Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 | /* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["_app-pages-browser_src_components_App_tsx-_app-pages-browser_src_components_ui_Footer_tsx"],{ /***/ "(app-pages-browser)/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js": /*!*******************************************************************************!*\ !*** ./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js ***! \*******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ isPropValid)\n/* harmony export */ });\n/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ \"(app-pages-browser)/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js\");\n\n\n// eslint-disable-next-line no-undef\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */(0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9pcy1wcm9wLXZhbGlkL2Rpc3QvZW1vdGlvbi1pcy1wcm9wLXZhbGlkLmVzbS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUF1Qzs7QUFFdkM7QUFDQSx1a0lBQXVrSTs7QUFFdmtJLGlDQUFpQyw0REFBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVrQyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9pcy1wcm9wLXZhbGlkL2Rpc3QvZW1vdGlvbi1pcy1wcm9wLXZhbGlkLmVzbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbWVtb2l6ZSBmcm9tICdAZW1vdGlvbi9tZW1vaXplJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG52YXIgcmVhY3RQcm9wc1JlZ2V4ID0gL14oKGNoaWxkcmVufGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfGtleXxyZWZ8YXV0b0ZvY3VzfGRlZmF1bHRWYWx1ZXxkZWZhdWx0Q2hlY2tlZHxpbm5lckhUTUx8c3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nfHN1cHByZXNzSHlkcmF0aW9uV2FybmluZ3x2YWx1ZUxpbmt8YWJicnxhY2NlcHR8YWNjZXB0Q2hhcnNldHxhY2Nlc3NLZXl8YWN0aW9ufGFsbG93fGFsbG93VXNlck1lZGlhfGFsbG93UGF5bWVudFJlcXVlc3R8YWxsb3dGdWxsU2NyZWVufGFsbG93VHJhbnNwYXJlbmN5fGFsdHxhc3luY3xhdXRvQ29tcGxldGV8YXV0b1BsYXl8Y2FwdHVyZXxjZWxsUGFkZGluZ3xjZWxsU3BhY2luZ3xjaGFsbGVuZ2V8Y2hhclNldHxjaGVja2VkfGNpdGV8Y2xhc3NJRHxjbGFzc05hbWV8Y29sc3xjb2xTcGFufGNvbnRlbnR8Y29udGVudEVkaXRhYmxlfGNvbnRleHRNZW51fGNvbnRyb2xzfGNvbnRyb2xzTGlzdHxjb29yZHN8Y3Jvc3NPcmlnaW58ZGF0YXxkYXRlVGltZXxkZWNvZGluZ3xkZWZhdWx0fGRlZmVyfGRpcnxkaXNhYmxlZHxkaXNhYmxlUGljdHVyZUluUGljdHVyZXxkaXNhYmxlUmVtb3RlUGxheWJhY2t8ZG93bmxvYWR8ZHJhZ2dhYmxlfGVuY1R5cGV8ZW50ZXJLZXlIaW50fGZldGNocHJpb3JpdHl8ZmV0Y2hQcmlvcml0eXxmb3JtfGZvcm1BY3Rpb258Zm9ybUVuY1R5cGV8Zm9ybU1ldGhvZHxmb3JtTm9WYWxpZGF0ZXxmb3JtVGFyZ2V0fGZyYW1lQm9yZGVyfGhlYWRlcnN8aGVpZ2h0fGhpZGRlbnxoaWdofGhyZWZ8aHJlZkxhbmd8aHRtbEZvcnxodHRwRXF1aXZ8aWR8aW5wdXRNb2RlfGludGVncml0eXxpc3xrZXlQYXJhbXN8a2V5VHlwZXxraW5kfGxhYmVsfGxhbmd8bGlzdHxsb2FkaW5nfGxvb3B8bG93fG1hcmdpbkhlaWdodHxtYXJnaW5XaWR0aHxtYXh8bWF4TGVuZ3RofG1lZGlhfG1lZGlhR3JvdXB8bWV0aG9kfG1pbnxtaW5MZW5ndGh8bXVsdGlwbGV8bXV0ZWR8bmFtZXxub25jZXxub1ZhbGlkYXRlfG9wZW58b3B0aW11bXxwYXR0ZXJufHBsYWNlaG9sZGVyfHBsYXlzSW5saW5lfHBvcG92ZXJ8cG9wb3ZlclRhcmdldHxwb3BvdmVyVGFyZ2V0QWN0aW9ufHBvc3RlcnxwcmVsb2FkfHByb2ZpbGV8cmFkaW9Hcm91cHxyZWFkT25seXxyZWZlcnJlclBvbGljeXxyZWx8cmVxdWlyZWR8cmV2ZXJzZWR8cm9sZXxyb3dzfHJvd1NwYW58c2FuZGJveHxzY29wZXxzY29wZWR8c2Nyb2xsaW5nfHNlYW1sZXNzfHNlbGVjdGVkfHNoYXBlfHNpemV8c2l6ZXN8c2xvdHxzcGFufHNwZWxsQ2hlY2t8c3JjfHNyY0RvY3xzcmNMYW5nfHNyY1NldHxzdGFydHxzdGVwfHN0eWxlfHN1bW1hcnl8dGFiSW5kZXh8dGFyZ2V0fHRpdGxlfHRyYW5zbGF0ZXx0eXBlfHVzZU1hcHx2YWx1ZXx3aWR0aHx3bW9kZXx3cmFwfGFib3V0fGRhdGF0eXBlfGlubGlzdHxwcmVmaXh8cHJvcGVydHl8cmVzb3VyY2V8dHlwZW9mfHZvY2FifGF1dG9DYXBpdGFsaXplfGF1dG9Db3JyZWN0fGF1dG9TYXZlfGNvbG9yfGluY3JlbWVudGFsfGZhbGxiYWNrfGluZXJ0fGl0ZW1Qcm9wfGl0ZW1TY29wZXxpdGVtVHlwZXxpdGVtSUR8aXRlbVJlZnxvbnxvcHRpb258cmVzdWx0c3xzZWN1cml0eXx1bnNlbGVjdGFibGV8YWNjZW50SGVpZ2h0fGFjY3VtdWxhdGV8YWRkaXRpdmV8YWxpZ25tZW50QmFzZWxpbmV8YWxsb3dSZW9yZGVyfGFscGhhYmV0aWN8YW1wbGl0dWRlfGFyYWJpY0Zvcm18YXNjZW50fGF0dHJpYnV0ZU5hbWV8YXR0cmlidXRlVHlwZXxhdXRvUmV2ZXJzZXxhemltdXRofGJhc2VGcmVxdWVuY3l8YmFzZWxpbmVTaGlmdHxiYXNlUHJvZmlsZXxiYm94fGJlZ2lufGJpYXN8Ynl8Y2FsY01vZGV8Y2FwSGVpZ2h0fGNsaXB8Y2xpcFBhdGhVbml0c3xjbGlwUGF0aHxjbGlwUnVsZXxjb2xvckludGVycG9sYXRpb258Y29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyc3xjb2xvclByb2ZpbGV8Y29sb3JSZW5kZXJpbmd8Y29udGVudFNjcmlwdFR5cGV8Y29udGVudFN0eWxlVHlwZXxjdXJzb3J8Y3h8Y3l8ZHxkZWNlbGVyYXRlfGRlc2NlbnR8ZGlmZnVzZUNvbnN0YW50fGRpcmVjdGlvbnxkaXNwbGF5fGRpdmlzb3J8ZG9taW5hbnRCYXNlbGluZXxkdXJ8ZHh8ZHl8ZWRnZU1vZGV8ZWxldmF0aW9ufGVuYWJsZUJhY2tncm91bmR8ZW5kfGV4cG9uZW50fGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWR8ZmlsbHxmaWxsT3BhY2l0eXxmaWxsUnVsZXxmaWx0ZXJ8ZmlsdGVyUmVzfGZpbHRlclVuaXRzfGZsb29kQ29sb3J8Zmxvb2RPcGFjaXR5fGZvY3VzYWJsZXxmb250RmFtaWx5fGZvbnRTaXplfGZvbnRTaXplQWRqdXN0fGZvbnRTdHJldGNofGZvbnRTdHlsZXxmb250VmFyaWFudHxmb250V2VpZ2h0fGZvcm1hdHxmcm9tfGZyfGZ4fGZ5fGcxfGcyfGdseXBoTmFtZXxnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbHxnbHlwaE9yaWVudGF0aW9uVmVydGljYWx8Z2x5cGhSZWZ8Z3JhZGllbnRUcmFuc2Zvcm18Z3JhZGllbnRVbml0c3xoYW5naW5nfGhvcml6QWR2WHxob3Jpek9yaWdpblh8aWRlb2dyYXBoaWN8aW1hZ2VSZW5kZXJpbmd8aW58aW4yfGludGVyY2VwdHxrfGsxfGsyfGszfGs0fGtlcm5lbE1hdHJpeHxrZXJuZWxVbml0TGVuZ3RofGtlcm5pbmd8a2V5UG9pbnRzfGtleVNwbGluZXN8a2V5VGltZXN8bGVuZ3RoQWRqdXN0fGxldHRlclNwYWNpbmd8bGlnaHRpbmdDb2xvcnxsaW1pdGluZ0NvbmVBbmdsZXxsb2NhbHxtYXJrZXJFbmR8bWFya2VyTWlkfG1hcmtlclN0YXJ0fG1hcmtlckhlaWdodHxtYXJrZXJVbml0c3xtYXJrZXJXaWR0aHxtYXNrfG1hc2tDb250ZW50VW5pdHN8bWFza1VuaXRzfG1hdGhlbWF0aWNhbHxtb2RlfG51bU9jdGF2ZXN8b2Zmc2V0fG9wYWNpdHl8b3BlcmF0b3J8b3JkZXJ8b3JpZW50fG9yaWVudGF0aW9ufG9yaWdpbnxvdmVyZmxvd3xvdmVybGluZVBvc2l0aW9ufG92ZXJsaW5lVGhpY2tuZXNzfHBhbm9zZTF8cGFpbnRPcmRlcnxwYXRoTGVuZ3RofHBhdHRlcm5Db250ZW50VW5pdHN8cGF0dGVyblRyYW5zZm9ybXxwYXR0ZXJuVW5pdHN8cG9pbnRlckV2ZW50c3xwb2ludHN8cG9pbnRzQXRYfHBvaW50c0F0WXxwb2ludHNBdFp8cHJlc2VydmVBbHBoYXxwcmVzZXJ2ZUFzcGVjdFJhdGlvfHByaW1pdGl2ZVVuaXRzfHJ8cmFkaXVzfHJlZlh8cmVmWXxyZW5kZXJpbmdJbnRlbnR8cmVwZWF0Q291bnR8cmVwZWF0RHVyfHJlcXVpcmVkRXh0ZW5zaW9uc3xyZXF1aXJlZEZlYXR1cmVzfHJlc3RhcnR8cmVzdWx0fHJvdGF0ZXxyeHxyeXxzY2FsZXxzZWVkfHNoYXBlUmVuZGVyaW5nfHNsb3BlfHNwYWNpbmd8c3BlY3VsYXJDb25zdGFudHxzcGVjdWxhckV4cG9uZW50fHNwZWVkfHNwcmVhZE1ldGhvZHxzdGFydE9mZnNldHxzdGREZXZpYXRpb258c3RlbWh8c3RlbXZ8c3RpdGNoVGlsZXN8c3RvcENvbG9yfHN0b3BPcGFjaXR5fHN0cmlrZXRocm91Z2hQb3NpdGlvbnxzdHJpa2V0aHJvdWdoVGhpY2tuZXNzfHN0cmluZ3xzdHJva2V8c3Ryb2tlRGFzaGFycmF5fHN0cm9rZURhc2hvZmZzZXR8c3Ryb2tlTGluZWNhcHxzdHJva2VMaW5lam9pbnxzdHJva2VNaXRlcmxpbWl0fHN0cm9rZU9wYWNpdHl8c3Ryb2tlV2lkdGh8c3VyZmFjZVNjYWxlfHN5c3RlbUxhbmd1YWdlfHRhYmxlVmFsdWVzfHRhcmdldFh8dGFyZ2V0WXx0ZXh0QW5jaG9yfHRleHREZWNvcmF0aW9ufHRleHRSZW5kZXJpbmd8dGV4dExlbmd0aHx0b3x0cmFuc2Zvcm18dTF8dTJ8dW5kZXJsaW5lUG9zaXRpb258dW5kZXJsaW5lVGhpY2tuZXNzfHVuaWNvZGV8dW5pY29kZUJpZGl8dW5pY29kZVJhbmdlfHVuaXRzUGVyRW18dkFscGhhYmV0aWN8dkhhbmdpbmd8dklkZW9ncmFwaGljfHZNYXRoZW1hdGljYWx8dmFsdWVzfHZlY3RvckVmZmVjdHx2ZXJzaW9ufHZlcnRBZHZZfHZlcnRPcmlnaW5YfHZlcnRPcmlnaW5ZfHZpZXdCb3h8dmlld1RhcmdldHx2aXNpYmlsaXR5fHdpZHRoc3x3b3JkU3BhY2luZ3x3cml0aW5nTW9kZXx4fHhIZWlnaHR8eDF8eDJ8eENoYW5uZWxTZWxlY3Rvcnx4bGlua0FjdHVhdGV8eGxpbmtBcmNyb2xlfHhsaW5rSHJlZnx4bGlua1JvbGV8eGxpbmtTaG93fHhsaW5rVGl0bGV8eGxpbmtUeXBlfHhtbEJhc2V8eG1sbnN8eG1sbnNYbGlua3x4bWxMYW5nfHhtbFNwYWNlfHl8eTF8eTJ8eUNoYW5uZWxTZWxlY3Rvcnx6fHpvb21BbmRQYW58Zm9yfGNsYXNzfGF1dG9mb2N1cyl8KChbRGRdW0FhXVtUdF1bQWFdfFtBYV1bUnJdW0lpXVtBYV18eCktLiopKSQvOyAvLyBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzViZmVlNjhhNGNkN2U2MDA5ZWY2MWQyM1xuXG52YXIgaXNQcm9wVmFsaWQgPSAvKiAjX19QVVJFX18gKi9tZW1vaXplKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiByZWFjdFByb3BzUmVnZXgudGVzdChwcm9wKSB8fCBwcm9wLmNoYXJDb2RlQXQoMCkgPT09IDExMVxuICAvKiBvICovXG4gICYmIHByb3AuY2hhckNvZGVBdCgxKSA9PT0gMTEwXG4gIC8qIG4gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDIpIDwgOTE7XG59XG4vKiBaKzEgKi9cbik7XG5cbmV4cG9ydCB7IGlzUHJvcFZhbGlkIGFzIGRlZmF1bHQgfTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js": /*!*******************************************************************!*\ !*** ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ memoize)\n/* harmony export */ });\nfunction memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9tZW1vaXplL2Rpc3QvZW1vdGlvbi1tZW1vaXplLmVzbS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRThCIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BlbW90aW9uL21lbW9pemUvZGlzdC9lbW90aW9uLW1lbW9pemUuZXNtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG1lbW9pemUoZm4pIHtcbiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICBpZiAoY2FjaGVbYXJnXSA9PT0gdW5kZWZpbmVkKSBjYWNoZVthcmddID0gZm4oYXJnKTtcbiAgICByZXR1cm4gY2FjaGVbYXJnXTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgbWVtb2l6ZSBhcyBkZWZhdWx0IH07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js": /*!******************************************************!*\ !*** ./node_modules/@neynar/react/dist/bundle.es.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CastCard: () => (/* binding */ oa),\n/* harmony export */ MiniAppProvider: () => (/* binding */ dR),\n/* harmony export */ NeynarAuthButton: () => (/* binding */ pS),\n/* harmony export */ NeynarAutoCompleteUser: () => (/* binding */ xR),\n/* harmony export */ NeynarCastCard: () => (/* binding */ RA),\n/* harmony export */ NeynarContextProvider: () => (/* binding */ fR),\n/* harmony export */ NeynarConversationList: () => (/* binding */ mR),\n/* harmony export */ NeynarFeedList: () => (/* binding */ yR),\n/* harmony export */ NeynarFrameCard: () => (/* binding */ aI),\n/* harmony export */ NeynarProfileCard: () => (/* binding */ vR),\n/* harmony export */ NeynarUserDropdown: () => (/* binding */ ER),\n/* harmony export */ SIWN_variant: () => (/* binding */ gs),\n/* harmony export */ Theme: () => (/* binding */ yg),\n/* harmony export */ useLocalStorage: () => (/* binding */ du),\n/* harmony export */ useMiniApp: () => (/* binding */ hR),\n/* harmony export */ useNeynarContext: () => (/* binding */ ts)\n/* harmony export */ });\n/* harmony import */ var _pigment_css_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pigment-css/react */ \"(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\")[\"Buffer\"];\nvar ym = Object.defineProperty;\nvar vm = (s, e, t) => e in s ? ym(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;\nvar Cr = (s, e, t) => vm(s, typeof e != \"symbol\" ? e + \"\" : e, t);\n\n\nconst Gr = {\n vars: {\n colors: {\n primary: \"var(--colors-primary)\"\n },\n typography: {\n fonts: {\n base: \"var(--typography-fonts-base)\"\n },\n fontWeights: {\n regular: \"var(--typography-fontWeights-regular)\",\n bold: \"var(--typography-fontWeights-bold)\"\n },\n fontSizes: {\n large: \"var(--typography-fontSizes-large)\",\n medium: \"var(--typography-fontSizes-medium)\",\n small: \"var(--typography-fontSizes-small)\"\n }\n },\n palette: {\n background: \"var(--palette-background)\",\n border: \"var(--palette-border)\",\n text: \"var(--palette-text)\",\n textMuted: \"var(--palette-textMuted)\"\n }\n }\n};\nfunction Fc(s) {\n return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nfunction Nc(s) {\n if (Object.prototype.hasOwnProperty.call(s, \"__esModule\")) return s;\n var e = s.default;\n if (typeof e == \"function\") {\n var t = function r() {\n return this instanceof r ? Reflect.construct(e, arguments, this.constructor) : e.apply(this, arguments);\n };\n t.prototype = e.prototype;\n } else t = {};\n return Object.defineProperty(t, \"__esModule\", {\n value: !0\n }), Object.keys(s).forEach(function(r) {\n var n = Object.getOwnPropertyDescriptor(s, r);\n Object.defineProperty(t, r, n.get ? n : {\n enumerable: !0,\n get: function() {\n return s[r];\n }\n });\n }), t;\n}\nvar Ua = { exports: {} }, Kn = {};\n/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar Wu;\nfunction Sm() {\n if (Wu) return Kn;\n Wu = 1;\n var s = Symbol.for(\"react.transitional.element\"), e = Symbol.for(\"react.fragment\");\n function t(r, n, i) {\n var o = null;\n if (i !== void 0 && (o = \"\" + i), n.key !== void 0 && (o = \"\" + n.key), \"key\" in n) {\n i = {};\n for (var a in n)\n a !== \"key\" && (i[a] = n[a]);\n } else i = n;\n return n = i.ref, {\n $$typeof: s,\n type: r,\n key: o,\n ref: n !== void 0 ? n : null,\n props: i\n };\n }\n return Kn.Fragment = e, Kn.jsx = t, Kn.jsxs = t, Kn;\n}\nvar zu;\nfunction bm() {\n return zu || (zu = 1, Ua.exports = Sm()), Ua.exports;\n}\nvar q = bm();\nlet Un = class extends Error {\n constructor(t, r = {}) {\n super(t, r.cause ? { cause: r.cause } : void 0);\n Cr(this, \"name\", \"BaseError\");\n Cr(this, \"cause\");\n this.cause = r.cause;\n }\n};\nclass Tm extends Un {\n constructor() {\n super(\"Invalid domain manifest\");\n Cr(this, \"name\", \"AddMiniApp.InvalidDomainManifest\");\n }\n}\nlet wm = class extends Un {\n constructor() {\n super(\"Add miniapp rejected by user\");\n Cr(this, \"name\", \"AddMiniApp.RejectedByUser\");\n }\n}, Of = class extends Un {\n constructor() {\n super(\"Sign in rejected by user\");\n Cr(this, \"name\", \"SignIn.RejectedByUser\");\n }\n};\nclass Am extends Un {\n constructor() {\n super(\"Sign manifest rejected by user\");\n Cr(this, \"name\", \"SignManifest.RejectedByUser\");\n }\n}\nclass Im extends Un {\n constructor() {\n super(\"Invalid domain provided\");\n Cr(this, \"name\", \"SignManifest.InvalidDomain\");\n }\n}\nclass _m extends Un {\n constructor(t = \"Manifest signing failed\") {\n super(t);\n Cr(this, \"name\", \"SignManifest.GenericError\");\n }\n}\nvar Ze;\n(function(s) {\n s.assertEqual = (n) => {\n };\n function e(n) {\n }\n s.assertIs = e;\n function t(n) {\n throw new Error();\n }\n s.assertNever = t, s.arrayToEnum = (n) => {\n const i = {};\n for (const o of n)\n i[o] = o;\n return i;\n }, s.getValidEnumValues = (n) => {\n const i = s.objectKeys(n).filter((a) => typeof n[n[a]] != \"number\"), o = {};\n for (const a of i)\n o[a] = n[a];\n return s.objectValues(o);\n }, s.objectValues = (n) => s.objectKeys(n).map(function(i) {\n return n[i];\n }), s.objectKeys = typeof Object.keys == \"function\" ? (n) => Object.keys(n) : (n) => {\n const i = [];\n for (const o in n)\n Object.prototype.hasOwnProperty.call(n, o) && i.push(o);\n return i;\n }, s.find = (n, i) => {\n for (const o of n)\n if (i(o))\n return o;\n }, s.isInteger = typeof Number.isInteger == \"function\" ? (n) => Number.isInteger(n) : (n) => typeof n == \"number\" && Number.isFinite(n) && Math.floor(n) === n;\n function r(n, i = \" | \") {\n return n.map((o) => typeof o == \"string\" ? `'${o}'` : o).join(i);\n }\n s.joinValues = r, s.jsonStringifyReplacer = (n, i) => typeof i == \"bigint\" ? i.toString() : i;\n})(Ze || (Ze = {}));\nvar Yu;\n(function(s) {\n s.mergeShapes = (e, t) => ({\n ...e,\n ...t\n // second overwrites first\n });\n})(Yu || (Yu = {}));\nconst me = Ze.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\"\n]), ws = (s) => {\n switch (typeof s) {\n case \"undefined\":\n return me.undefined;\n case \"string\":\n return me.string;\n case \"number\":\n return Number.isNaN(s) ? me.nan : me.number;\n case \"boolean\":\n return me.boolean;\n case \"function\":\n return me.function;\n case \"bigint\":\n return me.bigint;\n case \"symbol\":\n return me.symbol;\n case \"object\":\n return Array.isArray(s) ? me.array : s === null ? me.null : s.then && typeof s.then == \"function\" && s.catch && typeof s.catch == \"function\" ? me.promise : typeof Map < \"u\" && s instanceof Map ? me.map : typeof Set < \"u\" && s instanceof Set ? me.set : typeof Date < \"u\" && s instanceof Date ? me.date : me.object;\n default:\n return me.unknown;\n }\n}, ae = Ze.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\"\n]);\nclass ps extends Error {\n get errors() {\n return this.issues;\n }\n constructor(e) {\n super(), this.issues = [], this.addIssue = (r) => {\n this.issues = [...this.issues, r];\n }, this.addIssues = (r = []) => {\n this.issues = [...this.issues, ...r];\n };\n const t = new.target.prototype;\n Object.setPrototypeOf ? Object.setPrototypeOf(this, t) : this.__proto__ = t, this.name = \"ZodError\", this.issues = e;\n }\n format(e) {\n const t = e || function(i) {\n return i.message;\n }, r = { _errors: [] }, n = (i) => {\n for (const o of i.issues)\n if (o.code === \"invalid_union\")\n o.unionErrors.map(n);\n else if (o.code === \"invalid_return_type\")\n n(o.returnTypeError);\n else if (o.code === \"invalid_arguments\")\n n(o.argumentsError);\n else if (o.path.length === 0)\n r._errors.push(t(o));\n else {\n let a = r, l = 0;\n for (; l < o.path.length; ) {\n const c = o.path[l];\n l === o.path.length - 1 ? (a[c] = a[c] || { _errors: [] }, a[c]._errors.push(t(o))) : a[c] = a[c] || { _errors: [] }, a = a[c], l++;\n }\n }\n };\n return n(this), r;\n }\n static assert(e) {\n if (!(e instanceof ps))\n throw new Error(`Not a ZodError: ${e}`);\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, Ze.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(e = (t) => t.message) {\n const t = {}, r = [];\n for (const n of this.issues)\n if (n.path.length > 0) {\n const i = n.path[0];\n t[i] = t[i] || [], t[i].push(e(n));\n } else\n r.push(e(n));\n return { formErrors: r, fieldErrors: t };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nps.create = (s) => new ps(s);\nconst Kl = (s, e) => {\n let t;\n switch (s.code) {\n case ae.invalid_type:\n s.received === me.undefined ? t = \"Required\" : t = `Expected ${s.expected}, received ${s.received}`;\n break;\n case ae.invalid_literal:\n t = `Invalid literal value, expected ${JSON.stringify(s.expected, Ze.jsonStringifyReplacer)}`;\n break;\n case ae.unrecognized_keys:\n t = `Unrecognized key(s) in object: ${Ze.joinValues(s.keys, \", \")}`;\n break;\n case ae.invalid_union:\n t = \"Invalid input\";\n break;\n case ae.invalid_union_discriminator:\n t = `Invalid discriminator value. Expected ${Ze.joinValues(s.options)}`;\n break;\n case ae.invalid_enum_value:\n t = `Invalid enum value. Expected ${Ze.joinValues(s.options)}, received '${s.received}'`;\n break;\n case ae.invalid_arguments:\n t = \"Invalid function arguments\";\n break;\n case ae.invalid_return_type:\n t = \"Invalid function return type\";\n break;\n case ae.invalid_date:\n t = \"Invalid date\";\n break;\n case ae.invalid_string:\n typeof s.validation == \"object\" ? \"includes\" in s.validation ? (t = `Invalid input: must include \"${s.validation.includes}\"`, typeof s.validation.position == \"number\" && (t = `${t} at one or more positions greater than or equal to ${s.validation.position}`)) : \"startsWith\" in s.validation ? t = `Invalid input: must start with \"${s.validation.startsWith}\"` : \"endsWith\" in s.validation ? t = `Invalid input: must end with \"${s.validation.endsWith}\"` : Ze.assertNever(s.validation) : s.validation !== \"regex\" ? t = `Invalid ${s.validation}` : t = \"Invalid\";\n break;\n case ae.too_small:\n s.type === \"array\" ? t = `Array must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at least\" : \"more than\"} ${s.minimum} element(s)` : s.type === \"string\" ? t = `String must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at least\" : \"over\"} ${s.minimum} character(s)` : s.type === \"number\" ? t = `Number must be ${s.exact ? \"exactly equal to \" : s.inclusive ? \"greater than or equal to \" : \"greater than \"}${s.minimum}` : s.type === \"bigint\" ? t = `Number must be ${s.exact ? \"exactly equal to \" : s.inclusive ? \"greater than or equal to \" : \"greater than \"}${s.minimum}` : s.type === \"date\" ? t = `Date must be ${s.exact ? \"exactly equal to \" : s.inclusive ? \"greater than or equal to \" : \"greater than \"}${new Date(Number(s.minimum))}` : t = \"Invalid input\";\n break;\n case ae.too_big:\n s.type === \"array\" ? t = `Array must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at most\" : \"less than\"} ${s.maximum} element(s)` : s.type === \"string\" ? t = `String must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at most\" : \"under\"} ${s.maximum} character(s)` : s.type === \"number\" ? t = `Number must be ${s.exact ? \"exactly\" : s.inclusive ? \"less than or equal to\" : \"less than\"} ${s.maximum}` : s.type === \"bigint\" ? t = `BigInt must be ${s.exact ? \"exactly\" : s.inclusive ? \"less than or equal to\" : \"less than\"} ${s.maximum}` : s.type === \"date\" ? t = `Date must be ${s.exact ? \"exactly\" : s.inclusive ? \"smaller than or equal to\" : \"smaller than\"} ${new Date(Number(s.maximum))}` : t = \"Invalid input\";\n break;\n case ae.custom:\n t = \"Invalid input\";\n break;\n case ae.invalid_intersection_types:\n t = \"Intersection results could not be merged\";\n break;\n case ae.not_multiple_of:\n t = `Number must be a multiple of ${s.multipleOf}`;\n break;\n case ae.not_finite:\n t = \"Number must be finite\";\n break;\n default:\n t = e.defaultError, Ze.assertNever(s);\n }\n return { message: t };\n};\nlet Rm = Kl;\nfunction Lm() {\n return Rm;\n}\nconst Cm = (s) => {\n const { data: e, path: t, errorMaps: r, issueData: n } = s, i = [...t, ...n.path || []], o = {\n ...n,\n path: i\n };\n if (n.message !== void 0)\n return {\n ...n,\n path: i,\n message: n.message\n };\n let a = \"\";\n const l = r.filter((c) => !!c).slice().reverse();\n for (const c of l)\n a = c(o, { data: e, defaultError: a }).message;\n return {\n ...n,\n path: i,\n message: a\n };\n};\nfunction he(s, e) {\n const t = Lm(), r = Cm({\n issueData: e,\n data: s.data,\n path: s.path,\n errorMaps: [\n s.common.contextualErrorMap,\n // contextual error map is first priority\n s.schemaErrorMap,\n // then schema-bound map if available\n t,\n // then global override map\n t === Kl ? void 0 : Kl\n // then global default map\n ].filter((n) => !!n)\n });\n s.common.issues.push(r);\n}\nclass wr {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n this.value === \"valid\" && (this.value = \"dirty\");\n }\n abort() {\n this.value !== \"aborted\" && (this.value = \"aborted\");\n }\n static mergeArray(e, t) {\n const r = [];\n for (const n of t) {\n if (n.status === \"aborted\")\n return Re;\n n.status === \"dirty\" && e.dirty(), r.push(n.value);\n }\n return { status: e.value, value: r };\n }\n static async mergeObjectAsync(e, t) {\n const r = [];\n for (const n of t) {\n const i = await n.key, o = await n.value;\n r.push({\n key: i,\n value: o\n });\n }\n return wr.mergeObjectSync(e, r);\n }\n static mergeObjectSync(e, t) {\n const r = {};\n for (const n of t) {\n const { key: i, value: o } = n;\n if (i.status === \"aborted\" || o.status === \"aborted\")\n return Re;\n i.status === \"dirty\" && e.dirty(), o.status === \"dirty\" && e.dirty(), i.value !== \"__proto__\" && (typeof o.value < \"u\" || n.alwaysSet) && (r[i.value] = o.value);\n }\n return { status: e.value, value: r };\n }\n}\nconst Re = Object.freeze({\n status: \"aborted\"\n}), Wn = (s) => ({ status: \"dirty\", value: s }), Rr = (s) => ({ status: \"valid\", value: s }), Zu = (s) => s.status === \"aborted\", Xu = (s) => s.status === \"dirty\", Ln = (s) => s.status === \"valid\", bo = (s) => typeof Promise < \"u\" && s instanceof Promise;\nvar Ee;\n(function(s) {\n s.errToObj = (e) => typeof e == \"string\" ? { message: e } : e || {}, s.toString = (e) => typeof e == \"string\" ? e : e == null ? void 0 : e.message;\n})(Ee || (Ee = {}));\nclass Ds {\n constructor(e, t, r, n) {\n this._cachedPath = [], this.parent = e, this.data = t, this._path = r, this._key = n;\n }\n get path() {\n return this._cachedPath.length || (Array.isArray(this._key) ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath;\n }\n}\nconst Ju = (s, e) => {\n if (Ln(e))\n return { success: !0, data: e.value };\n if (!s.common.issues.length)\n throw new Error(\"Validation failed but no issues detected.\");\n return {\n success: !1,\n get error() {\n if (this._error)\n return this._error;\n const t = new ps(s.common.issues);\n return this._error = t, this._error;\n }\n };\n};\nfunction Ve(s) {\n if (!s)\n return {};\n const { errorMap: e, invalid_type_error: t, required_error: r, description: n } = s;\n if (e && (t || r))\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n return e ? { errorMap: e, description: n } : { errorMap: (o, a) => {\n const { message: l } = s;\n return o.code === \"invalid_enum_value\" ? { message: l ?? a.defaultError } : typeof a.data > \"u\" ? { message: l ?? r ?? a.defaultError } : o.code !== \"invalid_type\" ? { message: a.defaultError } : { message: l ?? t ?? a.defaultError };\n }, description: n };\n}\nclass Ye {\n get description() {\n return this._def.description;\n }\n _getType(e) {\n return ws(e.data);\n }\n _getOrReturnCtx(e, t) {\n return t || {\n common: e.parent.common,\n data: e.data,\n parsedType: ws(e.data),\n schemaErrorMap: this._def.errorMap,\n path: e.path,\n parent: e.parent\n };\n }\n _processInputParams(e) {\n return {\n status: new wr(),\n ctx: {\n common: e.parent.common,\n data: e.data,\n parsedType: ws(e.data),\n schemaErrorMap: this._def.errorMap,\n path: e.path,\n parent: e.parent\n }\n };\n }\n _parseSync(e) {\n const t = this._parse(e);\n if (bo(t))\n throw new Error(\"Synchronous parse encountered promise.\");\n return t;\n }\n _parseAsync(e) {\n const t = this._parse(e);\n return Promise.resolve(t);\n }\n parse(e, t) {\n const r = this.safeParse(e, t);\n if (r.success)\n return r.data;\n throw r.error;\n }\n safeParse(e, t) {\n const r = {\n common: {\n issues: [],\n async: (t == null ? void 0 : t.async) ?? !1,\n contextualErrorMap: t == null ? void 0 : t.errorMap\n },\n path: (t == null ? void 0 : t.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data: e,\n parsedType: ws(e)\n }, n = this._parseSync({ data: e, path: r.path, parent: r });\n return Ju(r, n);\n }\n \"~validate\"(e) {\n var r, n;\n const t = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data: e,\n parsedType: ws(e)\n };\n if (!this[\"~standard\"].async)\n try {\n const i = this._parseSync({ data: e, path: [], parent: t });\n return Ln(i) ? {\n value: i.value\n } : {\n issues: t.common.issues\n };\n } catch (i) {\n (n = (r = i == null ? void 0 : i.message) == null ? void 0 : r.toLowerCase()) != null && n.includes(\"encountered\") && (this[\"~standard\"].async = !0), t.common = {\n issues: [],\n async: !0\n };\n }\n return this._parseAsync({ data: e, path: [], parent: t }).then((i) => Ln(i) ? {\n value: i.value\n } : {\n issues: t.common.issues\n });\n }\n async parseAsync(e, t) {\n const r = await this.safeParseAsync(e, t);\n if (r.success)\n return r.data;\n throw r.error;\n }\n async safeParseAsync(e, t) {\n const r = {\n common: {\n issues: [],\n contextualErrorMap: t == null ? void 0 : t.errorMap,\n async: !0\n },\n path: (t == null ? void 0 : t.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data: e,\n parsedType: ws(e)\n }, n = this._parse({ data: e, path: r.path, parent: r }), i = await (bo(n) ? n : Promise.resolve(n));\n return Ju(r, i);\n }\n refine(e, t) {\n const r = (n) => typeof t == \"string\" || typeof t > \"u\" ? { message: t } : typeof t == \"function\" ? t(n) : t;\n return this._refinement((n, i) => {\n const o = e(n), a = () => i.addIssue({\n code: ae.custom,\n ...r(n)\n });\n return typeof Promise < \"u\" && o instanceof Promise ? o.then((l) => l ? !0 : (a(), !1)) : o ? !0 : (a(), !1);\n });\n }\n refinement(e, t) {\n return this._refinement((r, n) => e(r) ? !0 : (n.addIssue(typeof t == \"function\" ? t(r, n) : t), !1));\n }\n _refinement(e) {\n return new Ys({\n schema: this,\n typeName: ke.ZodEffects,\n effect: { type: \"refinement\", refinement: e }\n });\n }\n superRefine(e) {\n return this._refinement(e);\n }\n constructor(e) {\n this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this), this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (t) => this[\"~validate\"](t)\n };\n }\n optional() {\n return fs.create(this, this._def);\n }\n nullable() {\n return Zs.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return Yr.create(this);\n }\n promise() {\n return _o.create(this, this._def);\n }\n or(e) {\n return wo.create([this, e], this._def);\n }\n and(e) {\n return Ao.create(this, e, this._def);\n }\n transform(e) {\n return new Ys({\n ...Ve(this._def),\n schema: this,\n typeName: ke.ZodEffects,\n effect: { type: \"transform\", transform: e }\n });\n }\n default(e) {\n const t = typeof e == \"function\" ? e : () => e;\n return new Ro({\n ...Ve(this._def),\n innerType: this,\n defaultValue: t,\n typeName: ke.ZodDefault\n });\n }\n brand() {\n return new Uf({\n typeName: ke.ZodBranded,\n type: this,\n ...Ve(this._def)\n });\n }\n catch(e) {\n const t = typeof e == \"function\" ? e : () => e;\n return new Lo({\n ...Ve(this._def),\n innerType: this,\n catchValue: t,\n typeName: ke.ZodCatch\n });\n }\n describe(e) {\n const t = this.constructor;\n return new t({\n ...this._def,\n description: e\n });\n }\n pipe(e) {\n return $c.create(this, e);\n }\n readonly() {\n return Co.create(this);\n }\n isOptional() {\n return this.safeParse(void 0).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst km = /^c[^\\s-]{8,}$/i, Dm = /^[0-9a-z]+$/, Pm = /^[0-9A-HJKMNP-TV-Z]{26}$/i, Mm = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i, Om = /^[a-z0-9_-]{21}$/i, Bm = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/, Fm = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/, Nm = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i, Um = \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\";\nlet $a;\nconst $m = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/, Gm = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/, Vm = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/, jm = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/, Km = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/, Hm = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/, Bf = \"((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))\", qm = new RegExp(`^${Bf}$`);\nfunction Ff(s) {\n let e = \"[0-5]\\\\d\";\n s.precision ? e = `${e}\\\\.\\\\d{${s.precision}}` : s.precision == null && (e = `${e}(\\\\.\\\\d+)?`);\n const t = s.precision ? \"+\" : \"?\";\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${e})${t}`;\n}\nfunction Wm(s) {\n return new RegExp(`^${Ff(s)}$`);\n}\nfunction zm(s) {\n let e = `${Bf}T${Ff(s)}`;\n const t = [];\n return t.push(s.local ? \"Z?\" : \"Z\"), s.offset && t.push(\"([+-]\\\\d{2}:?\\\\d{2})\"), e = `${e}(${t.join(\"|\")})`, new RegExp(`^${e}$`);\n}\nfunction Ym(s, e) {\n return !!((e === \"v4\" || !e) && $m.test(s) || (e === \"v6\" || !e) && Vm.test(s));\n}\nfunction Zm(s, e) {\n if (!Bm.test(s))\n return !1;\n try {\n const [t] = s.split(\".\");\n if (!t)\n return !1;\n const r = t.replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(t.length + (4 - t.length % 4) % 4, \"=\"), n = JSON.parse(atob(r));\n return !(typeof n != \"object\" || n === null || \"typ\" in n && (n == null ? void 0 : n.typ) !== \"JWT\" || !n.alg || e && n.alg !== e);\n } catch {\n return !1;\n }\n}\nfunction Xm(s, e) {\n return !!((e === \"v4\" || !e) && Gm.test(s) || (e === \"v6\" || !e) && jm.test(s));\n}\nclass Rs extends Ye {\n _parse(e) {\n if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== me.string) {\n const i = this._getOrReturnCtx(e);\n return he(i, {\n code: ae.invalid_type,\n expected: me.string,\n received: i.parsedType\n }), Re;\n }\n const r = new wr();\n let n;\n for (const i of this._def.checks)\n if (i.kind === \"min\")\n e.data.length < i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.too_small,\n minimum: i.value,\n type: \"string\",\n inclusive: !0,\n exact: !1,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"max\")\n e.data.length > i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.too_big,\n maximum: i.value,\n type: \"string\",\n inclusive: !0,\n exact: !1,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"length\") {\n const o = e.data.length > i.value, a = e.data.length < i.value;\n (o || a) && (n = this._getOrReturnCtx(e, n), o ? he(n, {\n code: ae.too_big,\n maximum: i.value,\n type: \"string\",\n inclusive: !0,\n exact: !0,\n message: i.message\n }) : a && he(n, {\n code: ae.too_small,\n minimum: i.value,\n type: \"string\",\n inclusive: !0,\n exact: !0,\n message: i.message\n }), r.dirty());\n } else if (i.kind === \"email\")\n Nm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"email\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"emoji\")\n $a || ($a = new RegExp(Um, \"u\")), $a.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"emoji\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"uuid\")\n Mm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"uuid\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"nanoid\")\n Om.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"nanoid\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"cuid\")\n km.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"cuid\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"cuid2\")\n Dm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"cuid2\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"ulid\")\n Pm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"ulid\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty());\n else if (i.kind === \"url\")\n try {\n new URL(e.data);\n } catch {\n n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"url\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty();\n }\n else i.kind === \"regex\" ? (i.regex.lastIndex = 0, i.regex.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"regex\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty())) : i.kind === \"trim\" ? e.data = e.data.trim() : i.kind === \"includes\" ? e.data.includes(i.value, i.position) || (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.invalid_string,\n validation: { includes: i.value, position: i.position },\n message: i.message\n }), r.dirty()) : i.kind === \"toLowerCase\" ? e.data = e.data.toLowerCase() : i.kind === \"toUpperCase\" ? e.data = e.data.toUpperCase() : i.kind === \"startsWith\" ? e.data.startsWith(i.value) || (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.invalid_string,\n validation: { startsWith: i.value },\n message: i.message\n }), r.dirty()) : i.kind === \"endsWith\" ? e.data.endsWith(i.value) || (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.invalid_string,\n validation: { endsWith: i.value },\n message: i.message\n }), r.dirty()) : i.kind === \"datetime\" ? zm(i).test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.invalid_string,\n validation: \"datetime\",\n message: i.message\n }), r.dirty()) : i.kind === \"date\" ? qm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.invalid_string,\n validation: \"date\",\n message: i.message\n }), r.dirty()) : i.kind === \"time\" ? Wm(i).test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.invalid_string,\n validation: \"time\",\n message: i.message\n }), r.dirty()) : i.kind === \"duration\" ? Fm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"duration\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty()) : i.kind === \"ip\" ? Ym(e.data, i.version) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"ip\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty()) : i.kind === \"jwt\" ? Zm(e.data, i.alg) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"jwt\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty()) : i.kind === \"cidr\" ? Xm(e.data, i.version) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"cidr\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty()) : i.kind === \"base64\" ? Km.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"base64\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty()) : i.kind === \"base64url\" ? Hm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n validation: \"base64url\",\n code: ae.invalid_string,\n message: i.message\n }), r.dirty()) : Ze.assertNever(i);\n return { status: r.value, value: e.data };\n }\n _regex(e, t, r) {\n return this.refinement((n) => e.test(n), {\n validation: t,\n code: ae.invalid_string,\n ...Ee.errToObj(r)\n });\n }\n _addCheck(e) {\n return new Rs({\n ...this._def,\n checks: [...this._def.checks, e]\n });\n }\n email(e) {\n return this._addCheck({ kind: \"email\", ...Ee.errToObj(e) });\n }\n url(e) {\n return this._addCheck({ kind: \"url\", ...Ee.errToObj(e) });\n }\n emoji(e) {\n return this._addCheck({ kind: \"emoji\", ...Ee.errToObj(e) });\n }\n uuid(e) {\n return this._addCheck({ kind: \"uuid\", ...Ee.errToObj(e) });\n }\n nanoid(e) {\n return this._addCheck({ kind: \"nanoid\", ...Ee.errToObj(e) });\n }\n cuid(e) {\n return this._addCheck({ kind: \"cuid\", ...Ee.errToObj(e) });\n }\n cuid2(e) {\n return this._addCheck({ kind: \"cuid2\", ...Ee.errToObj(e) });\n }\n ulid(e) {\n return this._addCheck({ kind: \"ulid\", ...Ee.errToObj(e) });\n }\n base64(e) {\n return this._addCheck({ kind: \"base64\", ...Ee.errToObj(e) });\n }\n base64url(e) {\n return this._addCheck({\n kind: \"base64url\",\n ...Ee.errToObj(e)\n });\n }\n jwt(e) {\n return this._addCheck({ kind: \"jwt\", ...Ee.errToObj(e) });\n }\n ip(e) {\n return this._addCheck({ kind: \"ip\", ...Ee.errToObj(e) });\n }\n cidr(e) {\n return this._addCheck({ kind: \"cidr\", ...Ee.errToObj(e) });\n }\n datetime(e) {\n return typeof e == \"string\" ? this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: !1,\n local: !1,\n message: e\n }) : this._addCheck({\n kind: \"datetime\",\n precision: typeof (e == null ? void 0 : e.precision) > \"u\" ? null : e == null ? void 0 : e.precision,\n offset: (e == null ? void 0 : e.offset) ?? !1,\n local: (e == null ? void 0 : e.local) ?? !1,\n ...Ee.errToObj(e == null ? void 0 : e.message)\n });\n }\n date(e) {\n return this._addCheck({ kind: \"date\", message: e });\n }\n time(e) {\n return typeof e == \"string\" ? this._addCheck({\n kind: \"time\",\n precision: null,\n message: e\n }) : this._addCheck({\n kind: \"time\",\n precision: typeof (e == null ? void 0 : e.precision) > \"u\" ? null : e == null ? void 0 : e.precision,\n ...Ee.errToObj(e == null ? void 0 : e.message)\n });\n }\n duration(e) {\n return this._addCheck({ kind: \"duration\", ...Ee.errToObj(e) });\n }\n regex(e, t) {\n return this._addCheck({\n kind: \"regex\",\n regex: e,\n ...Ee.errToObj(t)\n });\n }\n includes(e, t) {\n return this._addCheck({\n kind: \"includes\",\n value: e,\n position: t == null ? void 0 : t.position,\n ...Ee.errToObj(t == null ? void 0 : t.message)\n });\n }\n startsWith(e, t) {\n return this._addCheck({\n kind: \"startsWith\",\n value: e,\n ...Ee.errToObj(t)\n });\n }\n endsWith(e, t) {\n return this._addCheck({\n kind: \"endsWith\",\n value: e,\n ...Ee.errToObj(t)\n });\n }\n min(e, t) {\n return this._addCheck({\n kind: \"min\",\n value: e,\n ...Ee.errToObj(t)\n });\n }\n max(e, t) {\n return this._addCheck({\n kind: \"max\",\n value: e,\n ...Ee.errToObj(t)\n });\n }\n length(e, t) {\n return this._addCheck({\n kind: \"length\",\n value: e,\n ...Ee.errToObj(t)\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(e) {\n return this.min(1, Ee.errToObj(e));\n }\n trim() {\n return new Rs({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }]\n });\n }\n toLowerCase() {\n return new Rs({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }]\n });\n }\n toUpperCase() {\n return new Rs({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }]\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((e) => e.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((e) => e.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((e) => e.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((e) => e.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((e) => e.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((e) => e.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((e) => e.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((e) => e.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((e) => e.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((e) => e.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((e) => e.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((e) => e.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((e) => e.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((e) => e.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((e) => e.kind === \"base64\");\n }\n get isBase64url() {\n return !!this._def.checks.find((e) => e.kind === \"base64url\");\n }\n get minLength() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n return e;\n }\n get maxLength() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n return e;\n }\n}\nRs.create = (s) => new Rs({\n checks: [],\n typeName: ke.ZodString,\n coerce: (s == null ? void 0 : s.coerce) ?? !1,\n ...Ve(s)\n});\nfunction Jm(s, e) {\n const t = (s.toString().split(\".\")[1] || \"\").length, r = (e.toString().split(\".\")[1] || \"\").length, n = t > r ? t : r, i = Number.parseInt(s.toFixed(n).replace(\".\", \"\")), o = Number.parseInt(e.toFixed(n).replace(\".\", \"\"));\n return i % o / 10 ** n;\n}\nclass Cn extends Ye {\n constructor() {\n super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;\n }\n _parse(e) {\n if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== me.number) {\n const i = this._getOrReturnCtx(e);\n return he(i, {\n code: ae.invalid_type,\n expected: me.number,\n received: i.parsedType\n }), Re;\n }\n let r;\n const n = new wr();\n for (const i of this._def.checks)\n i.kind === \"int\" ? Ze.isInteger(e.data) || (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: i.message\n }), n.dirty()) : i.kind === \"min\" ? (i.inclusive ? e.data < i.value : e.data <= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.too_small,\n minimum: i.value,\n type: \"number\",\n inclusive: i.inclusive,\n exact: !1,\n message: i.message\n }), n.dirty()) : i.kind === \"max\" ? (i.inclusive ? e.data > i.value : e.data >= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.too_big,\n maximum: i.value,\n type: \"number\",\n inclusive: i.inclusive,\n exact: !1,\n message: i.message\n }), n.dirty()) : i.kind === \"multipleOf\" ? Jm(e.data, i.value) !== 0 && (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.not_multiple_of,\n multipleOf: i.value,\n message: i.message\n }), n.dirty()) : i.kind === \"finite\" ? Number.isFinite(e.data) || (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.not_finite,\n message: i.message\n }), n.dirty()) : Ze.assertNever(i);\n return { status: n.value, value: e.data };\n }\n gte(e, t) {\n return this.setLimit(\"min\", e, !0, Ee.toString(t));\n }\n gt(e, t) {\n return this.setLimit(\"min\", e, !1, Ee.toString(t));\n }\n lte(e, t) {\n return this.setLimit(\"max\", e, !0, Ee.toString(t));\n }\n lt(e, t) {\n return this.setLimit(\"max\", e, !1, Ee.toString(t));\n }\n setLimit(e, t, r, n) {\n return new Cn({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: e,\n value: t,\n inclusive: r,\n message: Ee.toString(n)\n }\n ]\n });\n }\n _addCheck(e) {\n return new Cn({\n ...this._def,\n checks: [...this._def.checks, e]\n });\n }\n int(e) {\n return this._addCheck({\n kind: \"int\",\n message: Ee.toString(e)\n });\n }\n positive(e) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: !1,\n message: Ee.toString(e)\n });\n }\n negative(e) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: !1,\n message: Ee.toString(e)\n });\n }\n nonpositive(e) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: !0,\n message: Ee.toString(e)\n });\n }\n nonnegative(e) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: !0,\n message: Ee.toString(e)\n });\n }\n multipleOf(e, t) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: e,\n message: Ee.toString(t)\n });\n }\n finite(e) {\n return this._addCheck({\n kind: \"finite\",\n message: Ee.toString(e)\n });\n }\n safe(e) {\n return this._addCheck({\n kind: \"min\",\n inclusive: !0,\n value: Number.MIN_SAFE_INTEGER,\n message: Ee.toString(e)\n })._addCheck({\n kind: \"max\",\n inclusive: !0,\n value: Number.MAX_SAFE_INTEGER,\n message: Ee.toString(e)\n });\n }\n get minValue() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n return e;\n }\n get maxValue() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n return e;\n }\n get isInt() {\n return !!this._def.checks.find((e) => e.kind === \"int\" || e.kind === \"multipleOf\" && Ze.isInteger(e.value));\n }\n get isFinite() {\n let e = null, t = null;\n for (const r of this._def.checks) {\n if (r.kind === \"finite\" || r.kind === \"int\" || r.kind === \"multipleOf\")\n return !0;\n r.kind === \"min\" ? (t === null || r.value > t) && (t = r.value) : r.kind === \"max\" && (e === null || r.value < e) && (e = r.value);\n }\n return Number.isFinite(t) && Number.isFinite(e);\n }\n}\nCn.create = (s) => new Cn({\n checks: [],\n typeName: ke.ZodNumber,\n coerce: (s == null ? void 0 : s.coerce) || !1,\n ...Ve(s)\n});\nclass Jn extends Ye {\n constructor() {\n super(...arguments), this.min = this.gte, this.max = this.lte;\n }\n _parse(e) {\n if (this._def.coerce)\n try {\n e.data = BigInt(e.data);\n } catch {\n return this._getInvalidInput(e);\n }\n if (this._getType(e) !== me.bigint)\n return this._getInvalidInput(e);\n let r;\n const n = new wr();\n for (const i of this._def.checks)\n i.kind === \"min\" ? (i.inclusive ? e.data < i.value : e.data <= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.too_small,\n type: \"bigint\",\n minimum: i.value,\n inclusive: i.inclusive,\n message: i.message\n }), n.dirty()) : i.kind === \"max\" ? (i.inclusive ? e.data > i.value : e.data >= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.too_big,\n type: \"bigint\",\n maximum: i.value,\n inclusive: i.inclusive,\n message: i.message\n }), n.dirty()) : i.kind === \"multipleOf\" ? e.data % i.value !== BigInt(0) && (r = this._getOrReturnCtx(e, r), he(r, {\n code: ae.not_multiple_of,\n multipleOf: i.value,\n message: i.message\n }), n.dirty()) : Ze.assertNever(i);\n return { status: n.value, value: e.data };\n }\n _getInvalidInput(e) {\n const t = this._getOrReturnCtx(e);\n return he(t, {\n code: ae.invalid_type,\n expected: me.bigint,\n received: t.parsedType\n }), Re;\n }\n gte(e, t) {\n return this.setLimit(\"min\", e, !0, Ee.toString(t));\n }\n gt(e, t) {\n return this.setLimit(\"min\", e, !1, Ee.toString(t));\n }\n lte(e, t) {\n return this.setLimit(\"max\", e, !0, Ee.toString(t));\n }\n lt(e, t) {\n return this.setLimit(\"max\", e, !1, Ee.toString(t));\n }\n setLimit(e, t, r, n) {\n return new Jn({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind: e,\n value: t,\n inclusive: r,\n message: Ee.toString(n)\n }\n ]\n });\n }\n _addCheck(e) {\n return new Jn({\n ...this._def,\n checks: [...this._def.checks, e]\n });\n }\n positive(e) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: !1,\n message: Ee.toString(e)\n });\n }\n negative(e) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: !1,\n message: Ee.toString(e)\n });\n }\n nonpositive(e) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: !0,\n message: Ee.toString(e)\n });\n }\n nonnegative(e) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: !0,\n message: Ee.toString(e)\n });\n }\n multipleOf(e, t) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: e,\n message: Ee.toString(t)\n });\n }\n get minValue() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n return e;\n }\n get maxValue() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n return e;\n }\n}\nJn.create = (s) => new Jn({\n checks: [],\n typeName: ke.ZodBigInt,\n coerce: (s == null ? void 0 : s.coerce) ?? !1,\n ...Ve(s)\n});\nclass Hl extends Ye {\n _parse(e) {\n if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== me.boolean) {\n const r = this._getOrReturnCtx(e);\n return he(r, {\n code: ae.invalid_type,\n expected: me.boolean,\n received: r.parsedType\n }), Re;\n }\n return Rr(e.data);\n }\n}\nHl.create = (s) => new Hl({\n typeName: ke.ZodBoolean,\n coerce: (s == null ? void 0 : s.coerce) || !1,\n ...Ve(s)\n});\nclass To extends Ye {\n _parse(e) {\n if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== me.date) {\n const i = this._getOrReturnCtx(e);\n return he(i, {\n code: ae.invalid_type,\n expected: me.date,\n received: i.parsedType\n }), Re;\n }\n if (Number.isNaN(e.data.getTime())) {\n const i = this._getOrReturnCtx(e);\n return he(i, {\n code: ae.invalid_date\n }), Re;\n }\n const r = new wr();\n let n;\n for (const i of this._def.checks)\n i.kind === \"min\" ? e.data.getTime() < i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.too_small,\n message: i.message,\n inclusive: !0,\n exact: !1,\n minimum: i.value,\n type: \"date\"\n }), r.dirty()) : i.kind === \"max\" ? e.data.getTime() > i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n code: ae.too_big,\n message: i.message,\n inclusive: !0,\n exact: !1,\n maximum: i.value,\n type: \"date\"\n }), r.dirty()) : Ze.assertNever(i);\n return {\n status: r.value,\n value: new Date(e.data.getTime())\n };\n }\n _addCheck(e) {\n return new To({\n ...this._def,\n checks: [...this._def.checks, e]\n });\n }\n min(e, t) {\n return this._addCheck({\n kind: \"min\",\n value: e.getTime(),\n message: Ee.toString(t)\n });\n }\n max(e, t) {\n return this._addCheck({\n kind: \"max\",\n value: e.getTime(),\n message: Ee.toString(t)\n });\n }\n get minDate() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n return e != null ? new Date(e) : null;\n }\n get maxDate() {\n let e = null;\n for (const t of this._def.checks)\n t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n return e != null ? new Date(e) : null;\n }\n}\nTo.create = (s) => new To({\n checks: [],\n coerce: (s == null ? void 0 : s.coerce) || !1,\n typeName: ke.ZodDate,\n ...Ve(s)\n});\nclass Qu extends Ye {\n _parse(e) {\n if (this._getType(e) !== me.symbol) {\n const r = this._getOrReturnCtx(e);\n return he(r, {\n code: ae.invalid_type,\n expected: me.symbol,\n received: r.parsedType\n }), Re;\n }\n return Rr(e.data);\n }\n}\nQu.create = (s) => new Qu({\n typeName: ke.ZodSymbol,\n ...Ve(s)\n});\nclass ql extends Ye {\n _parse(e) {\n if (this._getType(e) !== me.undefined) {\n const r = this._getOrReturnCtx(e);\n return he(r, {\n code: ae.invalid_type,\n expected: me.undefined,\n received: r.parsedType\n }), Re;\n }\n return Rr(e.data);\n }\n}\nql.create = (s) => new ql({\n typeName: ke.ZodUndefined,\n ...Ve(s)\n});\nclass Wl extends Ye {\n _parse(e) {\n if (this._getType(e) !== me.null) {\n const r = this._getOrReturnCtx(e);\n return he(r, {\n code: ae.invalid_type,\n expected: me.null,\n received: r.parsedType\n }), Re;\n }\n return Rr(e.data);\n }\n}\nWl.create = (s) => new Wl({\n typeName: ke.ZodNull,\n ...Ve(s)\n});\nclass ed extends Ye {\n constructor() {\n super(...arguments), this._any = !0;\n }\n _parse(e) {\n return Rr(e.data);\n }\n}\ned.create = (s) => new ed({\n typeName: ke.ZodAny,\n ...Ve(s)\n});\nclass td extends Ye {\n constructor() {\n super(...arguments), this._unknown = !0;\n }\n _parse(e) {\n return Rr(e.data);\n }\n}\ntd.create = (s) => new td({\n typeName: ke.ZodUnknown,\n ...Ve(s)\n});\nclass Ps extends Ye {\n _parse(e) {\n const t = this._getOrReturnCtx(e);\n return he(t, {\n code: ae.invalid_type,\n expected: me.never,\n received: t.parsedType\n }), Re;\n }\n}\nPs.create = (s) => new Ps({\n typeName: ke.ZodNever,\n ...Ve(s)\n});\nclass rd extends Ye {\n _parse(e) {\n if (this._getType(e) !== me.undefined) {\n const r = this._getOrReturnCtx(e);\n return he(r, {\n code: ae.invalid_type,\n expected: me.void,\n received: r.parsedType\n }), Re;\n }\n return Rr(e.data);\n }\n}\nrd.create = (s) => new rd({\n typeName: ke.ZodVoid,\n ...Ve(s)\n});\nclass Yr extends Ye {\n _parse(e) {\n const { ctx: t, status: r } = this._processInputParams(e), n = this._def;\n if (t.parsedType !== me.array)\n return he(t, {\n code: ae.invalid_type,\n expected: me.array,\n received: t.parsedType\n }), Re;\n if (n.exactLength !== null) {\n const o = t.data.length > n.exactLength.value, a = t.data.length < n.exactLength.value;\n (o || a) && (he(t, {\n code: o ? ae.too_big : ae.too_small,\n minimum: a ? n.exactLength.value : void 0,\n maximum: o ? n.exactLength.value : void 0,\n type: \"array\",\n inclusive: !0,\n exact: !0,\n message: n.exactLength.message\n }), r.dirty());\n }\n if (n.minLength !== null && t.data.length < n.minLength.value && (he(t, {\n code: ae.too_small,\n minimum: n.minLength.value,\n type: \"array\",\n inclusive: !0,\n exact: !1,\n message: n.minLength.message\n }), r.dirty()), n.maxLength !== null && t.data.length > n.maxLength.value && (he(t, {\n code: ae.too_big,\n maximum: n.maxLength.value,\n type: \"array\",\n inclusive: !0,\n exact: !1,\n message: n.maxLength.message\n }), r.dirty()), t.common.async)\n return Promise.all([...t.data].map((o, a) => n.type._parseAsync(new Ds(t, o, t.path, a)))).then((o) => wr.mergeArray(r, o));\n const i = [...t.data].map((o, a) => n.type._parseSync(new Ds(t, o, t.path, a)));\n return wr.mergeArray(r, i);\n }\n get element() {\n return this._def.type;\n }\n min(e, t) {\n return new Yr({\n ...this._def,\n minLength: { value: e, message: Ee.toString(t) }\n });\n }\n max(e, t) {\n return new Yr({\n ...this._def,\n maxLength: { value: e, message: Ee.toString(t) }\n });\n }\n length(e, t) {\n return new Yr({\n ...this._def,\n exactLength: { value: e, message: Ee.toString(t) }\n });\n }\n nonempty(e) {\n return this.min(1, e);\n }\n}\nYr.create = (s, e) => new Yr({\n type: s,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ke.ZodArray,\n ...Ve(e)\n});\nfunction mn(s) {\n if (s instanceof $t) {\n const e = {};\n for (const t in s.shape) {\n const r = s.shape[t];\n e[t] = fs.create(mn(r));\n }\n return new $t({\n ...s._def,\n shape: () => e\n });\n } else return s instanceof Yr ? new Yr({\n ...s._def,\n type: mn(s.element)\n }) : s instanceof fs ? fs.create(mn(s.unwrap())) : s instanceof Zs ? Zs.create(mn(s.unwrap())) : s instanceof Ws ? Ws.create(s.items.map((e) => mn(e))) : s;\n}\nclass $t extends Ye {\n constructor() {\n super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const e = this._def.shape(), t = Ze.objectKeys(e);\n return this._cached = { shape: e, keys: t }, this._cached;\n }\n _parse(e) {\n if (this._getType(e) !== me.object) {\n const c = this._getOrReturnCtx(e);\n return he(c, {\n code: ae.invalid_type,\n expected: me.object,\n received: c.parsedType\n }), Re;\n }\n const { status: r, ctx: n } = this._processInputParams(e), { shape: i, keys: o } = this._getCached(), a = [];\n if (!(this._def.catchall instanceof Ps && this._def.unknownKeys === \"strip\"))\n for (const c in n.data)\n o.includes(c) || a.push(c);\n const l = [];\n for (const c of o) {\n const u = i[c], d = n.data[c];\n l.push({\n key: { status: \"valid\", value: c },\n value: u._parse(new Ds(n, d, n.path, c)),\n alwaysSet: c in n.data\n });\n }\n if (this._def.catchall instanceof Ps) {\n const c = this._def.unknownKeys;\n if (c === \"passthrough\")\n for (const u of a)\n l.push({\n key: { status: \"valid\", value: u },\n value: { status: \"valid\", value: n.data[u] }\n });\n else if (c === \"strict\")\n a.length > 0 && (he(n, {\n code: ae.unrecognized_keys,\n keys: a\n }), r.dirty());\n else if (c !== \"strip\") throw new Error(\"Internal ZodObject error: invalid unknownKeys value.\");\n } else {\n const c = this._def.catchall;\n for (const u of a) {\n const d = n.data[u];\n l.push({\n key: { status: \"valid\", value: u },\n value: c._parse(\n new Ds(n, d, n.path, u)\n //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: u in n.data\n });\n }\n }\n return n.common.async ? Promise.resolve().then(async () => {\n const c = [];\n for (const u of l) {\n const d = await u.key, h = await u.value;\n c.push({\n key: d,\n value: h,\n alwaysSet: u.alwaysSet\n });\n }\n return c;\n }).then((c) => wr.mergeObjectSync(r, c)) : wr.mergeObjectSync(r, l);\n }\n get shape() {\n return this._def.shape();\n }\n strict(e) {\n return Ee.errToObj, new $t({\n ...this._def,\n unknownKeys: \"strict\",\n ...e !== void 0 ? {\n errorMap: (t, r) => {\n var i, o;\n const n = ((o = (i = this._def).errorMap) == null ? void 0 : o.call(i, t, r).message) ?? r.defaultError;\n return t.code === \"unrecognized_keys\" ? {\n message: Ee.errToObj(e).message ?? n\n } : {\n message: n\n };\n }\n } : {}\n });\n }\n strip() {\n return new $t({\n ...this._def,\n unknownKeys: \"strip\"\n });\n }\n passthrough() {\n return new $t({\n ...this._def,\n unknownKeys: \"passthrough\"\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(e) {\n return new $t({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...e\n })\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(e) {\n return new $t({\n unknownKeys: e._def.unknownKeys,\n catchall: e._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...e._def.shape()\n }),\n typeName: ke.ZodObject\n });\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(e, t) {\n return this.augment({ [e]: t });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(e) {\n return new $t({\n ...this._def,\n catchall: e\n });\n }\n pick(e) {\n const t = {};\n for (const r of Ze.objectKeys(e))\n e[r] && this.shape[r] && (t[r] = this.shape[r]);\n return new $t({\n ...this._def,\n shape: () => t\n });\n }\n omit(e) {\n const t = {};\n for (const r of Ze.objectKeys(this.shape))\n e[r] || (t[r] = this.shape[r]);\n return new $t({\n ...this._def,\n shape: () => t\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return mn(this);\n }\n partial(e) {\n const t = {};\n for (const r of Ze.objectKeys(this.shape)) {\n const n = this.shape[r];\n e && !e[r] ? t[r] = n : t[r] = n.optional();\n }\n return new $t({\n ...this._def,\n shape: () => t\n });\n }\n required(e) {\n const t = {};\n for (const r of Ze.objectKeys(this.shape))\n if (e && !e[r])\n t[r] = this.shape[r];\n else {\n let i = this.shape[r];\n for (; i instanceof fs; )\n i = i._def.innerType;\n t[r] = i;\n }\n return new $t({\n ...this._def,\n shape: () => t\n });\n }\n keyof() {\n return Nf(Ze.objectKeys(this.shape));\n }\n}\n$t.create = (s, e) => new $t({\n shape: () => s,\n unknownKeys: \"strip\",\n catchall: Ps.create(),\n typeName: ke.ZodObject,\n ...Ve(e)\n});\n$t.strictCreate = (s, e) => new $t({\n shape: () => s,\n unknownKeys: \"strict\",\n catchall: Ps.create(),\n typeName: ke.ZodObject,\n ...Ve(e)\n});\n$t.lazycreate = (s, e) => new $t({\n shape: s,\n unknownKeys: \"strip\",\n catchall: Ps.create(),\n typeName: ke.ZodObject,\n ...Ve(e)\n});\nclass wo extends Ye {\n _parse(e) {\n const { ctx: t } = this._processInputParams(e), r = this._def.options;\n function n(i) {\n for (const a of i)\n if (a.result.status === \"valid\")\n return a.result;\n for (const a of i)\n if (a.result.status === \"dirty\")\n return t.common.issues.push(...a.ctx.common.issues), a.result;\n const o = i.map((a) => new ps(a.ctx.common.issues));\n return he(t, {\n code: ae.invalid_union,\n unionErrors: o\n }), Re;\n }\n if (t.common.async)\n return Promise.all(r.map(async (i) => {\n const o = {\n ...t,\n common: {\n ...t.common,\n issues: []\n },\n parent: null\n };\n return {\n result: await i._parseAsync({\n data: t.data,\n path: t.path,\n parent: o\n }),\n ctx: o\n };\n })).then(n);\n {\n let i;\n const o = [];\n for (const l of r) {\n const c = {\n ...t,\n common: {\n ...t.common,\n issues: []\n },\n parent: null\n }, u = l._parseSync({\n data: t.data,\n path: t.path,\n parent: c\n });\n if (u.status === \"valid\")\n return u;\n u.status === \"dirty\" && !i && (i = { result: u, ctx: c }), c.common.issues.length && o.push(c.common.issues);\n }\n if (i)\n return t.common.issues.push(...i.ctx.common.issues), i.result;\n const a = o.map((l) => new ps(l));\n return he(t, {\n code: ae.invalid_union,\n unionErrors: a\n }), Re;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nwo.create = (s, e) => new wo({\n options: s,\n typeName: ke.ZodUnion,\n ...Ve(e)\n});\nconst os = (s) => s instanceof Yl ? os(s.schema) : s instanceof Ys ? os(s.innerType()) : s instanceof Io ? [s.value] : s instanceof zs ? s.options : s instanceof Zl ? Ze.objectValues(s.enum) : s instanceof Ro ? os(s._def.innerType) : s instanceof ql ? [void 0] : s instanceof Wl ? [null] : s instanceof fs ? [void 0, ...os(s.unwrap())] : s instanceof Zs ? [null, ...os(s.unwrap())] : s instanceof Uf || s instanceof Co ? os(s.unwrap()) : s instanceof Lo ? os(s._def.innerType) : [];\nclass Uc extends Ye {\n _parse(e) {\n const { ctx: t } = this._processInputParams(e);\n if (t.parsedType !== me.object)\n return he(t, {\n code: ae.invalid_type,\n expected: me.object,\n received: t.parsedType\n }), Re;\n const r = this.discriminator, n = t.data[r], i = this.optionsMap.get(n);\n return i ? t.common.async ? i._parseAsync({\n data: t.data,\n path: t.path,\n parent: t\n }) : i._parseSync({\n data: t.data,\n path: t.path,\n parent: t\n }) : (he(t, {\n code: ae.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [r]\n }), Re);\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(e, t, r) {\n const n = /* @__PURE__ */ new Map();\n for (const i of t) {\n const o = os(i.shape[e]);\n if (!o.length)\n throw new Error(`A discriminator value for key \\`${e}\\` could not be extracted from all schema options`);\n for (const a of o) {\n if (n.has(a))\n throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(a)}`);\n n.set(a, i);\n }\n }\n return new Uc({\n typeName: ke.ZodDiscriminatedUnion,\n discriminator: e,\n options: t,\n optionsMap: n,\n ...Ve(r)\n });\n }\n}\nfunction zl(s, e) {\n const t = ws(s), r = ws(e);\n if (s === e)\n return { valid: !0, data: s };\n if (t === me.object && r === me.object) {\n const n = Ze.objectKeys(e), i = Ze.objectKeys(s).filter((a) => n.indexOf(a) !== -1), o = { ...s, ...e };\n for (const a of i) {\n const l = zl(s[a], e[a]);\n if (!l.valid)\n return { valid: !1 };\n o[a] = l.data;\n }\n return { valid: !0, data: o };\n } else if (t === me.array && r === me.array) {\n if (s.length !== e.length)\n return { valid: !1 };\n const n = [];\n for (let i = 0; i < s.length; i++) {\n const o = s[i], a = e[i], l = zl(o, a);\n if (!l.valid)\n return { valid: !1 };\n n.push(l.data);\n }\n return { valid: !0, data: n };\n } else return t === me.date && r === me.date && +s == +e ? { valid: !0, data: s } : { valid: !1 };\n}\nclass Ao extends Ye {\n _parse(e) {\n const { status: t, ctx: r } = this._processInputParams(e), n = (i, o) => {\n if (Zu(i) || Zu(o))\n return Re;\n const a = zl(i.value, o.value);\n return a.valid ? ((Xu(i) || Xu(o)) && t.dirty(), { status: t.value, value: a.data }) : (he(r, {\n code: ae.invalid_intersection_types\n }), Re);\n };\n return r.common.async ? Promise.all([\n this._def.left._parseAsync({\n data: r.data,\n path: r.path,\n parent: r\n }),\n this._def.right._parseAsync({\n data: r.data,\n path: r.path,\n parent: r\n })\n ]).then(([i, o]) => n(i, o)) : n(this._def.left._parseSync({\n data: r.data,\n path: r.path,\n parent: r\n }), this._def.right._parseSync({\n data: r.data,\n path: r.path,\n parent: r\n }));\n }\n}\nAo.create = (s, e, t) => new Ao({\n left: s,\n right: e,\n typeName: ke.ZodIntersection,\n ...Ve(t)\n});\nclass Ws extends Ye {\n _parse(e) {\n const { status: t, ctx: r } = this._processInputParams(e);\n if (r.parsedType !== me.array)\n return he(r, {\n code: ae.invalid_type,\n expected: me.array,\n received: r.parsedType\n }), Re;\n if (r.data.length < this._def.items.length)\n return he(r, {\n code: ae.too_small,\n minimum: this._def.items.length,\n inclusive: !0,\n exact: !1,\n type: \"array\"\n }), Re;\n !this._def.rest && r.data.length > this._def.items.length && (he(r, {\n code: ae.too_big,\n maximum: this._def.items.length,\n inclusive: !0,\n exact: !1,\n type: \"array\"\n }), t.dirty());\n const i = [...r.data].map((o, a) => {\n const l = this._def.items[a] || this._def.rest;\n return l ? l._parse(new Ds(r, o, r.path, a)) : null;\n }).filter((o) => !!o);\n return r.common.async ? Promise.all(i).then((o) => wr.mergeArray(t, o)) : wr.mergeArray(t, i);\n }\n get items() {\n return this._def.items;\n }\n rest(e) {\n return new Ws({\n ...this._def,\n rest: e\n });\n }\n}\nWs.create = (s, e) => {\n if (!Array.isArray(s))\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n return new Ws({\n items: s,\n typeName: ke.ZodTuple,\n rest: null,\n ...Ve(e)\n });\n};\nclass sd extends Ye {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(e) {\n const { status: t, ctx: r } = this._processInputParams(e);\n if (r.parsedType !== me.map)\n return he(r, {\n code: ae.invalid_type,\n expected: me.map,\n received: r.parsedType\n }), Re;\n const n = this._def.keyType, i = this._def.valueType, o = [...r.data.entries()].map(([a, l], c) => ({\n key: n._parse(new Ds(r, a, r.path, [c, \"key\"])),\n value: i._parse(new Ds(r, l, r.path, [c, \"value\"]))\n }));\n if (r.common.async) {\n const a = /* @__PURE__ */ new Map();\n return Promise.resolve().then(async () => {\n for (const l of o) {\n const c = await l.key, u = await l.value;\n if (c.status === \"aborted\" || u.status === \"aborted\")\n return Re;\n (c.status === \"dirty\" || u.status === \"dirty\") && t.dirty(), a.set(c.value, u.value);\n }\n return { status: t.value, value: a };\n });\n } else {\n const a = /* @__PURE__ */ new Map();\n for (const l of o) {\n const c = l.key, u = l.value;\n if (c.status === \"aborted\" || u.status === \"aborted\")\n return Re;\n (c.status === \"dirty\" || u.status === \"dirty\") && t.dirty(), a.set(c.value, u.value);\n }\n return { status: t.value, value: a };\n }\n }\n}\nsd.create = (s, e, t) => new sd({\n valueType: e,\n keyType: s,\n typeName: ke.ZodMap,\n ...Ve(t)\n});\nclass Qn extends Ye {\n _parse(e) {\n const { status: t, ctx: r } = this._processInputParams(e);\n if (r.parsedType !== me.set)\n return he(r, {\n code: ae.invalid_type,\n expected: me.set,\n received: r.parsedType\n }), Re;\n const n = this._def;\n n.minSize !== null && r.data.size < n.minSize.value && (he(r, {\n code: ae.too_small,\n minimum: n.minSize.value,\n type: \"set\",\n inclusive: !0,\n exact: !1,\n message: n.minSize.message\n }), t.dirty()), n.maxSize !== null && r.data.size > n.maxSize.value && (he(r, {\n code: ae.too_big,\n maximum: n.maxSize.value,\n type: \"set\",\n inclusive: !0,\n exact: !1,\n message: n.maxSize.message\n }), t.dirty());\n const i = this._def.valueType;\n function o(l) {\n const c = /* @__PURE__ */ new Set();\n for (const u of l) {\n if (u.status === \"aborted\")\n return Re;\n u.status === \"dirty\" && t.dirty(), c.add(u.value);\n }\n return { status: t.value, value: c };\n }\n const a = [...r.data.values()].map((l, c) => i._parse(new Ds(r, l, r.path, c)));\n return r.common.async ? Promise.all(a).then((l) => o(l)) : o(a);\n }\n min(e, t) {\n return new Qn({\n ...this._def,\n minSize: { value: e, message: Ee.toString(t) }\n });\n }\n max(e, t) {\n return new Qn({\n ...this._def,\n maxSize: { value: e, message: Ee.toString(t) }\n });\n }\n size(e, t) {\n return this.min(e, t).max(e, t);\n }\n nonempty(e) {\n return this.min(1, e);\n }\n}\nQn.create = (s, e) => new Qn({\n valueType: s,\n minSize: null,\n maxSize: null,\n typeName: ke.ZodSet,\n ...Ve(e)\n});\nclass Yl extends Ye {\n get schema() {\n return this._def.getter();\n }\n _parse(e) {\n const { ctx: t } = this._processInputParams(e);\n return this._def.getter()._parse({ data: t.data, path: t.path, parent: t });\n }\n}\nYl.create = (s, e) => new Yl({\n getter: s,\n typeName: ke.ZodLazy,\n ...Ve(e)\n});\nclass Io extends Ye {\n _parse(e) {\n if (e.data !== this._def.value) {\n const t = this._getOrReturnCtx(e);\n return he(t, {\n received: t.data,\n code: ae.invalid_literal,\n expected: this._def.value\n }), Re;\n }\n return { status: \"valid\", value: e.data };\n }\n get value() {\n return this._def.value;\n }\n}\nIo.create = (s, e) => new Io({\n value: s,\n typeName: ke.ZodLiteral,\n ...Ve(e)\n});\nfunction Nf(s, e) {\n return new zs({\n values: s,\n typeName: ke.ZodEnum,\n ...Ve(e)\n });\n}\nclass zs extends Ye {\n _parse(e) {\n if (typeof e.data != \"string\") {\n const t = this._getOrReturnCtx(e), r = this._def.values;\n return he(t, {\n expected: Ze.joinValues(r),\n received: t.parsedType,\n code: ae.invalid_type\n }), Re;\n }\n if (this._cache || (this._cache = new Set(this._def.values)), !this._cache.has(e.data)) {\n const t = this._getOrReturnCtx(e), r = this._def.values;\n return he(t, {\n received: t.data,\n code: ae.invalid_enum_value,\n options: r\n }), Re;\n }\n return Rr(e.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const e = {};\n for (const t of this._def.values)\n e[t] = t;\n return e;\n }\n get Values() {\n const e = {};\n for (const t of this._def.values)\n e[t] = t;\n return e;\n }\n get Enum() {\n const e = {};\n for (const t of this._def.values)\n e[t] = t;\n return e;\n }\n extract(e, t = this._def) {\n return zs.create(e, {\n ...this._def,\n ...t\n });\n }\n exclude(e, t = this._def) {\n return zs.create(this.options.filter((r) => !e.includes(r)), {\n ...this._def,\n ...t\n });\n }\n}\nzs.create = Nf;\nclass Zl extends Ye {\n _parse(e) {\n const t = Ze.getValidEnumValues(this._def.values), r = this._getOrReturnCtx(e);\n if (r.parsedType !== me.string && r.parsedType !== me.number) {\n const n = Ze.objectValues(t);\n return he(r, {\n expected: Ze.joinValues(n),\n received: r.parsedType,\n code: ae.invalid_type\n }), Re;\n }\n if (this._cache || (this._cache = new Set(Ze.getValidEnumValues(this._def.values))), !this._cache.has(e.data)) {\n const n = Ze.objectValues(t);\n return he(r, {\n received: r.data,\n code: ae.invalid_enum_value,\n options: n\n }), Re;\n }\n return Rr(e.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZl.create = (s, e) => new Zl({\n values: s,\n typeName: ke.ZodNativeEnum,\n ...Ve(e)\n});\nclass _o extends Ye {\n unwrap() {\n return this._def.type;\n }\n _parse(e) {\n const { ctx: t } = this._processInputParams(e);\n if (t.parsedType !== me.promise && t.common.async === !1)\n return he(t, {\n code: ae.invalid_type,\n expected: me.promise,\n received: t.parsedType\n }), Re;\n const r = t.parsedType === me.promise ? t.data : Promise.resolve(t.data);\n return Rr(r.then((n) => this._def.type.parseAsync(n, {\n path: t.path,\n errorMap: t.common.contextualErrorMap\n })));\n }\n}\n_o.create = (s, e) => new _o({\n type: s,\n typeName: ke.ZodPromise,\n ...Ve(e)\n});\nclass Ys extends Ye {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ke.ZodEffects ? this._def.schema.sourceType() : this._def.schema;\n }\n _parse(e) {\n const { status: t, ctx: r } = this._processInputParams(e), n = this._def.effect || null, i = {\n addIssue: (o) => {\n he(r, o), o.fatal ? t.abort() : t.dirty();\n },\n get path() {\n return r.path;\n }\n };\n if (i.addIssue = i.addIssue.bind(i), n.type === \"preprocess\") {\n const o = n.transform(r.data, i);\n if (r.common.async)\n return Promise.resolve(o).then(async (a) => {\n if (t.value === \"aborted\")\n return Re;\n const l = await this._def.schema._parseAsync({\n data: a,\n path: r.path,\n parent: r\n });\n return l.status === \"aborted\" ? Re : l.status === \"dirty\" || t.value === \"dirty\" ? Wn(l.value) : l;\n });\n {\n if (t.value === \"aborted\")\n return Re;\n const a = this._def.schema._parseSync({\n data: o,\n path: r.path,\n parent: r\n });\n return a.status === \"aborted\" ? Re : a.status === \"dirty\" || t.value === \"dirty\" ? Wn(a.value) : a;\n }\n }\n if (n.type === \"refinement\") {\n const o = (a) => {\n const l = n.refinement(a, i);\n if (r.common.async)\n return Promise.resolve(l);\n if (l instanceof Promise)\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n return a;\n };\n if (r.common.async === !1) {\n const a = this._def.schema._parseSync({\n data: r.data,\n path: r.path,\n parent: r\n });\n return a.status === \"aborted\" ? Re : (a.status === \"dirty\" && t.dirty(), o(a.value), { status: t.value, value: a.value });\n } else\n return this._def.schema._parseAsync({ data: r.data, path: r.path, parent: r }).then((a) => a.status === \"aborted\" ? Re : (a.status === \"dirty\" && t.dirty(), o(a.value).then(() => ({ status: t.value, value: a.value }))));\n }\n if (n.type === \"transform\")\n if (r.common.async === !1) {\n const o = this._def.schema._parseSync({\n data: r.data,\n path: r.path,\n parent: r\n });\n if (!Ln(o))\n return Re;\n const a = n.transform(o.value, i);\n if (a instanceof Promise)\n throw new Error(\"Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.\");\n return { status: t.value, value: a };\n } else\n return this._def.schema._parseAsync({ data: r.data, path: r.path, parent: r }).then((o) => Ln(o) ? Promise.resolve(n.transform(o.value, i)).then((a) => ({\n status: t.value,\n value: a\n })) : Re);\n Ze.assertNever(n);\n }\n}\nYs.create = (s, e, t) => new Ys({\n schema: s,\n typeName: ke.ZodEffects,\n effect: e,\n ...Ve(t)\n});\nYs.createWithPreprocess = (s, e, t) => new Ys({\n schema: e,\n effect: { type: \"preprocess\", transform: s },\n typeName: ke.ZodEffects,\n ...Ve(t)\n});\nclass fs extends Ye {\n _parse(e) {\n return this._getType(e) === me.undefined ? Rr(void 0) : this._def.innerType._parse(e);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nfs.create = (s, e) => new fs({\n innerType: s,\n typeName: ke.ZodOptional,\n ...Ve(e)\n});\nclass Zs extends Ye {\n _parse(e) {\n return this._getType(e) === me.null ? Rr(null) : this._def.innerType._parse(e);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZs.create = (s, e) => new Zs({\n innerType: s,\n typeName: ke.ZodNullable,\n ...Ve(e)\n});\nclass Ro extends Ye {\n _parse(e) {\n const { ctx: t } = this._processInputParams(e);\n let r = t.data;\n return t.parsedType === me.undefined && (r = this._def.defaultValue()), this._def.innerType._parse({\n data: r,\n path: t.path,\n parent: t\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nRo.create = (s, e) => new Ro({\n innerType: s,\n typeName: ke.ZodDefault,\n defaultValue: typeof e.default == \"function\" ? e.default : () => e.default,\n ...Ve(e)\n});\nclass Lo extends Ye {\n _parse(e) {\n const { ctx: t } = this._processInputParams(e), r = {\n ...t,\n common: {\n ...t.common,\n issues: []\n }\n }, n = this._def.innerType._parse({\n data: r.data,\n path: r.path,\n parent: {\n ...r\n }\n });\n return bo(n) ? n.then((i) => ({\n status: \"valid\",\n value: i.status === \"valid\" ? i.value : this._def.catchValue({\n get error() {\n return new ps(r.common.issues);\n },\n input: r.data\n })\n })) : {\n status: \"valid\",\n value: n.status === \"valid\" ? n.value : this._def.catchValue({\n get error() {\n return new ps(r.common.issues);\n },\n input: r.data\n })\n };\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nLo.create = (s, e) => new Lo({\n innerType: s,\n typeName: ke.ZodCatch,\n catchValue: typeof e.catch == \"function\" ? e.catch : () => e.catch,\n ...Ve(e)\n});\nclass nd extends Ye {\n _parse(e) {\n if (this._getType(e) !== me.nan) {\n const r = this._getOrReturnCtx(e);\n return he(r, {\n code: ae.invalid_type,\n expected: me.nan,\n received: r.parsedType\n }), Re;\n }\n return { status: \"valid\", value: e.data };\n }\n}\nnd.create = (s) => new nd({\n typeName: ke.ZodNaN,\n ...Ve(s)\n});\nclass Uf extends Ye {\n _parse(e) {\n const { ctx: t } = this._processInputParams(e), r = t.data;\n return this._def.type._parse({\n data: r,\n path: t.path,\n parent: t\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass $c extends Ye {\n _parse(e) {\n const { status: t, ctx: r } = this._processInputParams(e);\n if (r.common.async)\n return (async () => {\n const i = await this._def.in._parseAsync({\n data: r.data,\n path: r.path,\n parent: r\n });\n return i.status === \"aborted\" ? Re : i.status === \"dirty\" ? (t.dirty(), Wn(i.value)) : this._def.out._parseAsync({\n data: i.value,\n path: r.path,\n parent: r\n });\n })();\n {\n const n = this._def.in._parseSync({\n data: r.data,\n path: r.path,\n parent: r\n });\n return n.status === \"aborted\" ? Re : n.status === \"dirty\" ? (t.dirty(), {\n status: \"dirty\",\n value: n.value\n }) : this._def.out._parseSync({\n data: n.value,\n path: r.path,\n parent: r\n });\n }\n }\n static create(e, t) {\n return new $c({\n in: e,\n out: t,\n typeName: ke.ZodPipeline\n });\n }\n}\nclass Co extends Ye {\n _parse(e) {\n const t = this._def.innerType._parse(e), r = (n) => (Ln(n) && (n.value = Object.freeze(n.value)), n);\n return bo(t) ? t.then((n) => r(n)) : r(t);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nCo.create = (s, e) => new Co({\n innerType: s,\n typeName: ke.ZodReadonly,\n ...Ve(e)\n});\nvar ke;\n(function(s) {\n s.ZodString = \"ZodString\", s.ZodNumber = \"ZodNumber\", s.ZodNaN = \"ZodNaN\", s.ZodBigInt = \"ZodBigInt\", s.ZodBoolean = \"ZodBoolean\", s.ZodDate = \"ZodDate\", s.ZodSymbol = \"ZodSymbol\", s.ZodUndefined = \"ZodUndefined\", s.ZodNull = \"ZodNull\", s.ZodAny = \"ZodAny\", s.ZodUnknown = \"ZodUnknown\", s.ZodNever = \"ZodNever\", s.ZodVoid = \"ZodVoid\", s.ZodArray = \"ZodArray\", s.ZodObject = \"ZodObject\", s.ZodUnion = \"ZodUnion\", s.ZodDiscriminatedUnion = \"ZodDiscriminatedUnion\", s.ZodIntersection = \"ZodIntersection\", s.ZodTuple = \"ZodTuple\", s.ZodRecord = \"ZodRecord\", s.ZodMap = \"ZodMap\", s.ZodSet = \"ZodSet\", s.ZodFunction = \"ZodFunction\", s.ZodLazy = \"ZodLazy\", s.ZodLiteral = \"ZodLiteral\", s.ZodEnum = \"ZodEnum\", s.ZodEffects = \"ZodEffects\", s.ZodNativeEnum = \"ZodNativeEnum\", s.ZodOptional = \"ZodOptional\", s.ZodNullable = \"ZodNullable\", s.ZodDefault = \"ZodDefault\", s.ZodCatch = \"ZodCatch\", s.ZodPromise = \"ZodPromise\", s.ZodBranded = \"ZodBranded\", s.ZodPipeline = \"ZodPipeline\", s.ZodReadonly = \"ZodReadonly\";\n})(ke || (ke = {}));\nconst xt = Rs.create, $f = Cn.create, Qm = Hl.create;\nPs.create;\nconst Ks = Yr.create, Jt = $t.create, ko = wo.create, Gf = Uc.create;\nAo.create;\nWs.create;\nconst ir = Io.create, Gc = zs.create;\n_o.create;\nfs.create;\nZs.create;\nconst e1 = /[@#$%^&*+=/\\\\|~«»]/, t1 = /(!{2,}|\\?{2,}|-{2,})/, r1 = /[\\u{1F300}-\\u{1F9FF}]|[\\u{2702}-\\u{27B0}]|[\\u{2600}-\\u{26FF}]|[\\u{2B00}-\\u{2BFF}]/u, $n = ({ max: s, noSpaces: e } = {}) => (e ? xt().max(s ?? Number.POSITIVE_INFINITY).regex(/^\\S*$/, \"Spaces are not allowed\") : xt().max(s ?? Number.POSITIVE_INFINITY)).refine((r) => !r1.test(r), {\n message: \"Emojis and symbols are not allowed\"\n}).refine((r) => !e1.test(r), {\n message: \"Special characters (@, #, $, %, ^, &, *, +, =, /, \\\\, |, ~, «, ») are not allowed\"\n}).refine((r) => !t1.test(r), {\n message: \"Repeated punctuations (!!, ??, --) are not allowed\"\n}), or = xt().url().startsWith(\"https://\", { message: \"Must be an https url\" }).max(1024).refine((s) => !s.includes(\" \"), {\n message: \"URL must not contain spaces\"\n}).refine((s) => {\n try {\n const e = new URL(s).hostname;\n return !(e === \"localhost\" || e.endsWith(\".localhost\") || /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(e) || e.startsWith(\"[\") && e.endsWith(\"]\"));\n } catch {\n return !1;\n }\n}, {\n message: \"URL must not use IP addresses or localhost\"\n}), Vc = xt().max(32), Vf = xt().max(32), s1 = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}\\/(?:[-a-z0-9]{3,8}:[-.%a-zA-Z0-9]{1,128}(?:\\/[-.%a-zA-Z0-9]{1,78})?|native)$/, n1 = xt().regex(s1, { message: \"Invalid CAIP-19 asset ID\" }), jc = xt().regex(/^#([0-9A-F]{3}|[0-9A-F]{6})$/i, {\n message: \"Invalid hex color code. It should be in the format #RRGGBB or #RGB.\"\n}), i1 = /^(?!.*\\.\\.)([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/, o1 = xt().max(1024).regex(i1, {\n message: \"Must be a valid domain name (e.g., example.com, sub.example.com)\"\n}).refine((s) => !s.includes(\"://\"), {\n message: \"Domain must not include protocol (http://, https://, etc.)\"\n}).refine((s) => !s.includes(\"/\"), {\n message: \"Domain must not include path separators\"\n}).refine((s) => !s.includes(\"@\"), {\n message: \"Domain must not include @ symbol\"\n}).refine((s) => !s.includes(\":\"), {\n message: \"Domain must not include port numbers\"\n}), a1 = ko([ir(\"1:1\"), ir(\"3:2\")]), l1 = Jt({\n header: xt(),\n payload: xt(),\n signature: xt()\n});\nJt({\n fid: $f(),\n type: ir(\"app_key\"),\n key: xt().startsWith(\"0x\")\n});\nconst c1 = Jt({\n type: ir(\"launch_frame\"),\n name: Vc,\n url: or.optional(),\n splashImageUrl: or.optional(),\n splashBackgroundColor: jc.optional()\n}), u1 = Jt({\n type: ir(\"launch_miniapp\"),\n name: Vc,\n url: or.optional(),\n splashImageUrl: or.optional(),\n splashBackgroundColor: jc.optional()\n}), d1 = Jt({\n type: ir(\"view_token\"),\n token: n1\n}), h1 = Gf(\"type\", [\n u1,\n d1,\n // Remove after compatibility period\n c1\n]), f1 = Jt({\n title: Vf,\n action: h1\n});\nJt({\n version: ko([xt(), $f()]).transform((s) => String(s)).pipe(ko([ir(\"next\"), ir(\"1\")])),\n imageUrl: or,\n aspectRatio: a1.optional(),\n button: f1\n});\nconst jf = Jt({\n url: xt(),\n token: xt()\n});\nJt({\n notificationId: xt().max(128),\n title: xt().max(32),\n body: xt().max(128),\n targetUrl: or,\n tokens: xt().array().max(100)\n});\nJt({\n result: Jt({\n successfulTokens: Ks(xt()),\n invalidTokens: Ks(xt()),\n rateLimitedTokens: Ks(xt())\n })\n});\nconst g1 = Jt({\n event: ir(\"miniapp_added\"),\n notificationDetails: jf.optional()\n}), p1 = Jt({\n event: ir(\"miniapp_removed\")\n}), m1 = Jt({\n event: ir(\"notifications_enabled\"),\n notificationDetails: jf.required()\n}), y1 = Jt({\n event: ir(\"notifications_disabled\")\n});\nGf(\"event\", [\n g1,\n p1,\n m1,\n y1\n]);\nconst v1 = [\n \"wallet.getEthereumProvider\",\n \"wallet.getSolanaProvider\",\n \"actions.ready\",\n \"actions.openUrl\",\n \"actions.close\",\n \"actions.setPrimaryButton\",\n \"actions.addMiniApp\",\n \"actions.signIn\",\n \"actions.viewCast\",\n \"actions.viewProfile\",\n \"actions.composeCast\",\n \"actions.viewToken\",\n \"actions.sendToken\",\n \"actions.swapToken\",\n \"actions.openMiniApp\",\n \"actions.requestCameraAndMicrophoneAccess\",\n \"experimental.signManifest\",\n \"haptics.impactOccurred\",\n \"haptics.notificationOccurred\",\n \"haptics.selectionChanged\",\n \"back\"\n], E1 = [\n \"games\",\n \"social\",\n \"finance\",\n \"utility\",\n \"productivity\",\n \"health-fitness\",\n \"news-media\",\n \"music\",\n \"shopping\",\n \"education\",\n \"developer-tools\",\n \"entertainment\",\n \"art-creativity\"\n], x1 = Gc(E1), S1 = ko([\n ir(\"0.0.0\"),\n ir(\"0.0.1\"),\n ir(\"1\"),\n ir(\"next\")\n]), b1 = $n({ max: 30 }), T1 = $n({ max: 170 }), w1 = Ks(or).max(3), A1 = Ks($n({ max: 20, noSpaces: !0 })).max(5), I1 = $n({ max: 30 }), _1 = $n({ max: 30 }), R1 = $n({ max: 100 }), L1 = Qm(), C1 = [\n \"eip155:1\",\n // Ethereum mainnet\n \"eip155:8453\",\n // Base mainnet\n \"eip155:42161\",\n // Arbitrum One\n \"eip155:421614\",\n // Arbitrum Sepolia\n \"eip155:84532\",\n // Base Sepolia\n \"eip155:666666666\",\n // Degen\n \"eip155:100\",\n // Gnosis\n \"eip155:10\",\n // Optimism\n \"eip155:11155420\",\n // Optimism Sepolia\n \"eip155:137\",\n // Polygon\n \"eip155:11155111\",\n // Ethereum Sepolia\n \"eip155:7777777\",\n // Zora\n \"eip155:130\",\n // Unichain\n \"eip155:10143\",\n // Monad testnet\n \"eip155:42220\",\n // Celo\n \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\"\n // Solana\n];\nfunction Kf(s) {\n const e = new Set(s);\n return Array.from(e);\n}\nconst k1 = Ks(Gc(C1)).transform(Kf), D1 = Ks(Gc(v1)).transform(Kf), id = Jt({\n // 0.0.0 and 0.0.1 are not technically part of the spec but kept for\n // backwards compatibility. next should always resolve to the most recent\n // schema version.\n version: S1,\n name: Vc,\n iconUrl: or,\n homeUrl: or,\n /** deprecated, set ogImageUrl instead */\n imageUrl: or.optional(),\n /** deprecated, will rely on fc:frame/fc:miniapp meta tag */\n buttonTitle: Vf.optional(),\n splashImageUrl: or.optional(),\n splashBackgroundColor: jc.optional(),\n webhookUrl: or.optional(),\n /** see: https://github.com/farcasterxyz/miniapps/discussions/191 */\n subtitle: b1.optional(),\n description: T1.optional(),\n screenshotUrls: w1.optional(),\n primaryCategory: x1.optional(),\n tags: A1.optional(),\n heroImageUrl: or.optional(),\n tagline: I1.optional(),\n ogTitle: _1.optional(),\n ogDescription: R1.optional(),\n ogImageUrl: or.optional(),\n /** see: https://github.com/farcasterxyz/miniapps/discussions/204 */\n noindex: L1.optional(),\n /** see https://github.com/farcasterxyz/miniapps/discussions/256 */\n requiredChains: k1.optional(),\n requiredCapabilities: D1.optional(),\n /** see https://github.com/farcasterxyz/miniapps/discussions/158 */\n /** Documentation will be added once this feature is finalized. */\n castShareUrl: or.optional(),\n /** Canonical domain for the miniapp application */\n canonicalDomain: o1.optional()\n}).refine((s) => {\n if (s.castShareUrl === void 0)\n return !0;\n try {\n const e = new URL(s.homeUrl).hostname, t = new URL(s.castShareUrl).hostname;\n return e === t;\n } catch {\n return !1;\n }\n}, {\n message: \"castShareUrl must have the same domain as homeUrl\",\n path: [\"castShareUrl\"]\n});\nJt({\n accountAssociation: l1,\n miniapp: id.optional(),\n // Support both 'frame' and 'miniapp' during transition period\n frame: id.optional()\n}).refine((s) => s.frame && s.miniapp ? JSON.stringify(s.frame) === JSON.stringify(s.miniapp) : !0, {\n message: 'If both \"frame\" and \"miniapp\" are provided, they must be identical',\n path: [\"frame\", \"miniapp\"]\n}).transform((s) => ({\n ...s,\n frame: s.frame ?? s.miniapp\n}));\nvar Ga = {}, Hn = {}, od;\nfunction P1() {\n if (od) return Hn;\n od = 1, Hn.byteLength = a, Hn.toByteArray = c, Hn.fromByteArray = h;\n for (var s = [], e = [], t = typeof Uint8Array < \"u\" ? Uint8Array : Array, r = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\", n = 0, i = r.length; n < i; ++n)\n s[n] = r[n], e[r.charCodeAt(n)] = n;\n e[45] = 62, e[95] = 63;\n function o(f) {\n var p = f.length;\n if (p % 4 > 0)\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\n var y = f.indexOf(\"=\");\n y === -1 && (y = p);\n var E = y === p ? 0 : 4 - y % 4;\n return [y, E];\n }\n function a(f) {\n var p = o(f), y = p[0], E = p[1];\n return (y + E) * 3 / 4 - E;\n }\n function l(f, p, y) {\n return (p + y) * 3 / 4 - y;\n }\n function c(f) {\n var p, y = o(f), E = y[0], b = y[1], R = new t(l(f, E, b)), A = 0, F = b > 0 ? E - 4 : E, M;\n for (M = 0; M < F; M += 4)\n p = e[f.charCodeAt(M)] << 18 | e[f.charCodeAt(M + 1)] << 12 | e[f.charCodeAt(M + 2)] << 6 | e[f.charCodeAt(M + 3)], R[A++] = p >> 16 & 255, R[A++] = p >> 8 & 255, R[A++] = p & 255;\n return b === 2 && (p = e[f.charCodeAt(M)] << 2 | e[f.charCodeAt(M + 1)] >> 4, R[A++] = p & 255), b === 1 && (p = e[f.charCodeAt(M)] << 10 | e[f.charCodeAt(M + 1)] << 4 | e[f.charCodeAt(M + 2)] >> 2, R[A++] = p >> 8 & 255, R[A++] = p & 255), R;\n }\n function u(f) {\n return s[f >> 18 & 63] + s[f >> 12 & 63] + s[f >> 6 & 63] + s[f & 63];\n }\n function d(f, p, y) {\n for (var E, b = [], R = p; R < y; R += 3)\n E = (f[R] << 16 & 16711680) + (f[R + 1] << 8 & 65280) + (f[R + 2] & 255), b.push(u(E));\n return b.join(\"\");\n }\n function h(f) {\n for (var p, y = f.length, E = y % 3, b = [], R = 16383, A = 0, F = y - E; A < F; A += R)\n b.push(d(f, A, A + R > F ? F : A + R));\n return E === 1 ? (p = f[y - 1], b.push(\n s[p >> 2] + s[p << 4 & 63] + \"==\"\n )) : E === 2 && (p = (f[y - 2] << 8) + f[y - 1], b.push(\n s[p >> 10] + s[p >> 4 & 63] + s[p << 2 & 63] + \"=\"\n )), b.join(\"\");\n }\n return Hn;\n}\nvar Mi = {};\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nvar ad;\nfunction M1() {\n return ad || (ad = 1, Mi.read = function(s, e, t, r, n) {\n var i, o, a = n * 8 - r - 1, l = (1 << a) - 1, c = l >> 1, u = -7, d = t ? n - 1 : 0, h = t ? -1 : 1, f = s[e + d];\n for (d += h, i = f & (1 << -u) - 1, f >>= -u, u += a; u > 0; i = i * 256 + s[e + d], d += h, u -= 8)\n ;\n for (o = i & (1 << -u) - 1, i >>= -u, u += r; u > 0; o = o * 256 + s[e + d], d += h, u -= 8)\n ;\n if (i === 0)\n i = 1 - c;\n else {\n if (i === l)\n return o ? NaN : (f ? -1 : 1) * (1 / 0);\n o = o + Math.pow(2, r), i = i - c;\n }\n return (f ? -1 : 1) * o * Math.pow(2, i - r);\n }, Mi.write = function(s, e, t, r, n, i) {\n var o, a, l, c = i * 8 - n - 1, u = (1 << c) - 1, d = u >> 1, h = n === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, f = r ? 0 : i - 1, p = r ? 1 : -1, y = e < 0 || e === 0 && 1 / e < 0 ? 1 : 0;\n for (e = Math.abs(e), isNaN(e) || e === 1 / 0 ? (a = isNaN(e) ? 1 : 0, o = u) : (o = Math.floor(Math.log(e) / Math.LN2), e * (l = Math.pow(2, -o)) < 1 && (o--, l *= 2), o + d >= 1 ? e += h / l : e += h * Math.pow(2, 1 - d), e * l >= 2 && (o++, l /= 2), o + d >= u ? (a = 0, o = u) : o + d >= 1 ? (a = (e * l - 1) * Math.pow(2, n), o = o + d) : (a = e * Math.pow(2, d - 1) * Math.pow(2, n), o = 0)); n >= 8; s[t + f] = a & 255, f += p, a /= 256, n -= 8)\n ;\n for (o = o << n | a, c += n; c > 0; s[t + f] = o & 255, f += p, o /= 256, c -= 8)\n ;\n s[t + f - p] |= y * 128;\n }), Mi;\n}\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\nvar ld;\nfunction Kc() {\n return ld || (ld = 1, (function(s) {\n const e = P1(), t = M1(), r = typeof Symbol == \"function\" && typeof Symbol.for == \"function\" ? Symbol.for(\"nodejs.util.inspect.custom\") : null;\n s.Buffer = a, s.SlowBuffer = R, s.INSPECT_MAX_BYTES = 50;\n const n = 2147483647;\n s.kMaxLength = n, a.TYPED_ARRAY_SUPPORT = i(), !a.TYPED_ARRAY_SUPPORT && typeof console < \"u\" && typeof console.error == \"function\" && console.error(\n \"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\"\n );\n function i() {\n try {\n const B = new Uint8Array(1), S = { foo: function() {\n return 42;\n } };\n return Object.setPrototypeOf(S, Uint8Array.prototype), Object.setPrototypeOf(B, S), B.foo() === 42;\n } catch {\n return !1;\n }\n }\n Object.defineProperty(a.prototype, \"parent\", {\n enumerable: !0,\n get: function() {\n if (a.isBuffer(this))\n return this.buffer;\n }\n }), Object.defineProperty(a.prototype, \"offset\", {\n enumerable: !0,\n get: function() {\n if (a.isBuffer(this))\n return this.byteOffset;\n }\n });\n function o(B) {\n if (B > n)\n throw new RangeError('The value \"' + B + '\" is invalid for option \"size\"');\n const S = new Uint8Array(B);\n return Object.setPrototypeOf(S, a.prototype), S;\n }\n function a(B, S, T) {\n if (typeof B == \"number\") {\n if (typeof S == \"string\")\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n );\n return d(B);\n }\n return l(B, S, T);\n }\n a.poolSize = 8192;\n function l(B, S, T) {\n if (typeof B == \"string\")\n return h(B, S);\n if (ArrayBuffer.isView(B))\n return p(B);\n if (B == null)\n throw new TypeError(\n \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof B\n );\n if (dt(B, ArrayBuffer) || B && dt(B.buffer, ArrayBuffer) || typeof SharedArrayBuffer < \"u\" && (dt(B, SharedArrayBuffer) || B && dt(B.buffer, SharedArrayBuffer)))\n return y(B, S, T);\n if (typeof B == \"number\")\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n );\n const G = B.valueOf && B.valueOf();\n if (G != null && G !== B)\n return a.from(G, S, T);\n const Z = E(B);\n if (Z) return Z;\n if (typeof Symbol < \"u\" && Symbol.toPrimitive != null && typeof B[Symbol.toPrimitive] == \"function\")\n return a.from(B[Symbol.toPrimitive](\"string\"), S, T);\n throw new TypeError(\n \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof B\n );\n }\n a.from = function(B, S, T) {\n return l(B, S, T);\n }, Object.setPrototypeOf(a.prototype, Uint8Array.prototype), Object.setPrototypeOf(a, Uint8Array);\n function c(B) {\n if (typeof B != \"number\")\n throw new TypeError('\"size\" argument must be of type number');\n if (B < 0)\n throw new RangeError('The value \"' + B + '\" is invalid for option \"size\"');\n }\n function u(B, S, T) {\n return c(B), B <= 0 ? o(B) : S !== void 0 ? typeof T == \"string\" ? o(B).fill(S, T) : o(B).fill(S) : o(B);\n }\n a.alloc = function(B, S, T) {\n return u(B, S, T);\n };\n function d(B) {\n return c(B), o(B < 0 ? 0 : b(B) | 0);\n }\n a.allocUnsafe = function(B) {\n return d(B);\n }, a.allocUnsafeSlow = function(B) {\n return d(B);\n };\n function h(B, S) {\n if ((typeof S != \"string\" || S === \"\") && (S = \"utf8\"), !a.isEncoding(S))\n throw new TypeError(\"Unknown encoding: \" + S);\n const T = A(B, S) | 0;\n let G = o(T);\n const Z = G.write(B, S);\n return Z !== T && (G = G.slice(0, Z)), G;\n }\n function f(B) {\n const S = B.length < 0 ? 0 : b(B.length) | 0, T = o(S);\n for (let G = 0; G < S; G += 1)\n T[G] = B[G] & 255;\n return T;\n }\n function p(B) {\n if (dt(B, Uint8Array)) {\n const S = new Uint8Array(B);\n return y(S.buffer, S.byteOffset, S.byteLength);\n }\n return f(B);\n }\n function y(B, S, T) {\n if (S < 0 || B.byteLength < S)\n throw new RangeError('\"offset\" is outside of buffer bounds');\n if (B.byteLength < S + (T || 0))\n throw new RangeError('\"length\" is outside of buffer bounds');\n let G;\n return S === void 0 && T === void 0 ? G = new Uint8Array(B) : T === void 0 ? G = new Uint8Array(B, S) : G = new Uint8Array(B, S, T), Object.setPrototypeOf(G, a.prototype), G;\n }\n function E(B) {\n if (a.isBuffer(B)) {\n const S = b(B.length) | 0, T = o(S);\n return T.length === 0 || B.copy(T, 0, 0, S), T;\n }\n if (B.length !== void 0)\n return typeof B.length != \"number\" || Je(B.length) ? o(0) : f(B);\n if (B.type === \"Buffer\" && Array.isArray(B.data))\n return f(B.data);\n }\n function b(B) {\n if (B >= n)\n throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + n.toString(16) + \" bytes\");\n return B | 0;\n }\n function R(B) {\n return +B != B && (B = 0), a.alloc(+B);\n }\n a.isBuffer = function(S) {\n return S != null && S._isBuffer === !0 && S !== a.prototype;\n }, a.compare = function(S, T) {\n if (dt(S, Uint8Array) && (S = a.from(S, S.offset, S.byteLength)), dt(T, Uint8Array) && (T = a.from(T, T.offset, T.byteLength)), !a.isBuffer(S) || !a.isBuffer(T))\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n );\n if (S === T) return 0;\n let G = S.length, Z = T.length;\n for (let Q = 0, se = Math.min(G, Z); Q < se; ++Q)\n if (S[Q] !== T[Q]) {\n G = S[Q], Z = T[Q];\n break;\n }\n return G < Z ? -1 : Z < G ? 1 : 0;\n }, a.isEncoding = function(S) {\n switch (String(S).toLowerCase()) {\n case \"hex\":\n case \"utf8\":\n case \"utf-8\":\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n case \"base64\":\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return !0;\n default:\n return !1;\n }\n }, a.concat = function(S, T) {\n if (!Array.isArray(S))\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n if (S.length === 0)\n return a.alloc(0);\n let G;\n if (T === void 0)\n for (T = 0, G = 0; G < S.length; ++G)\n T += S[G].length;\n const Z = a.allocUnsafe(T);\n let Q = 0;\n for (G = 0; G < S.length; ++G) {\n let se = S[G];\n if (dt(se, Uint8Array))\n Q + se.length > Z.length ? (a.isBuffer(se) || (se = a.from(se)), se.copy(Z, Q)) : Uint8Array.prototype.set.call(\n Z,\n se,\n Q\n );\n else if (a.isBuffer(se))\n se.copy(Z, Q);\n else\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n Q += se.length;\n }\n return Z;\n };\n function A(B, S) {\n if (a.isBuffer(B))\n return B.length;\n if (ArrayBuffer.isView(B) || dt(B, ArrayBuffer))\n return B.byteLength;\n if (typeof B != \"string\")\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof B\n );\n const T = B.length, G = arguments.length > 2 && arguments[2] === !0;\n if (!G && T === 0) return 0;\n let Z = !1;\n for (; ; )\n switch (S) {\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n return T;\n case \"utf8\":\n case \"utf-8\":\n return be(B).length;\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return T * 2;\n case \"hex\":\n return T >>> 1;\n case \"base64\":\n return we(B).length;\n default:\n if (Z)\n return G ? -1 : be(B).length;\n S = (\"\" + S).toLowerCase(), Z = !0;\n }\n }\n a.byteLength = A;\n function F(B, S, T) {\n let G = !1;\n if ((S === void 0 || S < 0) && (S = 0), S > this.length || ((T === void 0 || T > this.length) && (T = this.length), T <= 0) || (T >>>= 0, S >>>= 0, T <= S))\n return \"\";\n for (B || (B = \"utf8\"); ; )\n switch (B) {\n case \"hex\":\n return U(this, S, T);\n case \"utf8\":\n case \"utf-8\":\n return g(this, S, T);\n case \"ascii\":\n return D(this, S, T);\n case \"latin1\":\n case \"binary\":\n return O(this, S, T);\n case \"base64\":\n return _(this, S, T);\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return V(this, S, T);\n default:\n if (G) throw new TypeError(\"Unknown encoding: \" + B);\n B = (B + \"\").toLowerCase(), G = !0;\n }\n }\n a.prototype._isBuffer = !0;\n function M(B, S, T) {\n const G = B[S];\n B[S] = B[T], B[T] = G;\n }\n a.prototype.swap16 = function() {\n const S = this.length;\n if (S % 2 !== 0)\n throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n for (let T = 0; T < S; T += 2)\n M(this, T, T + 1);\n return this;\n }, a.prototype.swap32 = function() {\n const S = this.length;\n if (S % 4 !== 0)\n throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n for (let T = 0; T < S; T += 4)\n M(this, T, T + 3), M(this, T + 1, T + 2);\n return this;\n }, a.prototype.swap64 = function() {\n const S = this.length;\n if (S % 8 !== 0)\n throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n for (let T = 0; T < S; T += 8)\n M(this, T, T + 7), M(this, T + 1, T + 6), M(this, T + 2, T + 5), M(this, T + 3, T + 4);\n return this;\n }, a.prototype.toString = function() {\n const S = this.length;\n return S === 0 ? \"\" : arguments.length === 0 ? g(this, 0, S) : F.apply(this, arguments);\n }, a.prototype.toLocaleString = a.prototype.toString, a.prototype.equals = function(S) {\n if (!a.isBuffer(S)) throw new TypeError(\"Argument must be a Buffer\");\n return this === S ? !0 : a.compare(this, S) === 0;\n }, a.prototype.inspect = function() {\n let S = \"\";\n const T = s.INSPECT_MAX_BYTES;\n return S = this.toString(\"hex\", 0, T).replace(/(.{2})/g, \"$1 \").trim(), this.length > T && (S += \" ... \"), \"<Buffer \" + S + \">\";\n }, r && (a.prototype[r] = a.prototype.inspect), a.prototype.compare = function(S, T, G, Z, Q) {\n if (dt(S, Uint8Array) && (S = a.from(S, S.offset, S.byteLength)), !a.isBuffer(S))\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof S\n );\n if (T === void 0 && (T = 0), G === void 0 && (G = S ? S.length : 0), Z === void 0 && (Z = 0), Q === void 0 && (Q = this.length), T < 0 || G > S.length || Z < 0 || Q > this.length)\n throw new RangeError(\"out of range index\");\n if (Z >= Q && T >= G)\n return 0;\n if (Z >= Q)\n return -1;\n if (T >= G)\n return 1;\n if (T >>>= 0, G >>>= 0, Z >>>= 0, Q >>>= 0, this === S) return 0;\n let se = Q - Z, Ue = G - T;\n const Pe = Math.min(se, Ue), Le = this.slice(Z, Q), ct = S.slice(T, G);\n for (let Ae = 0; Ae < Pe; ++Ae)\n if (Le[Ae] !== ct[Ae]) {\n se = Le[Ae], Ue = ct[Ae];\n break;\n }\n return se < Ue ? -1 : Ue < se ? 1 : 0;\n };\n function H(B, S, T, G, Z) {\n if (B.length === 0) return -1;\n if (typeof T == \"string\" ? (G = T, T = 0) : T > 2147483647 ? T = 2147483647 : T < -2147483648 && (T = -2147483648), T = +T, Je(T) && (T = Z ? 0 : B.length - 1), T < 0 && (T = B.length + T), T >= B.length) {\n if (Z) return -1;\n T = B.length - 1;\n } else if (T < 0)\n if (Z) T = 0;\n else return -1;\n if (typeof S == \"string\" && (S = a.from(S, G)), a.isBuffer(S))\n return S.length === 0 ? -1 : K(B, S, T, G, Z);\n if (typeof S == \"number\")\n return S = S & 255, typeof Uint8Array.prototype.indexOf == \"function\" ? Z ? Uint8Array.prototype.indexOf.call(B, S, T) : Uint8Array.prototype.lastIndexOf.call(B, S, T) : K(B, [S], T, G, Z);\n throw new TypeError(\"val must be string, number or Buffer\");\n }\n function K(B, S, T, G, Z) {\n let Q = 1, se = B.length, Ue = S.length;\n if (G !== void 0 && (G = String(G).toLowerCase(), G === \"ucs2\" || G === \"ucs-2\" || G === \"utf16le\" || G === \"utf-16le\")) {\n if (B.length < 2 || S.length < 2)\n return -1;\n Q = 2, se /= 2, Ue /= 2, T /= 2;\n }\n function Pe(ct, Ae) {\n return Q === 1 ? ct[Ae] : ct.readUInt16BE(Ae * Q);\n }\n let Le;\n if (Z) {\n let ct = -1;\n for (Le = T; Le < se; Le++)\n if (Pe(B, Le) === Pe(S, ct === -1 ? 0 : Le - ct)) {\n if (ct === -1 && (ct = Le), Le - ct + 1 === Ue) return ct * Q;\n } else\n ct !== -1 && (Le -= Le - ct), ct = -1;\n } else\n for (T + Ue > se && (T = se - Ue), Le = T; Le >= 0; Le--) {\n let ct = !0;\n for (let Ae = 0; Ae < Ue; Ae++)\n if (Pe(B, Le + Ae) !== Pe(S, Ae)) {\n ct = !1;\n break;\n }\n if (ct) return Le;\n }\n return -1;\n }\n a.prototype.includes = function(S, T, G) {\n return this.indexOf(S, T, G) !== -1;\n }, a.prototype.indexOf = function(S, T, G) {\n return H(this, S, T, G, !0);\n }, a.prototype.lastIndexOf = function(S, T, G) {\n return H(this, S, T, G, !1);\n };\n function j(B, S, T, G) {\n T = Number(T) || 0;\n const Z = B.length - T;\n G ? (G = Number(G), G > Z && (G = Z)) : G = Z;\n const Q = S.length;\n G > Q / 2 && (G = Q / 2);\n let se;\n for (se = 0; se < G; ++se) {\n const Ue = parseInt(S.substr(se * 2, 2), 16);\n if (Je(Ue)) return se;\n B[T + se] = Ue;\n }\n return se;\n }\n function C(B, S, T, G) {\n return Ne(be(S, B.length - T), B, T, G);\n }\n function k(B, S, T, G) {\n return Ne(Fe(S), B, T, G);\n }\n function $(B, S, T, G) {\n return Ne(we(S), B, T, G);\n }\n function W(B, S, T, G) {\n return Ne(Xe(S, B.length - T), B, T, G);\n }\n a.prototype.write = function(S, T, G, Z) {\n if (T === void 0)\n Z = \"utf8\", G = this.length, T = 0;\n else if (G === void 0 && typeof T == \"string\")\n Z = T, G = this.length, T = 0;\n else if (isFinite(T))\n T = T >>> 0, isFinite(G) ? (G = G >>> 0, Z === void 0 && (Z = \"utf8\")) : (Z = G, G = void 0);\n else\n throw new Error(\n \"Buffer.write(string, encoding, offset[, length]) is no longer supported\"\n );\n const Q = this.length - T;\n if ((G === void 0 || G > Q) && (G = Q), S.length > 0 && (G < 0 || T < 0) || T > this.length)\n throw new RangeError(\"Attempt to write outside buffer bounds\");\n Z || (Z = \"utf8\");\n let se = !1;\n for (; ; )\n switch (Z) {\n case \"hex\":\n return j(this, S, T, G);\n case \"utf8\":\n case \"utf-8\":\n return C(this, S, T, G);\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n return k(this, S, T, G);\n case \"base64\":\n return $(this, S, T, G);\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return W(this, S, T, G);\n default:\n if (se) throw new TypeError(\"Unknown encoding: \" + Z);\n Z = (\"\" + Z).toLowerCase(), se = !0;\n }\n }, a.prototype.toJSON = function() {\n return {\n type: \"Buffer\",\n data: Array.prototype.slice.call(this._arr || this, 0)\n };\n };\n function _(B, S, T) {\n return S === 0 && T === B.length ? e.fromByteArray(B) : e.fromByteArray(B.slice(S, T));\n }\n function g(B, S, T) {\n T = Math.min(B.length, T);\n const G = [];\n let Z = S;\n for (; Z < T; ) {\n const Q = B[Z];\n let se = null, Ue = Q > 239 ? 4 : Q > 223 ? 3 : Q > 191 ? 2 : 1;\n if (Z + Ue <= T) {\n let Pe, Le, ct, Ae;\n switch (Ue) {\n case 1:\n Q < 128 && (se = Q);\n break;\n case 2:\n Pe = B[Z + 1], (Pe & 192) === 128 && (Ae = (Q & 31) << 6 | Pe & 63, Ae > 127 && (se = Ae));\n break;\n case 3:\n Pe = B[Z + 1], Le = B[Z + 2], (Pe & 192) === 128 && (Le & 192) === 128 && (Ae = (Q & 15) << 12 | (Pe & 63) << 6 | Le & 63, Ae > 2047 && (Ae < 55296 || Ae > 57343) && (se = Ae));\n break;\n case 4:\n Pe = B[Z + 1], Le = B[Z + 2], ct = B[Z + 3], (Pe & 192) === 128 && (Le & 192) === 128 && (ct & 192) === 128 && (Ae = (Q & 15) << 18 | (Pe & 63) << 12 | (Le & 63) << 6 | ct & 63, Ae > 65535 && Ae < 1114112 && (se = Ae));\n }\n }\n se === null ? (se = 65533, Ue = 1) : se > 65535 && (se -= 65536, G.push(se >>> 10 & 1023 | 55296), se = 56320 | se & 1023), G.push(se), Z += Ue;\n }\n return w(G);\n }\n const x = 4096;\n function w(B) {\n const S = B.length;\n if (S <= x)\n return String.fromCharCode.apply(String, B);\n let T = \"\", G = 0;\n for (; G < S; )\n T += String.fromCharCode.apply(\n String,\n B.slice(G, G += x)\n );\n return T;\n }\n function D(B, S, T) {\n let G = \"\";\n T = Math.min(B.length, T);\n for (let Z = S; Z < T; ++Z)\n G += String.fromCharCode(B[Z] & 127);\n return G;\n }\n function O(B, S, T) {\n let G = \"\";\n T = Math.min(B.length, T);\n for (let Z = S; Z < T; ++Z)\n G += String.fromCharCode(B[Z]);\n return G;\n }\n function U(B, S, T) {\n const G = B.length;\n (!S || S < 0) && (S = 0), (!T || T < 0 || T > G) && (T = G);\n let Z = \"\";\n for (let Q = S; Q < T; ++Q)\n Z += Qe[B[Q]];\n return Z;\n }\n function V(B, S, T) {\n const G = B.slice(S, T);\n let Z = \"\";\n for (let Q = 0; Q < G.length - 1; Q += 2)\n Z += String.fromCharCode(G[Q] + G[Q + 1] * 256);\n return Z;\n }\n a.prototype.slice = function(S, T) {\n const G = this.length;\n S = ~~S, T = T === void 0 ? G : ~~T, S < 0 ? (S += G, S < 0 && (S = 0)) : S > G && (S = G), T < 0 ? (T += G, T < 0 && (T = 0)) : T > G && (T = G), T < S && (T = S);\n const Z = this.subarray(S, T);\n return Object.setPrototypeOf(Z, a.prototype), Z;\n };\n function L(B, S, T) {\n if (B % 1 !== 0 || B < 0) throw new RangeError(\"offset is not uint\");\n if (B + S > T) throw new RangeError(\"Trying to access beyond buffer length\");\n }\n a.prototype.readUintLE = a.prototype.readUIntLE = function(S, T, G) {\n S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n let Z = this[S], Q = 1, se = 0;\n for (; ++se < T && (Q *= 256); )\n Z += this[S + se] * Q;\n return Z;\n }, a.prototype.readUintBE = a.prototype.readUIntBE = function(S, T, G) {\n S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n let Z = this[S + --T], Q = 1;\n for (; T > 0 && (Q *= 256); )\n Z += this[S + --T] * Q;\n return Z;\n }, a.prototype.readUint8 = a.prototype.readUInt8 = function(S, T) {\n return S = S >>> 0, T || L(S, 1, this.length), this[S];\n }, a.prototype.readUint16LE = a.prototype.readUInt16LE = function(S, T) {\n return S = S >>> 0, T || L(S, 2, this.length), this[S] | this[S + 1] << 8;\n }, a.prototype.readUint16BE = a.prototype.readUInt16BE = function(S, T) {\n return S = S >>> 0, T || L(S, 2, this.length), this[S] << 8 | this[S + 1];\n }, a.prototype.readUint32LE = a.prototype.readUInt32LE = function(S, T) {\n return S = S >>> 0, T || L(S, 4, this.length), (this[S] | this[S + 1] << 8 | this[S + 2] << 16) + this[S + 3] * 16777216;\n }, a.prototype.readUint32BE = a.prototype.readUInt32BE = function(S, T) {\n return S = S >>> 0, T || L(S, 4, this.length), this[S] * 16777216 + (this[S + 1] << 16 | this[S + 2] << 8 | this[S + 3]);\n }, a.prototype.readBigUInt64LE = it(function(S) {\n S = S >>> 0, _e(S, \"offset\");\n const T = this[S], G = this[S + 7];\n (T === void 0 || G === void 0) && xe(S, this.length - 8);\n const Z = T + this[++S] * 2 ** 8 + this[++S] * 2 ** 16 + this[++S] * 2 ** 24, Q = this[++S] + this[++S] * 2 ** 8 + this[++S] * 2 ** 16 + G * 2 ** 24;\n return BigInt(Z) + (BigInt(Q) << BigInt(32));\n }), a.prototype.readBigUInt64BE = it(function(S) {\n S = S >>> 0, _e(S, \"offset\");\n const T = this[S], G = this[S + 7];\n (T === void 0 || G === void 0) && xe(S, this.length - 8);\n const Z = T * 2 ** 24 + this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + this[++S], Q = this[++S] * 2 ** 24 + this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + G;\n return (BigInt(Z) << BigInt(32)) + BigInt(Q);\n }), a.prototype.readIntLE = function(S, T, G) {\n S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n let Z = this[S], Q = 1, se = 0;\n for (; ++se < T && (Q *= 256); )\n Z += this[S + se] * Q;\n return Q *= 128, Z >= Q && (Z -= Math.pow(2, 8 * T)), Z;\n }, a.prototype.readIntBE = function(S, T, G) {\n S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n let Z = T, Q = 1, se = this[S + --Z];\n for (; Z > 0 && (Q *= 256); )\n se += this[S + --Z] * Q;\n return Q *= 128, se >= Q && (se -= Math.pow(2, 8 * T)), se;\n }, a.prototype.readInt8 = function(S, T) {\n return S = S >>> 0, T || L(S, 1, this.length), this[S] & 128 ? (255 - this[S] + 1) * -1 : this[S];\n }, a.prototype.readInt16LE = function(S, T) {\n S = S >>> 0, T || L(S, 2, this.length);\n const G = this[S] | this[S + 1] << 8;\n return G & 32768 ? G | 4294901760 : G;\n }, a.prototype.readInt16BE = function(S, T) {\n S = S >>> 0, T || L(S, 2, this.length);\n const G = this[S + 1] | this[S] << 8;\n return G & 32768 ? G | 4294901760 : G;\n }, a.prototype.readInt32LE = function(S, T) {\n return S = S >>> 0, T || L(S, 4, this.length), this[S] | this[S + 1] << 8 | this[S + 2] << 16 | this[S + 3] << 24;\n }, a.prototype.readInt32BE = function(S, T) {\n return S = S >>> 0, T || L(S, 4, this.length), this[S] << 24 | this[S + 1] << 16 | this[S + 2] << 8 | this[S + 3];\n }, a.prototype.readBigInt64LE = it(function(S) {\n S = S >>> 0, _e(S, \"offset\");\n const T = this[S], G = this[S + 7];\n (T === void 0 || G === void 0) && xe(S, this.length - 8);\n const Z = this[S + 4] + this[S + 5] * 2 ** 8 + this[S + 6] * 2 ** 16 + (G << 24);\n return (BigInt(Z) << BigInt(32)) + BigInt(T + this[++S] * 2 ** 8 + this[++S] * 2 ** 16 + this[++S] * 2 ** 24);\n }), a.prototype.readBigInt64BE = it(function(S) {\n S = S >>> 0, _e(S, \"offset\");\n const T = this[S], G = this[S + 7];\n (T === void 0 || G === void 0) && xe(S, this.length - 8);\n const Z = (T << 24) + // Overflow\n this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + this[++S];\n return (BigInt(Z) << BigInt(32)) + BigInt(this[++S] * 2 ** 24 + this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + G);\n }), a.prototype.readFloatLE = function(S, T) {\n return S = S >>> 0, T || L(S, 4, this.length), t.read(this, S, !0, 23, 4);\n }, a.prototype.readFloatBE = function(S, T) {\n return S = S >>> 0, T || L(S, 4, this.length), t.read(this, S, !1, 23, 4);\n }, a.prototype.readDoubleLE = function(S, T) {\n return S = S >>> 0, T || L(S, 8, this.length), t.read(this, S, !0, 52, 8);\n }, a.prototype.readDoubleBE = function(S, T) {\n return S = S >>> 0, T || L(S, 8, this.length), t.read(this, S, !1, 52, 8);\n };\n function m(B, S, T, G, Z, Q) {\n if (!a.isBuffer(B)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n if (S > Z || S < Q) throw new RangeError('\"value\" argument is out of bounds');\n if (T + G > B.length) throw new RangeError(\"Index out of range\");\n }\n a.prototype.writeUintLE = a.prototype.writeUIntLE = function(S, T, G, Z) {\n if (S = +S, T = T >>> 0, G = G >>> 0, !Z) {\n const Ue = Math.pow(2, 8 * G) - 1;\n m(this, S, T, G, Ue, 0);\n }\n let Q = 1, se = 0;\n for (this[T] = S & 255; ++se < G && (Q *= 256); )\n this[T + se] = S / Q & 255;\n return T + G;\n }, a.prototype.writeUintBE = a.prototype.writeUIntBE = function(S, T, G, Z) {\n if (S = +S, T = T >>> 0, G = G >>> 0, !Z) {\n const Ue = Math.pow(2, 8 * G) - 1;\n m(this, S, T, G, Ue, 0);\n }\n let Q = G - 1, se = 1;\n for (this[T + Q] = S & 255; --Q >= 0 && (se *= 256); )\n this[T + Q] = S / se & 255;\n return T + G;\n }, a.prototype.writeUint8 = a.prototype.writeUInt8 = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 1, 255, 0), this[T] = S & 255, T + 1;\n }, a.prototype.writeUint16LE = a.prototype.writeUInt16LE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 2, 65535, 0), this[T] = S & 255, this[T + 1] = S >>> 8, T + 2;\n }, a.prototype.writeUint16BE = a.prototype.writeUInt16BE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 2, 65535, 0), this[T] = S >>> 8, this[T + 1] = S & 255, T + 2;\n }, a.prototype.writeUint32LE = a.prototype.writeUInt32LE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 4, 4294967295, 0), this[T + 3] = S >>> 24, this[T + 2] = S >>> 16, this[T + 1] = S >>> 8, this[T] = S & 255, T + 4;\n }, a.prototype.writeUint32BE = a.prototype.writeUInt32BE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 4, 4294967295, 0), this[T] = S >>> 24, this[T + 1] = S >>> 16, this[T + 2] = S >>> 8, this[T + 3] = S & 255, T + 4;\n };\n function v(B, S, T, G, Z) {\n ze(S, G, Z, B, T, 7);\n let Q = Number(S & BigInt(4294967295));\n B[T++] = Q, Q = Q >> 8, B[T++] = Q, Q = Q >> 8, B[T++] = Q, Q = Q >> 8, B[T++] = Q;\n let se = Number(S >> BigInt(32) & BigInt(4294967295));\n return B[T++] = se, se = se >> 8, B[T++] = se, se = se >> 8, B[T++] = se, se = se >> 8, B[T++] = se, T;\n }\n function P(B, S, T, G, Z) {\n ze(S, G, Z, B, T, 7);\n let Q = Number(S & BigInt(4294967295));\n B[T + 7] = Q, Q = Q >> 8, B[T + 6] = Q, Q = Q >> 8, B[T + 5] = Q, Q = Q >> 8, B[T + 4] = Q;\n let se = Number(S >> BigInt(32) & BigInt(4294967295));\n return B[T + 3] = se, se = se >> 8, B[T + 2] = se, se = se >> 8, B[T + 1] = se, se = se >> 8, B[T] = se, T + 8;\n }\n a.prototype.writeBigUInt64LE = it(function(S, T = 0) {\n return v(this, S, T, BigInt(0), BigInt(\"0xffffffffffffffff\"));\n }), a.prototype.writeBigUInt64BE = it(function(S, T = 0) {\n return P(this, S, T, BigInt(0), BigInt(\"0xffffffffffffffff\"));\n }), a.prototype.writeIntLE = function(S, T, G, Z) {\n if (S = +S, T = T >>> 0, !Z) {\n const Pe = Math.pow(2, 8 * G - 1);\n m(this, S, T, G, Pe - 1, -Pe);\n }\n let Q = 0, se = 1, Ue = 0;\n for (this[T] = S & 255; ++Q < G && (se *= 256); )\n S < 0 && Ue === 0 && this[T + Q - 1] !== 0 && (Ue = 1), this[T + Q] = (S / se >> 0) - Ue & 255;\n return T + G;\n }, a.prototype.writeIntBE = function(S, T, G, Z) {\n if (S = +S, T = T >>> 0, !Z) {\n const Pe = Math.pow(2, 8 * G - 1);\n m(this, S, T, G, Pe - 1, -Pe);\n }\n let Q = G - 1, se = 1, Ue = 0;\n for (this[T + Q] = S & 255; --Q >= 0 && (se *= 256); )\n S < 0 && Ue === 0 && this[T + Q + 1] !== 0 && (Ue = 1), this[T + Q] = (S / se >> 0) - Ue & 255;\n return T + G;\n }, a.prototype.writeInt8 = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 1, 127, -128), S < 0 && (S = 255 + S + 1), this[T] = S & 255, T + 1;\n }, a.prototype.writeInt16LE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 2, 32767, -32768), this[T] = S & 255, this[T + 1] = S >>> 8, T + 2;\n }, a.prototype.writeInt16BE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 2, 32767, -32768), this[T] = S >>> 8, this[T + 1] = S & 255, T + 2;\n }, a.prototype.writeInt32LE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 4, 2147483647, -2147483648), this[T] = S & 255, this[T + 1] = S >>> 8, this[T + 2] = S >>> 16, this[T + 3] = S >>> 24, T + 4;\n }, a.prototype.writeInt32BE = function(S, T, G) {\n return S = +S, T = T >>> 0, G || m(this, S, T, 4, 2147483647, -2147483648), S < 0 && (S = 4294967295 + S + 1), this[T] = S >>> 24, this[T + 1] = S >>> 16, this[T + 2] = S >>> 8, this[T + 3] = S & 255, T + 4;\n }, a.prototype.writeBigInt64LE = it(function(S, T = 0) {\n return v(this, S, T, -BigInt(\"0x8000000000000000\"), BigInt(\"0x7fffffffffffffff\"));\n }), a.prototype.writeBigInt64BE = it(function(S, T = 0) {\n return P(this, S, T, -BigInt(\"0x8000000000000000\"), BigInt(\"0x7fffffffffffffff\"));\n });\n function N(B, S, T, G, Z, Q) {\n if (T + G > B.length) throw new RangeError(\"Index out of range\");\n if (T < 0) throw new RangeError(\"Index out of range\");\n }\n function Y(B, S, T, G, Z) {\n return S = +S, T = T >>> 0, Z || N(B, S, T, 4), t.write(B, S, T, G, 23, 4), T + 4;\n }\n a.prototype.writeFloatLE = function(S, T, G) {\n return Y(this, S, T, !0, G);\n }, a.prototype.writeFloatBE = function(S, T, G) {\n return Y(this, S, T, !1, G);\n };\n function ee(B, S, T, G, Z) {\n return S = +S, T = T >>> 0, Z || N(B, S, T, 8), t.write(B, S, T, G, 52, 8), T + 8;\n }\n a.prototype.writeDoubleLE = function(S, T, G) {\n return ee(this, S, T, !0, G);\n }, a.prototype.writeDoubleBE = function(S, T, G) {\n return ee(this, S, T, !1, G);\n }, a.prototype.copy = function(S, T, G, Z) {\n if (!a.isBuffer(S)) throw new TypeError(\"argument should be a Buffer\");\n if (G || (G = 0), !Z && Z !== 0 && (Z = this.length), T >= S.length && (T = S.length), T || (T = 0), Z > 0 && Z < G && (Z = G), Z === G || S.length === 0 || this.length === 0) return 0;\n if (T < 0)\n throw new RangeError(\"targetStart out of bounds\");\n if (G < 0 || G >= this.length) throw new RangeError(\"Index out of range\");\n if (Z < 0) throw new RangeError(\"sourceEnd out of bounds\");\n Z > this.length && (Z = this.length), S.length - T < Z - G && (Z = S.length - T + G);\n const Q = Z - G;\n return this === S && typeof Uint8Array.prototype.copyWithin == \"function\" ? this.copyWithin(T, G, Z) : Uint8Array.prototype.set.call(\n S,\n this.subarray(G, Z),\n T\n ), Q;\n }, a.prototype.fill = function(S, T, G, Z) {\n if (typeof S == \"string\") {\n if (typeof T == \"string\" ? (Z = T, T = 0, G = this.length) : typeof G == \"string\" && (Z = G, G = this.length), Z !== void 0 && typeof Z != \"string\")\n throw new TypeError(\"encoding must be a string\");\n if (typeof Z == \"string\" && !a.isEncoding(Z))\n throw new TypeError(\"Unknown encoding: \" + Z);\n if (S.length === 1) {\n const se = S.charCodeAt(0);\n (Z === \"utf8\" && se < 128 || Z === \"latin1\") && (S = se);\n }\n } else typeof S == \"number\" ? S = S & 255 : typeof S == \"boolean\" && (S = Number(S));\n if (T < 0 || this.length < T || this.length < G)\n throw new RangeError(\"Out of range index\");\n if (G <= T)\n return this;\n T = T >>> 0, G = G === void 0 ? this.length : G >>> 0, S || (S = 0);\n let Q;\n if (typeof S == \"number\")\n for (Q = T; Q < G; ++Q)\n this[Q] = S;\n else {\n const se = a.isBuffer(S) ? S : a.from(S, Z), Ue = se.length;\n if (Ue === 0)\n throw new TypeError('The value \"' + S + '\" is invalid for argument \"value\"');\n for (Q = 0; Q < G - T; ++Q)\n this[Q + T] = se[Q % Ue];\n }\n return this;\n };\n const ie = {};\n function le(B, S, T) {\n ie[B] = class extends T {\n constructor() {\n super(), Object.defineProperty(this, \"message\", {\n value: S.apply(this, arguments),\n writable: !0,\n configurable: !0\n }), this.name = `${this.name} [${B}]`, this.stack, delete this.name;\n }\n get code() {\n return B;\n }\n set code(Z) {\n Object.defineProperty(this, \"code\", {\n configurable: !0,\n enumerable: !0,\n value: Z,\n writable: !0\n });\n }\n toString() {\n return `${this.name} [${B}]: ${this.message}`;\n }\n };\n }\n le(\n \"ERR_BUFFER_OUT_OF_BOUNDS\",\n function(B) {\n return B ? `${B} is outside of buffer bounds` : \"Attempt to access memory outside buffer bounds\";\n },\n RangeError\n ), le(\n \"ERR_INVALID_ARG_TYPE\",\n function(B, S) {\n return `The \"${B}\" argument must be of type number. Received type ${typeof S}`;\n },\n TypeError\n ), le(\n \"ERR_OUT_OF_RANGE\",\n function(B, S, T) {\n let G = `The value of \"${B}\" is out of range.`, Z = T;\n return Number.isInteger(T) && Math.abs(T) > 2 ** 32 ? Z = Te(String(T)) : typeof T == \"bigint\" && (Z = String(T), (T > BigInt(2) ** BigInt(32) || T < -(BigInt(2) ** BigInt(32))) && (Z = Te(Z)), Z += \"n\"), G += ` It must be ${S}. Received ${Z}`, G;\n },\n RangeError\n );\n function Te(B) {\n let S = \"\", T = B.length;\n const G = B[0] === \"-\" ? 1 : 0;\n for (; T >= G + 4; T -= 3)\n S = `_${B.slice(T - 3, T)}${S}`;\n return `${B.slice(0, T)}${S}`;\n }\n function De(B, S, T) {\n _e(S, \"offset\"), (B[S] === void 0 || B[S + T] === void 0) && xe(S, B.length - (T + 1));\n }\n function ze(B, S, T, G, Z, Q) {\n if (B > T || B < S) {\n const se = typeof S == \"bigint\" ? \"n\" : \"\";\n let Ue;\n throw S === 0 || S === BigInt(0) ? Ue = `>= 0${se} and < 2${se} ** ${(Q + 1) * 8}${se}` : Ue = `>= -(2${se} ** ${(Q + 1) * 8 - 1}${se}) and < 2 ** ${(Q + 1) * 8 - 1}${se}`, new ie.ERR_OUT_OF_RANGE(\"value\", Ue, B);\n }\n De(G, Z, Q);\n }\n function _e(B, S) {\n if (typeof B != \"number\")\n throw new ie.ERR_INVALID_ARG_TYPE(S, \"number\", B);\n }\n function xe(B, S, T) {\n throw Math.floor(B) !== B ? (_e(B, T), new ie.ERR_OUT_OF_RANGE(\"offset\", \"an integer\", B)) : S < 0 ? new ie.ERR_BUFFER_OUT_OF_BOUNDS() : new ie.ERR_OUT_OF_RANGE(\n \"offset\",\n `>= 0 and <= ${S}`,\n B\n );\n }\n const Be = /[^+/0-9A-Za-z-_]/g;\n function ye(B) {\n if (B = B.split(\"=\")[0], B = B.trim().replace(Be, \"\"), B.length < 2) return \"\";\n for (; B.length % 4 !== 0; )\n B = B + \"=\";\n return B;\n }\n function be(B, S) {\n S = S || 1 / 0;\n let T;\n const G = B.length;\n let Z = null;\n const Q = [];\n for (let se = 0; se < G; ++se) {\n if (T = B.charCodeAt(se), T > 55295 && T < 57344) {\n if (!Z) {\n if (T > 56319) {\n (S -= 3) > -1 && Q.push(239, 191, 189);\n continue;\n } else if (se + 1 === G) {\n (S -= 3) > -1 && Q.push(239, 191, 189);\n continue;\n }\n Z = T;\n continue;\n }\n if (T < 56320) {\n (S -= 3) > -1 && Q.push(239, 191, 189), Z = T;\n continue;\n }\n T = (Z - 55296 << 10 | T - 56320) + 65536;\n } else Z && (S -= 3) > -1 && Q.push(239, 191, 189);\n if (Z = null, T < 128) {\n if ((S -= 1) < 0) break;\n Q.push(T);\n } else if (T < 2048) {\n if ((S -= 2) < 0) break;\n Q.push(\n T >> 6 | 192,\n T & 63 | 128\n );\n } else if (T < 65536) {\n if ((S -= 3) < 0) break;\n Q.push(\n T >> 12 | 224,\n T >> 6 & 63 | 128,\n T & 63 | 128\n );\n } else if (T < 1114112) {\n if ((S -= 4) < 0) break;\n Q.push(\n T >> 18 | 240,\n T >> 12 & 63 | 128,\n T >> 6 & 63 | 128,\n T & 63 | 128\n );\n } else\n throw new Error(\"Invalid code point\");\n }\n return Q;\n }\n function Fe(B) {\n const S = [];\n for (let T = 0; T < B.length; ++T)\n S.push(B.charCodeAt(T) & 255);\n return S;\n }\n function Xe(B, S) {\n let T, G, Z;\n const Q = [];\n for (let se = 0; se < B.length && !((S -= 2) < 0); ++se)\n T = B.charCodeAt(se), G = T >> 8, Z = T % 256, Q.push(Z), Q.push(G);\n return Q;\n }\n function we(B) {\n return e.toByteArray(ye(B));\n }\n function Ne(B, S, T, G) {\n let Z;\n for (Z = 0; Z < G && !(Z + T >= S.length || Z >= B.length); ++Z)\n S[Z + T] = B[Z];\n return Z;\n }\n function dt(B, S) {\n return B instanceof S || B != null && B.constructor != null && B.constructor.name != null && B.constructor.name === S.name;\n }\n function Je(B) {\n return B !== B;\n }\n const Qe = (function() {\n const B = \"0123456789abcdef\", S = new Array(256);\n for (let T = 0; T < 16; ++T) {\n const G = T * 16;\n for (let Z = 0; Z < 16; ++Z)\n S[G + Z] = B[T] + B[Z];\n }\n return S;\n })();\n function it(B) {\n return typeof BigInt > \"u\" ? je : B;\n }\n function je() {\n throw new Error(\"BigInt not supported\");\n }\n })(Ga)), Ga;\n}\nvar He = Kc();\nconst ln = typeof globalThis == \"object\" && \"crypto\" in globalThis ? globalThis.crypto : void 0;\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction Ii(s) {\n return s instanceof Uint8Array || ArrayBuffer.isView(s) && s.constructor.name === \"Uint8Array\";\n}\nfunction Xl(s) {\n if (!Number.isSafeInteger(s) || s < 0)\n throw new Error(\"positive integer expected, got \" + s);\n}\nfunction Qs(s, ...e) {\n if (!Ii(s))\n throw new Error(\"Uint8Array expected\");\n if (e.length > 0 && !e.includes(s.length))\n throw new Error(\"Uint8Array expected of length \" + e + \", got length=\" + s.length);\n}\nfunction Hf(s) {\n if (typeof s != \"function\" || typeof s.create != \"function\")\n throw new Error(\"Hash should be wrapped by utils.createHasher\");\n Xl(s.outputLen), Xl(s.blockLen);\n}\nfunction Do(s, e = !0) {\n if (s.destroyed)\n throw new Error(\"Hash instance has been destroyed\");\n if (e && s.finished)\n throw new Error(\"Hash#digest() has already been called\");\n}\nfunction O1(s, e) {\n Qs(s);\n const t = e.outputLen;\n if (s.length < t)\n throw new Error(\"digestInto() expects output buffer of length at least \" + t);\n}\nfunction kn(...s) {\n for (let e = 0; e < s.length; e++)\n s[e].fill(0);\n}\nfunction Va(s) {\n return new DataView(s.buffer, s.byteOffset, s.byteLength);\n}\nfunction Nr(s, e) {\n return s << 32 - e | s >>> e;\n}\nconst qf = /* @ts-ignore */ typeof Uint8Array.from([]).toHex == \"function\" && typeof Uint8Array.fromHex == \"function\", B1 = /* @__PURE__ */ Array.from({ length: 256 }, (s, e) => e.toString(16).padStart(2, \"0\"));\nfunction Hs(s) {\n if (Qs(s), qf)\n return s.toHex();\n let e = \"\";\n for (let t = 0; t < s.length; t++)\n e += B1[s[t]];\n return e;\n}\nconst rs = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction cd(s) {\n if (s >= rs._0 && s <= rs._9)\n return s - rs._0;\n if (s >= rs.A && s <= rs.F)\n return s - (rs.A - 10);\n if (s >= rs.a && s <= rs.f)\n return s - (rs.a - 10);\n}\nfunction Po(s) {\n if (typeof s != \"string\")\n throw new Error(\"hex string expected, got \" + typeof s);\n if (qf)\n return Uint8Array.fromHex(s);\n const e = s.length, t = e / 2;\n if (e % 2)\n throw new Error(\"hex string expected, got unpadded hex of length \" + e);\n const r = new Uint8Array(t);\n for (let n = 0, i = 0; n < t; n++, i += 2) {\n const o = cd(s.charCodeAt(i)), a = cd(s.charCodeAt(i + 1));\n if (o === void 0 || a === void 0) {\n const l = s[i] + s[i + 1];\n throw new Error('hex string expected, got non-hex character \"' + l + '\" at index ' + i);\n }\n r[n] = o * 16 + a;\n }\n return r;\n}\nfunction F1(s) {\n if (typeof s != \"string\")\n throw new Error(\"string expected\");\n return new Uint8Array(new TextEncoder().encode(s));\n}\nfunction Hc(s) {\n return typeof s == \"string\" && (s = F1(s)), Qs(s), s;\n}\nfunction Kr(...s) {\n let e = 0;\n for (let r = 0; r < s.length; r++) {\n const n = s[r];\n Qs(n), e += n.length;\n }\n const t = new Uint8Array(e);\n for (let r = 0, n = 0; r < s.length; r++) {\n const i = s[r];\n t.set(i, n), n += i.length;\n }\n return t;\n}\nclass Wf {\n}\nfunction zf(s) {\n const e = (r) => s().update(Hc(r)).digest(), t = s();\n return e.outputLen = t.outputLen, e.blockLen = t.blockLen, e.create = () => s(), e;\n}\nfunction qc(s = 32) {\n if (ln && typeof ln.getRandomValues == \"function\")\n return ln.getRandomValues(new Uint8Array(s));\n if (ln && typeof ln.randomBytes == \"function\")\n return Uint8Array.from(ln.randomBytes(s));\n throw new Error(\"crypto.getRandomValues must be defined\");\n}\nfunction N1(s, e, t, r) {\n if (typeof s.setBigUint64 == \"function\")\n return s.setBigUint64(e, t, r);\n const n = BigInt(32), i = BigInt(4294967295), o = Number(t >> n & i), a = Number(t & i), l = r ? 4 : 0, c = r ? 0 : 4;\n s.setUint32(e + l, o, r), s.setUint32(e + c, a, r);\n}\nfunction U1(s, e, t) {\n return s & e ^ ~s & t;\n}\nfunction $1(s, e, t) {\n return s & e ^ s & t ^ e & t;\n}\nclass Yf extends Wf {\n constructor(e, t, r, n) {\n super(), this.finished = !1, this.length = 0, this.pos = 0, this.destroyed = !1, this.blockLen = e, this.outputLen = t, this.padOffset = r, this.isLE = n, this.buffer = new Uint8Array(e), this.view = Va(this.buffer);\n }\n update(e) {\n Do(this), e = Hc(e), Qs(e);\n const { view: t, buffer: r, blockLen: n } = this, i = e.length;\n for (let o = 0; o < i; ) {\n const a = Math.min(n - this.pos, i - o);\n if (a === n) {\n const l = Va(e);\n for (; n <= i - o; o += n)\n this.process(l, o);\n continue;\n }\n r.set(e.subarray(o, o + a), this.pos), this.pos += a, o += a, this.pos === n && (this.process(t, 0), this.pos = 0);\n }\n return this.length += e.length, this.roundClean(), this;\n }\n digestInto(e) {\n Do(this), O1(e, this), this.finished = !0;\n const { buffer: t, view: r, blockLen: n, isLE: i } = this;\n let { pos: o } = this;\n t[o++] = 128, kn(this.buffer.subarray(o)), this.padOffset > n - o && (this.process(r, 0), o = 0);\n for (let d = o; d < n; d++)\n t[d] = 0;\n N1(r, n - 8, BigInt(this.length * 8), i), this.process(r, 0);\n const a = Va(e), l = this.outputLen;\n if (l % 4)\n throw new Error(\"_sha2: outputLen should be aligned to 32bit\");\n const c = l / 4, u = this.get();\n if (c > u.length)\n throw new Error(\"_sha2: outputLen bigger than state\");\n for (let d = 0; d < c; d++)\n a.setUint32(4 * d, u[d], i);\n }\n digest() {\n const { buffer: e, outputLen: t } = this;\n this.digestInto(e);\n const r = e.slice(0, t);\n return this.destroy(), r;\n }\n _cloneInto(e) {\n e || (e = new this.constructor()), e.set(...this.get());\n const { blockLen: t, buffer: r, length: n, finished: i, destroyed: o, pos: a } = this;\n return e.destroyed = o, e.finished = i, e.length = n, e.pos = a, n % t && e.buffer.set(r), e;\n }\n clone() {\n return this._cloneInto();\n }\n}\nconst ms = /* @__PURE__ */ Uint32Array.from([\n 1779033703,\n 3144134277,\n 1013904242,\n 2773480762,\n 1359893119,\n 2600822924,\n 528734635,\n 1541459225\n]), Qt = /* @__PURE__ */ Uint32Array.from([\n 1779033703,\n 4089235720,\n 3144134277,\n 2227873595,\n 1013904242,\n 4271175723,\n 2773480762,\n 1595750129,\n 1359893119,\n 2917565137,\n 2600822924,\n 725511199,\n 528734635,\n 4215389547,\n 1541459225,\n 327033209\n]), Oi = /* @__PURE__ */ BigInt(2 ** 32 - 1), ud = /* @__PURE__ */ BigInt(32);\nfunction G1(s, e = !1) {\n return e ? { h: Number(s & Oi), l: Number(s >> ud & Oi) } : { h: Number(s >> ud & Oi) | 0, l: Number(s & Oi) | 0 };\n}\nfunction V1(s, e = !1) {\n const t = s.length;\n let r = new Uint32Array(t), n = new Uint32Array(t);\n for (let i = 0; i < t; i++) {\n const { h: o, l: a } = G1(s[i], e);\n [r[i], n[i]] = [o, a];\n }\n return [r, n];\n}\nconst dd = (s, e, t) => s >>> t, hd = (s, e, t) => s << 32 - t | e >>> t, cn = (s, e, t) => s >>> t | e << 32 - t, un = (s, e, t) => s << 32 - t | e >>> t, Bi = (s, e, t) => s << 64 - t | e >>> t - 32, Fi = (s, e, t) => s >>> t - 32 | e << 64 - t;\nfunction ss(s, e, t, r) {\n const n = (e >>> 0) + (r >>> 0);\n return { h: s + t + (n / 2 ** 32 | 0) | 0, l: n | 0 };\n}\nconst j1 = (s, e, t) => (s >>> 0) + (e >>> 0) + (t >>> 0), K1 = (s, e, t, r) => e + t + r + (s / 2 ** 32 | 0) | 0, H1 = (s, e, t, r) => (s >>> 0) + (e >>> 0) + (t >>> 0) + (r >>> 0), q1 = (s, e, t, r, n) => e + t + r + n + (s / 2 ** 32 | 0) | 0, W1 = (s, e, t, r, n) => (s >>> 0) + (e >>> 0) + (t >>> 0) + (r >>> 0) + (n >>> 0), z1 = (s, e, t, r, n, i) => e + t + r + n + i + (s / 2 ** 32 | 0) | 0, Y1 = /* @__PURE__ */ Uint32Array.from([\n 1116352408,\n 1899447441,\n 3049323471,\n 3921009573,\n 961987163,\n 1508970993,\n 2453635748,\n 2870763221,\n 3624381080,\n 310598401,\n 607225278,\n 1426881987,\n 1925078388,\n 2162078206,\n 2614888103,\n 3248222580,\n 3835390401,\n 4022224774,\n 264347078,\n 604807628,\n 770255983,\n 1249150122,\n 1555081692,\n 1996064986,\n 2554220882,\n 2821834349,\n 2952996808,\n 3210313671,\n 3336571891,\n 3584528711,\n 113926993,\n 338241895,\n 666307205,\n 773529912,\n 1294757372,\n 1396182291,\n 1695183700,\n 1986661051,\n 2177026350,\n 2456956037,\n 2730485921,\n 2820302411,\n 3259730800,\n 3345764771,\n 3516065817,\n 3600352804,\n 4094571909,\n 275423344,\n 430227734,\n 506948616,\n 659060556,\n 883997877,\n 958139571,\n 1322822218,\n 1537002063,\n 1747873779,\n 1955562222,\n 2024104815,\n 2227730452,\n 2361852424,\n 2428436474,\n 2756734187,\n 3204031479,\n 3329325298\n]), ys = /* @__PURE__ */ new Uint32Array(64);\nclass Z1 extends Yf {\n constructor(e = 32) {\n super(64, e, 8, !1), this.A = ms[0] | 0, this.B = ms[1] | 0, this.C = ms[2] | 0, this.D = ms[3] | 0, this.E = ms[4] | 0, this.F = ms[5] | 0, this.G = ms[6] | 0, this.H = ms[7] | 0;\n }\n get() {\n const { A: e, B: t, C: r, D: n, E: i, F: o, G: a, H: l } = this;\n return [e, t, r, n, i, o, a, l];\n }\n // prettier-ignore\n set(e, t, r, n, i, o, a, l) {\n this.A = e | 0, this.B = t | 0, this.C = r | 0, this.D = n | 0, this.E = i | 0, this.F = o | 0, this.G = a | 0, this.H = l | 0;\n }\n process(e, t) {\n for (let d = 0; d < 16; d++, t += 4)\n ys[d] = e.getUint32(t, !1);\n for (let d = 16; d < 64; d++) {\n const h = ys[d - 15], f = ys[d - 2], p = Nr(h, 7) ^ Nr(h, 18) ^ h >>> 3, y = Nr(f, 17) ^ Nr(f, 19) ^ f >>> 10;\n ys[d] = y + ys[d - 7] + p + ys[d - 16] | 0;\n }\n let { A: r, B: n, C: i, D: o, E: a, F: l, G: c, H: u } = this;\n for (let d = 0; d < 64; d++) {\n const h = Nr(a, 6) ^ Nr(a, 11) ^ Nr(a, 25), f = u + h + U1(a, l, c) + Y1[d] + ys[d] | 0, y = (Nr(r, 2) ^ Nr(r, 13) ^ Nr(r, 22)) + $1(r, n, i) | 0;\n u = c, c = l, l = a, a = o + f | 0, o = i, i = n, n = r, r = f + y | 0;\n }\n r = r + this.A | 0, n = n + this.B | 0, i = i + this.C | 0, o = o + this.D | 0, a = a + this.E | 0, l = l + this.F | 0, c = c + this.G | 0, u = u + this.H | 0, this.set(r, n, i, o, a, l, c, u);\n }\n roundClean() {\n kn(ys);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0), kn(this.buffer);\n }\n}\nconst Zf = V1([\n \"0x428a2f98d728ae22\",\n \"0x7137449123ef65cd\",\n \"0xb5c0fbcfec4d3b2f\",\n \"0xe9b5dba58189dbbc\",\n \"0x3956c25bf348b538\",\n \"0x59f111f1b605d019\",\n \"0x923f82a4af194f9b\",\n \"0xab1c5ed5da6d8118\",\n \"0xd807aa98a3030242\",\n \"0x12835b0145706fbe\",\n \"0x243185be4ee4b28c\",\n \"0x550c7dc3d5ffb4e2\",\n \"0x72be5d74f27b896f\",\n \"0x80deb1fe3b1696b1\",\n \"0x9bdc06a725c71235\",\n \"0xc19bf174cf692694\",\n \"0xe49b69c19ef14ad2\",\n \"0xefbe4786384f25e3\",\n \"0x0fc19dc68b8cd5b5\",\n \"0x240ca1cc77ac9c65\",\n \"0x2de92c6f592b0275\",\n \"0x4a7484aa6ea6e483\",\n \"0x5cb0a9dcbd41fbd4\",\n \"0x76f988da831153b5\",\n \"0x983e5152ee66dfab\",\n \"0xa831c66d2db43210\",\n \"0xb00327c898fb213f\",\n \"0xbf597fc7beef0ee4\",\n \"0xc6e00bf33da88fc2\",\n \"0xd5a79147930aa725\",\n \"0x06ca6351e003826f\",\n \"0x142929670a0e6e70\",\n \"0x27b70a8546d22ffc\",\n \"0x2e1b21385c26c926\",\n \"0x4d2c6dfc5ac42aed\",\n \"0x53380d139d95b3df\",\n \"0x650a73548baf63de\",\n \"0x766a0abb3c77b2a8\",\n \"0x81c2c92e47edaee6\",\n \"0x92722c851482353b\",\n \"0xa2bfe8a14cf10364\",\n \"0xa81a664bbc423001\",\n \"0xc24b8b70d0f89791\",\n \"0xc76c51a30654be30\",\n \"0xd192e819d6ef5218\",\n \"0xd69906245565a910\",\n \"0xf40e35855771202a\",\n \"0x106aa07032bbd1b8\",\n \"0x19a4c116b8d2d0c8\",\n \"0x1e376c085141ab53\",\n \"0x2748774cdf8eeb99\",\n \"0x34b0bcb5e19b48a8\",\n \"0x391c0cb3c5c95a63\",\n \"0x4ed8aa4ae3418acb\",\n \"0x5b9cca4f7763e373\",\n \"0x682e6ff3d6b2b8a3\",\n \"0x748f82ee5defb2fc\",\n \"0x78a5636f43172f60\",\n \"0x84c87814a1f0ab72\",\n \"0x8cc702081a6439ec\",\n \"0x90befffa23631e28\",\n \"0xa4506cebde82bde9\",\n \"0xbef9a3f7b2c67915\",\n \"0xc67178f2e372532b\",\n \"0xca273eceea26619c\",\n \"0xd186b8c721c0c207\",\n \"0xeada7dd6cde0eb1e\",\n \"0xf57d4f7fee6ed178\",\n \"0x06f067aa72176fba\",\n \"0x0a637dc5a2c898a6\",\n \"0x113f9804bef90dae\",\n \"0x1b710b35131c471b\",\n \"0x28db77f523047d84\",\n \"0x32caab7b40c72493\",\n \"0x3c9ebe0a15c9bebc\",\n \"0x431d67c49c100d4c\",\n \"0x4cc5d4becb3e42b6\",\n \"0x597f299cfc657e2a\",\n \"0x5fcb6fab3ad6faec\",\n \"0x6c44198c4a475817\"\n].map((s) => BigInt(s))), X1 = Zf[0], J1 = Zf[1], vs = /* @__PURE__ */ new Uint32Array(80), Es = /* @__PURE__ */ new Uint32Array(80);\nclass Q1 extends Yf {\n constructor(e = 64) {\n super(128, e, 16, !1), this.Ah = Qt[0] | 0, this.Al = Qt[1] | 0, this.Bh = Qt[2] | 0, this.Bl = Qt[3] | 0, this.Ch = Qt[4] | 0, this.Cl = Qt[5] | 0, this.Dh = Qt[6] | 0, this.Dl = Qt[7] | 0, this.Eh = Qt[8] | 0, this.El = Qt[9] | 0, this.Fh = Qt[10] | 0, this.Fl = Qt[11] | 0, this.Gh = Qt[12] | 0, this.Gl = Qt[13] | 0, this.Hh = Qt[14] | 0, this.Hl = Qt[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah: e, Al: t, Bh: r, Bl: n, Ch: i, Cl: o, Dh: a, Dl: l, Eh: c, El: u, Fh: d, Fl: h, Gh: f, Gl: p, Hh: y, Hl: E } = this;\n return [e, t, r, n, i, o, a, l, c, u, d, h, f, p, y, E];\n }\n // prettier-ignore\n set(e, t, r, n, i, o, a, l, c, u, d, h, f, p, y, E) {\n this.Ah = e | 0, this.Al = t | 0, this.Bh = r | 0, this.Bl = n | 0, this.Ch = i | 0, this.Cl = o | 0, this.Dh = a | 0, this.Dl = l | 0, this.Eh = c | 0, this.El = u | 0, this.Fh = d | 0, this.Fl = h | 0, this.Gh = f | 0, this.Gl = p | 0, this.Hh = y | 0, this.Hl = E | 0;\n }\n process(e, t) {\n for (let A = 0; A < 16; A++, t += 4)\n vs[A] = e.getUint32(t), Es[A] = e.getUint32(t += 4);\n for (let A = 16; A < 80; A++) {\n const F = vs[A - 15] | 0, M = Es[A - 15] | 0, H = cn(F, M, 1) ^ cn(F, M, 8) ^ dd(F, M, 7), K = un(F, M, 1) ^ un(F, M, 8) ^ hd(F, M, 7), j = vs[A - 2] | 0, C = Es[A - 2] | 0, k = cn(j, C, 19) ^ Bi(j, C, 61) ^ dd(j, C, 6), $ = un(j, C, 19) ^ Fi(j, C, 61) ^ hd(j, C, 6), W = H1(K, $, Es[A - 7], Es[A - 16]), _ = q1(W, H, k, vs[A - 7], vs[A - 16]);\n vs[A] = _ | 0, Es[A] = W | 0;\n }\n let { Ah: r, Al: n, Bh: i, Bl: o, Ch: a, Cl: l, Dh: c, Dl: u, Eh: d, El: h, Fh: f, Fl: p, Gh: y, Gl: E, Hh: b, Hl: R } = this;\n for (let A = 0; A < 80; A++) {\n const F = cn(d, h, 14) ^ cn(d, h, 18) ^ Bi(d, h, 41), M = un(d, h, 14) ^ un(d, h, 18) ^ Fi(d, h, 41), H = d & f ^ ~d & y, K = h & p ^ ~h & E, j = W1(R, M, K, J1[A], Es[A]), C = z1(j, b, F, H, X1[A], vs[A]), k = j | 0, $ = cn(r, n, 28) ^ Bi(r, n, 34) ^ Bi(r, n, 39), W = un(r, n, 28) ^ Fi(r, n, 34) ^ Fi(r, n, 39), _ = r & i ^ r & a ^ i & a, g = n & o ^ n & l ^ o & l;\n b = y | 0, R = E | 0, y = f | 0, E = p | 0, f = d | 0, p = h | 0, { h: d, l: h } = ss(c | 0, u | 0, C | 0, k | 0), c = a | 0, u = l | 0, a = i | 0, l = o | 0, i = r | 0, o = n | 0;\n const x = j1(k, W, g);\n r = K1(x, C, $, _), n = x | 0;\n }\n ({ h: r, l: n } = ss(this.Ah | 0, this.Al | 0, r | 0, n | 0)), { h: i, l: o } = ss(this.Bh | 0, this.Bl | 0, i | 0, o | 0), { h: a, l } = ss(this.Ch | 0, this.Cl | 0, a | 0, l | 0), { h: c, l: u } = ss(this.Dh | 0, this.Dl | 0, c | 0, u | 0), { h: d, l: h } = ss(this.Eh | 0, this.El | 0, d | 0, h | 0), { h: f, l: p } = ss(this.Fh | 0, this.Fl | 0, f | 0, p | 0), { h: y, l: E } = ss(this.Gh | 0, this.Gl | 0, y | 0, E | 0), { h: b, l: R } = ss(this.Hh | 0, this.Hl | 0, b | 0, R | 0), this.set(r, n, i, o, a, l, c, u, d, h, f, p, y, E, b, R);\n }\n roundClean() {\n kn(vs, Es);\n }\n destroy() {\n kn(this.buffer), this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nconst Xf = /* @__PURE__ */ zf(() => new Z1()), ey = /* @__PURE__ */ zf(() => new Q1());\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Wc = /* @__PURE__ */ BigInt(0), Jl = /* @__PURE__ */ BigInt(1);\nfunction Xs(s, e = \"\") {\n if (typeof s != \"boolean\") {\n const t = e && `\"${e}\"`;\n throw new Error(t + \"expected boolean, got type=\" + typeof s);\n }\n return s;\n}\nfunction Or(s, e, t = \"\") {\n const r = Ii(s), n = s == null ? void 0 : s.length, i = e !== void 0;\n if (!r || i && n !== e) {\n const o = t && `\"${t}\" `, a = i ? ` of length ${e}` : \"\", l = r ? `length=${n}` : `type=${typeof s}`;\n throw new Error(o + \"expected Uint8Array\" + a + \", got \" + l);\n }\n return s;\n}\nfunction Ni(s) {\n const e = s.toString(16);\n return e.length & 1 ? \"0\" + e : e;\n}\nfunction Jf(s) {\n if (typeof s != \"string\")\n throw new Error(\"hex string expected, got \" + typeof s);\n return s === \"\" ? Wc : BigInt(\"0x\" + s);\n}\nfunction la(s) {\n return Jf(Hs(s));\n}\nfunction ei(s) {\n return Qs(s), Jf(Hs(Uint8Array.from(s).reverse()));\n}\nfunction zc(s, e) {\n return Po(s.toString(16).padStart(e * 2, \"0\"));\n}\nfunction Qf(s, e) {\n return zc(s, e).reverse();\n}\nfunction Et(s, e, t) {\n let r;\n if (typeof e == \"string\")\n try {\n r = Po(e);\n } catch (i) {\n throw new Error(s + \" must be hex string or Uint8Array, cause: \" + i);\n }\n else if (Ii(e))\n r = Uint8Array.from(e);\n else\n throw new Error(s + \" must be hex string or Uint8Array\");\n const n = r.length;\n if (typeof t == \"number\" && n !== t)\n throw new Error(s + \" of length \" + t + \" expected, got \" + n);\n return r;\n}\nfunction fd(s) {\n return Uint8Array.from(s);\n}\nconst ja = (s) => typeof s == \"bigint\" && Wc <= s;\nfunction ty(s, e, t) {\n return ja(s) && ja(e) && ja(t) && e <= s && s < t;\n}\nfunction Ql(s, e, t, r) {\n if (!ty(e, t, r))\n throw new Error(\"expected valid \" + s + \": \" + t + \" <= n < \" + r + \", got \" + e);\n}\nfunction e0(s) {\n let e;\n for (e = 0; s > Wc; s >>= Jl, e += 1)\n ;\n return e;\n}\nconst _i = (s) => (Jl << BigInt(s)) - Jl;\nfunction ry(s, e, t) {\n if (typeof s != \"number\" || s < 2)\n throw new Error(\"hashLen must be a number\");\n if (typeof e != \"number\" || e < 2)\n throw new Error(\"qByteLen must be a number\");\n if (typeof t != \"function\")\n throw new Error(\"hmacFn must be a function\");\n const r = (f) => new Uint8Array(f), n = (f) => Uint8Array.of(f);\n let i = r(s), o = r(s), a = 0;\n const l = () => {\n i.fill(1), o.fill(0), a = 0;\n }, c = (...f) => t(o, i, ...f), u = (f = r(0)) => {\n o = c(n(0), f), i = c(), f.length !== 0 && (o = c(n(1), f), i = c());\n }, d = () => {\n if (a++ >= 1e3)\n throw new Error(\"drbg: tried 1000 values\");\n let f = 0;\n const p = [];\n for (; f < e; ) {\n i = c();\n const y = i.slice();\n p.push(y), f += i.length;\n }\n return Kr(...p);\n };\n return (f, p) => {\n l(), u(f);\n let y;\n for (; !(y = p(d())); )\n u();\n return l(), y;\n };\n}\nfunction Ri(s, e, t = {}) {\n if (!s || typeof s != \"object\")\n throw new Error(\"expected valid options object\");\n function r(n, i, o) {\n const a = s[n];\n if (o && a === void 0)\n return;\n const l = typeof a;\n if (l !== i || a === null)\n throw new Error(`param \"${n}\" is invalid: expected ${i}, got ${l}`);\n }\n Object.entries(e).forEach(([n, i]) => r(n, i, !1)), Object.entries(t).forEach(([n, i]) => r(n, i, !0));\n}\nfunction Mo(s) {\n const e = /* @__PURE__ */ new WeakMap();\n return (t, ...r) => {\n const n = e.get(t);\n if (n !== void 0)\n return n;\n const i = s(t, ...r);\n return e.set(t, i), i;\n };\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst gr = BigInt(0), Xt = BigInt(1), Gs = /* @__PURE__ */ BigInt(2), t0 = /* @__PURE__ */ BigInt(3), r0 = /* @__PURE__ */ BigInt(4), s0 = /* @__PURE__ */ BigInt(5), sy = /* @__PURE__ */ BigInt(7), n0 = /* @__PURE__ */ BigInt(8), ny = /* @__PURE__ */ BigInt(9), i0 = /* @__PURE__ */ BigInt(16);\nfunction Gt(s, e) {\n const t = s % e;\n return t >= gr ? t : e + t;\n}\nfunction vt(s, e, t) {\n let r = s;\n for (; e-- > gr; )\n r *= r, r %= t;\n return r;\n}\nfunction gd(s, e) {\n if (s === gr)\n throw new Error(\"invert: expected non-zero number\");\n if (e <= gr)\n throw new Error(\"invert: expected positive modulus, got \" + e);\n let t = Gt(s, e), r = e, n = gr, i = Xt;\n for (; t !== gr; ) {\n const a = r / t, l = r % t, c = n - i * a;\n r = t, t = l, n = i, i = c;\n }\n if (r !== Xt)\n throw new Error(\"invert: does not exist\");\n return Gt(n, e);\n}\nfunction Yc(s, e, t) {\n if (!s.eql(s.sqr(e), t))\n throw new Error(\"Cannot find square root\");\n}\nfunction o0(s, e) {\n const t = (s.ORDER + Xt) / r0, r = s.pow(e, t);\n return Yc(s, r, e), r;\n}\nfunction iy(s, e) {\n const t = (s.ORDER - s0) / n0, r = s.mul(e, Gs), n = s.pow(r, t), i = s.mul(e, n), o = s.mul(s.mul(i, Gs), n), a = s.mul(i, s.sub(o, s.ONE));\n return Yc(s, a, e), a;\n}\nfunction oy(s) {\n const e = en(s), t = a0(s), r = t(e, e.neg(e.ONE)), n = t(e, r), i = t(e, e.neg(r)), o = (s + sy) / i0;\n return (a, l) => {\n let c = a.pow(l, o), u = a.mul(c, r);\n const d = a.mul(c, n), h = a.mul(c, i), f = a.eql(a.sqr(u), l), p = a.eql(a.sqr(d), l);\n c = a.cmov(c, u, f), u = a.cmov(h, d, p);\n const y = a.eql(a.sqr(u), l), E = a.cmov(c, u, y);\n return Yc(a, E, l), E;\n };\n}\nfunction a0(s) {\n if (s < t0)\n throw new Error(\"sqrt is not defined for small field\");\n let e = s - Xt, t = 0;\n for (; e % Gs === gr; )\n e /= Gs, t++;\n let r = Gs;\n const n = en(s);\n for (; pd(n, r) === 1; )\n if (r++ > 1e3)\n throw new Error(\"Cannot find square root: probably non-prime P\");\n if (t === 1)\n return o0;\n let i = n.pow(r, e);\n const o = (e + Xt) / Gs;\n return function(l, c) {\n if (l.is0(c))\n return c;\n if (pd(l, c) !== 1)\n throw new Error(\"Cannot find square root\");\n let u = t, d = l.mul(l.ONE, i), h = l.pow(c, e), f = l.pow(c, o);\n for (; !l.eql(h, l.ONE); ) {\n if (l.is0(h))\n return l.ZERO;\n let p = 1, y = l.sqr(h);\n for (; !l.eql(y, l.ONE); )\n if (p++, y = l.sqr(y), p === u)\n throw new Error(\"Cannot find square root\");\n const E = Xt << BigInt(u - p - 1), b = l.pow(d, E);\n u = p, d = l.sqr(b), h = l.mul(h, d), f = l.mul(f, b);\n }\n return f;\n };\n}\nfunction ay(s) {\n return s % r0 === t0 ? o0 : s % n0 === s0 ? iy : s % i0 === ny ? oy(s) : a0(s);\n}\nconst ly = (s, e) => (Gt(s, e) & Xt) === Xt, cy = [\n \"create\",\n \"isValid\",\n \"is0\",\n \"neg\",\n \"inv\",\n \"sqrt\",\n \"sqr\",\n \"eql\",\n \"add\",\n \"sub\",\n \"mul\",\n \"pow\",\n \"div\",\n \"addN\",\n \"subN\",\n \"mulN\",\n \"sqrN\"\n];\nfunction uy(s) {\n const e = {\n ORDER: \"bigint\",\n MASK: \"bigint\",\n BYTES: \"number\",\n BITS: \"number\"\n }, t = cy.reduce((r, n) => (r[n] = \"function\", r), e);\n return Ri(s, t), s;\n}\nfunction dy(s, e, t) {\n if (t < gr)\n throw new Error(\"invalid exponent, negatives unsupported\");\n if (t === gr)\n return s.ONE;\n if (t === Xt)\n return e;\n let r = s.ONE, n = e;\n for (; t > gr; )\n t & Xt && (r = s.mul(r, n)), n = s.sqr(n), t >>= Xt;\n return r;\n}\nfunction l0(s, e, t = !1) {\n const r = new Array(e.length).fill(t ? s.ZERO : void 0), n = e.reduce((o, a, l) => s.is0(a) ? o : (r[l] = o, s.mul(o, a)), s.ONE), i = s.inv(n);\n return e.reduceRight((o, a, l) => s.is0(a) ? o : (r[l] = s.mul(o, r[l]), s.mul(o, a)), i), r;\n}\nfunction pd(s, e) {\n const t = (s.ORDER - Xt) / Gs, r = s.pow(e, t), n = s.eql(r, s.ONE), i = s.eql(r, s.ZERO), o = s.eql(r, s.neg(s.ONE));\n if (!n && !i && !o)\n throw new Error(\"invalid Legendre symbol result\");\n return n ? 1 : i ? 0 : -1;\n}\nfunction c0(s, e) {\n e !== void 0 && Xl(e);\n const t = e !== void 0 ? e : s.toString(2).length, r = Math.ceil(t / 8);\n return { nBitLength: t, nByteLength: r };\n}\nfunction en(s, e, t = !1, r = {}) {\n if (s <= gr)\n throw new Error(\"invalid field: expected ORDER > 0, got \" + s);\n let n, i, o = !1, a;\n if (typeof e == \"object\" && e != null) {\n if (r.sqrt || t)\n throw new Error(\"cannot specify opts in two arguments\");\n const h = e;\n h.BITS && (n = h.BITS), h.sqrt && (i = h.sqrt), typeof h.isLE == \"boolean\" && (t = h.isLE), typeof h.modFromBytes == \"boolean\" && (o = h.modFromBytes), a = h.allowedLengths;\n } else\n typeof e == \"number\" && (n = e), r.sqrt && (i = r.sqrt);\n const { nBitLength: l, nByteLength: c } = c0(s, n);\n if (c > 2048)\n throw new Error(\"invalid field: expected ORDER of <= 2048 bytes\");\n let u;\n const d = Object.freeze({\n ORDER: s,\n isLE: t,\n BITS: l,\n BYTES: c,\n MASK: _i(l),\n ZERO: gr,\n ONE: Xt,\n allowedLengths: a,\n create: (h) => Gt(h, s),\n isValid: (h) => {\n if (typeof h != \"bigint\")\n throw new Error(\"invalid field element: expected bigint, got \" + typeof h);\n return gr <= h && h < s;\n },\n is0: (h) => h === gr,\n // is valid and invertible\n isValidNot0: (h) => !d.is0(h) && d.isValid(h),\n isOdd: (h) => (h & Xt) === Xt,\n neg: (h) => Gt(-h, s),\n eql: (h, f) => h === f,\n sqr: (h) => Gt(h * h, s),\n add: (h, f) => Gt(h + f, s),\n sub: (h, f) => Gt(h - f, s),\n mul: (h, f) => Gt(h * f, s),\n pow: (h, f) => dy(d, h, f),\n div: (h, f) => Gt(h * gd(f, s), s),\n // Same as above, but doesn't normalize\n sqrN: (h) => h * h,\n addN: (h, f) => h + f,\n subN: (h, f) => h - f,\n mulN: (h, f) => h * f,\n inv: (h) => gd(h, s),\n sqrt: i || ((h) => (u || (u = ay(s)), u(d, h))),\n toBytes: (h) => t ? Qf(h, c) : zc(h, c),\n fromBytes: (h, f = !0) => {\n if (a) {\n if (!a.includes(h.length) || h.length > c)\n throw new Error(\"Field.fromBytes: expected \" + a + \" bytes, got \" + h.length);\n const y = new Uint8Array(c);\n y.set(h, t ? 0 : y.length - h.length), h = y;\n }\n if (h.length !== c)\n throw new Error(\"Field.fromBytes: expected \" + c + \" bytes, got \" + h.length);\n let p = t ? ei(h) : la(h);\n if (o && (p = Gt(p, s)), !f && !d.isValid(p))\n throw new Error(\"invalid field element: outside of range 0..ORDER\");\n return p;\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (h) => l0(d, h),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (h, f, p) => p ? f : h\n });\n return Object.freeze(d);\n}\nfunction u0(s) {\n if (typeof s != \"bigint\")\n throw new Error(\"field order must be bigint\");\n const e = s.toString(2).length;\n return Math.ceil(e / 8);\n}\nfunction d0(s) {\n const e = u0(s);\n return e + Math.ceil(e / 2);\n}\nfunction hy(s, e, t = !1) {\n const r = s.length, n = u0(e), i = d0(e);\n if (r < 16 || r < i || r > 1024)\n throw new Error(\"expected \" + i + \"-1024 bytes of input, got \" + r);\n const o = t ? ei(s) : la(s), a = Gt(o, e - Xt) + Xt;\n return t ? Qf(a, n) : zc(a, n);\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Dn = BigInt(0), Vs = BigInt(1);\nfunction Oo(s, e) {\n const t = e.negate();\n return s ? t : e;\n}\nfunction js(s, e) {\n const t = l0(s.Fp, e.map((r) => r.Z));\n return e.map((r, n) => s.fromAffine(r.toAffine(t[n])));\n}\nfunction h0(s, e) {\n if (!Number.isSafeInteger(s) || s <= 0 || s > e)\n throw new Error(\"invalid window size, expected [1..\" + e + \"], got W=\" + s);\n}\nfunction Ka(s, e) {\n h0(s, e);\n const t = Math.ceil(e / s) + 1, r = 2 ** (s - 1), n = 2 ** s, i = _i(s), o = BigInt(s);\n return { windows: t, windowSize: r, mask: i, maxNumber: n, shiftBy: o };\n}\nfunction md(s, e, t) {\n const { windowSize: r, mask: n, maxNumber: i, shiftBy: o } = t;\n let a = Number(s & n), l = s >> o;\n a > r && (a -= i, l += Vs);\n const c = e * r, u = c + Math.abs(a) - 1, d = a === 0, h = a < 0, f = e % 2 !== 0;\n return { nextN: l, offset: u, isZero: d, isNeg: h, isNegF: f, offsetF: c };\n}\nfunction fy(s, e) {\n if (!Array.isArray(s))\n throw new Error(\"array expected\");\n s.forEach((t, r) => {\n if (!(t instanceof e))\n throw new Error(\"invalid point at index \" + r);\n });\n}\nfunction gy(s, e) {\n if (!Array.isArray(s))\n throw new Error(\"array of scalars expected\");\n s.forEach((t, r) => {\n if (!e.isValid(t))\n throw new Error(\"invalid scalar at index \" + r);\n });\n}\nconst Ha = /* @__PURE__ */ new WeakMap(), f0 = /* @__PURE__ */ new WeakMap();\nfunction qa(s) {\n return f0.get(s) || 1;\n}\nfunction yd(s) {\n if (s !== Dn)\n throw new Error(\"invalid wNAF\");\n}\nclass g0 {\n // Parametrized with a given Point class (not individual point)\n constructor(e, t) {\n this.BASE = e.BASE, this.ZERO = e.ZERO, this.Fn = e.Fn, this.bits = t;\n }\n // non-const time multiplication ladder\n _unsafeLadder(e, t, r = this.ZERO) {\n let n = e;\n for (; t > Dn; )\n t & Vs && (r = r.add(n)), n = n.double(), t >>= Vs;\n return r;\n }\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(e, t) {\n const { windows: r, windowSize: n } = Ka(t, this.bits), i = [];\n let o = e, a = o;\n for (let l = 0; l < r; l++) {\n a = o, i.push(a);\n for (let c = 1; c < n; c++)\n a = a.add(o), i.push(a);\n o = a.double();\n }\n return i;\n }\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n wNAF(e, t, r) {\n if (!this.Fn.isValid(r))\n throw new Error(\"invalid scalar\");\n let n = this.ZERO, i = this.BASE;\n const o = Ka(e, this.bits);\n for (let a = 0; a < o.windows; a++) {\n const { nextN: l, offset: c, isZero: u, isNeg: d, isNegF: h, offsetF: f } = md(r, a, o);\n r = l, u ? i = i.add(Oo(h, t[f])) : n = n.add(Oo(d, t[c]));\n }\n return yd(r), { p: n, f: i };\n }\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(e, t, r, n = this.ZERO) {\n const i = Ka(e, this.bits);\n for (let o = 0; o < i.windows && r !== Dn; o++) {\n const { nextN: a, offset: l, isZero: c, isNeg: u } = md(r, o, i);\n if (r = a, !c) {\n const d = t[l];\n n = n.add(u ? d.negate() : d);\n }\n }\n return yd(r), n;\n }\n getPrecomputes(e, t, r) {\n let n = Ha.get(t);\n return n || (n = this.precomputeWindow(t, e), e !== 1 && (typeof r == \"function\" && (n = r(n)), Ha.set(t, n))), n;\n }\n cached(e, t, r) {\n const n = qa(e);\n return this.wNAF(n, this.getPrecomputes(n, e, r), t);\n }\n unsafe(e, t, r, n) {\n const i = qa(e);\n return i === 1 ? this._unsafeLadder(e, t, n) : this.wNAFUnsafe(i, this.getPrecomputes(i, e, r), t, n);\n }\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(e, t) {\n h0(t, this.bits), f0.set(e, t), Ha.delete(e);\n }\n hasCache(e) {\n return qa(e) !== 1;\n }\n}\nfunction py(s, e, t, r) {\n let n = e, i = s.ZERO, o = s.ZERO;\n for (; t > Dn || r > Dn; )\n t & Vs && (i = i.add(n)), r & Vs && (o = o.add(n)), n = n.double(), t >>= Vs, r >>= Vs;\n return { p1: i, p2: o };\n}\nfunction p0(s, e, t, r) {\n fy(t, s), gy(r, e);\n const n = t.length, i = r.length;\n if (n !== i)\n throw new Error(\"arrays of points and scalars must have equal length\");\n const o = s.ZERO, a = e0(BigInt(n));\n let l = 1;\n a > 12 ? l = a - 3 : a > 4 ? l = a - 2 : a > 0 && (l = 2);\n const c = _i(l), u = new Array(Number(c) + 1).fill(o), d = Math.floor((e.BITS - 1) / l) * l;\n let h = o;\n for (let f = d; f >= 0; f -= l) {\n u.fill(o);\n for (let y = 0; y < i; y++) {\n const E = r[y], b = Number(E >> BigInt(f) & c);\n u[b] = u[b].add(t[y]);\n }\n let p = o;\n for (let y = u.length - 1, E = o; y > 0; y--)\n E = E.add(u[y]), p = p.add(E);\n if (h = h.add(p), f !== 0)\n for (let y = 0; y < l; y++)\n h = h.double();\n }\n return h;\n}\nfunction vd(s, e, t) {\n if (e) {\n if (e.ORDER !== s)\n throw new Error(\"Field.ORDER must match order: Fp == p, Fn == n\");\n return uy(e), e;\n } else\n return en(s, { isLE: t });\n}\nfunction m0(s, e, t = {}, r) {\n if (r === void 0 && (r = s === \"edwards\"), !e || typeof e != \"object\")\n throw new Error(`expected valid ${s} CURVE object`);\n for (const l of [\"p\", \"n\", \"h\"]) {\n const c = e[l];\n if (!(typeof c == \"bigint\" && c > Dn))\n throw new Error(`CURVE.${l} must be positive bigint`);\n }\n const n = vd(e.p, t.Fp, r), i = vd(e.n, t.Fn, r), a = [\"Gx\", \"Gy\", \"a\", s === \"weierstrass\" ? \"b\" : \"d\"];\n for (const l of a)\n if (!n.isValid(e[l]))\n throw new Error(`CURVE.${l} must be valid field element of CURVE.Fp`);\n return e = Object.freeze(Object.assign({}, e)), { CURVE: e, Fp: n, Fn: i };\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst xs = BigInt(0), zt = BigInt(1), Wa = BigInt(2), my = BigInt(8);\nfunction yy(s, e, t, r) {\n const n = s.sqr(t), i = s.sqr(r), o = s.add(s.mul(e.a, n), i), a = s.add(s.ONE, s.mul(e.d, s.mul(n, i)));\n return s.eql(o, a);\n}\nfunction vy(s, e = {}) {\n const t = m0(\"edwards\", s, e, e.FpFnLE), { Fp: r, Fn: n } = t;\n let i = t.CURVE;\n const { h: o } = i;\n Ri(e, {}, { uvRatio: \"function\" });\n const a = Wa << BigInt(n.BYTES * 8) - zt, l = (E) => r.create(E), c = e.uvRatio || ((E, b) => {\n try {\n return { isValid: !0, value: r.sqrt(r.div(E, b)) };\n } catch {\n return { isValid: !1, value: xs };\n }\n });\n if (!yy(r, i, i.Gx, i.Gy))\n throw new Error(\"bad curve params: generator point\");\n function u(E, b, R = !1) {\n const A = R ? zt : xs;\n return Ql(\"coordinate \" + E, b, A, a), b;\n }\n function d(E) {\n if (!(E instanceof p))\n throw new Error(\"ExtendedPoint expected\");\n }\n const h = Mo((E, b) => {\n const { X: R, Y: A, Z: F } = E, M = E.is0();\n b == null && (b = M ? my : r.inv(F));\n const H = l(R * b), K = l(A * b), j = r.mul(F, b);\n if (M)\n return { x: xs, y: zt };\n if (j !== zt)\n throw new Error(\"invZ was invalid\");\n return { x: H, y: K };\n }), f = Mo((E) => {\n const { a: b, d: R } = i;\n if (E.is0())\n throw new Error(\"bad point: ZERO\");\n const { X: A, Y: F, Z: M, T: H } = E, K = l(A * A), j = l(F * F), C = l(M * M), k = l(C * C), $ = l(K * b), W = l(C * l($ + j)), _ = l(k + l(R * l(K * j)));\n if (W !== _)\n throw new Error(\"bad point: equation left != right (1)\");\n const g = l(A * F), x = l(M * H);\n if (g !== x)\n throw new Error(\"bad point: equation left != right (2)\");\n return !0;\n });\n class p {\n constructor(b, R, A, F) {\n this.X = u(\"x\", b), this.Y = u(\"y\", R), this.Z = u(\"z\", A, !0), this.T = u(\"t\", F), Object.freeze(this);\n }\n static CURVE() {\n return i;\n }\n static fromAffine(b) {\n if (b instanceof p)\n throw new Error(\"extended point not allowed\");\n const { x: R, y: A } = b || {};\n return u(\"x\", R), u(\"y\", A), new p(R, A, zt, l(R * A));\n }\n // Uses algo from RFC8032 5.1.3.\n static fromBytes(b, R = !1) {\n const A = r.BYTES, { a: F, d: M } = i;\n b = fd(Or(b, A, \"point\")), Xs(R, \"zip215\");\n const H = fd(b), K = b[A - 1];\n H[A - 1] = K & -129;\n const j = ei(H), C = R ? a : r.ORDER;\n Ql(\"point.y\", j, xs, C);\n const k = l(j * j), $ = l(k - zt), W = l(M * k - F);\n let { isValid: _, value: g } = c($, W);\n if (!_)\n throw new Error(\"bad point: invalid y coordinate\");\n const x = (g & zt) === zt, w = (K & 128) !== 0;\n if (!R && g === xs && w)\n throw new Error(\"bad point: x=0 and x_0=1\");\n return w !== x && (g = l(-g)), p.fromAffine({ x: g, y: j });\n }\n static fromHex(b, R = !1) {\n return p.fromBytes(Et(\"point\", b), R);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n precompute(b = 8, R = !0) {\n return y.createCache(this, b), R || this.multiply(Wa), this;\n }\n // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n assertValidity() {\n f(this);\n }\n // Compare one point to another.\n equals(b) {\n d(b);\n const { X: R, Y: A, Z: F } = this, { X: M, Y: H, Z: K } = b, j = l(R * K), C = l(M * F), k = l(A * K), $ = l(H * F);\n return j === C && k === $;\n }\n is0() {\n return this.equals(p.ZERO);\n }\n negate() {\n return new p(l(-this.X), this.Y, this.Z, l(-this.T));\n }\n // Fast algo for doubling Extended Point.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n // Cost: 4M + 4S + 1*a + 6add + 1*2.\n double() {\n const { a: b } = i, { X: R, Y: A, Z: F } = this, M = l(R * R), H = l(A * A), K = l(Wa * l(F * F)), j = l(b * M), C = R + A, k = l(l(C * C) - M - H), $ = j + H, W = $ - K, _ = j - H, g = l(k * W), x = l($ * _), w = l(k * _), D = l(W * $);\n return new p(g, x, D, w);\n }\n // Fast algo for adding 2 Extended Points.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n // Cost: 9M + 1*a + 1*d + 7add.\n add(b) {\n d(b);\n const { a: R, d: A } = i, { X: F, Y: M, Z: H, T: K } = this, { X: j, Y: C, Z: k, T: $ } = b, W = l(F * j), _ = l(M * C), g = l(K * A * $), x = l(H * k), w = l((F + M) * (j + C) - W - _), D = x - g, O = x + g, U = l(_ - R * W), V = l(w * D), L = l(O * U), m = l(w * U), v = l(D * O);\n return new p(V, L, v, m);\n }\n subtract(b) {\n return this.add(b.negate());\n }\n // Constant-time multiplication.\n multiply(b) {\n if (!n.isValidNot0(b))\n throw new Error(\"invalid scalar: expected 1 <= sc < curve.n\");\n const { p: R, f: A } = y.cached(this, b, (F) => js(p, F));\n return js(p, [R, A])[0];\n }\n // Non-constant-time multiplication. Uses double-and-add algorithm.\n // It's faster, but should only be used when you don't care about\n // an exposed private key e.g. sig verification.\n // Does NOT allow scalars higher than CURVE.n.\n // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n multiplyUnsafe(b, R = p.ZERO) {\n if (!n.isValid(b))\n throw new Error(\"invalid scalar: expected 0 <= sc < curve.n\");\n return b === xs ? p.ZERO : this.is0() || b === zt ? this : y.unsafe(this, b, (A) => js(p, A), R);\n }\n // Checks if point is of small order.\n // If you add something to small order point, you will have \"dirty\"\n // point with torsion component.\n // Multiplies point by cofactor and checks if the result is 0.\n isSmallOrder() {\n return this.multiplyUnsafe(o).is0();\n }\n // Multiplies point by curve order and checks if the result is 0.\n // Returns `false` is the point is dirty.\n isTorsionFree() {\n return y.unsafe(this, i.n).is0();\n }\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n toAffine(b) {\n return h(this, b);\n }\n clearCofactor() {\n return o === zt ? this : this.multiplyUnsafe(o);\n }\n toBytes() {\n const { x: b, y: R } = this.toAffine(), A = r.toBytes(R);\n return A[A.length - 1] |= b & zt ? 128 : 0, A;\n }\n toHex() {\n return Hs(this.toBytes());\n }\n toString() {\n return `<Point ${this.is0() ? \"ZERO\" : this.toHex()}>`;\n }\n // TODO: remove\n get ex() {\n return this.X;\n }\n get ey() {\n return this.Y;\n }\n get ez() {\n return this.Z;\n }\n get et() {\n return this.T;\n }\n static normalizeZ(b) {\n return js(p, b);\n }\n static msm(b, R) {\n return p0(p, n, b, R);\n }\n _setWindowSize(b) {\n this.precompute(b);\n }\n toRawBytes() {\n return this.toBytes();\n }\n }\n p.BASE = new p(i.Gx, i.Gy, zt, l(i.Gx * i.Gy)), p.ZERO = new p(xs, zt, zt, xs), p.Fp = r, p.Fn = n;\n const y = new g0(p, n.BITS);\n return p.BASE.precompute(8), p;\n}\nfunction Ey(s, e, t = {}) {\n if (typeof e != \"function\")\n throw new Error('\"hash\" function param is required');\n Ri(t, {}, {\n adjustScalarBytes: \"function\",\n randomBytes: \"function\",\n domain: \"function\",\n prehash: \"function\",\n mapToCurve: \"function\"\n });\n const { prehash: r } = t, { BASE: n, Fp: i, Fn: o } = s, a = t.randomBytes || qc, l = t.adjustScalarBytes || ((C) => C), c = t.domain || ((C, k, $) => {\n if (Xs($, \"phflag\"), k.length || $)\n throw new Error(\"Contexts/pre-hash are not supported\");\n return C;\n });\n function u(C) {\n return o.create(ei(C));\n }\n function d(C) {\n const k = A.secretKey;\n C = Et(\"private key\", C, k);\n const $ = Et(\"hashed private key\", e(C), 2 * k), W = l($.slice(0, k)), _ = $.slice(k, 2 * k), g = u(W);\n return { head: W, prefix: _, scalar: g };\n }\n function h(C) {\n const { head: k, prefix: $, scalar: W } = d(C), _ = n.multiply(W), g = _.toBytes();\n return { head: k, prefix: $, scalar: W, point: _, pointBytes: g };\n }\n function f(C) {\n return h(C).pointBytes;\n }\n function p(C = Uint8Array.of(), ...k) {\n const $ = Kr(...k);\n return u(e(c($, Et(\"context\", C), !!r)));\n }\n function y(C, k, $ = {}) {\n C = Et(\"message\", C), r && (C = r(C));\n const { prefix: W, scalar: _, pointBytes: g } = h(k), x = p($.context, W, C), w = n.multiply(x).toBytes(), D = p($.context, w, g, C), O = o.create(x + D * _);\n if (!o.isValid(O))\n throw new Error(\"sign failed: invalid s\");\n const U = Kr(w, o.toBytes(O));\n return Or(U, A.signature, \"result\");\n }\n const E = { zip215: !0 };\n function b(C, k, $, W = E) {\n const { context: _, zip215: g } = W, x = A.signature;\n C = Et(\"signature\", C, x), k = Et(\"message\", k), $ = Et(\"publicKey\", $, A.publicKey), g !== void 0 && Xs(g, \"zip215\"), r && (k = r(k));\n const w = x / 2, D = C.subarray(0, w), O = ei(C.subarray(w, x));\n let U, V, L;\n try {\n U = s.fromBytes($, g), V = s.fromBytes(D, g), L = n.multiplyUnsafe(O);\n } catch {\n return !1;\n }\n if (!g && U.isSmallOrder())\n return !1;\n const m = p(_, V.toBytes(), U.toBytes(), k);\n return V.add(U.multiplyUnsafe(m)).subtract(L).clearCofactor().is0();\n }\n const R = i.BYTES, A = {\n secretKey: R,\n publicKey: R,\n signature: 2 * R,\n seed: R\n };\n function F(C = a(A.seed)) {\n return Or(C, A.seed, \"seed\");\n }\n function M(C) {\n const k = j.randomSecretKey(C);\n return { secretKey: k, publicKey: f(k) };\n }\n function H(C) {\n return Ii(C) && C.length === o.BYTES;\n }\n function K(C, k) {\n try {\n return !!s.fromBytes(C, k);\n } catch {\n return !1;\n }\n }\n const j = {\n getExtendedPublicKey: h,\n randomSecretKey: F,\n isValidSecretKey: H,\n isValidPublicKey: K,\n /**\n * Converts ed public key to x public key. Uses formula:\n * - ed25519:\n * - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n * - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n * - ed448:\n * - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n * - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n */\n toMontgomery(C) {\n const { y: k } = s.fromBytes(C), $ = A.publicKey, W = $ === 32;\n if (!W && $ !== 57)\n throw new Error(\"only defined for 25519 and 448\");\n const _ = W ? i.div(zt + k, zt - k) : i.div(k - zt, k + zt);\n return i.toBytes(_);\n },\n toMontgomerySecret(C) {\n const k = A.secretKey;\n Or(C, k);\n const $ = e(C.subarray(0, k));\n return l($).subarray(0, k);\n },\n /** @deprecated */\n randomPrivateKey: F,\n /** @deprecated */\n precompute(C = 8, k = s.BASE) {\n return k.precompute(C, !1);\n }\n };\n return Object.freeze({\n keygen: M,\n getPublicKey: f,\n sign: y,\n verify: b,\n utils: j,\n Point: s,\n lengths: A\n });\n}\nfunction xy(s) {\n const e = {\n a: s.a,\n d: s.d,\n p: s.Fp.ORDER,\n n: s.n,\n h: s.h,\n Gx: s.Gx,\n Gy: s.Gy\n }, t = s.Fp, r = en(e.n, s.nBitLength, !0), n = { Fp: t, Fn: r, uvRatio: s.uvRatio }, i = {\n randomBytes: s.randomBytes,\n adjustScalarBytes: s.adjustScalarBytes,\n domain: s.domain,\n prehash: s.prehash,\n mapToCurve: s.mapToCurve\n };\n return { CURVE: e, curveOpts: n, hash: s.hash, eddsaOpts: i };\n}\nfunction Sy(s, e) {\n const t = e.Point;\n return Object.assign({}, e, {\n ExtendedPoint: t,\n CURVE: s,\n nBitLength: t.Fn.BITS,\n nByteLength: t.Fn.BYTES\n });\n}\nfunction by(s) {\n const { CURVE: e, curveOpts: t, hash: r, eddsaOpts: n } = xy(s), i = vy(e, t), o = Ey(i, r, n);\n return Sy(s, o);\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Ty = BigInt(1), Ed = BigInt(2);\nBigInt(3);\nconst wy = BigInt(5), Ay = BigInt(8), Zc = BigInt(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed\"), y0 = {\n p: Zc,\n n: BigInt(\"0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed\"),\n h: Ay,\n a: BigInt(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec\"),\n d: BigInt(\"0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3\"),\n Gx: BigInt(\"0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\"),\n Gy: BigInt(\"0x6666666666666666666666666666666666666666666666666666666666666658\")\n};\nfunction Iy(s) {\n const e = BigInt(10), t = BigInt(20), r = BigInt(40), n = BigInt(80), i = Zc, a = s * s % i * s % i, l = vt(a, Ed, i) * a % i, c = vt(l, Ty, i) * s % i, u = vt(c, wy, i) * c % i, d = vt(u, e, i) * u % i, h = vt(d, t, i) * d % i, f = vt(h, r, i) * h % i, p = vt(f, n, i) * f % i, y = vt(p, n, i) * f % i, E = vt(y, e, i) * u % i;\n return { pow_p_5_8: vt(E, Ed, i) * s % i, b2: a };\n}\nfunction _y(s) {\n return s[0] &= 248, s[31] &= 127, s[31] |= 64, s;\n}\nconst xd = /* @__PURE__ */ BigInt(\"19681161376707505956807079304988542015446066515923890162744021073123829784752\");\nfunction Ry(s, e) {\n const t = Zc, r = Gt(e * e * e, t), n = Gt(r * r * e, t), i = Iy(s * n).pow_p_5_8;\n let o = Gt(s * r * i, t);\n const a = Gt(e * o * o, t), l = o, c = Gt(o * xd, t), u = a === s, d = a === Gt(-s, t), h = a === Gt(-s * xd, t);\n return u && (o = l), (d || h) && (o = c), ly(o, t) && (o = Gt(-o, t)), { isValid: u || d, value: o };\n}\nconst Ly = en(y0.p, { isLE: !0 }), Cy = {\n ...y0,\n Fp: Ly,\n hash: ey,\n adjustScalarBytes: _y,\n // dom2\n // Ratio of u to v. Allows us to combine inversion and square root. Uses algo from RFC8032 5.1.3.\n // Constant-time, u/√v\n uvRatio: Ry\n}, Li = by(Cy);\nvar co = { exports: {} };\nconst ky = {}, Dy = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n default: ky\n}, Symbol.toStringTag, { value: \"Module\" })), Py = /* @__PURE__ */ Nc(Dy);\nvar My = co.exports, Sd;\nfunction v0() {\n return Sd || (Sd = 1, (function(s) {\n (function(e, t) {\n function r(_, g) {\n if (!_) throw new Error(g || \"Assertion failed\");\n }\n function n(_, g) {\n _.super_ = g;\n var x = function() {\n };\n x.prototype = g.prototype, _.prototype = new x(), _.prototype.constructor = _;\n }\n function i(_, g, x) {\n if (i.isBN(_))\n return _;\n this.negative = 0, this.words = null, this.length = 0, this.red = null, _ !== null && ((g === \"le\" || g === \"be\") && (x = g, g = 10), this._init(_ || 0, g || 10, x || \"be\"));\n }\n typeof e == \"object\" ? e.exports = i : t.BN = i, i.BN = i, i.wordSize = 26;\n var o;\n try {\n typeof window < \"u\" && typeof window.Buffer < \"u\" ? o = window.Buffer : o = Py.Buffer;\n } catch {\n }\n i.isBN = function(g) {\n return g instanceof i ? !0 : g !== null && typeof g == \"object\" && g.constructor.wordSize === i.wordSize && Array.isArray(g.words);\n }, i.max = function(g, x) {\n return g.cmp(x) > 0 ? g : x;\n }, i.min = function(g, x) {\n return g.cmp(x) < 0 ? g : x;\n }, i.prototype._init = function(g, x, w) {\n if (typeof g == \"number\")\n return this._initNumber(g, x, w);\n if (typeof g == \"object\")\n return this._initArray(g, x, w);\n x === \"hex\" && (x = 16), r(x === (x | 0) && x >= 2 && x <= 36), g = g.toString().replace(/\\s+/g, \"\");\n var D = 0;\n g[0] === \"-\" && (D++, this.negative = 1), D < g.length && (x === 16 ? this._parseHex(g, D, w) : (this._parseBase(g, x, D), w === \"le\" && this._initArray(this.toArray(), x, w)));\n }, i.prototype._initNumber = function(g, x, w) {\n g < 0 && (this.negative = 1, g = -g), g < 67108864 ? (this.words = [g & 67108863], this.length = 1) : g < 4503599627370496 ? (this.words = [\n g & 67108863,\n g / 67108864 & 67108863\n ], this.length = 2) : (r(g < 9007199254740992), this.words = [\n g & 67108863,\n g / 67108864 & 67108863,\n 1\n ], this.length = 3), w === \"le\" && this._initArray(this.toArray(), x, w);\n }, i.prototype._initArray = function(g, x, w) {\n if (r(typeof g.length == \"number\"), g.length <= 0)\n return this.words = [0], this.length = 1, this;\n this.length = Math.ceil(g.length / 3), this.words = new Array(this.length);\n for (var D = 0; D < this.length; D++)\n this.words[D] = 0;\n var O, U, V = 0;\n if (w === \"be\")\n for (D = g.length - 1, O = 0; D >= 0; D -= 3)\n U = g[D] | g[D - 1] << 8 | g[D - 2] << 16, this.words[O] |= U << V & 67108863, this.words[O + 1] = U >>> 26 - V & 67108863, V += 24, V >= 26 && (V -= 26, O++);\n else if (w === \"le\")\n for (D = 0, O = 0; D < g.length; D += 3)\n U = g[D] | g[D + 1] << 8 | g[D + 2] << 16, this.words[O] |= U << V & 67108863, this.words[O + 1] = U >>> 26 - V & 67108863, V += 24, V >= 26 && (V -= 26, O++);\n return this._strip();\n };\n function a(_, g) {\n var x = _.charCodeAt(g);\n if (x >= 48 && x <= 57)\n return x - 48;\n if (x >= 65 && x <= 70)\n return x - 55;\n if (x >= 97 && x <= 102)\n return x - 87;\n r(!1, \"Invalid character in \" + _);\n }\n function l(_, g, x) {\n var w = a(_, x);\n return x - 1 >= g && (w |= a(_, x - 1) << 4), w;\n }\n i.prototype._parseHex = function(g, x, w) {\n this.length = Math.ceil((g.length - x) / 6), this.words = new Array(this.length);\n for (var D = 0; D < this.length; D++)\n this.words[D] = 0;\n var O = 0, U = 0, V;\n if (w === \"be\")\n for (D = g.length - 1; D >= x; D -= 2)\n V = l(g, x, D) << O, this.words[U] |= V & 67108863, O >= 18 ? (O -= 18, U += 1, this.words[U] |= V >>> 26) : O += 8;\n else {\n var L = g.length - x;\n for (D = L % 2 === 0 ? x + 1 : x; D < g.length; D += 2)\n V = l(g, x, D) << O, this.words[U] |= V & 67108863, O >= 18 ? (O -= 18, U += 1, this.words[U] |= V >>> 26) : O += 8;\n }\n this._strip();\n };\n function c(_, g, x, w) {\n for (var D = 0, O = 0, U = Math.min(_.length, x), V = g; V < U; V++) {\n var L = _.charCodeAt(V) - 48;\n D *= w, L >= 49 ? O = L - 49 + 10 : L >= 17 ? O = L - 17 + 10 : O = L, r(L >= 0 && O < w, \"Invalid character\"), D += O;\n }\n return D;\n }\n i.prototype._parseBase = function(g, x, w) {\n this.words = [0], this.length = 1;\n for (var D = 0, O = 1; O <= 67108863; O *= x)\n D++;\n D--, O = O / x | 0;\n for (var U = g.length - w, V = U % D, L = Math.min(U, U - V) + w, m = 0, v = w; v < L; v += D)\n m = c(g, v, v + D, x), this.imuln(O), this.words[0] + m < 67108864 ? this.words[0] += m : this._iaddn(m);\n if (V !== 0) {\n var P = 1;\n for (m = c(g, v, g.length, x), v = 0; v < V; v++)\n P *= x;\n this.imuln(P), this.words[0] + m < 67108864 ? this.words[0] += m : this._iaddn(m);\n }\n this._strip();\n }, i.prototype.copy = function(g) {\n g.words = new Array(this.length);\n for (var x = 0; x < this.length; x++)\n g.words[x] = this.words[x];\n g.length = this.length, g.negative = this.negative, g.red = this.red;\n };\n function u(_, g) {\n _.words = g.words, _.length = g.length, _.negative = g.negative, _.red = g.red;\n }\n if (i.prototype._move = function(g) {\n u(g, this);\n }, i.prototype.clone = function() {\n var g = new i(null);\n return this.copy(g), g;\n }, i.prototype._expand = function(g) {\n for (; this.length < g; )\n this.words[this.length++] = 0;\n return this;\n }, i.prototype._strip = function() {\n for (; this.length > 1 && this.words[this.length - 1] === 0; )\n this.length--;\n return this._normSign();\n }, i.prototype._normSign = function() {\n return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;\n }, typeof Symbol < \"u\" && typeof Symbol.for == \"function\")\n try {\n i.prototype[Symbol.for(\"nodejs.util.inspect.custom\")] = d;\n } catch {\n i.prototype.inspect = d;\n }\n else\n i.prototype.inspect = d;\n function d() {\n return (this.red ? \"<BN-R: \" : \"<BN: \") + this.toString(16) + \">\";\n }\n var h = [\n \"\",\n \"0\",\n \"00\",\n \"000\",\n \"0000\",\n \"00000\",\n \"000000\",\n \"0000000\",\n \"00000000\",\n \"000000000\",\n \"0000000000\",\n \"00000000000\",\n \"000000000000\",\n \"0000000000000\",\n \"00000000000000\",\n \"000000000000000\",\n \"0000000000000000\",\n \"00000000000000000\",\n \"000000000000000000\",\n \"0000000000000000000\",\n \"00000000000000000000\",\n \"000000000000000000000\",\n \"0000000000000000000000\",\n \"00000000000000000000000\",\n \"000000000000000000000000\",\n \"0000000000000000000000000\"\n ], f = [\n 0,\n 0,\n 25,\n 16,\n 12,\n 11,\n 10,\n 9,\n 8,\n 8,\n 7,\n 7,\n 7,\n 7,\n 6,\n 6,\n 6,\n 6,\n 6,\n 6,\n 6,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5,\n 5\n ], p = [\n 0,\n 0,\n 33554432,\n 43046721,\n 16777216,\n 48828125,\n 60466176,\n 40353607,\n 16777216,\n 43046721,\n 1e7,\n 19487171,\n 35831808,\n 62748517,\n 7529536,\n 11390625,\n 16777216,\n 24137569,\n 34012224,\n 47045881,\n 64e6,\n 4084101,\n 5153632,\n 6436343,\n 7962624,\n 9765625,\n 11881376,\n 14348907,\n 17210368,\n 20511149,\n 243e5,\n 28629151,\n 33554432,\n 39135393,\n 45435424,\n 52521875,\n 60466176\n ];\n i.prototype.toString = function(g, x) {\n g = g || 10, x = x | 0 || 1;\n var w;\n if (g === 16 || g === \"hex\") {\n w = \"\";\n for (var D = 0, O = 0, U = 0; U < this.length; U++) {\n var V = this.words[U], L = ((V << D | O) & 16777215).toString(16);\n O = V >>> 24 - D & 16777215, D += 2, D >= 26 && (D -= 26, U--), O !== 0 || U !== this.length - 1 ? w = h[6 - L.length] + L + w : w = L + w;\n }\n for (O !== 0 && (w = O.toString(16) + w); w.length % x !== 0; )\n w = \"0\" + w;\n return this.negative !== 0 && (w = \"-\" + w), w;\n }\n if (g === (g | 0) && g >= 2 && g <= 36) {\n var m = f[g], v = p[g];\n w = \"\";\n var P = this.clone();\n for (P.negative = 0; !P.isZero(); ) {\n var N = P.modrn(v).toString(g);\n P = P.idivn(v), P.isZero() ? w = N + w : w = h[m - N.length] + N + w;\n }\n for (this.isZero() && (w = \"0\" + w); w.length % x !== 0; )\n w = \"0\" + w;\n return this.negative !== 0 && (w = \"-\" + w), w;\n }\n r(!1, \"Base should be between 2 and 36\");\n }, i.prototype.toNumber = function() {\n var g = this.words[0];\n return this.length === 2 ? g += this.words[1] * 67108864 : this.length === 3 && this.words[2] === 1 ? g += 4503599627370496 + this.words[1] * 67108864 : this.length > 2 && r(!1, \"Number can only safely store up to 53 bits\"), this.negative !== 0 ? -g : g;\n }, i.prototype.toJSON = function() {\n return this.toString(16, 2);\n }, o && (i.prototype.toBuffer = function(g, x) {\n return this.toArrayLike(o, g, x);\n }), i.prototype.toArray = function(g, x) {\n return this.toArrayLike(Array, g, x);\n };\n var y = function(g, x) {\n return g.allocUnsafe ? g.allocUnsafe(x) : new g(x);\n };\n i.prototype.toArrayLike = function(g, x, w) {\n this._strip();\n var D = this.byteLength(), O = w || Math.max(1, D);\n r(D <= O, \"byte array longer than desired length\"), r(O > 0, \"Requested array length <= 0\");\n var U = y(g, O), V = x === \"le\" ? \"LE\" : \"BE\";\n return this[\"_toArrayLike\" + V](U, D), U;\n }, i.prototype._toArrayLikeLE = function(g, x) {\n for (var w = 0, D = 0, O = 0, U = 0; O < this.length; O++) {\n var V = this.words[O] << U | D;\n g[w++] = V & 255, w < g.length && (g[w++] = V >> 8 & 255), w < g.length && (g[w++] = V >> 16 & 255), U === 6 ? (w < g.length && (g[w++] = V >> 24 & 255), D = 0, U = 0) : (D = V >>> 24, U += 2);\n }\n if (w < g.length)\n for (g[w++] = D; w < g.length; )\n g[w++] = 0;\n }, i.prototype._toArrayLikeBE = function(g, x) {\n for (var w = g.length - 1, D = 0, O = 0, U = 0; O < this.length; O++) {\n var V = this.words[O] << U | D;\n g[w--] = V & 255, w >= 0 && (g[w--] = V >> 8 & 255), w >= 0 && (g[w--] = V >> 16 & 255), U === 6 ? (w >= 0 && (g[w--] = V >> 24 & 255), D = 0, U = 0) : (D = V >>> 24, U += 2);\n }\n if (w >= 0)\n for (g[w--] = D; w >= 0; )\n g[w--] = 0;\n }, Math.clz32 ? i.prototype._countBits = function(g) {\n return 32 - Math.clz32(g);\n } : i.prototype._countBits = function(g) {\n var x = g, w = 0;\n return x >= 4096 && (w += 13, x >>>= 13), x >= 64 && (w += 7, x >>>= 7), x >= 8 && (w += 4, x >>>= 4), x >= 2 && (w += 2, x >>>= 2), w + x;\n }, i.prototype._zeroBits = function(g) {\n if (g === 0) return 26;\n var x = g, w = 0;\n return (x & 8191) === 0 && (w += 13, x >>>= 13), (x & 127) === 0 && (w += 7, x >>>= 7), (x & 15) === 0 && (w += 4, x >>>= 4), (x & 3) === 0 && (w += 2, x >>>= 2), (x & 1) === 0 && w++, w;\n }, i.prototype.bitLength = function() {\n var g = this.words[this.length - 1], x = this._countBits(g);\n return (this.length - 1) * 26 + x;\n };\n function E(_) {\n for (var g = new Array(_.bitLength()), x = 0; x < g.length; x++) {\n var w = x / 26 | 0, D = x % 26;\n g[x] = _.words[w] >>> D & 1;\n }\n return g;\n }\n i.prototype.zeroBits = function() {\n if (this.isZero()) return 0;\n for (var g = 0, x = 0; x < this.length; x++) {\n var w = this._zeroBits(this.words[x]);\n if (g += w, w !== 26) break;\n }\n return g;\n }, i.prototype.byteLength = function() {\n return Math.ceil(this.bitLength() / 8);\n }, i.prototype.toTwos = function(g) {\n return this.negative !== 0 ? this.abs().inotn(g).iaddn(1) : this.clone();\n }, i.prototype.fromTwos = function(g) {\n return this.testn(g - 1) ? this.notn(g).iaddn(1).ineg() : this.clone();\n }, i.prototype.isNeg = function() {\n return this.negative !== 0;\n }, i.prototype.neg = function() {\n return this.clone().ineg();\n }, i.prototype.ineg = function() {\n return this.isZero() || (this.negative ^= 1), this;\n }, i.prototype.iuor = function(g) {\n for (; this.length < g.length; )\n this.words[this.length++] = 0;\n for (var x = 0; x < g.length; x++)\n this.words[x] = this.words[x] | g.words[x];\n return this._strip();\n }, i.prototype.ior = function(g) {\n return r((this.negative | g.negative) === 0), this.iuor(g);\n }, i.prototype.or = function(g) {\n return this.length > g.length ? this.clone().ior(g) : g.clone().ior(this);\n }, i.prototype.uor = function(g) {\n return this.length > g.length ? this.clone().iuor(g) : g.clone().iuor(this);\n }, i.prototype.iuand = function(g) {\n var x;\n this.length > g.length ? x = g : x = this;\n for (var w = 0; w < x.length; w++)\n this.words[w] = this.words[w] & g.words[w];\n return this.length = x.length, this._strip();\n }, i.prototype.iand = function(g) {\n return r((this.negative | g.negative) === 0), this.iuand(g);\n }, i.prototype.and = function(g) {\n return this.length > g.length ? this.clone().iand(g) : g.clone().iand(this);\n }, i.prototype.uand = function(g) {\n return this.length > g.length ? this.clone().iuand(g) : g.clone().iuand(this);\n }, i.prototype.iuxor = function(g) {\n var x, w;\n this.length > g.length ? (x = this, w = g) : (x = g, w = this);\n for (var D = 0; D < w.length; D++)\n this.words[D] = x.words[D] ^ w.words[D];\n if (this !== x)\n for (; D < x.length; D++)\n this.words[D] = x.words[D];\n return this.length = x.length, this._strip();\n }, i.prototype.ixor = function(g) {\n return r((this.negative | g.negative) === 0), this.iuxor(g);\n }, i.prototype.xor = function(g) {\n return this.length > g.length ? this.clone().ixor(g) : g.clone().ixor(this);\n }, i.prototype.uxor = function(g) {\n return this.length > g.length ? this.clone().iuxor(g) : g.clone().iuxor(this);\n }, i.prototype.inotn = function(g) {\n r(typeof g == \"number\" && g >= 0);\n var x = Math.ceil(g / 26) | 0, w = g % 26;\n this._expand(x), w > 0 && x--;\n for (var D = 0; D < x; D++)\n this.words[D] = ~this.words[D] & 67108863;\n return w > 0 && (this.words[D] = ~this.words[D] & 67108863 >> 26 - w), this._strip();\n }, i.prototype.notn = function(g) {\n return this.clone().inotn(g);\n }, i.prototype.setn = function(g, x) {\n r(typeof g == \"number\" && g >= 0);\n var w = g / 26 | 0, D = g % 26;\n return this._expand(w + 1), x ? this.words[w] = this.words[w] | 1 << D : this.words[w] = this.words[w] & ~(1 << D), this._strip();\n }, i.prototype.iadd = function(g) {\n var x;\n if (this.negative !== 0 && g.negative === 0)\n return this.negative = 0, x = this.isub(g), this.negative ^= 1, this._normSign();\n if (this.negative === 0 && g.negative !== 0)\n return g.negative = 0, x = this.isub(g), g.negative = 1, x._normSign();\n var w, D;\n this.length > g.length ? (w = this, D = g) : (w = g, D = this);\n for (var O = 0, U = 0; U < D.length; U++)\n x = (w.words[U] | 0) + (D.words[U] | 0) + O, this.words[U] = x & 67108863, O = x >>> 26;\n for (; O !== 0 && U < w.length; U++)\n x = (w.words[U] | 0) + O, this.words[U] = x & 67108863, O = x >>> 26;\n if (this.length = w.length, O !== 0)\n this.words[this.length] = O, this.length++;\n else if (w !== this)\n for (; U < w.length; U++)\n this.words[U] = w.words[U];\n return this;\n }, i.prototype.add = function(g) {\n var x;\n return g.negative !== 0 && this.negative === 0 ? (g.negative = 0, x = this.sub(g), g.negative ^= 1, x) : g.negative === 0 && this.negative !== 0 ? (this.negative = 0, x = g.sub(this), this.negative = 1, x) : this.length > g.length ? this.clone().iadd(g) : g.clone().iadd(this);\n }, i.prototype.isub = function(g) {\n if (g.negative !== 0) {\n g.negative = 0;\n var x = this.iadd(g);\n return g.negative = 1, x._normSign();\n } else if (this.negative !== 0)\n return this.negative = 0, this.iadd(g), this.negative = 1, this._normSign();\n var w = this.cmp(g);\n if (w === 0)\n return this.negative = 0, this.length = 1, this.words[0] = 0, this;\n var D, O;\n w > 0 ? (D = this, O = g) : (D = g, O = this);\n for (var U = 0, V = 0; V < O.length; V++)\n x = (D.words[V] | 0) - (O.words[V] | 0) + U, U = x >> 26, this.words[V] = x & 67108863;\n for (; U !== 0 && V < D.length; V++)\n x = (D.words[V] | 0) + U, U = x >> 26, this.words[V] = x & 67108863;\n if (U === 0 && V < D.length && D !== this)\n for (; V < D.length; V++)\n this.words[V] = D.words[V];\n return this.length = Math.max(this.length, V), D !== this && (this.negative = 1), this._strip();\n }, i.prototype.sub = function(g) {\n return this.clone().isub(g);\n };\n function b(_, g, x) {\n x.negative = g.negative ^ _.negative;\n var w = _.length + g.length | 0;\n x.length = w, w = w - 1 | 0;\n var D = _.words[0] | 0, O = g.words[0] | 0, U = D * O, V = U & 67108863, L = U / 67108864 | 0;\n x.words[0] = V;\n for (var m = 1; m < w; m++) {\n for (var v = L >>> 26, P = L & 67108863, N = Math.min(m, g.length - 1), Y = Math.max(0, m - _.length + 1); Y <= N; Y++) {\n var ee = m - Y | 0;\n D = _.words[ee] | 0, O = g.words[Y] | 0, U = D * O + P, v += U / 67108864 | 0, P = U & 67108863;\n }\n x.words[m] = P | 0, L = v | 0;\n }\n return L !== 0 ? x.words[m] = L | 0 : x.length--, x._strip();\n }\n var R = function(g, x, w) {\n var D = g.words, O = x.words, U = w.words, V = 0, L, m, v, P = D[0] | 0, N = P & 8191, Y = P >>> 13, ee = D[1] | 0, ie = ee & 8191, le = ee >>> 13, Te = D[2] | 0, De = Te & 8191, ze = Te >>> 13, _e = D[3] | 0, xe = _e & 8191, Be = _e >>> 13, ye = D[4] | 0, be = ye & 8191, Fe = ye >>> 13, Xe = D[5] | 0, we = Xe & 8191, Ne = Xe >>> 13, dt = D[6] | 0, Je = dt & 8191, Qe = dt >>> 13, it = D[7] | 0, je = it & 8191, B = it >>> 13, S = D[8] | 0, T = S & 8191, G = S >>> 13, Z = D[9] | 0, Q = Z & 8191, se = Z >>> 13, Ue = O[0] | 0, Pe = Ue & 8191, Le = Ue >>> 13, ct = O[1] | 0, Ae = ct & 8191, Tt = ct >>> 13, Uu = O[2] | 0, wt = Uu & 8191, At = Uu >>> 13, $u = O[3] | 0, It = $u & 8191, _t = $u >>> 13, Gu = O[4] | 0, Rt = Gu & 8191, Lt = Gu >>> 13, Vu = O[5] | 0, Ct = Vu & 8191, kt = Vu >>> 13, ju = O[6] | 0, Dt = ju & 8191, Pt = ju >>> 13, Ku = O[7] | 0, Mt = Ku & 8191, Ot = Ku >>> 13, Hu = O[8] | 0, Bt = Hu & 8191, Ft = Hu >>> 13, qu = O[9] | 0, Nt = qu & 8191, Ut = qu >>> 13;\n w.negative = g.negative ^ x.negative, w.length = 19, L = Math.imul(N, Pe), m = Math.imul(N, Le), m = m + Math.imul(Y, Pe) | 0, v = Math.imul(Y, Le);\n var xa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (xa >>> 26) | 0, xa &= 67108863, L = Math.imul(ie, Pe), m = Math.imul(ie, Le), m = m + Math.imul(le, Pe) | 0, v = Math.imul(le, Le), L = L + Math.imul(N, Ae) | 0, m = m + Math.imul(N, Tt) | 0, m = m + Math.imul(Y, Ae) | 0, v = v + Math.imul(Y, Tt) | 0;\n var Sa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Sa >>> 26) | 0, Sa &= 67108863, L = Math.imul(De, Pe), m = Math.imul(De, Le), m = m + Math.imul(ze, Pe) | 0, v = Math.imul(ze, Le), L = L + Math.imul(ie, Ae) | 0, m = m + Math.imul(ie, Tt) | 0, m = m + Math.imul(le, Ae) | 0, v = v + Math.imul(le, Tt) | 0, L = L + Math.imul(N, wt) | 0, m = m + Math.imul(N, At) | 0, m = m + Math.imul(Y, wt) | 0, v = v + Math.imul(Y, At) | 0;\n var ba = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (ba >>> 26) | 0, ba &= 67108863, L = Math.imul(xe, Pe), m = Math.imul(xe, Le), m = m + Math.imul(Be, Pe) | 0, v = Math.imul(Be, Le), L = L + Math.imul(De, Ae) | 0, m = m + Math.imul(De, Tt) | 0, m = m + Math.imul(ze, Ae) | 0, v = v + Math.imul(ze, Tt) | 0, L = L + Math.imul(ie, wt) | 0, m = m + Math.imul(ie, At) | 0, m = m + Math.imul(le, wt) | 0, v = v + Math.imul(le, At) | 0, L = L + Math.imul(N, It) | 0, m = m + Math.imul(N, _t) | 0, m = m + Math.imul(Y, It) | 0, v = v + Math.imul(Y, _t) | 0;\n var Ta = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Ta >>> 26) | 0, Ta &= 67108863, L = Math.imul(be, Pe), m = Math.imul(be, Le), m = m + Math.imul(Fe, Pe) | 0, v = Math.imul(Fe, Le), L = L + Math.imul(xe, Ae) | 0, m = m + Math.imul(xe, Tt) | 0, m = m + Math.imul(Be, Ae) | 0, v = v + Math.imul(Be, Tt) | 0, L = L + Math.imul(De, wt) | 0, m = m + Math.imul(De, At) | 0, m = m + Math.imul(ze, wt) | 0, v = v + Math.imul(ze, At) | 0, L = L + Math.imul(ie, It) | 0, m = m + Math.imul(ie, _t) | 0, m = m + Math.imul(le, It) | 0, v = v + Math.imul(le, _t) | 0, L = L + Math.imul(N, Rt) | 0, m = m + Math.imul(N, Lt) | 0, m = m + Math.imul(Y, Rt) | 0, v = v + Math.imul(Y, Lt) | 0;\n var wa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (wa >>> 26) | 0, wa &= 67108863, L = Math.imul(we, Pe), m = Math.imul(we, Le), m = m + Math.imul(Ne, Pe) | 0, v = Math.imul(Ne, Le), L = L + Math.imul(be, Ae) | 0, m = m + Math.imul(be, Tt) | 0, m = m + Math.imul(Fe, Ae) | 0, v = v + Math.imul(Fe, Tt) | 0, L = L + Math.imul(xe, wt) | 0, m = m + Math.imul(xe, At) | 0, m = m + Math.imul(Be, wt) | 0, v = v + Math.imul(Be, At) | 0, L = L + Math.imul(De, It) | 0, m = m + Math.imul(De, _t) | 0, m = m + Math.imul(ze, It) | 0, v = v + Math.imul(ze, _t) | 0, L = L + Math.imul(ie, Rt) | 0, m = m + Math.imul(ie, Lt) | 0, m = m + Math.imul(le, Rt) | 0, v = v + Math.imul(le, Lt) | 0, L = L + Math.imul(N, Ct) | 0, m = m + Math.imul(N, kt) | 0, m = m + Math.imul(Y, Ct) | 0, v = v + Math.imul(Y, kt) | 0;\n var Aa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Aa >>> 26) | 0, Aa &= 67108863, L = Math.imul(Je, Pe), m = Math.imul(Je, Le), m = m + Math.imul(Qe, Pe) | 0, v = Math.imul(Qe, Le), L = L + Math.imul(we, Ae) | 0, m = m + Math.imul(we, Tt) | 0, m = m + Math.imul(Ne, Ae) | 0, v = v + Math.imul(Ne, Tt) | 0, L = L + Math.imul(be, wt) | 0, m = m + Math.imul(be, At) | 0, m = m + Math.imul(Fe, wt) | 0, v = v + Math.imul(Fe, At) | 0, L = L + Math.imul(xe, It) | 0, m = m + Math.imul(xe, _t) | 0, m = m + Math.imul(Be, It) | 0, v = v + Math.imul(Be, _t) | 0, L = L + Math.imul(De, Rt) | 0, m = m + Math.imul(De, Lt) | 0, m = m + Math.imul(ze, Rt) | 0, v = v + Math.imul(ze, Lt) | 0, L = L + Math.imul(ie, Ct) | 0, m = m + Math.imul(ie, kt) | 0, m = m + Math.imul(le, Ct) | 0, v = v + Math.imul(le, kt) | 0, L = L + Math.imul(N, Dt) | 0, m = m + Math.imul(N, Pt) | 0, m = m + Math.imul(Y, Dt) | 0, v = v + Math.imul(Y, Pt) | 0;\n var Ia = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Ia >>> 26) | 0, Ia &= 67108863, L = Math.imul(je, Pe), m = Math.imul(je, Le), m = m + Math.imul(B, Pe) | 0, v = Math.imul(B, Le), L = L + Math.imul(Je, Ae) | 0, m = m + Math.imul(Je, Tt) | 0, m = m + Math.imul(Qe, Ae) | 0, v = v + Math.imul(Qe, Tt) | 0, L = L + Math.imul(we, wt) | 0, m = m + Math.imul(we, At) | 0, m = m + Math.imul(Ne, wt) | 0, v = v + Math.imul(Ne, At) | 0, L = L + Math.imul(be, It) | 0, m = m + Math.imul(be, _t) | 0, m = m + Math.imul(Fe, It) | 0, v = v + Math.imul(Fe, _t) | 0, L = L + Math.imul(xe, Rt) | 0, m = m + Math.imul(xe, Lt) | 0, m = m + Math.imul(Be, Rt) | 0, v = v + Math.imul(Be, Lt) | 0, L = L + Math.imul(De, Ct) | 0, m = m + Math.imul(De, kt) | 0, m = m + Math.imul(ze, Ct) | 0, v = v + Math.imul(ze, kt) | 0, L = L + Math.imul(ie, Dt) | 0, m = m + Math.imul(ie, Pt) | 0, m = m + Math.imul(le, Dt) | 0, v = v + Math.imul(le, Pt) | 0, L = L + Math.imul(N, Mt) | 0, m = m + Math.imul(N, Ot) | 0, m = m + Math.imul(Y, Mt) | 0, v = v + Math.imul(Y, Ot) | 0;\n var _a = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (_a >>> 26) | 0, _a &= 67108863, L = Math.imul(T, Pe), m = Math.imul(T, Le), m = m + Math.imul(G, Pe) | 0, v = Math.imul(G, Le), L = L + Math.imul(je, Ae) | 0, m = m + Math.imul(je, Tt) | 0, m = m + Math.imul(B, Ae) | 0, v = v + Math.imul(B, Tt) | 0, L = L + Math.imul(Je, wt) | 0, m = m + Math.imul(Je, At) | 0, m = m + Math.imul(Qe, wt) | 0, v = v + Math.imul(Qe, At) | 0, L = L + Math.imul(we, It) | 0, m = m + Math.imul(we, _t) | 0, m = m + Math.imul(Ne, It) | 0, v = v + Math.imul(Ne, _t) | 0, L = L + Math.imul(be, Rt) | 0, m = m + Math.imul(be, Lt) | 0, m = m + Math.imul(Fe, Rt) | 0, v = v + Math.imul(Fe, Lt) | 0, L = L + Math.imul(xe, Ct) | 0, m = m + Math.imul(xe, kt) | 0, m = m + Math.imul(Be, Ct) | 0, v = v + Math.imul(Be, kt) | 0, L = L + Math.imul(De, Dt) | 0, m = m + Math.imul(De, Pt) | 0, m = m + Math.imul(ze, Dt) | 0, v = v + Math.imul(ze, Pt) | 0, L = L + Math.imul(ie, Mt) | 0, m = m + Math.imul(ie, Ot) | 0, m = m + Math.imul(le, Mt) | 0, v = v + Math.imul(le, Ot) | 0, L = L + Math.imul(N, Bt) | 0, m = m + Math.imul(N, Ft) | 0, m = m + Math.imul(Y, Bt) | 0, v = v + Math.imul(Y, Ft) | 0;\n var Ra = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Ra >>> 26) | 0, Ra &= 67108863, L = Math.imul(Q, Pe), m = Math.imul(Q, Le), m = m + Math.imul(se, Pe) | 0, v = Math.imul(se, Le), L = L + Math.imul(T, Ae) | 0, m = m + Math.imul(T, Tt) | 0, m = m + Math.imul(G, Ae) | 0, v = v + Math.imul(G, Tt) | 0, L = L + Math.imul(je, wt) | 0, m = m + Math.imul(je, At) | 0, m = m + Math.imul(B, wt) | 0, v = v + Math.imul(B, At) | 0, L = L + Math.imul(Je, It) | 0, m = m + Math.imul(Je, _t) | 0, m = m + Math.imul(Qe, It) | 0, v = v + Math.imul(Qe, _t) | 0, L = L + Math.imul(we, Rt) | 0, m = m + Math.imul(we, Lt) | 0, m = m + Math.imul(Ne, Rt) | 0, v = v + Math.imul(Ne, Lt) | 0, L = L + Math.imul(be, Ct) | 0, m = m + Math.imul(be, kt) | 0, m = m + Math.imul(Fe, Ct) | 0, v = v + Math.imul(Fe, kt) | 0, L = L + Math.imul(xe, Dt) | 0, m = m + Math.imul(xe, Pt) | 0, m = m + Math.imul(Be, Dt) | 0, v = v + Math.imul(Be, Pt) | 0, L = L + Math.imul(De, Mt) | 0, m = m + Math.imul(De, Ot) | 0, m = m + Math.imul(ze, Mt) | 0, v = v + Math.imul(ze, Ot) | 0, L = L + Math.imul(ie, Bt) | 0, m = m + Math.imul(ie, Ft) | 0, m = m + Math.imul(le, Bt) | 0, v = v + Math.imul(le, Ft) | 0, L = L + Math.imul(N, Nt) | 0, m = m + Math.imul(N, Ut) | 0, m = m + Math.imul(Y, Nt) | 0, v = v + Math.imul(Y, Ut) | 0;\n var La = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (La >>> 26) | 0, La &= 67108863, L = Math.imul(Q, Ae), m = Math.imul(Q, Tt), m = m + Math.imul(se, Ae) | 0, v = Math.imul(se, Tt), L = L + Math.imul(T, wt) | 0, m = m + Math.imul(T, At) | 0, m = m + Math.imul(G, wt) | 0, v = v + Math.imul(G, At) | 0, L = L + Math.imul(je, It) | 0, m = m + Math.imul(je, _t) | 0, m = m + Math.imul(B, It) | 0, v = v + Math.imul(B, _t) | 0, L = L + Math.imul(Je, Rt) | 0, m = m + Math.imul(Je, Lt) | 0, m = m + Math.imul(Qe, Rt) | 0, v = v + Math.imul(Qe, Lt) | 0, L = L + Math.imul(we, Ct) | 0, m = m + Math.imul(we, kt) | 0, m = m + Math.imul(Ne, Ct) | 0, v = v + Math.imul(Ne, kt) | 0, L = L + Math.imul(be, Dt) | 0, m = m + Math.imul(be, Pt) | 0, m = m + Math.imul(Fe, Dt) | 0, v = v + Math.imul(Fe, Pt) | 0, L = L + Math.imul(xe, Mt) | 0, m = m + Math.imul(xe, Ot) | 0, m = m + Math.imul(Be, Mt) | 0, v = v + Math.imul(Be, Ot) | 0, L = L + Math.imul(De, Bt) | 0, m = m + Math.imul(De, Ft) | 0, m = m + Math.imul(ze, Bt) | 0, v = v + Math.imul(ze, Ft) | 0, L = L + Math.imul(ie, Nt) | 0, m = m + Math.imul(ie, Ut) | 0, m = m + Math.imul(le, Nt) | 0, v = v + Math.imul(le, Ut) | 0;\n var Ca = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Ca >>> 26) | 0, Ca &= 67108863, L = Math.imul(Q, wt), m = Math.imul(Q, At), m = m + Math.imul(se, wt) | 0, v = Math.imul(se, At), L = L + Math.imul(T, It) | 0, m = m + Math.imul(T, _t) | 0, m = m + Math.imul(G, It) | 0, v = v + Math.imul(G, _t) | 0, L = L + Math.imul(je, Rt) | 0, m = m + Math.imul(je, Lt) | 0, m = m + Math.imul(B, Rt) | 0, v = v + Math.imul(B, Lt) | 0, L = L + Math.imul(Je, Ct) | 0, m = m + Math.imul(Je, kt) | 0, m = m + Math.imul(Qe, Ct) | 0, v = v + Math.imul(Qe, kt) | 0, L = L + Math.imul(we, Dt) | 0, m = m + Math.imul(we, Pt) | 0, m = m + Math.imul(Ne, Dt) | 0, v = v + Math.imul(Ne, Pt) | 0, L = L + Math.imul(be, Mt) | 0, m = m + Math.imul(be, Ot) | 0, m = m + Math.imul(Fe, Mt) | 0, v = v + Math.imul(Fe, Ot) | 0, L = L + Math.imul(xe, Bt) | 0, m = m + Math.imul(xe, Ft) | 0, m = m + Math.imul(Be, Bt) | 0, v = v + Math.imul(Be, Ft) | 0, L = L + Math.imul(De, Nt) | 0, m = m + Math.imul(De, Ut) | 0, m = m + Math.imul(ze, Nt) | 0, v = v + Math.imul(ze, Ut) | 0;\n var ka = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (ka >>> 26) | 0, ka &= 67108863, L = Math.imul(Q, It), m = Math.imul(Q, _t), m = m + Math.imul(se, It) | 0, v = Math.imul(se, _t), L = L + Math.imul(T, Rt) | 0, m = m + Math.imul(T, Lt) | 0, m = m + Math.imul(G, Rt) | 0, v = v + Math.imul(G, Lt) | 0, L = L + Math.imul(je, Ct) | 0, m = m + Math.imul(je, kt) | 0, m = m + Math.imul(B, Ct) | 0, v = v + Math.imul(B, kt) | 0, L = L + Math.imul(Je, Dt) | 0, m = m + Math.imul(Je, Pt) | 0, m = m + Math.imul(Qe, Dt) | 0, v = v + Math.imul(Qe, Pt) | 0, L = L + Math.imul(we, Mt) | 0, m = m + Math.imul(we, Ot) | 0, m = m + Math.imul(Ne, Mt) | 0, v = v + Math.imul(Ne, Ot) | 0, L = L + Math.imul(be, Bt) | 0, m = m + Math.imul(be, Ft) | 0, m = m + Math.imul(Fe, Bt) | 0, v = v + Math.imul(Fe, Ft) | 0, L = L + Math.imul(xe, Nt) | 0, m = m + Math.imul(xe, Ut) | 0, m = m + Math.imul(Be, Nt) | 0, v = v + Math.imul(Be, Ut) | 0;\n var Da = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Da >>> 26) | 0, Da &= 67108863, L = Math.imul(Q, Rt), m = Math.imul(Q, Lt), m = m + Math.imul(se, Rt) | 0, v = Math.imul(se, Lt), L = L + Math.imul(T, Ct) | 0, m = m + Math.imul(T, kt) | 0, m = m + Math.imul(G, Ct) | 0, v = v + Math.imul(G, kt) | 0, L = L + Math.imul(je, Dt) | 0, m = m + Math.imul(je, Pt) | 0, m = m + Math.imul(B, Dt) | 0, v = v + Math.imul(B, Pt) | 0, L = L + Math.imul(Je, Mt) | 0, m = m + Math.imul(Je, Ot) | 0, m = m + Math.imul(Qe, Mt) | 0, v = v + Math.imul(Qe, Ot) | 0, L = L + Math.imul(we, Bt) | 0, m = m + Math.imul(we, Ft) | 0, m = m + Math.imul(Ne, Bt) | 0, v = v + Math.imul(Ne, Ft) | 0, L = L + Math.imul(be, Nt) | 0, m = m + Math.imul(be, Ut) | 0, m = m + Math.imul(Fe, Nt) | 0, v = v + Math.imul(Fe, Ut) | 0;\n var Pa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Pa >>> 26) | 0, Pa &= 67108863, L = Math.imul(Q, Ct), m = Math.imul(Q, kt), m = m + Math.imul(se, Ct) | 0, v = Math.imul(se, kt), L = L + Math.imul(T, Dt) | 0, m = m + Math.imul(T, Pt) | 0, m = m + Math.imul(G, Dt) | 0, v = v + Math.imul(G, Pt) | 0, L = L + Math.imul(je, Mt) | 0, m = m + Math.imul(je, Ot) | 0, m = m + Math.imul(B, Mt) | 0, v = v + Math.imul(B, Ot) | 0, L = L + Math.imul(Je, Bt) | 0, m = m + Math.imul(Je, Ft) | 0, m = m + Math.imul(Qe, Bt) | 0, v = v + Math.imul(Qe, Ft) | 0, L = L + Math.imul(we, Nt) | 0, m = m + Math.imul(we, Ut) | 0, m = m + Math.imul(Ne, Nt) | 0, v = v + Math.imul(Ne, Ut) | 0;\n var Ma = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Ma >>> 26) | 0, Ma &= 67108863, L = Math.imul(Q, Dt), m = Math.imul(Q, Pt), m = m + Math.imul(se, Dt) | 0, v = Math.imul(se, Pt), L = L + Math.imul(T, Mt) | 0, m = m + Math.imul(T, Ot) | 0, m = m + Math.imul(G, Mt) | 0, v = v + Math.imul(G, Ot) | 0, L = L + Math.imul(je, Bt) | 0, m = m + Math.imul(je, Ft) | 0, m = m + Math.imul(B, Bt) | 0, v = v + Math.imul(B, Ft) | 0, L = L + Math.imul(Je, Nt) | 0, m = m + Math.imul(Je, Ut) | 0, m = m + Math.imul(Qe, Nt) | 0, v = v + Math.imul(Qe, Ut) | 0;\n var Oa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Oa >>> 26) | 0, Oa &= 67108863, L = Math.imul(Q, Mt), m = Math.imul(Q, Ot), m = m + Math.imul(se, Mt) | 0, v = Math.imul(se, Ot), L = L + Math.imul(T, Bt) | 0, m = m + Math.imul(T, Ft) | 0, m = m + Math.imul(G, Bt) | 0, v = v + Math.imul(G, Ft) | 0, L = L + Math.imul(je, Nt) | 0, m = m + Math.imul(je, Ut) | 0, m = m + Math.imul(B, Nt) | 0, v = v + Math.imul(B, Ut) | 0;\n var Ba = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Ba >>> 26) | 0, Ba &= 67108863, L = Math.imul(Q, Bt), m = Math.imul(Q, Ft), m = m + Math.imul(se, Bt) | 0, v = Math.imul(se, Ft), L = L + Math.imul(T, Nt) | 0, m = m + Math.imul(T, Ut) | 0, m = m + Math.imul(G, Nt) | 0, v = v + Math.imul(G, Ut) | 0;\n var Fa = (V + L | 0) + ((m & 8191) << 13) | 0;\n V = (v + (m >>> 13) | 0) + (Fa >>> 26) | 0, Fa &= 67108863, L = Math.imul(Q, Nt), m = Math.imul(Q, Ut), m = m + Math.imul(se, Nt) | 0, v = Math.imul(se, Ut);\n var Na = (V + L | 0) + ((m & 8191) << 13) | 0;\n return V = (v + (m >>> 13) | 0) + (Na >>> 26) | 0, Na &= 67108863, U[0] = xa, U[1] = Sa, U[2] = ba, U[3] = Ta, U[4] = wa, U[5] = Aa, U[6] = Ia, U[7] = _a, U[8] = Ra, U[9] = La, U[10] = Ca, U[11] = ka, U[12] = Da, U[13] = Pa, U[14] = Ma, U[15] = Oa, U[16] = Ba, U[17] = Fa, U[18] = Na, V !== 0 && (U[19] = V, w.length++), w;\n };\n Math.imul || (R = b);\n function A(_, g, x) {\n x.negative = g.negative ^ _.negative, x.length = _.length + g.length;\n for (var w = 0, D = 0, O = 0; O < x.length - 1; O++) {\n var U = D;\n D = 0;\n for (var V = w & 67108863, L = Math.min(O, g.length - 1), m = Math.max(0, O - _.length + 1); m <= L; m++) {\n var v = O - m, P = _.words[v] | 0, N = g.words[m] | 0, Y = P * N, ee = Y & 67108863;\n U = U + (Y / 67108864 | 0) | 0, ee = ee + V | 0, V = ee & 67108863, U = U + (ee >>> 26) | 0, D += U >>> 26, U &= 67108863;\n }\n x.words[O] = V, w = U, U = D;\n }\n return w !== 0 ? x.words[O] = w : x.length--, x._strip();\n }\n function F(_, g, x) {\n return A(_, g, x);\n }\n i.prototype.mulTo = function(g, x) {\n var w, D = this.length + g.length;\n return this.length === 10 && g.length === 10 ? w = R(this, g, x) : D < 63 ? w = b(this, g, x) : D < 1024 ? w = A(this, g, x) : w = F(this, g, x), w;\n }, i.prototype.mul = function(g) {\n var x = new i(null);\n return x.words = new Array(this.length + g.length), this.mulTo(g, x);\n }, i.prototype.mulf = function(g) {\n var x = new i(null);\n return x.words = new Array(this.length + g.length), F(this, g, x);\n }, i.prototype.imul = function(g) {\n return this.clone().mulTo(g, this);\n }, i.prototype.imuln = function(g) {\n var x = g < 0;\n x && (g = -g), r(typeof g == \"number\"), r(g < 67108864);\n for (var w = 0, D = 0; D < this.length; D++) {\n var O = (this.words[D] | 0) * g, U = (O & 67108863) + (w & 67108863);\n w >>= 26, w += O / 67108864 | 0, w += U >>> 26, this.words[D] = U & 67108863;\n }\n return w !== 0 && (this.words[D] = w, this.length++), this.length = g === 0 ? 1 : this.length, x ? this.ineg() : this;\n }, i.prototype.muln = function(g) {\n return this.clone().imuln(g);\n }, i.prototype.sqr = function() {\n return this.mul(this);\n }, i.prototype.isqr = function() {\n return this.imul(this.clone());\n }, i.prototype.pow = function(g) {\n var x = E(g);\n if (x.length === 0) return new i(1);\n for (var w = this, D = 0; D < x.length && x[D] === 0; D++, w = w.sqr())\n ;\n if (++D < x.length)\n for (var O = w.sqr(); D < x.length; D++, O = O.sqr())\n x[D] !== 0 && (w = w.mul(O));\n return w;\n }, i.prototype.iushln = function(g) {\n r(typeof g == \"number\" && g >= 0);\n var x = g % 26, w = (g - x) / 26, D = 67108863 >>> 26 - x << 26 - x, O;\n if (x !== 0) {\n var U = 0;\n for (O = 0; O < this.length; O++) {\n var V = this.words[O] & D, L = (this.words[O] | 0) - V << x;\n this.words[O] = L | U, U = V >>> 26 - x;\n }\n U && (this.words[O] = U, this.length++);\n }\n if (w !== 0) {\n for (O = this.length - 1; O >= 0; O--)\n this.words[O + w] = this.words[O];\n for (O = 0; O < w; O++)\n this.words[O] = 0;\n this.length += w;\n }\n return this._strip();\n }, i.prototype.ishln = function(g) {\n return r(this.negative === 0), this.iushln(g);\n }, i.prototype.iushrn = function(g, x, w) {\n r(typeof g == \"number\" && g >= 0);\n var D;\n x ? D = (x - x % 26) / 26 : D = 0;\n var O = g % 26, U = Math.min((g - O) / 26, this.length), V = 67108863 ^ 67108863 >>> O << O, L = w;\n if (D -= U, D = Math.max(0, D), L) {\n for (var m = 0; m < U; m++)\n L.words[m] = this.words[m];\n L.length = U;\n }\n if (U !== 0) if (this.length > U)\n for (this.length -= U, m = 0; m < this.length; m++)\n this.words[m] = this.words[m + U];\n else\n this.words[0] = 0, this.length = 1;\n var v = 0;\n for (m = this.length - 1; m >= 0 && (v !== 0 || m >= D); m--) {\n var P = this.words[m] | 0;\n this.words[m] = v << 26 - O | P >>> O, v = P & V;\n }\n return L && v !== 0 && (L.words[L.length++] = v), this.length === 0 && (this.words[0] = 0, this.length = 1), this._strip();\n }, i.prototype.ishrn = function(g, x, w) {\n return r(this.negative === 0), this.iushrn(g, x, w);\n }, i.prototype.shln = function(g) {\n return this.clone().ishln(g);\n }, i.prototype.ushln = function(g) {\n return this.clone().iushln(g);\n }, i.prototype.shrn = function(g) {\n return this.clone().ishrn(g);\n }, i.prototype.ushrn = function(g) {\n return this.clone().iushrn(g);\n }, i.prototype.testn = function(g) {\n r(typeof g == \"number\" && g >= 0);\n var x = g % 26, w = (g - x) / 26, D = 1 << x;\n if (this.length <= w) return !1;\n var O = this.words[w];\n return !!(O & D);\n }, i.prototype.imaskn = function(g) {\n r(typeof g == \"number\" && g >= 0);\n var x = g % 26, w = (g - x) / 26;\n if (r(this.negative === 0, \"imaskn works only with positive numbers\"), this.length <= w)\n return this;\n if (x !== 0 && w++, this.length = Math.min(w, this.length), x !== 0) {\n var D = 67108863 ^ 67108863 >>> x << x;\n this.words[this.length - 1] &= D;\n }\n return this._strip();\n }, i.prototype.maskn = function(g) {\n return this.clone().imaskn(g);\n }, i.prototype.iaddn = function(g) {\n return r(typeof g == \"number\"), r(g < 67108864), g < 0 ? this.isubn(-g) : this.negative !== 0 ? this.length === 1 && (this.words[0] | 0) <= g ? (this.words[0] = g - (this.words[0] | 0), this.negative = 0, this) : (this.negative = 0, this.isubn(g), this.negative = 1, this) : this._iaddn(g);\n }, i.prototype._iaddn = function(g) {\n this.words[0] += g;\n for (var x = 0; x < this.length && this.words[x] >= 67108864; x++)\n this.words[x] -= 67108864, x === this.length - 1 ? this.words[x + 1] = 1 : this.words[x + 1]++;\n return this.length = Math.max(this.length, x + 1), this;\n }, i.prototype.isubn = function(g) {\n if (r(typeof g == \"number\"), r(g < 67108864), g < 0) return this.iaddn(-g);\n if (this.negative !== 0)\n return this.negative = 0, this.iaddn(g), this.negative = 1, this;\n if (this.words[0] -= g, this.length === 1 && this.words[0] < 0)\n this.words[0] = -this.words[0], this.negative = 1;\n else\n for (var x = 0; x < this.length && this.words[x] < 0; x++)\n this.words[x] += 67108864, this.words[x + 1] -= 1;\n return this._strip();\n }, i.prototype.addn = function(g) {\n return this.clone().iaddn(g);\n }, i.prototype.subn = function(g) {\n return this.clone().isubn(g);\n }, i.prototype.iabs = function() {\n return this.negative = 0, this;\n }, i.prototype.abs = function() {\n return this.clone().iabs();\n }, i.prototype._ishlnsubmul = function(g, x, w) {\n var D = g.length + w, O;\n this._expand(D);\n var U, V = 0;\n for (O = 0; O < g.length; O++) {\n U = (this.words[O + w] | 0) + V;\n var L = (g.words[O] | 0) * x;\n U -= L & 67108863, V = (U >> 26) - (L / 67108864 | 0), this.words[O + w] = U & 67108863;\n }\n for (; O < this.length - w; O++)\n U = (this.words[O + w] | 0) + V, V = U >> 26, this.words[O + w] = U & 67108863;\n if (V === 0) return this._strip();\n for (r(V === -1), V = 0, O = 0; O < this.length; O++)\n U = -(this.words[O] | 0) + V, V = U >> 26, this.words[O] = U & 67108863;\n return this.negative = 1, this._strip();\n }, i.prototype._wordDiv = function(g, x) {\n var w = this.length - g.length, D = this.clone(), O = g, U = O.words[O.length - 1] | 0, V = this._countBits(U);\n w = 26 - V, w !== 0 && (O = O.ushln(w), D.iushln(w), U = O.words[O.length - 1] | 0);\n var L = D.length - O.length, m;\n if (x !== \"mod\") {\n m = new i(null), m.length = L + 1, m.words = new Array(m.length);\n for (var v = 0; v < m.length; v++)\n m.words[v] = 0;\n }\n var P = D.clone()._ishlnsubmul(O, 1, L);\n P.negative === 0 && (D = P, m && (m.words[L] = 1));\n for (var N = L - 1; N >= 0; N--) {\n var Y = (D.words[O.length + N] | 0) * 67108864 + (D.words[O.length + N - 1] | 0);\n for (Y = Math.min(Y / U | 0, 67108863), D._ishlnsubmul(O, Y, N); D.negative !== 0; )\n Y--, D.negative = 0, D._ishlnsubmul(O, 1, N), D.isZero() || (D.negative ^= 1);\n m && (m.words[N] = Y);\n }\n return m && m._strip(), D._strip(), x !== \"div\" && w !== 0 && D.iushrn(w), {\n div: m || null,\n mod: D\n };\n }, i.prototype.divmod = function(g, x, w) {\n if (r(!g.isZero()), this.isZero())\n return {\n div: new i(0),\n mod: new i(0)\n };\n var D, O, U;\n return this.negative !== 0 && g.negative === 0 ? (U = this.neg().divmod(g, x), x !== \"mod\" && (D = U.div.neg()), x !== \"div\" && (O = U.mod.neg(), w && O.negative !== 0 && O.iadd(g)), {\n div: D,\n mod: O\n }) : this.negative === 0 && g.negative !== 0 ? (U = this.divmod(g.neg(), x), x !== \"mod\" && (D = U.div.neg()), {\n div: D,\n mod: U.mod\n }) : (this.negative & g.negative) !== 0 ? (U = this.neg().divmod(g.neg(), x), x !== \"div\" && (O = U.mod.neg(), w && O.negative !== 0 && O.isub(g)), {\n div: U.div,\n mod: O\n }) : g.length > this.length || this.cmp(g) < 0 ? {\n div: new i(0),\n mod: this\n } : g.length === 1 ? x === \"div\" ? {\n div: this.divn(g.words[0]),\n mod: null\n } : x === \"mod\" ? {\n div: null,\n mod: new i(this.modrn(g.words[0]))\n } : {\n div: this.divn(g.words[0]),\n mod: new i(this.modrn(g.words[0]))\n } : this._wordDiv(g, x);\n }, i.prototype.div = function(g) {\n return this.divmod(g, \"div\", !1).div;\n }, i.prototype.mod = function(g) {\n return this.divmod(g, \"mod\", !1).mod;\n }, i.prototype.umod = function(g) {\n return this.divmod(g, \"mod\", !0).mod;\n }, i.prototype.divRound = function(g) {\n var x = this.divmod(g);\n if (x.mod.isZero()) return x.div;\n var w = x.div.negative !== 0 ? x.mod.isub(g) : x.mod, D = g.ushrn(1), O = g.andln(1), U = w.cmp(D);\n return U < 0 || O === 1 && U === 0 ? x.div : x.div.negative !== 0 ? x.div.isubn(1) : x.div.iaddn(1);\n }, i.prototype.modrn = function(g) {\n var x = g < 0;\n x && (g = -g), r(g <= 67108863);\n for (var w = (1 << 26) % g, D = 0, O = this.length - 1; O >= 0; O--)\n D = (w * D + (this.words[O] | 0)) % g;\n return x ? -D : D;\n }, i.prototype.modn = function(g) {\n return this.modrn(g);\n }, i.prototype.idivn = function(g) {\n var x = g < 0;\n x && (g = -g), r(g <= 67108863);\n for (var w = 0, D = this.length - 1; D >= 0; D--) {\n var O = (this.words[D] | 0) + w * 67108864;\n this.words[D] = O / g | 0, w = O % g;\n }\n return this._strip(), x ? this.ineg() : this;\n }, i.prototype.divn = function(g) {\n return this.clone().idivn(g);\n }, i.prototype.egcd = function(g) {\n r(g.negative === 0), r(!g.isZero());\n var x = this, w = g.clone();\n x.negative !== 0 ? x = x.umod(g) : x = x.clone();\n for (var D = new i(1), O = new i(0), U = new i(0), V = new i(1), L = 0; x.isEven() && w.isEven(); )\n x.iushrn(1), w.iushrn(1), ++L;\n for (var m = w.clone(), v = x.clone(); !x.isZero(); ) {\n for (var P = 0, N = 1; (x.words[0] & N) === 0 && P < 26; ++P, N <<= 1) ;\n if (P > 0)\n for (x.iushrn(P); P-- > 0; )\n (D.isOdd() || O.isOdd()) && (D.iadd(m), O.isub(v)), D.iushrn(1), O.iushrn(1);\n for (var Y = 0, ee = 1; (w.words[0] & ee) === 0 && Y < 26; ++Y, ee <<= 1) ;\n if (Y > 0)\n for (w.iushrn(Y); Y-- > 0; )\n (U.isOdd() || V.isOdd()) && (U.iadd(m), V.isub(v)), U.iushrn(1), V.iushrn(1);\n x.cmp(w) >= 0 ? (x.isub(w), D.isub(U), O.isub(V)) : (w.isub(x), U.isub(D), V.isub(O));\n }\n return {\n a: U,\n b: V,\n gcd: w.iushln(L)\n };\n }, i.prototype._invmp = function(g) {\n r(g.negative === 0), r(!g.isZero());\n var x = this, w = g.clone();\n x.negative !== 0 ? x = x.umod(g) : x = x.clone();\n for (var D = new i(1), O = new i(0), U = w.clone(); x.cmpn(1) > 0 && w.cmpn(1) > 0; ) {\n for (var V = 0, L = 1; (x.words[0] & L) === 0 && V < 26; ++V, L <<= 1) ;\n if (V > 0)\n for (x.iushrn(V); V-- > 0; )\n D.isOdd() && D.iadd(U), D.iushrn(1);\n for (var m = 0, v = 1; (w.words[0] & v) === 0 && m < 26; ++m, v <<= 1) ;\n if (m > 0)\n for (w.iushrn(m); m-- > 0; )\n O.isOdd() && O.iadd(U), O.iushrn(1);\n x.cmp(w) >= 0 ? (x.isub(w), D.isub(O)) : (w.isub(x), O.isub(D));\n }\n var P;\n return x.cmpn(1) === 0 ? P = D : P = O, P.cmpn(0) < 0 && P.iadd(g), P;\n }, i.prototype.gcd = function(g) {\n if (this.isZero()) return g.abs();\n if (g.isZero()) return this.abs();\n var x = this.clone(), w = g.clone();\n x.negative = 0, w.negative = 0;\n for (var D = 0; x.isEven() && w.isEven(); D++)\n x.iushrn(1), w.iushrn(1);\n do {\n for (; x.isEven(); )\n x.iushrn(1);\n for (; w.isEven(); )\n w.iushrn(1);\n var O = x.cmp(w);\n if (O < 0) {\n var U = x;\n x = w, w = U;\n } else if (O === 0 || w.cmpn(1) === 0)\n break;\n x.isub(w);\n } while (!0);\n return w.iushln(D);\n }, i.prototype.invm = function(g) {\n return this.egcd(g).a.umod(g);\n }, i.prototype.isEven = function() {\n return (this.words[0] & 1) === 0;\n }, i.prototype.isOdd = function() {\n return (this.words[0] & 1) === 1;\n }, i.prototype.andln = function(g) {\n return this.words[0] & g;\n }, i.prototype.bincn = function(g) {\n r(typeof g == \"number\");\n var x = g % 26, w = (g - x) / 26, D = 1 << x;\n if (this.length <= w)\n return this._expand(w + 1), this.words[w] |= D, this;\n for (var O = D, U = w; O !== 0 && U < this.length; U++) {\n var V = this.words[U] | 0;\n V += O, O = V >>> 26, V &= 67108863, this.words[U] = V;\n }\n return O !== 0 && (this.words[U] = O, this.length++), this;\n }, i.prototype.isZero = function() {\n return this.length === 1 && this.words[0] === 0;\n }, i.prototype.cmpn = function(g) {\n var x = g < 0;\n if (this.negative !== 0 && !x) return -1;\n if (this.negative === 0 && x) return 1;\n this._strip();\n var w;\n if (this.length > 1)\n w = 1;\n else {\n x && (g = -g), r(g <= 67108863, \"Number is too big\");\n var D = this.words[0] | 0;\n w = D === g ? 0 : D < g ? -1 : 1;\n }\n return this.negative !== 0 ? -w | 0 : w;\n }, i.prototype.cmp = function(g) {\n if (this.negative !== 0 && g.negative === 0) return -1;\n if (this.negative === 0 && g.negative !== 0) return 1;\n var x = this.ucmp(g);\n return this.negative !== 0 ? -x | 0 : x;\n }, i.prototype.ucmp = function(g) {\n if (this.length > g.length) return 1;\n if (this.length < g.length) return -1;\n for (var x = 0, w = this.length - 1; w >= 0; w--) {\n var D = this.words[w] | 0, O = g.words[w] | 0;\n if (D !== O) {\n D < O ? x = -1 : D > O && (x = 1);\n break;\n }\n }\n return x;\n }, i.prototype.gtn = function(g) {\n return this.cmpn(g) === 1;\n }, i.prototype.gt = function(g) {\n return this.cmp(g) === 1;\n }, i.prototype.gten = function(g) {\n return this.cmpn(g) >= 0;\n }, i.prototype.gte = function(g) {\n return this.cmp(g) >= 0;\n }, i.prototype.ltn = function(g) {\n return this.cmpn(g) === -1;\n }, i.prototype.lt = function(g) {\n return this.cmp(g) === -1;\n }, i.prototype.lten = function(g) {\n return this.cmpn(g) <= 0;\n }, i.prototype.lte = function(g) {\n return this.cmp(g) <= 0;\n }, i.prototype.eqn = function(g) {\n return this.cmpn(g) === 0;\n }, i.prototype.eq = function(g) {\n return this.cmp(g) === 0;\n }, i.red = function(g) {\n return new $(g);\n }, i.prototype.toRed = function(g) {\n return r(!this.red, \"Already a number in reduction context\"), r(this.negative === 0, \"red works only with positives\"), g.convertTo(this)._forceRed(g);\n }, i.prototype.fromRed = function() {\n return r(this.red, \"fromRed works only with numbers in reduction context\"), this.red.convertFrom(this);\n }, i.prototype._forceRed = function(g) {\n return this.red = g, this;\n }, i.prototype.forceRed = function(g) {\n return r(!this.red, \"Already a number in reduction context\"), this._forceRed(g);\n }, i.prototype.redAdd = function(g) {\n return r(this.red, \"redAdd works only with red numbers\"), this.red.add(this, g);\n }, i.prototype.redIAdd = function(g) {\n return r(this.red, \"redIAdd works only with red numbers\"), this.red.iadd(this, g);\n }, i.prototype.redSub = function(g) {\n return r(this.red, \"redSub works only with red numbers\"), this.red.sub(this, g);\n }, i.prototype.redISub = function(g) {\n return r(this.red, \"redISub works only with red numbers\"), this.red.isub(this, g);\n }, i.prototype.redShl = function(g) {\n return r(this.red, \"redShl works only with red numbers\"), this.red.shl(this, g);\n }, i.prototype.redMul = function(g) {\n return r(this.red, \"redMul works only with red numbers\"), this.red._verify2(this, g), this.red.mul(this, g);\n }, i.prototype.redIMul = function(g) {\n return r(this.red, \"redMul works only with red numbers\"), this.red._verify2(this, g), this.red.imul(this, g);\n }, i.prototype.redSqr = function() {\n return r(this.red, \"redSqr works only with red numbers\"), this.red._verify1(this), this.red.sqr(this);\n }, i.prototype.redISqr = function() {\n return r(this.red, \"redISqr works only with red numbers\"), this.red._verify1(this), this.red.isqr(this);\n }, i.prototype.redSqrt = function() {\n return r(this.red, \"redSqrt works only with red numbers\"), this.red._verify1(this), this.red.sqrt(this);\n }, i.prototype.redInvm = function() {\n return r(this.red, \"redInvm works only with red numbers\"), this.red._verify1(this), this.red.invm(this);\n }, i.prototype.redNeg = function() {\n return r(this.red, \"redNeg works only with red numbers\"), this.red._verify1(this), this.red.neg(this);\n }, i.prototype.redPow = function(g) {\n return r(this.red && !g.red, \"redPow(normalNum)\"), this.red._verify1(this), this.red.pow(this, g);\n };\n var M = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n function H(_, g) {\n this.name = _, this.p = new i(g, 16), this.n = this.p.bitLength(), this.k = new i(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();\n }\n H.prototype._tmp = function() {\n var g = new i(null);\n return g.words = new Array(Math.ceil(this.n / 13)), g;\n }, H.prototype.ireduce = function(g) {\n var x = g, w;\n do\n this.split(x, this.tmp), x = this.imulK(x), x = x.iadd(this.tmp), w = x.bitLength();\n while (w > this.n);\n var D = w < this.n ? -1 : x.ucmp(this.p);\n return D === 0 ? (x.words[0] = 0, x.length = 1) : D > 0 ? x.isub(this.p) : x.strip !== void 0 ? x.strip() : x._strip(), x;\n }, H.prototype.split = function(g, x) {\n g.iushrn(this.n, 0, x);\n }, H.prototype.imulK = function(g) {\n return g.imul(this.k);\n };\n function K() {\n H.call(\n this,\n \"k256\",\n \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\"\n );\n }\n n(K, H), K.prototype.split = function(g, x) {\n for (var w = 4194303, D = Math.min(g.length, 9), O = 0; O < D; O++)\n x.words[O] = g.words[O];\n if (x.length = D, g.length <= 9) {\n g.words[0] = 0, g.length = 1;\n return;\n }\n var U = g.words[9];\n for (x.words[x.length++] = U & w, O = 10; O < g.length; O++) {\n var V = g.words[O] | 0;\n g.words[O - 10] = (V & w) << 4 | U >>> 22, U = V;\n }\n U >>>= 22, g.words[O - 10] = U, U === 0 && g.length > 10 ? g.length -= 10 : g.length -= 9;\n }, K.prototype.imulK = function(g) {\n g.words[g.length] = 0, g.words[g.length + 1] = 0, g.length += 2;\n for (var x = 0, w = 0; w < g.length; w++) {\n var D = g.words[w] | 0;\n x += D * 977, g.words[w] = x & 67108863, x = D * 64 + (x / 67108864 | 0);\n }\n return g.words[g.length - 1] === 0 && (g.length--, g.words[g.length - 1] === 0 && g.length--), g;\n };\n function j() {\n H.call(\n this,\n \"p224\",\n \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\"\n );\n }\n n(j, H);\n function C() {\n H.call(\n this,\n \"p192\",\n \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\"\n );\n }\n n(C, H);\n function k() {\n H.call(\n this,\n \"25519\",\n \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\"\n );\n }\n n(k, H), k.prototype.imulK = function(g) {\n for (var x = 0, w = 0; w < g.length; w++) {\n var D = (g.words[w] | 0) * 19 + x, O = D & 67108863;\n D >>>= 26, g.words[w] = O, x = D;\n }\n return x !== 0 && (g.words[g.length++] = x), g;\n }, i._prime = function(g) {\n if (M[g]) return M[g];\n var x;\n if (g === \"k256\")\n x = new K();\n else if (g === \"p224\")\n x = new j();\n else if (g === \"p192\")\n x = new C();\n else if (g === \"p25519\")\n x = new k();\n else\n throw new Error(\"Unknown prime \" + g);\n return M[g] = x, x;\n };\n function $(_) {\n if (typeof _ == \"string\") {\n var g = i._prime(_);\n this.m = g.p, this.prime = g;\n } else\n r(_.gtn(1), \"modulus must be greater than 1\"), this.m = _, this.prime = null;\n }\n $.prototype._verify1 = function(g) {\n r(g.negative === 0, \"red works only with positives\"), r(g.red, \"red works only with red numbers\");\n }, $.prototype._verify2 = function(g, x) {\n r((g.negative | x.negative) === 0, \"red works only with positives\"), r(\n g.red && g.red === x.red,\n \"red works only with red numbers\"\n );\n }, $.prototype.imod = function(g) {\n return this.prime ? this.prime.ireduce(g)._forceRed(this) : (u(g, g.umod(this.m)._forceRed(this)), g);\n }, $.prototype.neg = function(g) {\n return g.isZero() ? g.clone() : this.m.sub(g)._forceRed(this);\n }, $.prototype.add = function(g, x) {\n this._verify2(g, x);\n var w = g.add(x);\n return w.cmp(this.m) >= 0 && w.isub(this.m), w._forceRed(this);\n }, $.prototype.iadd = function(g, x) {\n this._verify2(g, x);\n var w = g.iadd(x);\n return w.cmp(this.m) >= 0 && w.isub(this.m), w;\n }, $.prototype.sub = function(g, x) {\n this._verify2(g, x);\n var w = g.sub(x);\n return w.cmpn(0) < 0 && w.iadd(this.m), w._forceRed(this);\n }, $.prototype.isub = function(g, x) {\n this._verify2(g, x);\n var w = g.isub(x);\n return w.cmpn(0) < 0 && w.iadd(this.m), w;\n }, $.prototype.shl = function(g, x) {\n return this._verify1(g), this.imod(g.ushln(x));\n }, $.prototype.imul = function(g, x) {\n return this._verify2(g, x), this.imod(g.imul(x));\n }, $.prototype.mul = function(g, x) {\n return this._verify2(g, x), this.imod(g.mul(x));\n }, $.prototype.isqr = function(g) {\n return this.imul(g, g.clone());\n }, $.prototype.sqr = function(g) {\n return this.mul(g, g);\n }, $.prototype.sqrt = function(g) {\n if (g.isZero()) return g.clone();\n var x = this.m.andln(3);\n if (r(x % 2 === 1), x === 3) {\n var w = this.m.add(new i(1)).iushrn(2);\n return this.pow(g, w);\n }\n for (var D = this.m.subn(1), O = 0; !D.isZero() && D.andln(1) === 0; )\n O++, D.iushrn(1);\n r(!D.isZero());\n var U = new i(1).toRed(this), V = U.redNeg(), L = this.m.subn(1).iushrn(1), m = this.m.bitLength();\n for (m = new i(2 * m * m).toRed(this); this.pow(m, L).cmp(V) !== 0; )\n m.redIAdd(V);\n for (var v = this.pow(m, D), P = this.pow(g, D.addn(1).iushrn(1)), N = this.pow(g, D), Y = O; N.cmp(U) !== 0; ) {\n for (var ee = N, ie = 0; ee.cmp(U) !== 0; ie++)\n ee = ee.redSqr();\n r(ie < Y);\n var le = this.pow(v, new i(1).iushln(Y - ie - 1));\n P = P.redMul(le), v = le.redSqr(), N = N.redMul(v), Y = ie;\n }\n return P;\n }, $.prototype.invm = function(g) {\n var x = g._invmp(this.m);\n return x.negative !== 0 ? (x.negative = 0, this.imod(x).redNeg()) : this.imod(x);\n }, $.prototype.pow = function(g, x) {\n if (x.isZero()) return new i(1).toRed(this);\n if (x.cmpn(1) === 0) return g.clone();\n var w = 4, D = new Array(1 << w);\n D[0] = new i(1).toRed(this), D[1] = g;\n for (var O = 2; O < D.length; O++)\n D[O] = this.mul(D[O - 1], g);\n var U = D[0], V = 0, L = 0, m = x.bitLength() % 26;\n for (m === 0 && (m = 26), O = x.length - 1; O >= 0; O--) {\n for (var v = x.words[O], P = m - 1; P >= 0; P--) {\n var N = v >> P & 1;\n if (U !== D[0] && (U = this.sqr(U)), N === 0 && V === 0) {\n L = 0;\n continue;\n }\n V <<= 1, V |= N, L++, !(L !== w && (O !== 0 || P !== 0)) && (U = this.mul(U, D[V]), L = 0, V = 0);\n }\n m = 26;\n }\n return U;\n }, $.prototype.convertTo = function(g) {\n var x = g.umod(this.m);\n return x === g ? x.clone() : x;\n }, $.prototype.convertFrom = function(g) {\n var x = g.clone();\n return x.red = null, x;\n }, i.mont = function(g) {\n return new W(g);\n };\n function W(_) {\n $.call(this, _), this.shift = this.m.bitLength(), this.shift % 26 !== 0 && (this.shift += 26 - this.shift % 26), this.r = new i(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);\n }\n n(W, $), W.prototype.convertTo = function(g) {\n return this.imod(g.ushln(this.shift));\n }, W.prototype.convertFrom = function(g) {\n var x = this.imod(g.mul(this.rinv));\n return x.red = null, x;\n }, W.prototype.imul = function(g, x) {\n if (g.isZero() || x.isZero())\n return g.words[0] = 0, g.length = 1, g;\n var w = g.imul(x), D = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), O = w.isub(D).iushrn(this.shift), U = O;\n return O.cmp(this.m) >= 0 ? U = O.isub(this.m) : O.cmpn(0) < 0 && (U = O.iadd(this.m)), U._forceRed(this);\n }, W.prototype.mul = function(g, x) {\n if (g.isZero() || x.isZero()) return new i(0)._forceRed(this);\n var w = g.mul(x), D = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), O = w.isub(D).iushrn(this.shift), U = O;\n return O.cmp(this.m) >= 0 ? U = O.isub(this.m) : O.cmpn(0) < 0 && (U = O.iadd(this.m)), U._forceRed(this);\n }, W.prototype.invm = function(g) {\n var x = this.imod(g._invmp(this.m).mul(this.r2));\n return x._forceRed(this);\n };\n })(s, My);\n })(co)), co.exports;\n}\nvar Oy = v0();\nconst bd = /* @__PURE__ */ Fc(Oy);\nvar Ui = { exports: {} };\n/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nvar Td;\nfunction By() {\n return Td || (Td = 1, (function(s, e) {\n var t = Kc(), r = t.Buffer;\n function n(o, a) {\n for (var l in o)\n a[l] = o[l];\n }\n r.from && r.alloc && r.allocUnsafe && r.allocUnsafeSlow ? s.exports = t : (n(t, e), e.Buffer = i);\n function i(o, a, l) {\n return r(o, a, l);\n }\n i.prototype = Object.create(r.prototype), n(r, i), i.from = function(o, a, l) {\n if (typeof o == \"number\")\n throw new TypeError(\"Argument must not be a number\");\n return r(o, a, l);\n }, i.alloc = function(o, a, l) {\n if (typeof o != \"number\")\n throw new TypeError(\"Argument must be a number\");\n var c = r(o);\n return a !== void 0 ? typeof l == \"string\" ? c.fill(a, l) : c.fill(a) : c.fill(0), c;\n }, i.allocUnsafe = function(o) {\n if (typeof o != \"number\")\n throw new TypeError(\"Argument must be a number\");\n return r(o);\n }, i.allocUnsafeSlow = function(o) {\n if (typeof o != \"number\")\n throw new TypeError(\"Argument must be a number\");\n return t.SlowBuffer(o);\n };\n })(Ui, Ui.exports)), Ui.exports;\n}\nvar za, wd;\nfunction E0() {\n if (wd) return za;\n wd = 1;\n var s = By().Buffer;\n function e(t) {\n if (t.length >= 255)\n throw new TypeError(\"Alphabet too long\");\n for (var r = new Uint8Array(256), n = 0; n < r.length; n++)\n r[n] = 255;\n for (var i = 0; i < t.length; i++) {\n var o = t.charAt(i), a = o.charCodeAt(0);\n if (r[a] !== 255)\n throw new TypeError(o + \" is ambiguous\");\n r[a] = i;\n }\n var l = t.length, c = t.charAt(0), u = Math.log(l) / Math.log(256), d = Math.log(256) / Math.log(l);\n function h(y) {\n if ((Array.isArray(y) || y instanceof Uint8Array) && (y = s.from(y)), !s.isBuffer(y))\n throw new TypeError(\"Expected Buffer\");\n if (y.length === 0)\n return \"\";\n for (var E = 0, b = 0, R = 0, A = y.length; R !== A && y[R] === 0; )\n R++, E++;\n for (var F = (A - R) * d + 1 >>> 0, M = new Uint8Array(F); R !== A; ) {\n for (var H = y[R], K = 0, j = F - 1; (H !== 0 || K < b) && j !== -1; j--, K++)\n H += 256 * M[j] >>> 0, M[j] = H % l >>> 0, H = H / l >>> 0;\n if (H !== 0)\n throw new Error(\"Non-zero carry\");\n b = K, R++;\n }\n for (var C = F - b; C !== F && M[C] === 0; )\n C++;\n for (var k = c.repeat(E); C < F; ++C)\n k += t.charAt(M[C]);\n return k;\n }\n function f(y) {\n if (typeof y != \"string\")\n throw new TypeError(\"Expected String\");\n if (y.length === 0)\n return s.alloc(0);\n for (var E = 0, b = 0, R = 0; y[E] === c; )\n b++, E++;\n for (var A = (y.length - E) * u + 1 >>> 0, F = new Uint8Array(A); E < y.length; ) {\n var M = y.charCodeAt(E);\n if (M > 255)\n return;\n var H = r[M];\n if (H === 255)\n return;\n for (var K = 0, j = A - 1; (H !== 0 || K < R) && j !== -1; j--, K++)\n H += l * F[j] >>> 0, F[j] = H % 256 >>> 0, H = H / 256 >>> 0;\n if (H !== 0)\n throw new Error(\"Non-zero carry\");\n R = K, E++;\n }\n for (var C = A - R; C !== A && F[C] === 0; )\n C++;\n var k = s.allocUnsafe(b + (A - C));\n k.fill(0, 0, b);\n for (var $ = b; C !== A; )\n k[$++] = F[C++];\n return k;\n }\n function p(y) {\n var E = f(y);\n if (E)\n return E;\n throw new Error(\"Non-base\" + l + \" character\");\n }\n return {\n encode: h,\n decodeUnsafe: f,\n decode: p\n };\n }\n return za = e, za;\n}\nvar Ya, Ad;\nfunction Fy() {\n if (Ad) return Ya;\n Ad = 1;\n var s = E0(), e = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n return Ya = s(e), Ya;\n}\nvar Ny = Fy();\nconst ar = /* @__PURE__ */ Fc(Ny), Id = Xf;\nvar et = {}, Za, _d;\nfunction Uy() {\n if (_d) return Za;\n _d = 1;\n var s = E0(), e = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n return Za = s(e), Za;\n}\nfunction us(s, e, t) {\n return e <= s && s <= t;\n}\nfunction ca(s) {\n if (s === void 0) return {};\n if (s === Object(s)) return s;\n throw TypeError(\"Could not convert argument to dictionary\");\n}\nfunction $y(s) {\n for (var e = String(s), t = e.length, r = 0, n = []; r < t; ) {\n var i = e.charCodeAt(r);\n if (i < 55296 || i > 57343)\n n.push(i);\n else if (56320 <= i && i <= 57343)\n n.push(65533);\n else if (55296 <= i && i <= 56319)\n if (r === t - 1)\n n.push(65533);\n else {\n var o = s.charCodeAt(r + 1);\n if (56320 <= o && o <= 57343) {\n var a = i & 1023, l = o & 1023;\n n.push(65536 + (a << 10) + l), r += 1;\n } else\n n.push(65533);\n }\n r += 1;\n }\n return n;\n}\nfunction Gy(s) {\n for (var e = \"\", t = 0; t < s.length; ++t) {\n var r = s[t];\n r <= 65535 ? e += String.fromCharCode(r) : (r -= 65536, e += String.fromCharCode(\n (r >> 10) + 55296,\n (r & 1023) + 56320\n ));\n }\n return e;\n}\nvar Bo = -1;\nfunction Xc(s) {\n this.tokens = [].slice.call(s);\n}\nXc.prototype = {\n /**\n * @return {boolean} True if end-of-stream has been hit.\n */\n endOfStream: function() {\n return !this.tokens.length;\n },\n /**\n * When a token is read from a stream, the first token in the\n * stream must be returned and subsequently removed, and\n * end-of-stream must be returned otherwise.\n *\n * @return {number} Get the next token from the stream, or\n * end_of_stream.\n */\n read: function() {\n return this.tokens.length ? this.tokens.shift() : Bo;\n },\n /**\n * When one or more tokens are prepended to a stream, those tokens\n * must be inserted, in given order, before the first token in the\n * stream.\n *\n * @param {(number|!Array.<number>)} token The token(s) to prepend to the stream.\n */\n prepend: function(s) {\n if (Array.isArray(s))\n for (var e = (\n /**@type {!Array.<number>}*/\n s\n ); e.length; )\n this.tokens.unshift(e.pop());\n else\n this.tokens.unshift(s);\n },\n /**\n * When one or more tokens are pushed to a stream, those tokens\n * must be inserted, in given order, after the last token in the\n * stream.\n *\n * @param {(number|!Array.<number>)} token The tokens(s) to prepend to the stream.\n */\n push: function(s) {\n if (Array.isArray(s))\n for (var e = (\n /**@type {!Array.<number>}*/\n s\n ); e.length; )\n this.tokens.push(e.shift());\n else\n this.tokens.push(s);\n }\n};\nvar Pn = -1;\nfunction Xa(s, e) {\n if (s)\n throw TypeError(\"Decoder error\");\n return e || 65533;\n}\nvar Fo = \"utf-8\";\nfunction No(s, e) {\n if (!(this instanceof No))\n return new No(s, e);\n if (s = s !== void 0 ? String(s).toLowerCase() : Fo, s !== Fo)\n throw new Error(\"Encoding not supported. Only utf-8 is supported\");\n e = ca(e), this._streaming = !1, this._BOMseen = !1, this._decoder = null, this._fatal = !!e.fatal, this._ignoreBOM = !!e.ignoreBOM, Object.defineProperty(this, \"encoding\", { value: \"utf-8\" }), Object.defineProperty(this, \"fatal\", { value: this._fatal }), Object.defineProperty(this, \"ignoreBOM\", { value: this._ignoreBOM });\n}\nNo.prototype = {\n /**\n * @param {ArrayBufferView=} input The buffer of bytes to decode.\n * @param {Object=} options\n * @return {string} The decoded string.\n */\n decode: function(e, t) {\n var r;\n typeof e == \"object\" && e instanceof ArrayBuffer ? r = new Uint8Array(e) : typeof e == \"object\" && \"buffer\" in e && e.buffer instanceof ArrayBuffer ? r = new Uint8Array(\n e.buffer,\n e.byteOffset,\n e.byteLength\n ) : r = new Uint8Array(0), t = ca(t), this._streaming || (this._decoder = new Vy({ fatal: this._fatal }), this._BOMseen = !1), this._streaming = !!t.stream;\n for (var n = new Xc(r), i = [], o; !n.endOfStream() && (o = this._decoder.handler(n, n.read()), o !== Pn); )\n o !== null && (Array.isArray(o) ? i.push.apply(\n i,\n /**@type {!Array.<number>}*/\n o\n ) : i.push(o));\n if (!this._streaming) {\n do {\n if (o = this._decoder.handler(n, n.read()), o === Pn)\n break;\n o !== null && (Array.isArray(o) ? i.push.apply(\n i,\n /**@type {!Array.<number>}*/\n o\n ) : i.push(o));\n } while (!n.endOfStream());\n this._decoder = null;\n }\n return i.length && [\"utf-8\"].indexOf(this.encoding) !== -1 && !this._ignoreBOM && !this._BOMseen && (i[0] === 65279 ? (this._BOMseen = !0, i.shift()) : this._BOMseen = !0), Gy(i);\n }\n};\nfunction Uo(s, e) {\n if (!(this instanceof Uo))\n return new Uo(s, e);\n if (s = s !== void 0 ? String(s).toLowerCase() : Fo, s !== Fo)\n throw new Error(\"Encoding not supported. Only utf-8 is supported\");\n e = ca(e), this._streaming = !1, this._encoder = null, this._options = { fatal: !!e.fatal }, Object.defineProperty(this, \"encoding\", { value: \"utf-8\" });\n}\nUo.prototype = {\n /**\n * @param {string=} opt_string The string to encode.\n * @param {Object=} options\n * @return {Uint8Array} Encoded bytes, as a Uint8Array.\n */\n encode: function(e, t) {\n e = e ? String(e) : \"\", t = ca(t), this._streaming || (this._encoder = new jy(this._options)), this._streaming = !!t.stream;\n for (var r = [], n = new Xc($y(e)), i; !n.endOfStream() && (i = this._encoder.handler(n, n.read()), i !== Pn); )\n Array.isArray(i) ? r.push.apply(\n r,\n /**@type {!Array.<number>}*/\n i\n ) : r.push(i);\n if (!this._streaming) {\n for (; i = this._encoder.handler(n, n.read()), i !== Pn; )\n Array.isArray(i) ? r.push.apply(\n r,\n /**@type {!Array.<number>}*/\n i\n ) : r.push(i);\n this._encoder = null;\n }\n return new Uint8Array(r);\n }\n};\nfunction Vy(s) {\n var e = s.fatal, t = 0, r = 0, n = 0, i = 128, o = 191;\n this.handler = function(a, l) {\n if (l === Bo && n !== 0)\n return n = 0, Xa(e);\n if (l === Bo)\n return Pn;\n if (n === 0) {\n if (us(l, 0, 127))\n return l;\n if (us(l, 194, 223))\n n = 1, t = l - 192;\n else if (us(l, 224, 239))\n l === 224 && (i = 160), l === 237 && (o = 159), n = 2, t = l - 224;\n else if (us(l, 240, 244))\n l === 240 && (i = 144), l === 244 && (o = 143), n = 3, t = l - 240;\n else\n return Xa(e);\n return t = t << 6 * n, null;\n }\n if (!us(l, i, o))\n return t = n = r = 0, i = 128, o = 191, a.prepend(l), Xa(e);\n if (i = 128, o = 191, r += 1, t += l - 128 << 6 * (n - r), r !== n)\n return null;\n var c = t;\n return t = n = r = 0, c;\n };\n}\nfunction jy(s) {\n s.fatal, this.handler = function(e, t) {\n if (t === Bo)\n return Pn;\n if (us(t, 0, 127))\n return t;\n var r, n;\n us(t, 128, 2047) ? (r = 1, n = 192) : us(t, 2048, 65535) ? (r = 2, n = 224) : us(t, 65536, 1114111) && (r = 3, n = 240);\n for (var i = [(t >> 6 * r) + n]; r > 0; ) {\n var o = t >> 6 * (r - 1);\n i.push(128 | o & 63), r -= 1;\n }\n return i;\n };\n}\nconst Ky = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n TextDecoder: No,\n TextEncoder: Uo\n}, Symbol.toStringTag, { value: \"Module\" })), Hy = /* @__PURE__ */ Nc(Ky);\nvar Rd;\nfunction qy() {\n if (Rd) return et;\n Rd = 1;\n var s = et && et.__createBinding || (Object.create ? (function(C, k, $, W) {\n W === void 0 && (W = $), Object.defineProperty(C, W, { enumerable: !0, get: function() {\n return k[$];\n } });\n }) : (function(C, k, $, W) {\n W === void 0 && (W = $), C[W] = k[$];\n })), e = et && et.__setModuleDefault || (Object.create ? (function(C, k) {\n Object.defineProperty(C, \"default\", { enumerable: !0, value: k });\n }) : function(C, k) {\n C.default = k;\n }), t = et && et.__decorate || function(C, k, $, W) {\n var _ = arguments.length, g = _ < 3 ? k : W === null ? W = Object.getOwnPropertyDescriptor(k, $) : W, x;\n if (typeof Reflect == \"object\" && typeof Reflect.decorate == \"function\") g = Reflect.decorate(C, k, $, W);\n else for (var w = C.length - 1; w >= 0; w--) (x = C[w]) && (g = (_ < 3 ? x(g) : _ > 3 ? x(k, $, g) : x(k, $)) || g);\n return _ > 3 && g && Object.defineProperty(k, $, g), g;\n }, r = et && et.__importStar || function(C) {\n if (C && C.__esModule) return C;\n var k = {};\n if (C != null) for (var $ in C) $ !== \"default\" && Object.hasOwnProperty.call(C, $) && s(k, C, $);\n return e(k, C), k;\n }, n = et && et.__importDefault || function(C) {\n return C && C.__esModule ? C : { default: C };\n };\n Object.defineProperty(et, \"__esModule\", { value: !0 }), et.deserializeUnchecked = et.deserialize = et.serialize = et.BinaryReader = et.BinaryWriter = et.BorshError = et.baseDecode = et.baseEncode = void 0;\n const i = n(v0()), o = n(Uy()), a = r(Hy), l = typeof TextDecoder != \"function\" ? a.TextDecoder : TextDecoder, c = new l(\"utf-8\", { fatal: !0 });\n function u(C) {\n return typeof C == \"string\" && (C = Buffer.from(C, \"utf8\")), o.default.encode(Buffer.from(C));\n }\n et.baseEncode = u;\n function d(C) {\n return Buffer.from(o.default.decode(C));\n }\n et.baseDecode = d;\n const h = 1024;\n class f extends Error {\n constructor(k) {\n super(k), this.fieldPath = [], this.originalMessage = k;\n }\n addToFieldPath(k) {\n this.fieldPath.splice(0, 0, k), this.message = this.originalMessage + \": \" + this.fieldPath.join(\".\");\n }\n }\n et.BorshError = f;\n class p {\n constructor() {\n this.buf = Buffer.alloc(h), this.length = 0;\n }\n maybeResize() {\n this.buf.length < 16 + this.length && (this.buf = Buffer.concat([this.buf, Buffer.alloc(h)]));\n }\n writeU8(k) {\n this.maybeResize(), this.buf.writeUInt8(k, this.length), this.length += 1;\n }\n writeU16(k) {\n this.maybeResize(), this.buf.writeUInt16LE(k, this.length), this.length += 2;\n }\n writeU32(k) {\n this.maybeResize(), this.buf.writeUInt32LE(k, this.length), this.length += 4;\n }\n writeU64(k) {\n this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 8)));\n }\n writeU128(k) {\n this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 16)));\n }\n writeU256(k) {\n this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 32)));\n }\n writeU512(k) {\n this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 64)));\n }\n writeBuffer(k) {\n this.buf = Buffer.concat([\n Buffer.from(this.buf.subarray(0, this.length)),\n k,\n Buffer.alloc(h)\n ]), this.length += k.length;\n }\n writeString(k) {\n this.maybeResize();\n const $ = Buffer.from(k, \"utf8\");\n this.writeU32($.length), this.writeBuffer($);\n }\n writeFixedArray(k) {\n this.writeBuffer(Buffer.from(k));\n }\n writeArray(k, $) {\n this.maybeResize(), this.writeU32(k.length);\n for (const W of k)\n this.maybeResize(), $(W);\n }\n toArray() {\n return this.buf.subarray(0, this.length);\n }\n }\n et.BinaryWriter = p;\n function y(C, k, $) {\n const W = $.value;\n $.value = function(..._) {\n try {\n return W.apply(this, _);\n } catch (g) {\n if (g instanceof RangeError) {\n const x = g.code;\n if ([\"ERR_BUFFER_OUT_OF_BOUNDS\", \"ERR_OUT_OF_RANGE\"].indexOf(x) >= 0)\n throw new f(\"Reached the end of buffer when deserializing\");\n }\n throw g;\n }\n };\n }\n class E {\n constructor(k) {\n this.buf = k, this.offset = 0;\n }\n readU8() {\n const k = this.buf.readUInt8(this.offset);\n return this.offset += 1, k;\n }\n readU16() {\n const k = this.buf.readUInt16LE(this.offset);\n return this.offset += 2, k;\n }\n readU32() {\n const k = this.buf.readUInt32LE(this.offset);\n return this.offset += 4, k;\n }\n readU64() {\n const k = this.readBuffer(8);\n return new i.default(k, \"le\");\n }\n readU128() {\n const k = this.readBuffer(16);\n return new i.default(k, \"le\");\n }\n readU256() {\n const k = this.readBuffer(32);\n return new i.default(k, \"le\");\n }\n readU512() {\n const k = this.readBuffer(64);\n return new i.default(k, \"le\");\n }\n readBuffer(k) {\n if (this.offset + k > this.buf.length)\n throw new f(`Expected buffer length ${k} isn't within bounds`);\n const $ = this.buf.slice(this.offset, this.offset + k);\n return this.offset += k, $;\n }\n readString() {\n const k = this.readU32(), $ = this.readBuffer(k);\n try {\n return c.decode($);\n } catch (W) {\n throw new f(`Error decoding UTF-8 string: ${W}`);\n }\n }\n readFixedArray(k) {\n return new Uint8Array(this.readBuffer(k));\n }\n readArray(k) {\n const $ = this.readU32(), W = Array();\n for (let _ = 0; _ < $; ++_)\n W.push(k());\n return W;\n }\n }\n t([\n y\n ], E.prototype, \"readU8\", null), t([\n y\n ], E.prototype, \"readU16\", null), t([\n y\n ], E.prototype, \"readU32\", null), t([\n y\n ], E.prototype, \"readU64\", null), t([\n y\n ], E.prototype, \"readU128\", null), t([\n y\n ], E.prototype, \"readU256\", null), t([\n y\n ], E.prototype, \"readU512\", null), t([\n y\n ], E.prototype, \"readString\", null), t([\n y\n ], E.prototype, \"readFixedArray\", null), t([\n y\n ], E.prototype, \"readArray\", null), et.BinaryReader = E;\n function b(C) {\n return C.charAt(0).toUpperCase() + C.slice(1);\n }\n function R(C, k, $, W, _) {\n try {\n if (typeof W == \"string\")\n _[`write${b(W)}`]($);\n else if (W instanceof Array)\n if (typeof W[0] == \"number\") {\n if ($.length !== W[0])\n throw new f(`Expecting byte array of length ${W[0]}, but got ${$.length} bytes`);\n _.writeFixedArray($);\n } else if (W.length === 2 && typeof W[1] == \"number\") {\n if ($.length !== W[1])\n throw new f(`Expecting byte array of length ${W[1]}, but got ${$.length} bytes`);\n for (let g = 0; g < W[1]; g++)\n R(C, null, $[g], W[0], _);\n } else\n _.writeArray($, (g) => {\n R(C, k, g, W[0], _);\n });\n else if (W.kind !== void 0)\n switch (W.kind) {\n case \"option\": {\n $ == null ? _.writeU8(0) : (_.writeU8(1), R(C, k, $, W.type, _));\n break;\n }\n case \"map\": {\n _.writeU32($.size), $.forEach((g, x) => {\n R(C, k, x, W.key, _), R(C, k, g, W.value, _);\n });\n break;\n }\n default:\n throw new f(`FieldType ${W} unrecognized`);\n }\n else\n A(C, $, _);\n } catch (g) {\n throw g instanceof f && g.addToFieldPath(k), g;\n }\n }\n function A(C, k, $) {\n if (typeof k.borshSerialize == \"function\") {\n k.borshSerialize($);\n return;\n }\n const W = C.get(k.constructor);\n if (!W)\n throw new f(`Class ${k.constructor.name} is missing in schema`);\n if (W.kind === \"struct\")\n W.fields.map(([_, g]) => {\n R(C, _, k[_], g, $);\n });\n else if (W.kind === \"enum\") {\n const _ = k[W.field];\n for (let g = 0; g < W.values.length; ++g) {\n const [x, w] = W.values[g];\n if (x === _) {\n $.writeU8(g), R(C, x, k[x], w, $);\n break;\n }\n }\n } else\n throw new f(`Unexpected schema kind: ${W.kind} for ${k.constructor.name}`);\n }\n function F(C, k, $ = p) {\n const W = new $();\n return A(C, k, W), W.toArray();\n }\n et.serialize = F;\n function M(C, k, $, W) {\n try {\n if (typeof $ == \"string\")\n return W[`read${b($)}`]();\n if ($ instanceof Array) {\n if (typeof $[0] == \"number\")\n return W.readFixedArray($[0]);\n if (typeof $[1] == \"number\") {\n const _ = [];\n for (let g = 0; g < $[1]; g++)\n _.push(M(C, null, $[0], W));\n return _;\n } else\n return W.readArray(() => M(C, k, $[0], W));\n }\n if ($.kind === \"option\")\n return W.readU8() ? M(C, k, $.type, W) : void 0;\n if ($.kind === \"map\") {\n let _ = /* @__PURE__ */ new Map();\n const g = W.readU32();\n for (let x = 0; x < g; x++) {\n const w = M(C, k, $.key, W), D = M(C, k, $.value, W);\n _.set(w, D);\n }\n return _;\n }\n return H(C, $, W);\n } catch (_) {\n throw _ instanceof f && _.addToFieldPath(k), _;\n }\n }\n function H(C, k, $) {\n if (typeof k.borshDeserialize == \"function\")\n return k.borshDeserialize($);\n const W = C.get(k);\n if (!W)\n throw new f(`Class ${k.name} is missing in schema`);\n if (W.kind === \"struct\") {\n const _ = {};\n for (const [g, x] of C.get(k).fields)\n _[g] = M(C, g, x, $);\n return new k(_);\n }\n if (W.kind === \"enum\") {\n const _ = $.readU8();\n if (_ >= W.values.length)\n throw new f(`Enum index: ${_} is out of range`);\n const [g, x] = W.values[_], w = M(C, g, x, $);\n return new k({ [g]: w });\n }\n throw new f(`Unexpected schema kind: ${W.kind} for ${k.constructor.name}`);\n }\n function K(C, k, $, W = E) {\n const _ = new W($), g = H(C, k, _);\n if (_.offset < $.length)\n throw new f(`Unexpected ${$.length - _.offset} bytes after deserialized data`);\n return g;\n }\n et.deserialize = K;\n function j(C, k, $, W = E) {\n const _ = new W($);\n return H(C, k, _);\n }\n return et.deserializeUnchecked = j, et;\n}\nvar Ja = qy(), re = {}, Ld;\nfunction Wy() {\n if (Ld) return re;\n Ld = 1, Object.defineProperty(re, \"__esModule\", { value: !0 }), re.s16 = re.s8 = re.nu64be = re.u48be = re.u40be = re.u32be = re.u24be = re.u16be = re.nu64 = re.u48 = re.u40 = re.u32 = re.u24 = re.u16 = re.u8 = re.offset = re.greedy = re.Constant = re.UTF8 = re.CString = re.Blob = re.Boolean = re.BitField = re.BitStructure = re.VariantLayout = re.Union = re.UnionLayoutDiscriminator = re.UnionDiscriminator = re.Structure = re.Sequence = re.DoubleBE = re.Double = re.FloatBE = re.Float = re.NearInt64BE = re.NearInt64 = re.NearUInt64BE = re.NearUInt64 = re.IntBE = re.Int = re.UIntBE = re.UInt = re.OffsetLayout = re.GreedyCount = re.ExternalLayout = re.bindConstructorLayout = re.nameWithProperty = re.Layout = re.uint8ArrayToBuffer = re.checkUint8Array = void 0, re.constant = re.utf8 = re.cstr = re.blob = re.unionLayoutDiscriminator = re.union = re.seq = re.bits = re.struct = re.f64be = re.f64 = re.f32be = re.f32 = re.ns64be = re.s48be = re.s40be = re.s32be = re.s24be = re.s16be = re.ns64 = re.s48 = re.s40 = re.s32 = re.s24 = void 0;\n const s = Kc();\n function e(m) {\n if (!(m instanceof Uint8Array))\n throw new TypeError(\"b must be a Uint8Array\");\n }\n re.checkUint8Array = e;\n function t(m) {\n return e(m), s.Buffer.from(m.buffer, m.byteOffset, m.length);\n }\n re.uint8ArrayToBuffer = t;\n let r = class {\n constructor(v, P) {\n if (!Number.isInteger(v))\n throw new TypeError(\"span must be an integer\");\n this.span = v, this.property = P;\n }\n /** Function to create an Object into which decoded properties will\n * be written.\n *\n * Used only for layouts that {@link Layout#decode|decode} to Object\n * instances, which means:\n * * {@link Structure}\n * * {@link Union}\n * * {@link VariantLayout}\n * * {@link BitStructure}\n *\n * If left undefined the JavaScript representation of these layouts\n * will be Object instances.\n *\n * See {@link bindConstructorLayout}.\n */\n makeDestinationObject() {\n return {};\n }\n /**\n * Calculate the span of a specific instance of a layout.\n *\n * @param {Uint8Array} b - the buffer that contains an encoded instance.\n *\n * @param {Number} [offset] - the offset at which the encoded instance\n * starts. If absent a zero offset is inferred.\n *\n * @return {Number} - the number of bytes covered by the layout\n * instance. If this method is not overridden in a subclass the\n * definition-time constant {@link Layout#span|span} will be\n * returned.\n *\n * @throws {RangeError} - if the length of the value cannot be\n * determined.\n */\n getSpan(v, P) {\n if (0 > this.span)\n throw new RangeError(\"indeterminate span\");\n return this.span;\n }\n /**\n * Replicate the layout using a new property.\n *\n * This function must be used to get a structurally-equivalent layout\n * with a different name since all {@link Layout} instances are\n * immutable.\n *\n * **NOTE** This is a shallow copy. All fields except {@link\n * Layout#property|property} are strictly equal to the origin layout.\n *\n * @param {String} property - the value for {@link\n * Layout#property|property} in the replica.\n *\n * @returns {Layout} - the copy with {@link Layout#property|property}\n * set to `property`.\n */\n replicate(v) {\n const P = Object.create(this.constructor.prototype);\n return Object.assign(P, this), P.property = v, P;\n }\n /**\n * Create an object from layout properties and an array of values.\n *\n * **NOTE** This function returns `undefined` if invoked on a layout\n * that does not return its value as an Object. Objects are\n * returned for things that are a {@link Structure}, which includes\n * {@link VariantLayout|variant layouts} if they are structures, and\n * excludes {@link Union}s. If you want this feature for a union\n * you must use {@link Union.getVariant|getVariant} to select the\n * desired layout.\n *\n * @param {Array} values - an array of values that correspond to the\n * default order for properties. As with {@link Layout#decode|decode}\n * layout elements that have no property name are skipped when\n * iterating over the array values. Only the top-level properties are\n * assigned; arguments are not assigned to properties of contained\n * layouts. Any unused values are ignored.\n *\n * @return {(Object|undefined)}\n */\n fromArray(v) {\n }\n };\n re.Layout = r;\n function n(m, v) {\n return v.property ? m + \"[\" + v.property + \"]\" : m;\n }\n re.nameWithProperty = n;\n function i(m, v) {\n if (typeof m != \"function\")\n throw new TypeError(\"Class must be constructor\");\n if (Object.prototype.hasOwnProperty.call(m, \"layout_\"))\n throw new Error(\"Class is already bound to a layout\");\n if (!(v && v instanceof r))\n throw new TypeError(\"layout must be a Layout\");\n if (Object.prototype.hasOwnProperty.call(v, \"boundConstructor_\"))\n throw new Error(\"layout is already bound to a constructor\");\n m.layout_ = v, v.boundConstructor_ = m, v.makeDestinationObject = (() => new m()), Object.defineProperty(m.prototype, \"encode\", {\n value(P, N) {\n return v.encode(this, P, N);\n },\n writable: !0\n }), Object.defineProperty(m, \"decode\", {\n value(P, N) {\n return v.decode(P, N);\n },\n writable: !0\n });\n }\n re.bindConstructorLayout = i;\n class o extends r {\n /**\n * Return `true` iff the external layout decodes to an unsigned\n * integer layout.\n *\n * In that case it can be used as the source of {@link\n * Sequence#count|Sequence counts}, {@link Blob#length|Blob lengths},\n * or as {@link UnionLayoutDiscriminator#layout|external union\n * discriminators}.\n *\n * @abstract\n */\n isCount() {\n throw new Error(\"ExternalLayout is abstract\");\n }\n }\n re.ExternalLayout = o;\n class a extends o {\n constructor(v = 1, P) {\n if (!Number.isInteger(v) || 0 >= v)\n throw new TypeError(\"elementSpan must be a (positive) integer\");\n super(-1, P), this.elementSpan = v;\n }\n /** @override */\n isCount() {\n return !0;\n }\n /** @override */\n decode(v, P = 0) {\n e(v);\n const N = v.length - P;\n return Math.floor(N / this.elementSpan);\n }\n /** @override */\n encode(v, P, N) {\n return 0;\n }\n }\n re.GreedyCount = a;\n class l extends o {\n constructor(v, P = 0, N) {\n if (!(v instanceof r))\n throw new TypeError(\"layout must be a Layout\");\n if (!Number.isInteger(P))\n throw new TypeError(\"offset must be integer or undefined\");\n super(v.span, N || v.property), this.layout = v, this.offset = P;\n }\n /** @override */\n isCount() {\n return this.layout instanceof c || this.layout instanceof u;\n }\n /** @override */\n decode(v, P = 0) {\n return this.layout.decode(v, P + this.offset);\n }\n /** @override */\n encode(v, P, N = 0) {\n return this.layout.encode(v, P, N + this.offset);\n }\n }\n re.OffsetLayout = l;\n class c extends r {\n constructor(v, P) {\n if (super(v, P), 6 < this.span)\n throw new RangeError(\"span must not exceed 6 bytes\");\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readUIntLE(P, this.span);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeUIntLE(v, N, this.span), this.span;\n }\n }\n re.UInt = c;\n class u extends r {\n constructor(v, P) {\n if (super(v, P), 6 < this.span)\n throw new RangeError(\"span must not exceed 6 bytes\");\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readUIntBE(P, this.span);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeUIntBE(v, N, this.span), this.span;\n }\n }\n re.UIntBE = u;\n class d extends r {\n constructor(v, P) {\n if (super(v, P), 6 < this.span)\n throw new RangeError(\"span must not exceed 6 bytes\");\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readIntLE(P, this.span);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeIntLE(v, N, this.span), this.span;\n }\n }\n re.Int = d;\n class h extends r {\n constructor(v, P) {\n if (super(v, P), 6 < this.span)\n throw new RangeError(\"span must not exceed 6 bytes\");\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readIntBE(P, this.span);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeIntBE(v, N, this.span), this.span;\n }\n }\n re.IntBE = h;\n const f = Math.pow(2, 32);\n function p(m) {\n const v = Math.floor(m / f), P = m - v * f;\n return { hi32: v, lo32: P };\n }\n function y(m, v) {\n return m * f + v;\n }\n class E extends r {\n constructor(v) {\n super(8, v);\n }\n /** @override */\n decode(v, P = 0) {\n const N = t(v), Y = N.readUInt32LE(P), ee = N.readUInt32LE(P + 4);\n return y(ee, Y);\n }\n /** @override */\n encode(v, P, N = 0) {\n const Y = p(v), ee = t(P);\n return ee.writeUInt32LE(Y.lo32, N), ee.writeUInt32LE(Y.hi32, N + 4), 8;\n }\n }\n re.NearUInt64 = E;\n class b extends r {\n constructor(v) {\n super(8, v);\n }\n /** @override */\n decode(v, P = 0) {\n const N = t(v), Y = N.readUInt32BE(P), ee = N.readUInt32BE(P + 4);\n return y(Y, ee);\n }\n /** @override */\n encode(v, P, N = 0) {\n const Y = p(v), ee = t(P);\n return ee.writeUInt32BE(Y.hi32, N), ee.writeUInt32BE(Y.lo32, N + 4), 8;\n }\n }\n re.NearUInt64BE = b;\n class R extends r {\n constructor(v) {\n super(8, v);\n }\n /** @override */\n decode(v, P = 0) {\n const N = t(v), Y = N.readUInt32LE(P), ee = N.readInt32LE(P + 4);\n return y(ee, Y);\n }\n /** @override */\n encode(v, P, N = 0) {\n const Y = p(v), ee = t(P);\n return ee.writeUInt32LE(Y.lo32, N), ee.writeInt32LE(Y.hi32, N + 4), 8;\n }\n }\n re.NearInt64 = R;\n class A extends r {\n constructor(v) {\n super(8, v);\n }\n /** @override */\n decode(v, P = 0) {\n const N = t(v), Y = N.readInt32BE(P), ee = N.readUInt32BE(P + 4);\n return y(Y, ee);\n }\n /** @override */\n encode(v, P, N = 0) {\n const Y = p(v), ee = t(P);\n return ee.writeInt32BE(Y.hi32, N), ee.writeUInt32BE(Y.lo32, N + 4), 8;\n }\n }\n re.NearInt64BE = A;\n class F extends r {\n constructor(v) {\n super(4, v);\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readFloatLE(P);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeFloatLE(v, N), 4;\n }\n }\n re.Float = F;\n class M extends r {\n constructor(v) {\n super(4, v);\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readFloatBE(P);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeFloatBE(v, N), 4;\n }\n }\n re.FloatBE = M;\n class H extends r {\n constructor(v) {\n super(8, v);\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readDoubleLE(P);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeDoubleLE(v, N), 8;\n }\n }\n re.Double = H;\n class K extends r {\n constructor(v) {\n super(8, v);\n }\n /** @override */\n decode(v, P = 0) {\n return t(v).readDoubleBE(P);\n }\n /** @override */\n encode(v, P, N = 0) {\n return t(P).writeDoubleBE(v, N), 8;\n }\n }\n re.DoubleBE = K;\n class j extends r {\n constructor(v, P, N) {\n if (!(v instanceof r))\n throw new TypeError(\"elementLayout must be a Layout\");\n if (!(P instanceof o && P.isCount() || Number.isInteger(P) && 0 <= P))\n throw new TypeError(\"count must be non-negative integer or an unsigned integer ExternalLayout\");\n let Y = -1;\n !(P instanceof o) && 0 < v.span && (Y = P * v.span), super(Y, N), this.elementLayout = v, this.count = P;\n }\n /** @override */\n getSpan(v, P = 0) {\n if (0 <= this.span)\n return this.span;\n let N = 0, Y = this.count;\n if (Y instanceof o && (Y = Y.decode(v, P)), 0 < this.elementLayout.span)\n N = Y * this.elementLayout.span;\n else {\n let ee = 0;\n for (; ee < Y; )\n N += this.elementLayout.getSpan(v, P + N), ++ee;\n }\n return N;\n }\n /** @override */\n decode(v, P = 0) {\n const N = [];\n let Y = 0, ee = this.count;\n for (ee instanceof o && (ee = ee.decode(v, P)); Y < ee; )\n N.push(this.elementLayout.decode(v, P)), P += this.elementLayout.getSpan(v, P), Y += 1;\n return N;\n }\n /** Implement {@link Layout#encode|encode} for {@link Sequence}.\n *\n * **NOTE** If `src` is shorter than {@link Sequence#count|count} then\n * the unused space in the buffer is left unchanged. If `src` is\n * longer than {@link Sequence#count|count} the unneeded elements are\n * ignored.\n *\n * **NOTE** If {@link Layout#count|count} is an instance of {@link\n * ExternalLayout} then the length of `src` will be encoded as the\n * count after `src` is encoded. */\n encode(v, P, N = 0) {\n const Y = this.elementLayout, ee = v.reduce((ie, le) => ie + Y.encode(le, P, N + ie), 0);\n return this.count instanceof o && this.count.encode(v.length, P, N), ee;\n }\n }\n re.Sequence = j;\n class C extends r {\n constructor(v, P, N) {\n if (!(Array.isArray(v) && v.reduce((ee, ie) => ee && ie instanceof r, !0)))\n throw new TypeError(\"fields must be array of Layout instances\");\n typeof P == \"boolean\" && N === void 0 && (N = P, P = void 0);\n for (const ee of v)\n if (0 > ee.span && ee.property === void 0)\n throw new Error(\"fields cannot contain unnamed variable-length layout\");\n let Y = -1;\n try {\n Y = v.reduce((ee, ie) => ee + ie.getSpan(), 0);\n } catch {\n }\n super(Y, P), this.fields = v, this.decodePrefixes = !!N;\n }\n /** @override */\n getSpan(v, P = 0) {\n if (0 <= this.span)\n return this.span;\n let N = 0;\n try {\n N = this.fields.reduce((Y, ee) => {\n const ie = ee.getSpan(v, P);\n return P += ie, Y + ie;\n }, 0);\n } catch {\n throw new RangeError(\"indeterminate span\");\n }\n return N;\n }\n /** @override */\n decode(v, P = 0) {\n e(v);\n const N = this.makeDestinationObject();\n for (const Y of this.fields)\n if (Y.property !== void 0 && (N[Y.property] = Y.decode(v, P)), P += Y.getSpan(v, P), this.decodePrefixes && v.length === P)\n break;\n return N;\n }\n /** Implement {@link Layout#encode|encode} for {@link Structure}.\n *\n * If `src` is missing a property for a member with a defined {@link\n * Layout#property|property} the corresponding region of the buffer is\n * left unmodified. */\n encode(v, P, N = 0) {\n const Y = N;\n let ee = 0, ie = 0;\n for (const le of this.fields) {\n let Te = le.span;\n if (ie = 0 < Te ? Te : 0, le.property !== void 0) {\n const De = v[le.property];\n De !== void 0 && (ie = le.encode(De, P, N), 0 > Te && (Te = le.getSpan(P, N)));\n }\n ee = N, N += Te;\n }\n return ee + ie - Y;\n }\n /** @override */\n fromArray(v) {\n const P = this.makeDestinationObject();\n for (const N of this.fields)\n N.property !== void 0 && 0 < v.length && (P[N.property] = v.shift());\n return P;\n }\n /**\n * Get access to the layout of a given property.\n *\n * @param {String} property - the structure member of interest.\n *\n * @return {Layout} - the layout associated with `property`, or\n * undefined if there is no such property.\n */\n layoutFor(v) {\n if (typeof v != \"string\")\n throw new TypeError(\"property must be string\");\n for (const P of this.fields)\n if (P.property === v)\n return P;\n }\n /**\n * Get the offset of a structure member.\n *\n * @param {String} property - the structure member of interest.\n *\n * @return {Number} - the offset in bytes to the start of `property`\n * within the structure, or undefined if `property` is not a field\n * within the structure. If the property is a member but follows a\n * variable-length structure member a negative number will be\n * returned.\n */\n offsetOf(v) {\n if (typeof v != \"string\")\n throw new TypeError(\"property must be string\");\n let P = 0;\n for (const N of this.fields) {\n if (N.property === v)\n return P;\n 0 > N.span ? P = -1 : 0 <= P && (P += N.span);\n }\n }\n }\n re.Structure = C;\n class k {\n constructor(v) {\n this.property = v;\n }\n /** Analog to {@link Layout#decode|Layout decode} for union discriminators.\n *\n * The implementation of this method need not reference the buffer if\n * variant information is available through other means. */\n decode(v, P) {\n throw new Error(\"UnionDiscriminator is abstract\");\n }\n /** Analog to {@link Layout#decode|Layout encode} for union discriminators.\n *\n * The implementation of this method need not store the value if\n * variant information is maintained through other means. */\n encode(v, P, N) {\n throw new Error(\"UnionDiscriminator is abstract\");\n }\n }\n re.UnionDiscriminator = k;\n class $ extends k {\n constructor(v, P) {\n if (!(v instanceof o && v.isCount()))\n throw new TypeError(\"layout must be an unsigned integer ExternalLayout\");\n super(P || v.property || \"variant\"), this.layout = v;\n }\n /** Delegate decoding to {@link UnionLayoutDiscriminator#layout|layout}. */\n decode(v, P) {\n return this.layout.decode(v, P);\n }\n /** Delegate encoding to {@link UnionLayoutDiscriminator#layout|layout}. */\n encode(v, P, N) {\n return this.layout.encode(v, P, N);\n }\n }\n re.UnionLayoutDiscriminator = $;\n class W extends r {\n constructor(v, P, N) {\n let Y;\n if (v instanceof c || v instanceof u)\n Y = new $(new l(v));\n else if (v instanceof o && v.isCount())\n Y = new $(v);\n else if (v instanceof k)\n Y = v;\n else\n throw new TypeError(\"discr must be a UnionDiscriminator or an unsigned integer layout\");\n if (P === void 0 && (P = null), !(P === null || P instanceof r))\n throw new TypeError(\"defaultLayout must be null or a Layout\");\n if (P !== null) {\n if (0 > P.span)\n throw new Error(\"defaultLayout must have constant span\");\n P.property === void 0 && (P = P.replicate(\"content\"));\n }\n let ee = -1;\n P && (ee = P.span, 0 <= ee && (v instanceof c || v instanceof u) && (ee += Y.layout.span)), super(ee, N), this.discriminator = Y, this.usesPrefixDiscriminator = v instanceof c || v instanceof u, this.defaultLayout = P, this.registry = {};\n let ie = this.defaultGetSourceVariant.bind(this);\n this.getSourceVariant = function(le) {\n return ie(le);\n }, this.configGetSourceVariant = function(le) {\n ie = le.bind(this);\n };\n }\n /** @override */\n getSpan(v, P = 0) {\n if (0 <= this.span)\n return this.span;\n const N = this.getVariant(v, P);\n if (!N)\n throw new Error(\"unable to determine span for unrecognized variant\");\n return N.getSpan(v, P);\n }\n /**\n * Method to infer a registered Union variant compatible with `src`.\n *\n * The first satisfied rule in the following sequence defines the\n * return value:\n * * If `src` has properties matching the Union discriminator and\n * the default layout, `undefined` is returned regardless of the\n * value of the discriminator property (this ensures the default\n * layout will be used);\n * * If `src` has a property matching the Union discriminator, the\n * value of the discriminator identifies a registered variant, and\n * either (a) the variant has no layout, or (b) `src` has the\n * variant's property, then the variant is returned (because the\n * source satisfies the constraints of the variant it identifies);\n * * If `src` does not have a property matching the Union\n * discriminator, but does have a property matching a registered\n * variant, then the variant is returned (because the source\n * matches a variant without an explicit conflict);\n * * An error is thrown (because we either can't identify a variant,\n * or we were explicitly told the variant but can't satisfy it).\n *\n * @param {Object} src - an object presumed to be compatible with\n * the content of the Union.\n *\n * @return {(undefined|VariantLayout)} - as described above.\n *\n * @throws {Error} - if `src` cannot be associated with a default or\n * registered variant.\n */\n defaultGetSourceVariant(v) {\n if (Object.prototype.hasOwnProperty.call(v, this.discriminator.property)) {\n if (this.defaultLayout && this.defaultLayout.property && Object.prototype.hasOwnProperty.call(v, this.defaultLayout.property))\n return;\n const P = this.registry[v[this.discriminator.property]];\n if (P && (!P.layout || P.property && Object.prototype.hasOwnProperty.call(v, P.property)))\n return P;\n } else\n for (const P in this.registry) {\n const N = this.registry[P];\n if (N.property && Object.prototype.hasOwnProperty.call(v, N.property))\n return N;\n }\n throw new Error(\"unable to infer src variant\");\n }\n /** Implement {@link Layout#decode|decode} for {@link Union}.\n *\n * If the variant is {@link Union#addVariant|registered} the return\n * value is an instance of that variant, with no explicit\n * discriminator. Otherwise the {@link Union#defaultLayout|default\n * layout} is used to decode the content. */\n decode(v, P = 0) {\n let N;\n const Y = this.discriminator, ee = Y.decode(v, P), ie = this.registry[ee];\n if (ie === void 0) {\n const le = this.defaultLayout;\n let Te = 0;\n this.usesPrefixDiscriminator && (Te = Y.layout.span), N = this.makeDestinationObject(), N[Y.property] = ee, N[le.property] = le.decode(v, P + Te);\n } else\n N = ie.decode(v, P);\n return N;\n }\n /** Implement {@link Layout#encode|encode} for {@link Union}.\n *\n * This API assumes the `src` object is consistent with the union's\n * {@link Union#defaultLayout|default layout}. To encode variants\n * use the appropriate variant-specific {@link VariantLayout#encode}\n * method. */\n encode(v, P, N = 0) {\n const Y = this.getSourceVariant(v);\n if (Y === void 0) {\n const ee = this.discriminator, ie = this.defaultLayout;\n let le = 0;\n return this.usesPrefixDiscriminator && (le = ee.layout.span), ee.encode(v[ee.property], P, N), le + ie.encode(v[ie.property], P, N + le);\n }\n return Y.encode(v, P, N);\n }\n /** Register a new variant structure within a union. The newly\n * created variant is returned.\n *\n * @param {Number} variant - initializer for {@link\n * VariantLayout#variant|variant}.\n *\n * @param {Layout} layout - initializer for {@link\n * VariantLayout#layout|layout}.\n *\n * @param {String} property - initializer for {@link\n * Layout#property|property}.\n *\n * @return {VariantLayout} */\n addVariant(v, P, N) {\n const Y = new _(this, v, P, N);\n return this.registry[v] = Y, Y;\n }\n /**\n * Get the layout associated with a registered variant.\n *\n * If `vb` does not produce a registered variant the function returns\n * `undefined`.\n *\n * @param {(Number|Uint8Array)} vb - either the variant number, or a\n * buffer from which the discriminator is to be read.\n *\n * @param {Number} offset - offset into `vb` for the start of the\n * union. Used only when `vb` is an instance of {Uint8Array}.\n *\n * @return {({VariantLayout}|undefined)}\n */\n getVariant(v, P = 0) {\n let N;\n return v instanceof Uint8Array ? N = this.discriminator.decode(v, P) : N = v, this.registry[N];\n }\n }\n re.Union = W;\n class _ extends r {\n constructor(v, P, N, Y) {\n if (!(v instanceof W))\n throw new TypeError(\"union must be a Union\");\n if (!Number.isInteger(P) || 0 > P)\n throw new TypeError(\"variant must be a (non-negative) integer\");\n if (typeof N == \"string\" && Y === void 0 && (Y = N, N = null), N) {\n if (!(N instanceof r))\n throw new TypeError(\"layout must be a Layout\");\n if (v.defaultLayout !== null && 0 <= N.span && N.span > v.defaultLayout.span)\n throw new Error(\"variant span exceeds span of containing union\");\n if (typeof Y != \"string\")\n throw new TypeError(\"variant must have a String property\");\n }\n let ee = v.span;\n 0 > v.span && (ee = N ? N.span : 0, 0 <= ee && v.usesPrefixDiscriminator && (ee += v.discriminator.layout.span)), super(ee, Y), this.union = v, this.variant = P, this.layout = N || null;\n }\n /** @override */\n getSpan(v, P = 0) {\n if (0 <= this.span)\n return this.span;\n let N = 0;\n this.union.usesPrefixDiscriminator && (N = this.union.discriminator.layout.span);\n let Y = 0;\n return this.layout && (Y = this.layout.getSpan(v, P + N)), N + Y;\n }\n /** @override */\n decode(v, P = 0) {\n const N = this.makeDestinationObject();\n if (this !== this.union.getVariant(v, P))\n throw new Error(\"variant mismatch\");\n let Y = 0;\n return this.union.usesPrefixDiscriminator && (Y = this.union.discriminator.layout.span), this.layout ? N[this.property] = this.layout.decode(v, P + Y) : this.property ? N[this.property] = !0 : this.union.usesPrefixDiscriminator && (N[this.union.discriminator.property] = this.variant), N;\n }\n /** @override */\n encode(v, P, N = 0) {\n let Y = 0;\n if (this.union.usesPrefixDiscriminator && (Y = this.union.discriminator.layout.span), this.layout && !Object.prototype.hasOwnProperty.call(v, this.property))\n throw new TypeError(\"variant lacks property \" + this.property);\n this.union.discriminator.encode(this.variant, P, N);\n let ee = Y;\n if (this.layout && (this.layout.encode(v[this.property], P, N + Y), ee += this.layout.getSpan(P, N + Y), 0 <= this.union.span && ee > this.union.span))\n throw new Error(\"encoded variant overruns containing union\");\n return ee;\n }\n /** Delegate {@link Layout#fromArray|fromArray} to {@link\n * VariantLayout#layout|layout}. */\n fromArray(v) {\n if (this.layout)\n return this.layout.fromArray(v);\n }\n }\n re.VariantLayout = _;\n function g(m) {\n return 0 > m && (m += 4294967296), m;\n }\n class x extends r {\n constructor(v, P, N) {\n if (!(v instanceof c || v instanceof u))\n throw new TypeError(\"word must be a UInt or UIntBE layout\");\n if (typeof P == \"string\" && N === void 0 && (N = P, P = !1), 4 < v.span)\n throw new RangeError(\"word cannot exceed 32 bits\");\n super(v.span, N), this.word = v, this.msb = !!P, this.fields = [];\n let Y = 0;\n this._packedSetValue = function(ee) {\n return Y = g(ee), this;\n }, this._packedGetValue = function() {\n return Y;\n };\n }\n /** @override */\n decode(v, P = 0) {\n const N = this.makeDestinationObject(), Y = this.word.decode(v, P);\n this._packedSetValue(Y);\n for (const ee of this.fields)\n ee.property !== void 0 && (N[ee.property] = ee.decode(v));\n return N;\n }\n /** Implement {@link Layout#encode|encode} for {@link BitStructure}.\n *\n * If `src` is missing a property for a member with a defined {@link\n * Layout#property|property} the corresponding region of the packed\n * value is left unmodified. Unused bits are also left unmodified. */\n encode(v, P, N = 0) {\n const Y = this.word.decode(P, N);\n this._packedSetValue(Y);\n for (const ee of this.fields)\n if (ee.property !== void 0) {\n const ie = v[ee.property];\n ie !== void 0 && ee.encode(ie);\n }\n return this.word.encode(this._packedGetValue(), P, N);\n }\n /** Register a new bitfield with a containing bit structure. The\n * resulting bitfield is returned.\n *\n * @param {Number} bits - initializer for {@link BitField#bits|bits}.\n *\n * @param {string} property - initializer for {@link\n * Layout#property|property}.\n *\n * @return {BitField} */\n addField(v, P) {\n const N = new w(this, v, P);\n return this.fields.push(N), N;\n }\n /** As with {@link BitStructure#addField|addField} for single-bit\n * fields with `boolean` value representation.\n *\n * @param {string} property - initializer for {@link\n * Layout#property|property}.\n *\n * @return {Boolean} */\n // `Boolean` conflicts with the native primitive type\n // eslint-disable-next-line @typescript-eslint/ban-types\n addBoolean(v) {\n const P = new D(this, v);\n return this.fields.push(P), P;\n }\n /**\n * Get access to the bit field for a given property.\n *\n * @param {String} property - the bit field of interest.\n *\n * @return {BitField} - the field associated with `property`, or\n * undefined if there is no such property.\n */\n fieldFor(v) {\n if (typeof v != \"string\")\n throw new TypeError(\"property must be string\");\n for (const P of this.fields)\n if (P.property === v)\n return P;\n }\n }\n re.BitStructure = x;\n class w {\n constructor(v, P, N) {\n if (!(v instanceof x))\n throw new TypeError(\"container must be a BitStructure\");\n if (!Number.isInteger(P) || 0 >= P)\n throw new TypeError(\"bits must be positive integer\");\n const Y = 8 * v.span, ee = v.fields.reduce((ie, le) => ie + le.bits, 0);\n if (P + ee > Y)\n throw new Error(\"bits too long for span remainder (\" + (Y - ee) + \" of \" + Y + \" remain)\");\n this.container = v, this.bits = P, this.valueMask = (1 << P) - 1, P === 32 && (this.valueMask = 4294967295), this.start = ee, this.container.msb && (this.start = Y - ee - P), this.wordMask = g(this.valueMask << this.start), this.property = N;\n }\n /** Store a value into the corresponding subsequence of the containing\n * bit field. */\n decode(v, P) {\n const N = this.container._packedGetValue();\n return g(N & this.wordMask) >>> this.start;\n }\n /** Store a value into the corresponding subsequence of the containing\n * bit field.\n *\n * **NOTE** This is not a specialization of {@link\n * Layout#encode|Layout.encode} and there is no return value. */\n encode(v) {\n if (typeof v != \"number\" || !Number.isInteger(v) || v !== g(v & this.valueMask))\n throw new TypeError(n(\"BitField.encode\", this) + \" value must be integer not exceeding \" + this.valueMask);\n const P = this.container._packedGetValue(), N = g(v << this.start);\n this.container._packedSetValue(g(P & ~this.wordMask) | N);\n }\n }\n re.BitField = w;\n class D extends w {\n constructor(v, P) {\n super(v, 1, P);\n }\n /** Override {@link BitField#decode|decode} for {@link Boolean|Boolean}.\n *\n * @returns {boolean} */\n decode(v, P) {\n return !!super.decode(v, P);\n }\n /** @override */\n encode(v) {\n typeof v == \"boolean\" && (v = +v), super.encode(v);\n }\n }\n re.Boolean = D;\n class O extends r {\n constructor(v, P) {\n if (!(v instanceof o && v.isCount() || Number.isInteger(v) && 0 <= v))\n throw new TypeError(\"length must be positive integer or an unsigned integer ExternalLayout\");\n let N = -1;\n v instanceof o || (N = v), super(N, P), this.length = v;\n }\n /** @override */\n getSpan(v, P) {\n let N = this.span;\n return 0 > N && (N = this.length.decode(v, P)), N;\n }\n /** @override */\n decode(v, P = 0) {\n let N = this.span;\n return 0 > N && (N = this.length.decode(v, P)), t(v).slice(P, P + N);\n }\n /** Implement {@link Layout#encode|encode} for {@link Blob}.\n *\n * **NOTE** If {@link Layout#count|count} is an instance of {@link\n * ExternalLayout} then the length of `src` will be encoded as the\n * count after `src` is encoded. */\n encode(v, P, N) {\n let Y = this.length;\n if (this.length instanceof o && (Y = v.length), !(v instanceof Uint8Array && Y === v.length))\n throw new TypeError(n(\"Blob.encode\", this) + \" requires (length \" + Y + \") Uint8Array as src\");\n if (N + Y > P.length)\n throw new RangeError(\"encoding overruns Uint8Array\");\n const ee = t(v);\n return t(P).write(ee.toString(\"hex\"), N, Y, \"hex\"), this.length instanceof o && this.length.encode(Y, P, N), Y;\n }\n }\n re.Blob = O;\n class U extends r {\n constructor(v) {\n super(-1, v);\n }\n /** @override */\n getSpan(v, P = 0) {\n e(v);\n let N = P;\n for (; N < v.length && v[N] !== 0; )\n N += 1;\n return 1 + N - P;\n }\n /** @override */\n decode(v, P = 0) {\n const N = this.getSpan(v, P);\n return t(v).slice(P, P + N - 1).toString(\"utf-8\");\n }\n /** @override */\n encode(v, P, N = 0) {\n typeof v != \"string\" && (v = String(v));\n const Y = s.Buffer.from(v, \"utf8\"), ee = Y.length;\n if (N + ee > P.length)\n throw new RangeError(\"encoding overruns Buffer\");\n const ie = t(P);\n return Y.copy(ie, N), ie[N + ee] = 0, ee + 1;\n }\n }\n re.CString = U;\n class V extends r {\n constructor(v, P) {\n if (typeof v == \"string\" && P === void 0 && (P = v, v = void 0), v === void 0)\n v = -1;\n else if (!Number.isInteger(v))\n throw new TypeError(\"maxSpan must be an integer\");\n super(-1, P), this.maxSpan = v;\n }\n /** @override */\n getSpan(v, P = 0) {\n return e(v), v.length - P;\n }\n /** @override */\n decode(v, P = 0) {\n const N = this.getSpan(v, P);\n if (0 <= this.maxSpan && this.maxSpan < N)\n throw new RangeError(\"text length exceeds maxSpan\");\n return t(v).slice(P, P + N).toString(\"utf-8\");\n }\n /** @override */\n encode(v, P, N = 0) {\n typeof v != \"string\" && (v = String(v));\n const Y = s.Buffer.from(v, \"utf8\"), ee = Y.length;\n if (0 <= this.maxSpan && this.maxSpan < ee)\n throw new RangeError(\"text length exceeds maxSpan\");\n if (N + ee > P.length)\n throw new RangeError(\"encoding overruns Buffer\");\n return Y.copy(t(P), N), ee;\n }\n }\n re.UTF8 = V;\n class L extends r {\n constructor(v, P) {\n super(0, P), this.value = v;\n }\n /** @override */\n decode(v, P) {\n return this.value;\n }\n /** @override */\n encode(v, P, N) {\n return 0;\n }\n }\n return re.Constant = L, re.greedy = ((m, v) => new a(m, v)), re.offset = ((m, v, P) => new l(m, v, P)), re.u8 = ((m) => new c(1, m)), re.u16 = ((m) => new c(2, m)), re.u24 = ((m) => new c(3, m)), re.u32 = ((m) => new c(4, m)), re.u40 = ((m) => new c(5, m)), re.u48 = ((m) => new c(6, m)), re.nu64 = ((m) => new E(m)), re.u16be = ((m) => new u(2, m)), re.u24be = ((m) => new u(3, m)), re.u32be = ((m) => new u(4, m)), re.u40be = ((m) => new u(5, m)), re.u48be = ((m) => new u(6, m)), re.nu64be = ((m) => new b(m)), re.s8 = ((m) => new d(1, m)), re.s16 = ((m) => new d(2, m)), re.s24 = ((m) => new d(3, m)), re.s32 = ((m) => new d(4, m)), re.s40 = ((m) => new d(5, m)), re.s48 = ((m) => new d(6, m)), re.ns64 = ((m) => new R(m)), re.s16be = ((m) => new h(2, m)), re.s24be = ((m) => new h(3, m)), re.s32be = ((m) => new h(4, m)), re.s40be = ((m) => new h(5, m)), re.s48be = ((m) => new h(6, m)), re.ns64be = ((m) => new A(m)), re.f32 = ((m) => new F(m)), re.f32be = ((m) => new M(m)), re.f64 = ((m) => new H(m)), re.f64be = ((m) => new K(m)), re.struct = ((m, v, P) => new C(m, v, P)), re.bits = ((m, v, P) => new x(m, v, P)), re.seq = ((m, v, P) => new j(m, v, P)), re.union = ((m, v, P) => new W(m, v, P)), re.unionLayoutDiscriminator = ((m, v) => new $(m, v)), re.blob = ((m, v) => new O(m, v)), re.cstr = ((m) => new U(m)), re.utf8 = ((m, v) => new V(m, v)), re.constant = ((m, v) => new L(m, v)), re;\n}\nvar z = Wy(), zy = 8078e3, Yy = 8078001, Zy = 8078004, Xy = 8078005, Jy = 8078006, Qy = 8078011;\nfunction x0(s) {\n return Array.isArray(s) ? \"%5B\" + s.map(x0).join(\n \"%2C%20\"\n /* \", \" */\n ) + /* \"]\" */\n \"%5D\" : typeof s == \"bigint\" ? `${s}n` : encodeURIComponent(\n String(\n s != null && Object.getPrototypeOf(s) === null ? (\n // Plain objects with no prototype don't have a `toString` method.\n // Convert them before stringifying them.\n { ...s }\n ) : s\n )\n );\n}\nfunction ev([s, e]) {\n return `${s}=${x0(e)}`;\n}\nfunction tv(s) {\n const e = Object.entries(s).map(ev).join(\"&\");\n return btoa(e);\n}\nfunction rv(s, e = {}) {\n {\n let t = `Solana error #${s}; Decode this error by running \\`npx @solana/errors decode -- ${s}`;\n return Object.keys(e).length && (t += ` '${tv(e)}'`), `${t}\\``;\n }\n}\nvar bn = class extends Error {\n constructor(...[e, t]) {\n let r, n;\n if (t) {\n const { cause: o, ...a } = t;\n o && (n = { cause: o }), Object.keys(a).length > 0 && (r = a);\n }\n const i = rv(e, r);\n super(i, n);\n /**\n * Indicates the root cause of this {@link SolanaError}, if any.\n *\n * For example, a transaction error might have an instruction error as its root cause. In this\n * case, you will be able to access the instruction error on the transaction error as `cause`.\n */\n Cr(this, \"cause\", this.cause);\n /**\n * Contains context that can assist in understanding or recovering from a {@link SolanaError}.\n */\n Cr(this, \"context\");\n this.context = {\n __code: e,\n ...r\n }, this.name = \"SolanaError\";\n }\n};\nfunction sv(s, e) {\n return \"fixedSize\" in e ? e.fixedSize : e.getSizeFromValue(s);\n}\nfunction nv(s) {\n return Object.freeze({\n ...s,\n encode: (e) => {\n const t = new Uint8Array(sv(e, s));\n return s.write(e, t, 0), t;\n }\n });\n}\nfunction iv(s) {\n return Object.freeze({\n ...s,\n decode: (e, t = 0) => s.read(e, t)[0]\n });\n}\nfunction dn(s) {\n return \"fixedSize\" in s && typeof s.fixedSize == \"number\";\n}\nfunction ov(s, e) {\n if (dn(s) !== dn(e))\n throw new bn(Zy);\n if (dn(s) && dn(e) && s.fixedSize !== e.fixedSize)\n throw new bn(Xy, {\n decoderFixedSize: e.fixedSize,\n encoderFixedSize: s.fixedSize\n });\n if (!dn(s) && !dn(e) && s.maxSize !== e.maxSize)\n throw new bn(Jy, {\n decoderMaxSize: e.maxSize,\n encoderMaxSize: s.maxSize\n });\n return {\n ...e,\n ...s,\n decode: e.decode,\n encode: s.encode,\n read: e.read,\n write: s.write\n };\n}\nfunction av(s, e, t = 0) {\n if (e.length - t <= 0)\n throw new bn(zy, {\n codecDescription: s\n });\n}\nfunction lv(s, e, t, r = 0) {\n const n = t.length - r;\n if (n < e)\n throw new bn(Yy, {\n bytesLength: n,\n codecDescription: s,\n expected: e\n });\n}\nfunction cv(s, e, t, r) {\n if (r < e || r > t)\n throw new bn(Qy, {\n codecDescription: s,\n max: t,\n min: e,\n value: r\n });\n}\nfunction S0(s) {\n return (s == null ? void 0 : s.endian) !== 1;\n}\nfunction uv(s) {\n return nv({\n fixedSize: s.size,\n write(e, t, r) {\n s.range && cv(s.name, s.range[0], s.range[1], e);\n const n = new ArrayBuffer(s.size);\n return s.set(new DataView(n), e, S0(s.config)), t.set(new Uint8Array(n), r), r + s.size;\n }\n });\n}\nfunction dv(s) {\n return iv({\n fixedSize: s.size,\n read(e, t = 0) {\n av(s.name, e, t), lv(s.name, s.size, e, t);\n const r = new DataView(hv(e, t, s.size));\n return [s.get(r, S0(s.config)), t + s.size];\n }\n });\n}\nfunction hv(s, e, t) {\n const r = s.byteOffset + (e ?? 0), n = t ?? s.byteLength;\n return s.buffer.slice(r, r + n);\n}\nvar fv = (s = {}) => uv({\n config: s,\n name: \"u64\",\n range: [0n, BigInt(\"0xffffffffffffffff\")],\n set: (e, t, r) => e.setBigUint64(0, BigInt(t), r),\n size: 8\n}), gv = (s = {}) => dv({\n config: s,\n get: (e, t) => e.getBigUint64(0, t),\n name: \"u64\",\n size: 8\n}), pv = (s = {}) => ov(fv(s), gv(s));\nclass mv extends TypeError {\n constructor(e, t) {\n let r;\n const { message: n, explanation: i, ...o } = e, { path: a } = e, l = a.length === 0 ? n : `At path: ${a.join(\".\")} -- ${n}`;\n super(i ?? l), i != null && (this.cause = l), Object.assign(this, o), this.name = this.constructor.name, this.failures = () => r ?? (r = [e, ...t()]);\n }\n}\nfunction yv(s) {\n return Ci(s) && typeof s[Symbol.iterator] == \"function\";\n}\nfunction Ci(s) {\n return typeof s == \"object\" && s != null;\n}\nfunction $o(s) {\n return Ci(s) && !Array.isArray(s);\n}\nfunction Br(s) {\n return typeof s == \"symbol\" ? s.toString() : typeof s == \"string\" ? JSON.stringify(s) : `${s}`;\n}\nfunction vv(s) {\n const { done: e, value: t } = s.next();\n return e ? void 0 : t;\n}\nfunction Ev(s, e, t, r) {\n if (s === !0)\n return;\n s === !1 ? s = {} : typeof s == \"string\" && (s = { message: s });\n const { path: n, branch: i } = e, { type: o } = t, { refinement: a, message: l = `Expected a value of type \\`${o}\\`${a ? ` with refinement \\`${a}\\`` : \"\"}, but received: \\`${Br(r)}\\`` } = s;\n return {\n value: r,\n type: o,\n refinement: a,\n key: n[n.length - 1],\n path: n,\n branch: i,\n ...s,\n message: l\n };\n}\nfunction* Cd(s, e, t, r) {\n yv(s) || (s = [s]);\n for (const n of s) {\n const i = Ev(n, e, t, r);\n i && (yield i);\n }\n}\nfunction* Jc(s, e, t = {}) {\n const { path: r = [], branch: n = [s], coerce: i = !1, mask: o = !1 } = t, a = { path: r, branch: n, mask: o };\n i && (s = e.coercer(s, a));\n let l = \"valid\";\n for (const c of e.validator(s, a))\n c.explanation = t.message, l = \"not_valid\", yield [c, void 0];\n for (let [c, u, d] of e.entries(s, a)) {\n const h = Jc(u, d, {\n path: c === void 0 ? r : [...r, c],\n branch: c === void 0 ? n : [...n, u],\n coerce: i,\n mask: o,\n message: t.message\n });\n for (const f of h)\n f[0] ? (l = f[0].refinement != null ? \"not_refined\" : \"not_valid\", yield [f[0], void 0]) : i && (u = f[1], c === void 0 ? s = u : s instanceof Map ? s.set(c, u) : s instanceof Set ? s.add(u) : Ci(s) && (u !== void 0 || c in s) && (s[c] = u));\n }\n if (l !== \"not_valid\")\n for (const c of e.refiner(s, a))\n c.explanation = t.message, l = \"not_refined\", yield [c, void 0];\n l === \"valid\" && (yield [void 0, s]);\n}\nlet es = class {\n constructor(e) {\n const { type: t, schema: r, validator: n, refiner: i, coercer: o = (l) => l, entries: a = function* () {\n } } = e;\n this.type = t, this.schema = r, this.entries = a, this.coercer = o, n ? this.validator = (l, c) => {\n const u = n(l, c);\n return Cd(u, c, this, l);\n } : this.validator = () => [], i ? this.refiner = (l, c) => {\n const u = i(l, c);\n return Cd(u, c, this, l);\n } : this.refiner = () => [];\n }\n /**\n * Assert that a value passes the struct's validation, throwing if it doesn't.\n */\n assert(e, t) {\n return xv(e, this, t);\n }\n /**\n * Create a value with the struct's coercion logic, then validate it.\n */\n create(e, t) {\n return ti(e, this, t);\n }\n /**\n * Check if a value passes the struct's validation.\n */\n is(e) {\n return b0(e, this);\n }\n /**\n * Mask a value, coercing and validating it, but returning only the subset of\n * properties defined by the struct's schema. Masking applies recursively to\n * props of `object` structs only.\n */\n mask(e, t) {\n return Sv(e, this, t);\n }\n /**\n * Validate a value with the struct's validation logic, returning a tuple\n * representing the result.\n *\n * You may optionally pass `true` for the `coerce` argument to coerce\n * the value before attempting to validate it. If you do, the result will\n * contain the coerced result when successful. Also, `mask` will turn on\n * masking of the unknown `object` props recursively if passed.\n */\n validate(e, t = {}) {\n return ki(e, this, t);\n }\n};\nfunction xv(s, e, t) {\n const r = ki(s, e, { message: t });\n if (r[0])\n throw r[0];\n}\nfunction ti(s, e, t) {\n const r = ki(s, e, { coerce: !0, message: t });\n if (r[0])\n throw r[0];\n return r[1];\n}\nfunction Sv(s, e, t) {\n const r = ki(s, e, { coerce: !0, mask: !0, message: t });\n if (r[0])\n throw r[0];\n return r[1];\n}\nfunction b0(s, e) {\n return !ki(s, e)[0];\n}\nfunction ki(s, e, t = {}) {\n const r = Jc(s, e, t), n = vv(r);\n return n[0] ? [new mv(n[0], function* () {\n for (const o of r)\n o[0] && (yield o[0]);\n }), void 0] : [void 0, n[1]];\n}\nfunction tn(s, e) {\n return new es({ type: s, schema: null, validator: e });\n}\nfunction bv() {\n return tn(\"any\", () => !0);\n}\nfunction fe(s) {\n return new es({\n type: \"array\",\n schema: s,\n *entries(e) {\n if (s && Array.isArray(e))\n for (const [t, r] of e.entries())\n yield [t, r, s];\n },\n coercer(e) {\n return Array.isArray(e) ? e.slice() : e;\n },\n validator(e) {\n return Array.isArray(e) || `Expected an array value, but received: ${Br(e)}`;\n }\n });\n}\nfunction Xr() {\n return tn(\"boolean\", (s) => typeof s == \"boolean\");\n}\nfunction Qc(s) {\n return tn(\"instance\", (e) => e instanceof s || `Expected a \\`${s.name}\\` instance, but received: ${Br(e)}`);\n}\nfunction pt(s) {\n const e = Br(s), t = typeof s;\n return new es({\n type: \"literal\",\n schema: t === \"string\" || t === \"number\" || t === \"boolean\" ? s : null,\n validator(r) {\n return r === s || `Expected the literal \\`${e}\\`, but received: ${Br(r)}`;\n }\n });\n}\nfunction Tv() {\n return tn(\"never\", () => !1);\n}\nfunction ge(s) {\n return new es({\n ...s,\n validator: (e, t) => e === null || s.validator(e, t),\n refiner: (e, t) => e === null || s.refiner(e, t)\n });\n}\nfunction te() {\n return tn(\"number\", (s) => typeof s == \"number\" && !isNaN(s) || `Expected a number, but received: ${Br(s)}`);\n}\nfunction Se(s) {\n return new es({\n ...s,\n validator: (e, t) => e === void 0 || s.validator(e, t),\n refiner: (e, t) => e === void 0 || s.refiner(e, t)\n });\n}\nfunction T0(s, e) {\n return new es({\n type: \"record\",\n schema: null,\n *entries(t) {\n if (Ci(t))\n for (const r in t) {\n const n = t[r];\n yield [r, r, s], yield [r, n, e];\n }\n },\n validator(t) {\n return $o(t) || `Expected an object, but received: ${Br(t)}`;\n },\n coercer(t) {\n return $o(t) ? { ...t } : t;\n }\n });\n}\nfunction ce() {\n return tn(\"string\", (s) => typeof s == \"string\" || `Expected a string, but received: ${Br(s)}`);\n}\nfunction eu(s) {\n const e = Tv();\n return new es({\n type: \"tuple\",\n schema: null,\n *entries(t) {\n if (Array.isArray(t)) {\n const r = Math.max(s.length, t.length);\n for (let n = 0; n < r; n++)\n yield [n, t[n], s[n] || e];\n }\n },\n validator(t) {\n return Array.isArray(t) || `Expected an array, but received: ${Br(t)}`;\n },\n coercer(t) {\n return Array.isArray(t) ? t.slice() : t;\n }\n });\n}\nfunction oe(s) {\n const e = Object.keys(s);\n return new es({\n type: \"type\",\n schema: s,\n *entries(t) {\n if (Ci(t))\n for (const r of e)\n yield [r, t[r], s[r]];\n },\n validator(t) {\n return $o(t) || `Expected an object, but received: ${Br(t)}`;\n },\n coercer(t) {\n return $o(t) ? { ...t } : t;\n }\n });\n}\nfunction ur(s) {\n const e = s.map((t) => t.type).join(\" | \");\n return new es({\n type: \"union\",\n schema: null,\n coercer(t, r) {\n for (const n of s) {\n const [i, o] = n.validate(t, {\n coerce: !0,\n mask: r.mask\n });\n if (!i)\n return o;\n }\n return t;\n },\n validator(t, r) {\n const n = [];\n for (const i of s) {\n const [...o] = Jc(t, i, r), [a] = o;\n if (a[0])\n for (const [l] of o)\n l && n.push(l);\n else\n return [];\n }\n return [\n `Expected the value to satisfy a union of \\`${e}\\`, but received: ${Br(t)}`,\n ...n\n ];\n }\n });\n}\nfunction Gn() {\n return tn(\"unknown\", () => !0);\n}\nfunction Di(s, e, t) {\n return new es({\n ...s,\n coercer: (r, n) => b0(r, e) ? s.coercer(t(r, n), n) : s.coercer(r, n)\n });\n}\nvar $i, wv = new Uint8Array(16);\nfunction w0() {\n if (!$i && ($i = typeof crypto < \"u\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto < \"u\" && typeof msCrypto.getRandomValues == \"function\" && msCrypto.getRandomValues.bind(msCrypto), !$i))\n throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n return $i(wv);\n}\nconst Av = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nfunction ua(s) {\n return typeof s == \"string\" && Av.test(s);\n}\nvar Yt = [];\nfor (var Qa = 0; Qa < 256; ++Qa)\n Yt.push((Qa + 256).toString(16).substr(1));\nfunction da(s) {\n var e = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0, t = (Yt[s[e + 0]] + Yt[s[e + 1]] + Yt[s[e + 2]] + Yt[s[e + 3]] + \"-\" + Yt[s[e + 4]] + Yt[s[e + 5]] + \"-\" + Yt[s[e + 6]] + Yt[s[e + 7]] + \"-\" + Yt[s[e + 8]] + Yt[s[e + 9]] + \"-\" + Yt[s[e + 10]] + Yt[s[e + 11]] + Yt[s[e + 12]] + Yt[s[e + 13]] + Yt[s[e + 14]] + Yt[s[e + 15]]).toLowerCase();\n if (!ua(t))\n throw TypeError(\"Stringified UUID is invalid\");\n return t;\n}\nvar kd, el, tl = 0, rl = 0;\nfunction Iv(s, e, t) {\n var r = e && t || 0, n = e || new Array(16);\n s = s || {};\n var i = s.node || kd, o = s.clockseq !== void 0 ? s.clockseq : el;\n if (i == null || o == null) {\n var a = s.random || (s.rng || w0)();\n i == null && (i = kd = [a[0] | 1, a[1], a[2], a[3], a[4], a[5]]), o == null && (o = el = (a[6] << 8 | a[7]) & 16383);\n }\n var l = s.msecs !== void 0 ? s.msecs : Date.now(), c = s.nsecs !== void 0 ? s.nsecs : rl + 1, u = l - tl + (c - rl) / 1e4;\n if (u < 0 && s.clockseq === void 0 && (o = o + 1 & 16383), (u < 0 || l > tl) && s.nsecs === void 0 && (c = 0), c >= 1e4)\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n tl = l, rl = c, el = o, l += 122192928e5;\n var d = ((l & 268435455) * 1e4 + c) % 4294967296;\n n[r++] = d >>> 24 & 255, n[r++] = d >>> 16 & 255, n[r++] = d >>> 8 & 255, n[r++] = d & 255;\n var h = l / 4294967296 * 1e4 & 268435455;\n n[r++] = h >>> 8 & 255, n[r++] = h & 255, n[r++] = h >>> 24 & 15 | 16, n[r++] = h >>> 16 & 255, n[r++] = o >>> 8 | 128, n[r++] = o & 255;\n for (var f = 0; f < 6; ++f)\n n[r + f] = i[f];\n return e || da(n);\n}\nfunction A0(s) {\n if (!ua(s))\n throw TypeError(\"Invalid UUID\");\n var e, t = new Uint8Array(16);\n return t[0] = (e = parseInt(s.slice(0, 8), 16)) >>> 24, t[1] = e >>> 16 & 255, t[2] = e >>> 8 & 255, t[3] = e & 255, t[4] = (e = parseInt(s.slice(9, 13), 16)) >>> 8, t[5] = e & 255, t[6] = (e = parseInt(s.slice(14, 18), 16)) >>> 8, t[7] = e & 255, t[8] = (e = parseInt(s.slice(19, 23), 16)) >>> 8, t[9] = e & 255, t[10] = (e = parseInt(s.slice(24, 36), 16)) / 1099511627776 & 255, t[11] = e / 4294967296 & 255, t[12] = e >>> 24 & 255, t[13] = e >>> 16 & 255, t[14] = e >>> 8 & 255, t[15] = e & 255, t;\n}\nfunction _v(s) {\n s = unescape(encodeURIComponent(s));\n for (var e = [], t = 0; t < s.length; ++t)\n e.push(s.charCodeAt(t));\n return e;\n}\nvar Rv = \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", Lv = \"6ba7b811-9dad-11d1-80b4-00c04fd430c8\";\nfunction I0(s, e, t) {\n function r(n, i, o, a) {\n if (typeof n == \"string\" && (n = _v(n)), typeof i == \"string\" && (i = A0(i)), i.length !== 16)\n throw TypeError(\"Namespace must be array-like (16 iterable integer values, 0-255)\");\n var l = new Uint8Array(16 + n.length);\n if (l.set(i), l.set(n, i.length), l = t(l), l[6] = l[6] & 15 | e, l[8] = l[8] & 63 | 128, o) {\n a = a || 0;\n for (var c = 0; c < 16; ++c)\n o[a + c] = l[c];\n return o;\n }\n return da(l);\n }\n try {\n r.name = s;\n } catch {\n }\n return r.DNS = Rv, r.URL = Lv, r;\n}\nfunction Cv(s) {\n if (typeof s == \"string\") {\n var e = unescape(encodeURIComponent(s));\n s = new Uint8Array(e.length);\n for (var t = 0; t < e.length; ++t)\n s[t] = e.charCodeAt(t);\n }\n return kv(Dv(Pv(s), s.length * 8));\n}\nfunction kv(s) {\n for (var e = [], t = s.length * 32, r = \"0123456789abcdef\", n = 0; n < t; n += 8) {\n var i = s[n >> 5] >>> n % 32 & 255, o = parseInt(r.charAt(i >>> 4 & 15) + r.charAt(i & 15), 16);\n e.push(o);\n }\n return e;\n}\nfunction _0(s) {\n return (s + 64 >>> 9 << 4) + 14 + 1;\n}\nfunction Dv(s, e) {\n s[e >> 5] |= 128 << e % 32, s[_0(e) - 1] = e;\n for (var t = 1732584193, r = -271733879, n = -1732584194, i = 271733878, o = 0; o < s.length; o += 16) {\n var a = t, l = r, c = n, u = i;\n t = er(t, r, n, i, s[o], 7, -680876936), i = er(i, t, r, n, s[o + 1], 12, -389564586), n = er(n, i, t, r, s[o + 2], 17, 606105819), r = er(r, n, i, t, s[o + 3], 22, -1044525330), t = er(t, r, n, i, s[o + 4], 7, -176418897), i = er(i, t, r, n, s[o + 5], 12, 1200080426), n = er(n, i, t, r, s[o + 6], 17, -1473231341), r = er(r, n, i, t, s[o + 7], 22, -45705983), t = er(t, r, n, i, s[o + 8], 7, 1770035416), i = er(i, t, r, n, s[o + 9], 12, -1958414417), n = er(n, i, t, r, s[o + 10], 17, -42063), r = er(r, n, i, t, s[o + 11], 22, -1990404162), t = er(t, r, n, i, s[o + 12], 7, 1804603682), i = er(i, t, r, n, s[o + 13], 12, -40341101), n = er(n, i, t, r, s[o + 14], 17, -1502002290), r = er(r, n, i, t, s[o + 15], 22, 1236535329), t = tr(t, r, n, i, s[o + 1], 5, -165796510), i = tr(i, t, r, n, s[o + 6], 9, -1069501632), n = tr(n, i, t, r, s[o + 11], 14, 643717713), r = tr(r, n, i, t, s[o], 20, -373897302), t = tr(t, r, n, i, s[o + 5], 5, -701558691), i = tr(i, t, r, n, s[o + 10], 9, 38016083), n = tr(n, i, t, r, s[o + 15], 14, -660478335), r = tr(r, n, i, t, s[o + 4], 20, -405537848), t = tr(t, r, n, i, s[o + 9], 5, 568446438), i = tr(i, t, r, n, s[o + 14], 9, -1019803690), n = tr(n, i, t, r, s[o + 3], 14, -187363961), r = tr(r, n, i, t, s[o + 8], 20, 1163531501), t = tr(t, r, n, i, s[o + 13], 5, -1444681467), i = tr(i, t, r, n, s[o + 2], 9, -51403784), n = tr(n, i, t, r, s[o + 7], 14, 1735328473), r = tr(r, n, i, t, s[o + 12], 20, -1926607734), t = rr(t, r, n, i, s[o + 5], 4, -378558), i = rr(i, t, r, n, s[o + 8], 11, -2022574463), n = rr(n, i, t, r, s[o + 11], 16, 1839030562), r = rr(r, n, i, t, s[o + 14], 23, -35309556), t = rr(t, r, n, i, s[o + 1], 4, -1530992060), i = rr(i, t, r, n, s[o + 4], 11, 1272893353), n = rr(n, i, t, r, s[o + 7], 16, -155497632), r = rr(r, n, i, t, s[o + 10], 23, -1094730640), t = rr(t, r, n, i, s[o + 13], 4, 681279174), i = rr(i, t, r, n, s[o], 11, -358537222), n = rr(n, i, t, r, s[o + 3], 16, -722521979), r = rr(r, n, i, t, s[o + 6], 23, 76029189), t = rr(t, r, n, i, s[o + 9], 4, -640364487), i = rr(i, t, r, n, s[o + 12], 11, -421815835), n = rr(n, i, t, r, s[o + 15], 16, 530742520), r = rr(r, n, i, t, s[o + 2], 23, -995338651), t = sr(t, r, n, i, s[o], 6, -198630844), i = sr(i, t, r, n, s[o + 7], 10, 1126891415), n = sr(n, i, t, r, s[o + 14], 15, -1416354905), r = sr(r, n, i, t, s[o + 5], 21, -57434055), t = sr(t, r, n, i, s[o + 12], 6, 1700485571), i = sr(i, t, r, n, s[o + 3], 10, -1894986606), n = sr(n, i, t, r, s[o + 10], 15, -1051523), r = sr(r, n, i, t, s[o + 1], 21, -2054922799), t = sr(t, r, n, i, s[o + 8], 6, 1873313359), i = sr(i, t, r, n, s[o + 15], 10, -30611744), n = sr(n, i, t, r, s[o + 6], 15, -1560198380), r = sr(r, n, i, t, s[o + 13], 21, 1309151649), t = sr(t, r, n, i, s[o + 4], 6, -145523070), i = sr(i, t, r, n, s[o + 11], 10, -1120210379), n = sr(n, i, t, r, s[o + 2], 15, 718787259), r = sr(r, n, i, t, s[o + 9], 21, -343485551), t = Ls(t, a), r = Ls(r, l), n = Ls(n, c), i = Ls(i, u);\n }\n return [t, r, n, i];\n}\nfunction Pv(s) {\n if (s.length === 0)\n return [];\n for (var e = s.length * 8, t = new Uint32Array(_0(e)), r = 0; r < e; r += 8)\n t[r >> 5] |= (s[r / 8] & 255) << r % 32;\n return t;\n}\nfunction Ls(s, e) {\n var t = (s & 65535) + (e & 65535), r = (s >> 16) + (e >> 16) + (t >> 16);\n return r << 16 | t & 65535;\n}\nfunction Mv(s, e) {\n return s << e | s >>> 32 - e;\n}\nfunction ha(s, e, t, r, n, i) {\n return Ls(Mv(Ls(Ls(e, s), Ls(r, i)), n), t);\n}\nfunction er(s, e, t, r, n, i, o) {\n return ha(e & t | ~e & r, s, e, n, i, o);\n}\nfunction tr(s, e, t, r, n, i, o) {\n return ha(e & r | t & ~r, s, e, n, i, o);\n}\nfunction rr(s, e, t, r, n, i, o) {\n return ha(e ^ t ^ r, s, e, n, i, o);\n}\nfunction sr(s, e, t, r, n, i, o) {\n return ha(t ^ (e | ~r), s, e, n, i, o);\n}\nvar Ov = I0(\"v3\", 48, Cv);\nfunction Bv(s, e, t) {\n s = s || {};\n var r = s.random || (s.rng || w0)();\n if (r[6] = r[6] & 15 | 64, r[8] = r[8] & 63 | 128, e) {\n t = t || 0;\n for (var n = 0; n < 16; ++n)\n e[t + n] = r[n];\n return e;\n }\n return da(r);\n}\nfunction Fv(s, e, t, r) {\n switch (s) {\n case 0:\n return e & t ^ ~e & r;\n case 1:\n return e ^ t ^ r;\n case 2:\n return e & t ^ e & r ^ t & r;\n case 3:\n return e ^ t ^ r;\n }\n}\nfunction sl(s, e) {\n return s << e | s >>> 32 - e;\n}\nfunction Nv(s) {\n var e = [1518500249, 1859775393, 2400959708, 3395469782], t = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];\n if (typeof s == \"string\") {\n var r = unescape(encodeURIComponent(s));\n s = [];\n for (var n = 0; n < r.length; ++n)\n s.push(r.charCodeAt(n));\n } else Array.isArray(s) || (s = Array.prototype.slice.call(s));\n s.push(128);\n for (var i = s.length / 4 + 2, o = Math.ceil(i / 16), a = new Array(o), l = 0; l < o; ++l) {\n for (var c = new Uint32Array(16), u = 0; u < 16; ++u)\n c[u] = s[l * 64 + u * 4] << 24 | s[l * 64 + u * 4 + 1] << 16 | s[l * 64 + u * 4 + 2] << 8 | s[l * 64 + u * 4 + 3];\n a[l] = c;\n }\n a[o - 1][14] = (s.length - 1) * 8 / Math.pow(2, 32), a[o - 1][14] = Math.floor(a[o - 1][14]), a[o - 1][15] = (s.length - 1) * 8 & 4294967295;\n for (var d = 0; d < o; ++d) {\n for (var h = new Uint32Array(80), f = 0; f < 16; ++f)\n h[f] = a[d][f];\n for (var p = 16; p < 80; ++p)\n h[p] = sl(h[p - 3] ^ h[p - 8] ^ h[p - 14] ^ h[p - 16], 1);\n for (var y = t[0], E = t[1], b = t[2], R = t[3], A = t[4], F = 0; F < 80; ++F) {\n var M = Math.floor(F / 20), H = sl(y, 5) + Fv(M, E, b, R) + A + e[M] + h[F] >>> 0;\n A = R, R = b, b = sl(E, 30) >>> 0, E = y, y = H;\n }\n t[0] = t[0] + y >>> 0, t[1] = t[1] + E >>> 0, t[2] = t[2] + b >>> 0, t[3] = t[3] + R >>> 0, t[4] = t[4] + A >>> 0;\n }\n return [t[0] >> 24 & 255, t[0] >> 16 & 255, t[0] >> 8 & 255, t[0] & 255, t[1] >> 24 & 255, t[1] >> 16 & 255, t[1] >> 8 & 255, t[1] & 255, t[2] >> 24 & 255, t[2] >> 16 & 255, t[2] >> 8 & 255, t[2] & 255, t[3] >> 24 & 255, t[3] >> 16 & 255, t[3] >> 8 & 255, t[3] & 255, t[4] >> 24 & 255, t[4] >> 16 & 255, t[4] >> 8 & 255, t[4] & 255];\n}\nvar Uv = I0(\"v5\", 80, Nv);\nconst $v = \"00000000-0000-0000-0000-000000000000\";\nfunction Gv(s) {\n if (!ua(s))\n throw TypeError(\"Invalid UUID\");\n return parseInt(s.substr(14, 1), 16);\n}\nconst Vv = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n NIL: $v,\n parse: A0,\n stringify: da,\n v1: Iv,\n v3: Ov,\n v4: Bv,\n v5: Uv,\n validate: ua,\n version: Gv\n}, Symbol.toStringTag, { value: \"Module\" })), R0 = /* @__PURE__ */ Nc(Vv);\nvar nl, Dd;\nfunction jv() {\n if (Dd) return nl;\n Dd = 1;\n const s = R0.v4;\n return nl = function(t, r, n, i) {\n if (typeof t != \"string\")\n throw new TypeError(t + \" must be a string\");\n i = i || {};\n const o = typeof i.version == \"number\" ? i.version : 2;\n if (o !== 1 && o !== 2)\n throw new TypeError(o + \" must be 1 or 2\");\n const a = {\n method: t\n };\n if (o === 2 && (a.jsonrpc = \"2.0\"), r) {\n if (typeof r != \"object\" && !Array.isArray(r))\n throw new TypeError(r + \" must be an object, array or omitted\");\n a.params = r;\n }\n if (typeof n > \"u\") {\n const l = typeof i.generator == \"function\" ? i.generator : function() {\n return s();\n };\n a.id = l(a, i);\n } else o === 2 && n === null ? i.notificationIdNull && (a.id = null) : a.id = n;\n return a;\n }, nl;\n}\nvar il, Pd;\nfunction Kv() {\n if (Pd) return il;\n Pd = 1;\n const s = R0.v4, e = jv(), t = function(r, n) {\n if (!(this instanceof t))\n return new t(r, n);\n n || (n = {}), this.options = {\n reviver: typeof n.reviver < \"u\" ? n.reviver : null,\n replacer: typeof n.replacer < \"u\" ? n.replacer : null,\n generator: typeof n.generator < \"u\" ? n.generator : function() {\n return s();\n },\n version: typeof n.version < \"u\" ? n.version : 2,\n notificationIdNull: typeof n.notificationIdNull == \"boolean\" ? n.notificationIdNull : !1\n }, this.callServer = r;\n };\n return il = t, t.prototype.request = function(r, n, i, o) {\n const a = this;\n let l = null;\n const c = Array.isArray(r) && typeof n == \"function\";\n if (this.options.version === 1 && c)\n throw new TypeError(\"JSON-RPC 1.0 does not support batching\");\n if (c || !c && r && typeof r == \"object\" && typeof n == \"function\")\n o = n, l = r;\n else {\n typeof i == \"function\" && (o = i, i = void 0);\n const h = typeof o == \"function\";\n try {\n l = e(r, n, i, {\n generator: this.options.generator,\n version: this.options.version,\n notificationIdNull: this.options.notificationIdNull\n });\n } catch (f) {\n if (h)\n return o(f);\n throw f;\n }\n if (!h)\n return l;\n }\n let d;\n try {\n d = JSON.stringify(l, this.options.replacer);\n } catch (h) {\n return o(h);\n }\n return this.callServer(d, function(h, f) {\n a._parseResponse(h, f, o);\n }), l;\n }, t.prototype._parseResponse = function(r, n, i) {\n if (r) {\n i(r);\n return;\n }\n if (!n)\n return i();\n let o;\n try {\n o = JSON.parse(n, this.options.reviver);\n } catch (a) {\n return i(a);\n }\n if (i.length === 3)\n if (Array.isArray(o)) {\n const a = function(c) {\n return typeof c.error < \"u\";\n }, l = function(c) {\n return !a(c);\n };\n return i(null, o.filter(a), o.filter(l));\n } else\n return i(null, o.error, o.result);\n i(null, o);\n }, il;\n}\nKv();\nvar ol = { exports: {} }, Md;\nfunction Hv() {\n return Md || (Md = 1, (function(s) {\n var e = Object.prototype.hasOwnProperty, t = \"~\";\n function r() {\n }\n Object.create && (r.prototype = /* @__PURE__ */ Object.create(null), new r().__proto__ || (t = !1));\n function n(l, c, u) {\n this.fn = l, this.context = c, this.once = u || !1;\n }\n function i(l, c, u, d, h) {\n if (typeof u != \"function\")\n throw new TypeError(\"The listener must be a function\");\n var f = new n(u, d || l, h), p = t ? t + c : c;\n return l._events[p] ? l._events[p].fn ? l._events[p] = [l._events[p], f] : l._events[p].push(f) : (l._events[p] = f, l._eventsCount++), l;\n }\n function o(l, c) {\n --l._eventsCount === 0 ? l._events = new r() : delete l._events[c];\n }\n function a() {\n this._events = new r(), this._eventsCount = 0;\n }\n a.prototype.eventNames = function() {\n var c = [], u, d;\n if (this._eventsCount === 0) return c;\n for (d in u = this._events)\n e.call(u, d) && c.push(t ? d.slice(1) : d);\n return Object.getOwnPropertySymbols ? c.concat(Object.getOwnPropertySymbols(u)) : c;\n }, a.prototype.listeners = function(c) {\n var u = t ? t + c : c, d = this._events[u];\n if (!d) return [];\n if (d.fn) return [d.fn];\n for (var h = 0, f = d.length, p = new Array(f); h < f; h++)\n p[h] = d[h].fn;\n return p;\n }, a.prototype.listenerCount = function(c) {\n var u = t ? t + c : c, d = this._events[u];\n return d ? d.fn ? 1 : d.length : 0;\n }, a.prototype.emit = function(c, u, d, h, f, p) {\n var y = t ? t + c : c;\n if (!this._events[y]) return !1;\n var E = this._events[y], b = arguments.length, R, A;\n if (E.fn) {\n switch (E.once && this.removeListener(c, E.fn, void 0, !0), b) {\n case 1:\n return E.fn.call(E.context), !0;\n case 2:\n return E.fn.call(E.context, u), !0;\n case 3:\n return E.fn.call(E.context, u, d), !0;\n case 4:\n return E.fn.call(E.context, u, d, h), !0;\n case 5:\n return E.fn.call(E.context, u, d, h, f), !0;\n case 6:\n return E.fn.call(E.context, u, d, h, f, p), !0;\n }\n for (A = 1, R = new Array(b - 1); A < b; A++)\n R[A - 1] = arguments[A];\n E.fn.apply(E.context, R);\n } else {\n var F = E.length, M;\n for (A = 0; A < F; A++)\n switch (E[A].once && this.removeListener(c, E[A].fn, void 0, !0), b) {\n case 1:\n E[A].fn.call(E[A].context);\n break;\n case 2:\n E[A].fn.call(E[A].context, u);\n break;\n case 3:\n E[A].fn.call(E[A].context, u, d);\n break;\n case 4:\n E[A].fn.call(E[A].context, u, d, h);\n break;\n default:\n if (!R) for (M = 1, R = new Array(b - 1); M < b; M++)\n R[M - 1] = arguments[M];\n E[A].fn.apply(E[A].context, R);\n }\n }\n return !0;\n }, a.prototype.on = function(c, u, d) {\n return i(this, c, u, d, !1);\n }, a.prototype.once = function(c, u, d) {\n return i(this, c, u, d, !0);\n }, a.prototype.removeListener = function(c, u, d, h) {\n var f = t ? t + c : c;\n if (!this._events[f]) return this;\n if (!u)\n return o(this, f), this;\n var p = this._events[f];\n if (p.fn)\n p.fn === u && (!h || p.once) && (!d || p.context === d) && o(this, f);\n else {\n for (var y = 0, E = [], b = p.length; y < b; y++)\n (p[y].fn !== u || h && !p[y].once || d && p[y].context !== d) && E.push(p[y]);\n E.length ? this._events[f] = E.length === 1 ? E[0] : E : o(this, f);\n }\n return this;\n }, a.prototype.removeAllListeners = function(c) {\n var u;\n return c ? (u = t ? t + c : c, this._events[u] && o(this, u)) : (this._events = new r(), this._eventsCount = 0), this;\n }, a.prototype.off = a.prototype.removeListener, a.prototype.addListener = a.prototype.on, a.prefixed = t, a.EventEmitter = a, s.exports = a;\n })(ol)), ol.exports;\n}\nvar qv = Hv();\nconst L0 = /* @__PURE__ */ Fc(qv);\nclass C0 extends Wf {\n constructor(e, t) {\n super(), this.finished = !1, this.destroyed = !1, Hf(e);\n const r = Hc(t);\n if (this.iHash = e.create(), typeof this.iHash.update != \"function\")\n throw new Error(\"Expected instance of class which extends utils.Hash\");\n this.blockLen = this.iHash.blockLen, this.outputLen = this.iHash.outputLen;\n const n = this.blockLen, i = new Uint8Array(n);\n i.set(r.length > n ? e.create().update(r).digest() : r);\n for (let o = 0; o < i.length; o++)\n i[o] ^= 54;\n this.iHash.update(i), this.oHash = e.create();\n for (let o = 0; o < i.length; o++)\n i[o] ^= 106;\n this.oHash.update(i), kn(i);\n }\n update(e) {\n return Do(this), this.iHash.update(e), this;\n }\n digestInto(e) {\n Do(this), Qs(e, this.outputLen), this.finished = !0, this.iHash.digestInto(e), this.oHash.update(e), this.oHash.digestInto(e), this.destroy();\n }\n digest() {\n const e = new Uint8Array(this.oHash.outputLen);\n return this.digestInto(e), e;\n }\n _cloneInto(e) {\n e || (e = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash: t, iHash: r, finished: n, destroyed: i, blockLen: o, outputLen: a } = this;\n return e = e, e.finished = n, e.destroyed = i, e.blockLen = o, e.outputLen = a, e.oHash = t._cloneInto(e.oHash), e.iHash = r._cloneInto(e.iHash), e;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = !0, this.oHash.destroy(), this.iHash.destroy();\n }\n}\nconst k0 = (s, e, t) => new C0(s, e).update(t).digest();\nk0.create = (s, e) => new C0(s, e);\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Od = (s, e) => (s + (s >= 0 ? e : -e) / D0) / e;\nfunction Wv(s, e, t) {\n const [[r, n], [i, o]] = e, a = Od(o * s, t), l = Od(-n * s, t);\n let c = s - a * r - l * i, u = -a * n - l * o;\n const d = c < hs, h = u < hs;\n d && (c = -c), h && (u = -u);\n const f = _i(Math.ceil(e0(t) / 2)) + Tn;\n if (c < hs || c >= f || u < hs || u >= f)\n throw new Error(\"splitScalar (endomorphism): failed, k=\" + s);\n return { k1neg: d, k1: c, k2neg: h, k2: u };\n}\nfunction ec(s) {\n if (![\"compact\", \"recovered\", \"der\"].includes(s))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return s;\n}\nfunction al(s, e) {\n const t = {};\n for (let r of Object.keys(e))\n t[r] = s[r] === void 0 ? e[r] : s[r];\n return Xs(t.lowS, \"lowS\"), Xs(t.prehash, \"prehash\"), t.format !== void 0 && ec(t.format), t;\n}\nclass zv extends Error {\n constructor(e = \"\") {\n super(e);\n }\n}\nconst cs = {\n // asn.1 DER encoding utils\n Err: zv,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (s, e) => {\n const { Err: t } = cs;\n if (s < 0 || s > 256)\n throw new t(\"tlv.encode: wrong tag\");\n if (e.length & 1)\n throw new t(\"tlv.encode: unpadded data\");\n const r = e.length / 2, n = Ni(r);\n if (n.length / 2 & 128)\n throw new t(\"tlv.encode: long form length too big\");\n const i = r > 127 ? Ni(n.length / 2 | 128) : \"\";\n return Ni(s) + i + n + e;\n },\n // v - value, l - left bytes (unparsed)\n decode(s, e) {\n const { Err: t } = cs;\n let r = 0;\n if (s < 0 || s > 256)\n throw new t(\"tlv.encode: wrong tag\");\n if (e.length < 2 || e[r++] !== s)\n throw new t(\"tlv.decode: wrong tlv\");\n const n = e[r++], i = !!(n & 128);\n let o = 0;\n if (!i)\n o = n;\n else {\n const l = n & 127;\n if (!l)\n throw new t(\"tlv.decode(long): indefinite length not supported\");\n if (l > 4)\n throw new t(\"tlv.decode(long): byte length is too big\");\n const c = e.subarray(r, r + l);\n if (c.length !== l)\n throw new t(\"tlv.decode: length bytes not complete\");\n if (c[0] === 0)\n throw new t(\"tlv.decode(long): zero leftmost byte\");\n for (const u of c)\n o = o << 8 | u;\n if (r += l, o < 128)\n throw new t(\"tlv.decode(long): not minimal encoding\");\n }\n const a = e.subarray(r, r + o);\n if (a.length !== o)\n throw new t(\"tlv.decode: wrong value length\");\n return { v: a, l: e.subarray(r + o) };\n }\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(s) {\n const { Err: e } = cs;\n if (s < hs)\n throw new e(\"integer: negative integers are not allowed\");\n let t = Ni(s);\n if (Number.parseInt(t[0], 16) & 8 && (t = \"00\" + t), t.length & 1)\n throw new e(\"unexpected DER parsing assertion: unpadded hex\");\n return t;\n },\n decode(s) {\n const { Err: e } = cs;\n if (s[0] & 128)\n throw new e(\"invalid signature integer: negative\");\n if (s[0] === 0 && !(s[1] & 128))\n throw new e(\"invalid signature integer: unnecessary leading zero\");\n return la(s);\n }\n },\n toSig(s) {\n const { Err: e, _int: t, _tlv: r } = cs, n = Et(\"signature\", s), { v: i, l: o } = r.decode(48, n);\n if (o.length)\n throw new e(\"invalid signature: left bytes after parsing\");\n const { v: a, l } = r.decode(2, i), { v: c, l: u } = r.decode(2, l);\n if (u.length)\n throw new e(\"invalid signature: left bytes after parsing\");\n return { r: t.decode(a), s: t.decode(c) };\n },\n hexFromSig(s) {\n const { _tlv: e, _int: t } = cs, r = e.encode(2, t.encode(s.r)), n = e.encode(2, t.encode(s.s)), i = r + n;\n return e.encode(48, i);\n }\n}, hs = BigInt(0), Tn = BigInt(1), D0 = BigInt(2), Gi = BigInt(3), Yv = BigInt(4);\nfunction En(s, e) {\n const { BYTES: t } = s;\n let r;\n if (typeof e == \"bigint\")\n r = e;\n else {\n let n = Et(\"private key\", e);\n try {\n r = s.fromBytes(n);\n } catch {\n throw new Error(`invalid private key: expected ui8a of size ${t}, got ${typeof e}`);\n }\n }\n if (!s.isValidNot0(r))\n throw new Error(\"invalid private key: out of range [1..N-1]\");\n return r;\n}\nfunction Zv(s, e = {}) {\n const t = m0(\"weierstrass\", s, e), { Fp: r, Fn: n } = t;\n let i = t.CURVE;\n const { h: o, n: a } = i;\n Ri(e, {}, {\n allowInfinityPoint: \"boolean\",\n clearCofactor: \"function\",\n isTorsionFree: \"function\",\n fromBytes: \"function\",\n toBytes: \"function\",\n endo: \"object\",\n wrapPrivateKey: \"boolean\"\n });\n const { endo: l } = e;\n if (l && (!r.is0(i.a) || typeof l.beta != \"bigint\" || !Array.isArray(l.basises)))\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n const c = M0(r, n);\n function u() {\n if (!r.isOdd)\n throw new Error(\"compression is not supported: Field does not have .isOdd()\");\n }\n function d(W, _, g) {\n const { x, y: w } = _.toAffine(), D = r.toBytes(x);\n if (Xs(g, \"isCompressed\"), g) {\n u();\n const O = !r.isOdd(w);\n return Kr(P0(O), D);\n } else\n return Kr(Uint8Array.of(4), D, r.toBytes(w));\n }\n function h(W) {\n Or(W, void 0, \"Point\");\n const { publicKey: _, publicKeyUncompressed: g } = c, x = W.length, w = W[0], D = W.subarray(1);\n if (x === _ && (w === 2 || w === 3)) {\n const O = r.fromBytes(D);\n if (!r.isValid(O))\n throw new Error(\"bad point: is not on curve, wrong x\");\n const U = y(O);\n let V;\n try {\n V = r.sqrt(U);\n } catch (v) {\n const P = v instanceof Error ? \": \" + v.message : \"\";\n throw new Error(\"bad point: is not on curve, sqrt error\" + P);\n }\n u();\n const L = r.isOdd(V);\n return (w & 1) === 1 !== L && (V = r.neg(V)), { x: O, y: V };\n } else if (x === g && w === 4) {\n const O = r.BYTES, U = r.fromBytes(D.subarray(0, O)), V = r.fromBytes(D.subarray(O, O * 2));\n if (!E(U, V))\n throw new Error(\"bad point: is not on curve\");\n return { x: U, y: V };\n } else\n throw new Error(`bad point: got length ${x}, expected compressed=${_} or uncompressed=${g}`);\n }\n const f = e.toBytes || d, p = e.fromBytes || h;\n function y(W) {\n const _ = r.sqr(W), g = r.mul(_, W);\n return r.add(r.add(g, r.mul(W, i.a)), i.b);\n }\n function E(W, _) {\n const g = r.sqr(_), x = y(W);\n return r.eql(g, x);\n }\n if (!E(i.Gx, i.Gy))\n throw new Error(\"bad curve params: generator point\");\n const b = r.mul(r.pow(i.a, Gi), Yv), R = r.mul(r.sqr(i.b), BigInt(27));\n if (r.is0(r.add(b, R)))\n throw new Error(\"bad curve params: a or b\");\n function A(W, _, g = !1) {\n if (!r.isValid(_) || g && r.is0(_))\n throw new Error(`bad point coordinate ${W}`);\n return _;\n }\n function F(W) {\n if (!(W instanceof C))\n throw new Error(\"ProjectivePoint expected\");\n }\n function M(W) {\n if (!l || !l.basises)\n throw new Error(\"no endo\");\n return Wv(W, l.basises, n.ORDER);\n }\n const H = Mo((W, _) => {\n const { X: g, Y: x, Z: w } = W;\n if (r.eql(w, r.ONE))\n return { x: g, y: x };\n const D = W.is0();\n _ == null && (_ = D ? r.ONE : r.inv(w));\n const O = r.mul(g, _), U = r.mul(x, _), V = r.mul(w, _);\n if (D)\n return { x: r.ZERO, y: r.ZERO };\n if (!r.eql(V, r.ONE))\n throw new Error(\"invZ was invalid\");\n return { x: O, y: U };\n }), K = Mo((W) => {\n if (W.is0()) {\n if (e.allowInfinityPoint && !r.is0(W.Y))\n return;\n throw new Error(\"bad point: ZERO\");\n }\n const { x: _, y: g } = W.toAffine();\n if (!r.isValid(_) || !r.isValid(g))\n throw new Error(\"bad point: x or y not field elements\");\n if (!E(_, g))\n throw new Error(\"bad point: equation left != right\");\n if (!W.isTorsionFree())\n throw new Error(\"bad point: not in prime-order subgroup\");\n return !0;\n });\n function j(W, _, g, x, w) {\n return g = new C(r.mul(g.X, W), g.Y, g.Z), _ = Oo(x, _), g = Oo(w, g), _.add(g);\n }\n class C {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(_, g, x) {\n this.X = A(\"x\", _), this.Y = A(\"y\", g, !0), this.Z = A(\"z\", x), Object.freeze(this);\n }\n static CURVE() {\n return i;\n }\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(_) {\n const { x: g, y: x } = _ || {};\n if (!_ || !r.isValid(g) || !r.isValid(x))\n throw new Error(\"invalid affine point\");\n if (_ instanceof C)\n throw new Error(\"projective point not allowed\");\n return r.is0(g) && r.is0(x) ? C.ZERO : new C(g, x, r.ONE);\n }\n static fromBytes(_) {\n const g = C.fromAffine(p(Or(_, void 0, \"point\")));\n return g.assertValidity(), g;\n }\n static fromHex(_) {\n return C.fromBytes(Et(\"pointHex\", _));\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(_ = 8, g = !0) {\n return $.createCache(this, _), g || this.multiply(Gi), this;\n }\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity() {\n K(this);\n }\n hasEvenY() {\n const { y: _ } = this.toAffine();\n if (!r.isOdd)\n throw new Error(\"Field doesn't support isOdd\");\n return !r.isOdd(_);\n }\n /** Compare one point to another. */\n equals(_) {\n F(_);\n const { X: g, Y: x, Z: w } = this, { X: D, Y: O, Z: U } = _, V = r.eql(r.mul(g, U), r.mul(D, w)), L = r.eql(r.mul(x, U), r.mul(O, w));\n return V && L;\n }\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate() {\n return new C(this.X, r.neg(this.Y), this.Z);\n }\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a: _, b: g } = i, x = r.mul(g, Gi), { X: w, Y: D, Z: O } = this;\n let U = r.ZERO, V = r.ZERO, L = r.ZERO, m = r.mul(w, w), v = r.mul(D, D), P = r.mul(O, O), N = r.mul(w, D);\n return N = r.add(N, N), L = r.mul(w, O), L = r.add(L, L), U = r.mul(_, L), V = r.mul(x, P), V = r.add(U, V), U = r.sub(v, V), V = r.add(v, V), V = r.mul(U, V), U = r.mul(N, U), L = r.mul(x, L), P = r.mul(_, P), N = r.sub(m, P), N = r.mul(_, N), N = r.add(N, L), L = r.add(m, m), m = r.add(L, m), m = r.add(m, P), m = r.mul(m, N), V = r.add(V, m), P = r.mul(D, O), P = r.add(P, P), m = r.mul(P, N), U = r.sub(U, m), L = r.mul(P, v), L = r.add(L, L), L = r.add(L, L), new C(U, V, L);\n }\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(_) {\n F(_);\n const { X: g, Y: x, Z: w } = this, { X: D, Y: O, Z: U } = _;\n let V = r.ZERO, L = r.ZERO, m = r.ZERO;\n const v = i.a, P = r.mul(i.b, Gi);\n let N = r.mul(g, D), Y = r.mul(x, O), ee = r.mul(w, U), ie = r.add(g, x), le = r.add(D, O);\n ie = r.mul(ie, le), le = r.add(N, Y), ie = r.sub(ie, le), le = r.add(g, w);\n let Te = r.add(D, U);\n return le = r.mul(le, Te), Te = r.add(N, ee), le = r.sub(le, Te), Te = r.add(x, w), V = r.add(O, U), Te = r.mul(Te, V), V = r.add(Y, ee), Te = r.sub(Te, V), m = r.mul(v, le), V = r.mul(P, ee), m = r.add(V, m), V = r.sub(Y, m), m = r.add(Y, m), L = r.mul(V, m), Y = r.add(N, N), Y = r.add(Y, N), ee = r.mul(v, ee), le = r.mul(P, le), Y = r.add(Y, ee), ee = r.sub(N, ee), ee = r.mul(v, ee), le = r.add(le, ee), N = r.mul(Y, le), L = r.add(L, N), N = r.mul(Te, le), V = r.mul(ie, V), V = r.sub(V, N), N = r.mul(ie, Y), m = r.mul(Te, m), m = r.add(m, N), new C(V, L, m);\n }\n subtract(_) {\n return this.add(_.negate());\n }\n is0() {\n return this.equals(C.ZERO);\n }\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(_) {\n const { endo: g } = e;\n if (!n.isValidNot0(_))\n throw new Error(\"invalid scalar: out of range\");\n let x, w;\n const D = (O) => $.cached(this, O, (U) => js(C, U));\n if (g) {\n const { k1neg: O, k1: U, k2neg: V, k2: L } = M(_), { p: m, f: v } = D(U), { p: P, f: N } = D(L);\n w = v.add(N), x = j(g.beta, m, P, O, V);\n } else {\n const { p: O, f: U } = D(_);\n x = O, w = U;\n }\n return js(C, [x, w])[0];\n }\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(_) {\n const { endo: g } = e, x = this;\n if (!n.isValid(_))\n throw new Error(\"invalid scalar: out of range\");\n if (_ === hs || x.is0())\n return C.ZERO;\n if (_ === Tn)\n return x;\n if ($.hasCache(this))\n return this.multiply(_);\n if (g) {\n const { k1neg: w, k1: D, k2neg: O, k2: U } = M(_), { p1: V, p2: L } = py(C, x, D, U);\n return j(g.beta, V, L, w, O);\n } else\n return $.unsafe(x, _);\n }\n multiplyAndAddUnsafe(_, g, x) {\n const w = this.multiplyUnsafe(g).add(_.multiplyUnsafe(x));\n return w.is0() ? void 0 : w;\n }\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(_) {\n return H(this, _);\n }\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree() {\n const { isTorsionFree: _ } = e;\n return o === Tn ? !0 : _ ? _(C, this) : $.unsafe(this, a).is0();\n }\n clearCofactor() {\n const { clearCofactor: _ } = e;\n return o === Tn ? this : _ ? _(C, this) : this.multiplyUnsafe(o);\n }\n isSmallOrder() {\n return this.multiplyUnsafe(o).is0();\n }\n toBytes(_ = !0) {\n return Xs(_, \"isCompressed\"), this.assertValidity(), f(C, this, _);\n }\n toHex(_ = !0) {\n return Hs(this.toBytes(_));\n }\n toString() {\n return `<Point ${this.is0() ? \"ZERO\" : this.toHex()}>`;\n }\n // TODO: remove\n get px() {\n return this.X;\n }\n get py() {\n return this.X;\n }\n get pz() {\n return this.Z;\n }\n toRawBytes(_ = !0) {\n return this.toBytes(_);\n }\n _setWindowSize(_) {\n this.precompute(_);\n }\n static normalizeZ(_) {\n return js(C, _);\n }\n static msm(_, g) {\n return p0(C, n, _, g);\n }\n static fromPrivateKey(_) {\n return C.BASE.multiply(En(n, _));\n }\n }\n C.BASE = new C(i.Gx, i.Gy, r.ONE), C.ZERO = new C(r.ZERO, r.ONE, r.ZERO), C.Fp = r, C.Fn = n;\n const k = n.BITS, $ = new g0(C, e.endo ? Math.ceil(k / 2) : k);\n return C.BASE.precompute(8), C;\n}\nfunction P0(s) {\n return Uint8Array.of(s ? 2 : 3);\n}\nfunction M0(s, e) {\n return {\n secretKey: e.BYTES,\n publicKey: 1 + s.BYTES,\n publicKeyUncompressed: 1 + 2 * s.BYTES,\n publicKeyHasPrefix: !0,\n signature: 2 * e.BYTES\n };\n}\nfunction Xv(s, e = {}) {\n const { Fn: t } = s, r = e.randomBytes || qc, n = Object.assign(M0(s.Fp, t), { seed: d0(t.ORDER) });\n function i(f) {\n try {\n return !!En(t, f);\n } catch {\n return !1;\n }\n }\n function o(f, p) {\n const { publicKey: y, publicKeyUncompressed: E } = n;\n try {\n const b = f.length;\n return p === !0 && b !== y || p === !1 && b !== E ? !1 : !!s.fromBytes(f);\n } catch {\n return !1;\n }\n }\n function a(f = r(n.seed)) {\n return hy(Or(f, n.seed, \"seed\"), t.ORDER);\n }\n function l(f, p = !0) {\n return s.BASE.multiply(En(t, f)).toBytes(p);\n }\n function c(f) {\n const p = a(f);\n return { secretKey: p, publicKey: l(p) };\n }\n function u(f) {\n if (typeof f == \"bigint\")\n return !1;\n if (f instanceof s)\n return !0;\n const { secretKey: p, publicKey: y, publicKeyUncompressed: E } = n;\n if (t.allowedLengths || p === y)\n return;\n const b = Et(\"key\", f).length;\n return b === y || b === E;\n }\n function d(f, p, y = !0) {\n if (u(f) === !0)\n throw new Error(\"first arg must be private key\");\n if (u(p) === !1)\n throw new Error(\"second arg must be public key\");\n const E = En(t, f);\n return s.fromHex(p).multiply(E).toBytes(y);\n }\n return Object.freeze({ getPublicKey: l, getSharedSecret: d, keygen: c, Point: s, utils: {\n isValidSecretKey: i,\n isValidPublicKey: o,\n randomSecretKey: a,\n // TODO: remove\n isValidPrivateKey: i,\n randomPrivateKey: a,\n normPrivateKeyToScalar: (f) => En(t, f),\n precompute(f = 8, p = s.BASE) {\n return p.precompute(f, !1);\n }\n }, lengths: n });\n}\nfunction Jv(s, e, t = {}) {\n Hf(e), Ri(t, {}, {\n hmac: \"function\",\n lowS: \"boolean\",\n randomBytes: \"function\",\n bits2int: \"function\",\n bits2int_modN: \"function\"\n });\n const r = t.randomBytes || qc, n = t.hmac || ((g, ...x) => k0(e, g, Kr(...x))), { Fp: i, Fn: o } = s, { ORDER: a, BITS: l } = o, { keygen: c, getPublicKey: u, getSharedSecret: d, utils: h, lengths: f } = Xv(s, t), p = {\n prehash: !1,\n lowS: typeof t.lowS == \"boolean\" ? t.lowS : !1,\n format: void 0,\n //'compact' as ECDSASigFormat,\n extraEntropy: !1\n }, y = \"compact\";\n function E(g) {\n const x = a >> Tn;\n return g > x;\n }\n function b(g, x) {\n if (!o.isValidNot0(x))\n throw new Error(`invalid signature ${g}: out of range 1..Point.Fn.ORDER`);\n return x;\n }\n function R(g, x) {\n ec(x);\n const w = f.signature, D = x === \"compact\" ? w : x === \"recovered\" ? w + 1 : void 0;\n return Or(g, D, `${x} signature`);\n }\n class A {\n constructor(x, w, D) {\n this.r = b(\"r\", x), this.s = b(\"s\", w), D != null && (this.recovery = D), Object.freeze(this);\n }\n static fromBytes(x, w = y) {\n R(x, w);\n let D;\n if (w === \"der\") {\n const { r: L, s: m } = cs.toSig(Or(x));\n return new A(L, m);\n }\n w === \"recovered\" && (D = x[0], w = \"compact\", x = x.subarray(1));\n const O = o.BYTES, U = x.subarray(0, O), V = x.subarray(O, O * 2);\n return new A(o.fromBytes(U), o.fromBytes(V), D);\n }\n static fromHex(x, w) {\n return this.fromBytes(Po(x), w);\n }\n addRecoveryBit(x) {\n return new A(this.r, this.s, x);\n }\n recoverPublicKey(x) {\n const w = i.ORDER, { r: D, s: O, recovery: U } = this;\n if (U == null || ![0, 1, 2, 3].includes(U))\n throw new Error(\"recovery id invalid\");\n if (a * D0 < w && U > 1)\n throw new Error(\"recovery id is ambiguous for h>1 curve\");\n const L = U === 2 || U === 3 ? D + a : D;\n if (!i.isValid(L))\n throw new Error(\"recovery id 2 or 3 invalid\");\n const m = i.toBytes(L), v = s.fromBytes(Kr(P0((U & 1) === 0), m)), P = o.inv(L), N = M(Et(\"msgHash\", x)), Y = o.create(-N * P), ee = o.create(O * P), ie = s.BASE.multiplyUnsafe(Y).add(v.multiplyUnsafe(ee));\n if (ie.is0())\n throw new Error(\"point at infinify\");\n return ie.assertValidity(), ie;\n }\n // Signatures should be low-s, to prevent malleability.\n hasHighS() {\n return E(this.s);\n }\n toBytes(x = y) {\n if (ec(x), x === \"der\")\n return Po(cs.hexFromSig(this));\n const w = o.toBytes(this.r), D = o.toBytes(this.s);\n if (x === \"recovered\") {\n if (this.recovery == null)\n throw new Error(\"recovery bit must be present\");\n return Kr(Uint8Array.of(this.recovery), w, D);\n }\n return Kr(w, D);\n }\n toHex(x) {\n return Hs(this.toBytes(x));\n }\n // TODO: remove\n assertValidity() {\n }\n static fromCompact(x) {\n return A.fromBytes(Et(\"sig\", x), \"compact\");\n }\n static fromDER(x) {\n return A.fromBytes(Et(\"sig\", x), \"der\");\n }\n normalizeS() {\n return this.hasHighS() ? new A(this.r, o.neg(this.s), this.recovery) : this;\n }\n toDERRawBytes() {\n return this.toBytes(\"der\");\n }\n toDERHex() {\n return Hs(this.toBytes(\"der\"));\n }\n toCompactRawBytes() {\n return this.toBytes(\"compact\");\n }\n toCompactHex() {\n return Hs(this.toBytes(\"compact\"));\n }\n }\n const F = t.bits2int || function(x) {\n if (x.length > 8192)\n throw new Error(\"input is too large\");\n const w = la(x), D = x.length * 8 - l;\n return D > 0 ? w >> BigInt(D) : w;\n }, M = t.bits2int_modN || function(x) {\n return o.create(F(x));\n }, H = _i(l);\n function K(g) {\n return Ql(\"num < 2^\" + l, g, hs, H), o.toBytes(g);\n }\n function j(g, x) {\n return Or(g, void 0, \"message\"), x ? Or(e(g), void 0, \"prehashed message\") : g;\n }\n function C(g, x, w) {\n if ([\"recovered\", \"canonical\"].some((Y) => Y in w))\n throw new Error(\"sign() legacy options not supported\");\n const { lowS: D, prehash: O, extraEntropy: U } = al(w, p);\n g = j(g, O);\n const V = M(g), L = En(o, x), m = [K(L), K(V)];\n if (U != null && U !== !1) {\n const Y = U === !0 ? r(f.secretKey) : U;\n m.push(Et(\"extraEntropy\", Y));\n }\n const v = Kr(...m), P = V;\n function N(Y) {\n const ee = F(Y);\n if (!o.isValidNot0(ee))\n return;\n const ie = o.inv(ee), le = s.BASE.multiply(ee).toAffine(), Te = o.create(le.x);\n if (Te === hs)\n return;\n const De = o.create(ie * o.create(P + Te * L));\n if (De === hs)\n return;\n let ze = (le.x === Te ? 0 : 2) | Number(le.y & Tn), _e = De;\n return D && E(De) && (_e = o.neg(De), ze ^= 1), new A(Te, _e, ze);\n }\n return { seed: v, k2sig: N };\n }\n function k(g, x, w = {}) {\n g = Et(\"message\", g);\n const { seed: D, k2sig: O } = C(g, x, w);\n return ry(e.outputLen, o.BYTES, n)(D, O);\n }\n function $(g) {\n let x;\n const w = typeof g == \"string\" || Ii(g), D = !w && g !== null && typeof g == \"object\" && typeof g.r == \"bigint\" && typeof g.s == \"bigint\";\n if (!w && !D)\n throw new Error(\"invalid signature, expected Uint8Array, hex string or Signature instance\");\n if (D)\n x = new A(g.r, g.s);\n else if (w) {\n try {\n x = A.fromBytes(Et(\"sig\", g), \"der\");\n } catch (O) {\n if (!(O instanceof cs.Err))\n throw O;\n }\n if (!x)\n try {\n x = A.fromBytes(Et(\"sig\", g), \"compact\");\n } catch {\n return !1;\n }\n }\n return x || !1;\n }\n function W(g, x, w, D = {}) {\n const { lowS: O, prehash: U, format: V } = al(D, p);\n if (w = Et(\"publicKey\", w), x = j(Et(\"message\", x), U), \"strict\" in D)\n throw new Error(\"options.strict was renamed to lowS\");\n const L = V === void 0 ? $(g) : A.fromBytes(Et(\"sig\", g), V);\n if (L === !1)\n return !1;\n try {\n const m = s.fromBytes(w);\n if (O && L.hasHighS())\n return !1;\n const { r: v, s: P } = L, N = M(x), Y = o.inv(P), ee = o.create(N * Y), ie = o.create(v * Y), le = s.BASE.multiplyUnsafe(ee).add(m.multiplyUnsafe(ie));\n return le.is0() ? !1 : o.create(le.x) === v;\n } catch {\n return !1;\n }\n }\n function _(g, x, w = {}) {\n const { prehash: D } = al(w, p);\n return x = j(x, D), A.fromBytes(g, \"recovered\").recoverPublicKey(x).toBytes();\n }\n return Object.freeze({\n keygen: c,\n getPublicKey: u,\n getSharedSecret: d,\n utils: h,\n lengths: f,\n Point: s,\n sign: k,\n verify: W,\n recoverPublicKey: _,\n Signature: A,\n hash: e\n });\n}\nfunction Qv(s) {\n const e = {\n a: s.a,\n b: s.b,\n p: s.Fp.ORDER,\n n: s.n,\n h: s.h,\n Gx: s.Gx,\n Gy: s.Gy\n }, t = s.Fp;\n let r = s.allowedPrivateKeyLengths ? Array.from(new Set(s.allowedPrivateKeyLengths.map((o) => Math.ceil(o / 2)))) : void 0;\n const n = en(e.n, {\n BITS: s.nBitLength,\n allowedLengths: r,\n modFromBytes: s.wrapPrivateKey\n }), i = {\n Fp: t,\n Fn: n,\n allowInfinityPoint: s.allowInfinityPoint,\n endo: s.endo,\n isTorsionFree: s.isTorsionFree,\n clearCofactor: s.clearCofactor,\n fromBytes: s.fromBytes,\n toBytes: s.toBytes\n };\n return { CURVE: e, curveOpts: i };\n}\nfunction eE(s) {\n const { CURVE: e, curveOpts: t } = Qv(s), r = {\n hmac: s.hmac,\n randomBytes: s.randomBytes,\n lowS: s.lowS,\n bits2int: s.bits2int,\n bits2int_modN: s.bits2int_modN\n };\n return { CURVE: e, curveOpts: t, hash: s.hash, ecdsaOpts: r };\n}\nfunction tE(s, e) {\n const t = e.Point;\n return Object.assign({}, e, {\n ProjectivePoint: t,\n CURVE: Object.assign({}, s, c0(t.Fn.ORDER, t.Fn.BITS))\n });\n}\nfunction rE(s) {\n const { CURVE: e, curveOpts: t, hash: r, ecdsaOpts: n } = eE(s), i = Zv(e, t), o = Jv(i, r, n);\n return tE(s, o);\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction sE(s, e) {\n const t = (r) => rE({ ...s, hash: r });\n return { ...t(e), create: t };\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst tu = {\n p: BigInt(\"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\"),\n n: BigInt(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\"),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt(\"0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\"),\n Gy: BigInt(\"0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\")\n}, nE = {\n beta: BigInt(\"0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\"),\n basises: [\n [BigInt(\"0x3086d221a7d46bcde86c90e49284eb15\"), -BigInt(\"0xe4437ed6010e88286f547fa90abfe4c3\")],\n [BigInt(\"0x114ca50f7a8e2f3f657c1108d9d44cfd8\"), BigInt(\"0x3086d221a7d46bcde86c90e49284eb15\")]\n ]\n}, Bd = /* @__PURE__ */ BigInt(2);\nfunction iE(s) {\n const e = tu.p, t = BigInt(3), r = BigInt(6), n = BigInt(11), i = BigInt(22), o = BigInt(23), a = BigInt(44), l = BigInt(88), c = s * s * s % e, u = c * c * s % e, d = vt(u, t, e) * u % e, h = vt(d, t, e) * u % e, f = vt(h, Bd, e) * c % e, p = vt(f, n, e) * f % e, y = vt(p, i, e) * p % e, E = vt(y, a, e) * y % e, b = vt(E, l, e) * E % e, R = vt(b, a, e) * y % e, A = vt(R, t, e) * u % e, F = vt(A, o, e) * p % e, M = vt(F, r, e) * c % e, H = vt(M, Bd, e);\n if (!tc.eql(tc.sqr(H), s))\n throw new Error(\"Cannot find square root\");\n return H;\n}\nconst tc = en(tu.p, { sqrt: iE }), oE = sE({ ...tu, Fp: tc, lowS: !0, endo: nE }, Xf);\nLi.utils.randomPrivateKey;\nLi.getPublicKey;\nfunction Fd(s) {\n try {\n return Li.ExtendedPoint.fromHex(s), !0;\n } catch {\n return !1;\n }\n}\nconst O0 = (s, e) => Li.sign(s, e.slice(0, 32)), aE = Li.verify, ru = (s) => He.Buffer.isBuffer(s) ? s : s instanceof Uint8Array ? He.Buffer.from(s.buffer, s.byteOffset, s.byteLength) : He.Buffer.from(s);\nclass lE {\n constructor(e) {\n Object.assign(this, e);\n }\n encode() {\n return He.Buffer.from(Ja.serialize(uo, this));\n }\n static decode(e) {\n return Ja.deserialize(uo, this, e);\n }\n static decodeUnchecked(e) {\n return Ja.deserializeUnchecked(uo, this, e);\n }\n}\nconst uo = /* @__PURE__ */ new Map();\nvar B0;\nconst cE = 32, ks = 32;\nfunction uE(s) {\n return s._bn !== void 0;\n}\nlet Nd = 1;\nclass Oe extends lE {\n /**\n * Create a new PublicKey object\n * @param value ed25519 public key as buffer or base-58 encoded string\n */\n constructor(e) {\n if (super({}), this._bn = void 0, uE(e))\n this._bn = e._bn;\n else {\n if (typeof e == \"string\") {\n const t = ar.decode(e);\n if (t.length != ks)\n throw new Error(\"Invalid public key input\");\n this._bn = new bd(t);\n } else\n this._bn = new bd(e);\n if (this._bn.byteLength() > ks)\n throw new Error(\"Invalid public key input\");\n }\n }\n /**\n * Returns a unique PublicKey for tests and benchmarks using a counter\n */\n static unique() {\n const e = new Oe(Nd);\n return Nd += 1, new Oe(e.toBuffer());\n }\n /**\n * Default public key value. The base58-encoded string representation is all ones (as seen below)\n * The underlying BN number is 32 bytes that are all zeros\n */\n /**\n * Checks if two publicKeys are equal\n */\n equals(e) {\n return this._bn.eq(e._bn);\n }\n /**\n * Return the base-58 representation of the public key\n */\n toBase58() {\n return ar.encode(this.toBytes());\n }\n toJSON() {\n return this.toBase58();\n }\n /**\n * Return the byte array representation of the public key in big endian\n */\n toBytes() {\n const e = this.toBuffer();\n return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);\n }\n /**\n * Return the Buffer representation of the public key in big endian\n */\n toBuffer() {\n const e = this._bn.toArrayLike(He.Buffer);\n if (e.length === ks)\n return e;\n const t = He.Buffer.alloc(32);\n return e.copy(t, 32 - e.length), t;\n }\n get [Symbol.toStringTag]() {\n return `PublicKey(${this.toString()})`;\n }\n /**\n * Return the base-58 representation of the public key\n */\n toString() {\n return this.toBase58();\n }\n /**\n * Derive a public key from another key, a seed, and a program ID.\n * The program ID will also serve as the owner of the public key, giving\n * it permission to write data to the account.\n */\n /* eslint-disable require-await */\n static async createWithSeed(e, t, r) {\n const n = He.Buffer.concat([e.toBuffer(), He.Buffer.from(t), r.toBuffer()]), i = Id(n);\n return new Oe(i);\n }\n /**\n * Derive a program address from seeds and a program ID.\n */\n /* eslint-disable require-await */\n static createProgramAddressSync(e, t) {\n let r = He.Buffer.alloc(0);\n e.forEach(function(i) {\n if (i.length > cE)\n throw new TypeError(\"Max seed length exceeded\");\n r = He.Buffer.concat([r, ru(i)]);\n }), r = He.Buffer.concat([r, t.toBuffer(), He.Buffer.from(\"ProgramDerivedAddress\")]);\n const n = Id(r);\n if (Fd(n))\n throw new Error(\"Invalid seeds, address must fall off the curve\");\n return new Oe(n);\n }\n /**\n * Async version of createProgramAddressSync\n * For backwards compatibility\n *\n * @deprecated Use {@link createProgramAddressSync} instead\n */\n /* eslint-disable require-await */\n static async createProgramAddress(e, t) {\n return this.createProgramAddressSync(e, t);\n }\n /**\n * Find a valid program address\n *\n * Valid program addresses must fall off the ed25519 curve. This function\n * iterates a nonce until it finds one that when combined with the seeds\n * results in a valid program address.\n */\n static findProgramAddressSync(e, t) {\n let r = 255, n;\n for (; r != 0; ) {\n try {\n const i = e.concat(He.Buffer.from([r]));\n n = this.createProgramAddressSync(i, t);\n } catch (i) {\n if (i instanceof TypeError)\n throw i;\n r--;\n continue;\n }\n return [n, r];\n }\n throw new Error(\"Unable to find a viable program address nonce\");\n }\n /**\n * Async version of findProgramAddressSync\n * For backwards compatibility\n *\n * @deprecated Use {@link findProgramAddressSync} instead\n */\n static async findProgramAddress(e, t) {\n return this.findProgramAddressSync(e, t);\n }\n /**\n * Check that a pubkey is on the ed25519 curve.\n */\n static isOnCurve(e) {\n const t = new Oe(e);\n return Fd(t.toBytes());\n }\n}\nB0 = Oe;\nOe.default = new B0(\"11111111111111111111111111111111\");\nuo.set(Oe, {\n kind: \"struct\",\n fields: [[\"_bn\", \"u256\"]]\n});\nnew Oe(\"BPFLoader1111111111111111111111111111111111\");\nconst wn = 1232, su = 127, Go = 64;\nclass Vo {\n constructor(e, t) {\n this.staticAccountKeys = void 0, this.accountKeysFromLookups = void 0, this.staticAccountKeys = e, this.accountKeysFromLookups = t;\n }\n keySegments() {\n const e = [this.staticAccountKeys];\n return this.accountKeysFromLookups && (e.push(this.accountKeysFromLookups.writable), e.push(this.accountKeysFromLookups.readonly)), e;\n }\n get(e) {\n for (const t of this.keySegments()) {\n if (e < t.length)\n return t[e];\n e -= t.length;\n }\n }\n get length() {\n return this.keySegments().flat().length;\n }\n compileInstructions(e) {\n if (this.length > 256)\n throw new Error(\"Account index overflow encountered during compilation\");\n const r = /* @__PURE__ */ new Map();\n this.keySegments().flat().forEach((i, o) => {\n r.set(i.toBase58(), o);\n });\n const n = (i) => {\n const o = r.get(i.toBase58());\n if (o === void 0) throw new Error(\"Encountered an unknown instruction account key during compilation\");\n return o;\n };\n return e.map((i) => ({\n programIdIndex: n(i.programId),\n accountKeyIndexes: i.keys.map((o) => n(o.pubkey)),\n data: i.data\n }));\n }\n}\nconst We = (s = \"publicKey\") => z.blob(32, s), dE = (s = \"signature\") => z.blob(64, s), xn = (s = \"string\") => {\n const e = z.struct([z.u32(\"length\"), z.u32(\"lengthPadding\"), z.blob(z.offset(z.u32(), -8), \"chars\")], s), t = e.decode.bind(e), r = e.encode.bind(e), n = e;\n return n.decode = (i, o) => t(i, o).chars.toString(), n.encode = (i, o, a) => {\n const l = {\n chars: He.Buffer.from(i, \"utf8\")\n };\n return r(l, o, a);\n }, n.alloc = (i) => z.u32().span + z.u32().span + He.Buffer.from(i, \"utf8\").length, n;\n}, hE = (s = \"authorized\") => z.struct([We(\"staker\"), We(\"withdrawer\")], s), fE = (s = \"lockup\") => z.struct([z.ns64(\"unixTimestamp\"), z.ns64(\"epoch\"), We(\"custodian\")], s), gE = (s = \"voteInit\") => z.struct([We(\"nodePubkey\"), We(\"authorizedVoter\"), We(\"authorizedWithdrawer\"), z.u8(\"commission\")], s), pE = (s = \"voteAuthorizeWithSeedArgs\") => z.struct([z.u32(\"voteAuthorizationType\"), We(\"currentAuthorityDerivedKeyOwnerPubkey\"), xn(\"currentAuthorityDerivedKeySeed\"), We(\"newAuthorized\")], s);\nfunction Er(s) {\n let e = 0, t = 0;\n for (; ; ) {\n let r = s.shift();\n if (e |= (r & 127) << t * 7, t += 1, (r & 128) === 0)\n break;\n }\n return e;\n}\nfunction xr(s, e) {\n let t = e;\n for (; ; ) {\n let r = t & 127;\n if (t >>= 7, t == 0) {\n s.push(r);\n break;\n } else\n r |= 128, s.push(r);\n }\n}\nfunction Kt(s, e) {\n if (!s)\n throw new Error(e || \"Assertion failed\");\n}\nclass fa {\n constructor(e, t) {\n this.payer = void 0, this.keyMetaMap = void 0, this.payer = e, this.keyMetaMap = t;\n }\n static compile(e, t) {\n const r = /* @__PURE__ */ new Map(), n = (o) => {\n const a = o.toBase58();\n let l = r.get(a);\n return l === void 0 && (l = {\n isSigner: !1,\n isWritable: !1,\n isInvoked: !1\n }, r.set(a, l)), l;\n }, i = n(t);\n i.isSigner = !0, i.isWritable = !0;\n for (const o of e) {\n n(o.programId).isInvoked = !0;\n for (const a of o.keys) {\n const l = n(a.pubkey);\n l.isSigner || (l.isSigner = a.isSigner), l.isWritable || (l.isWritable = a.isWritable);\n }\n }\n return new fa(t, r);\n }\n getMessageComponents() {\n const e = [...this.keyMetaMap.entries()];\n Kt(e.length <= 256, \"Max static account keys length exceeded\");\n const t = e.filter(([, l]) => l.isSigner && l.isWritable), r = e.filter(([, l]) => l.isSigner && !l.isWritable), n = e.filter(([, l]) => !l.isSigner && l.isWritable), i = e.filter(([, l]) => !l.isSigner && !l.isWritable), o = {\n numRequiredSignatures: t.length + r.length,\n numReadonlySignedAccounts: r.length,\n numReadonlyUnsignedAccounts: i.length\n };\n {\n Kt(t.length > 0, \"Expected at least one writable signer key\");\n const [l] = t[0];\n Kt(l === this.payer.toBase58(), \"Expected first writable signer key to be the fee payer\");\n }\n const a = [...t.map(([l]) => new Oe(l)), ...r.map(([l]) => new Oe(l)), ...n.map(([l]) => new Oe(l)), ...i.map(([l]) => new Oe(l))];\n return [o, a];\n }\n extractTableLookup(e) {\n const [t, r] = this.drainKeysFoundInLookupTable(e.state.addresses, (o) => !o.isSigner && !o.isInvoked && o.isWritable), [n, i] = this.drainKeysFoundInLookupTable(e.state.addresses, (o) => !o.isSigner && !o.isInvoked && !o.isWritable);\n if (!(t.length === 0 && n.length === 0))\n return [{\n accountKey: e.key,\n writableIndexes: t,\n readonlyIndexes: n\n }, {\n writable: r,\n readonly: i\n }];\n }\n /** @internal */\n drainKeysFoundInLookupTable(e, t) {\n const r = new Array(), n = new Array();\n for (const [i, o] of this.keyMetaMap.entries())\n if (t(o)) {\n const a = new Oe(i), l = e.findIndex((c) => c.equals(a));\n l >= 0 && (Kt(l < 256, \"Max lookup table index exceeded\"), r.push(l), n.push(a), this.keyMetaMap.delete(i));\n }\n return [r, n];\n }\n}\nconst F0 = \"Reached end of buffer unexpectedly\";\nfunction ds(s) {\n if (s.length === 0)\n throw new Error(F0);\n return s.shift();\n}\nfunction Sr(s, ...e) {\n const [t] = e;\n if (e.length === 2 ? t + (e[1] ?? 0) > s.length : t >= s.length)\n throw new Error(F0);\n return s.splice(...e);\n}\nclass Mn {\n constructor(e) {\n this.header = void 0, this.accountKeys = void 0, this.recentBlockhash = void 0, this.instructions = void 0, this.indexToProgramIds = /* @__PURE__ */ new Map(), this.header = e.header, this.accountKeys = e.accountKeys.map((t) => new Oe(t)), this.recentBlockhash = e.recentBlockhash, this.instructions = e.instructions, this.instructions.forEach((t) => this.indexToProgramIds.set(t.programIdIndex, this.accountKeys[t.programIdIndex]));\n }\n get version() {\n return \"legacy\";\n }\n get staticAccountKeys() {\n return this.accountKeys;\n }\n get compiledInstructions() {\n return this.instructions.map((e) => ({\n programIdIndex: e.programIdIndex,\n accountKeyIndexes: e.accounts,\n data: ar.decode(e.data)\n }));\n }\n get addressTableLookups() {\n return [];\n }\n getAccountKeys() {\n return new Vo(this.staticAccountKeys);\n }\n static compile(e) {\n const t = fa.compile(e.instructions, e.payerKey), [r, n] = t.getMessageComponents(), o = new Vo(n).compileInstructions(e.instructions).map((a) => ({\n programIdIndex: a.programIdIndex,\n accounts: a.accountKeyIndexes,\n data: ar.encode(a.data)\n }));\n return new Mn({\n header: r,\n accountKeys: n,\n recentBlockhash: e.recentBlockhash,\n instructions: o\n });\n }\n isAccountSigner(e) {\n return e < this.header.numRequiredSignatures;\n }\n isAccountWritable(e) {\n const t = this.header.numRequiredSignatures;\n if (e >= this.header.numRequiredSignatures) {\n const r = e - t, i = this.accountKeys.length - t - this.header.numReadonlyUnsignedAccounts;\n return r < i;\n } else {\n const r = t - this.header.numReadonlySignedAccounts;\n return e < r;\n }\n }\n isProgramId(e) {\n return this.indexToProgramIds.has(e);\n }\n programIds() {\n return [...this.indexToProgramIds.values()];\n }\n nonProgramIds() {\n return this.accountKeys.filter((e, t) => !this.isProgramId(t));\n }\n serialize() {\n const e = this.accountKeys.length;\n let t = [];\n xr(t, e);\n const r = this.instructions.map((d) => {\n const {\n accounts: h,\n programIdIndex: f\n } = d, p = Array.from(ar.decode(d.data));\n let y = [];\n xr(y, h.length);\n let E = [];\n return xr(E, p.length), {\n programIdIndex: f,\n keyIndicesCount: He.Buffer.from(y),\n keyIndices: h,\n dataLength: He.Buffer.from(E),\n data: p\n };\n });\n let n = [];\n xr(n, r.length);\n let i = He.Buffer.alloc(wn);\n He.Buffer.from(n).copy(i);\n let o = n.length;\n r.forEach((d) => {\n const f = z.struct([z.u8(\"programIdIndex\"), z.blob(d.keyIndicesCount.length, \"keyIndicesCount\"), z.seq(z.u8(\"keyIndex\"), d.keyIndices.length, \"keyIndices\"), z.blob(d.dataLength.length, \"dataLength\"), z.seq(z.u8(\"userdatum\"), d.data.length, \"data\")]).encode(d, i, o);\n o += f;\n }), i = i.slice(0, o);\n const a = z.struct([z.blob(1, \"numRequiredSignatures\"), z.blob(1, \"numReadonlySignedAccounts\"), z.blob(1, \"numReadonlyUnsignedAccounts\"), z.blob(t.length, \"keyCount\"), z.seq(We(\"key\"), e, \"keys\"), We(\"recentBlockhash\")]), l = {\n numRequiredSignatures: He.Buffer.from([this.header.numRequiredSignatures]),\n numReadonlySignedAccounts: He.Buffer.from([this.header.numReadonlySignedAccounts]),\n numReadonlyUnsignedAccounts: He.Buffer.from([this.header.numReadonlyUnsignedAccounts]),\n keyCount: He.Buffer.from(t),\n keys: this.accountKeys.map((d) => ru(d.toBytes())),\n recentBlockhash: ar.decode(this.recentBlockhash)\n };\n let c = He.Buffer.alloc(2048);\n const u = a.encode(l, c);\n return i.copy(c, u), c.slice(0, u + i.length);\n }\n /**\n * Decode a compiled message into a Message object.\n */\n static from(e) {\n let t = [...e];\n const r = ds(t);\n if (r !== (r & su))\n throw new Error(\"Versioned messages must be deserialized with VersionedMessage.deserialize()\");\n const n = ds(t), i = ds(t), o = Er(t);\n let a = [];\n for (let h = 0; h < o; h++) {\n const f = Sr(t, 0, ks);\n a.push(new Oe(He.Buffer.from(f)));\n }\n const l = Sr(t, 0, ks), c = Er(t);\n let u = [];\n for (let h = 0; h < c; h++) {\n const f = ds(t), p = Er(t), y = Sr(t, 0, p), E = Er(t), b = Sr(t, 0, E), R = ar.encode(He.Buffer.from(b));\n u.push({\n programIdIndex: f,\n accounts: y,\n data: R\n });\n }\n const d = {\n header: {\n numRequiredSignatures: r,\n numReadonlySignedAccounts: n,\n numReadonlyUnsignedAccounts: i\n },\n recentBlockhash: ar.encode(He.Buffer.from(l)),\n accountKeys: a,\n instructions: u\n };\n return new Mn(d);\n }\n}\nclass jo {\n constructor(e) {\n this.header = void 0, this.staticAccountKeys = void 0, this.recentBlockhash = void 0, this.compiledInstructions = void 0, this.addressTableLookups = void 0, this.header = e.header, this.staticAccountKeys = e.staticAccountKeys, this.recentBlockhash = e.recentBlockhash, this.compiledInstructions = e.compiledInstructions, this.addressTableLookups = e.addressTableLookups;\n }\n get version() {\n return 0;\n }\n get numAccountKeysFromLookups() {\n let e = 0;\n for (const t of this.addressTableLookups)\n e += t.readonlyIndexes.length + t.writableIndexes.length;\n return e;\n }\n getAccountKeys(e) {\n let t;\n if (e && \"accountKeysFromLookups\" in e && e.accountKeysFromLookups) {\n if (this.numAccountKeysFromLookups != e.accountKeysFromLookups.writable.length + e.accountKeysFromLookups.readonly.length)\n throw new Error(\"Failed to get account keys because of a mismatch in the number of account keys from lookups\");\n t = e.accountKeysFromLookups;\n } else if (e && \"addressLookupTableAccounts\" in e && e.addressLookupTableAccounts)\n t = this.resolveAddressTableLookups(e.addressLookupTableAccounts);\n else if (this.addressTableLookups.length > 0)\n throw new Error(\"Failed to get account keys because address table lookups were not resolved\");\n return new Vo(this.staticAccountKeys, t);\n }\n isAccountSigner(e) {\n return e < this.header.numRequiredSignatures;\n }\n isAccountWritable(e) {\n const t = this.header.numRequiredSignatures, r = this.staticAccountKeys.length;\n if (e >= r) {\n const n = e - r, i = this.addressTableLookups.reduce((o, a) => o + a.writableIndexes.length, 0);\n return n < i;\n } else if (e >= this.header.numRequiredSignatures) {\n const n = e - t, o = r - t - this.header.numReadonlyUnsignedAccounts;\n return n < o;\n } else {\n const n = t - this.header.numReadonlySignedAccounts;\n return e < n;\n }\n }\n resolveAddressTableLookups(e) {\n const t = {\n writable: [],\n readonly: []\n };\n for (const r of this.addressTableLookups) {\n const n = e.find((i) => i.key.equals(r.accountKey));\n if (!n)\n throw new Error(`Failed to find address lookup table account for table key ${r.accountKey.toBase58()}`);\n for (const i of r.writableIndexes)\n if (i < n.state.addresses.length)\n t.writable.push(n.state.addresses[i]);\n else\n throw new Error(`Failed to find address for index ${i} in address lookup table ${r.accountKey.toBase58()}`);\n for (const i of r.readonlyIndexes)\n if (i < n.state.addresses.length)\n t.readonly.push(n.state.addresses[i]);\n else\n throw new Error(`Failed to find address for index ${i} in address lookup table ${r.accountKey.toBase58()}`);\n }\n return t;\n }\n static compile(e) {\n const t = fa.compile(e.instructions, e.payerKey), r = new Array(), n = {\n writable: new Array(),\n readonly: new Array()\n }, i = e.addressLookupTableAccounts || [];\n for (const u of i) {\n const d = t.extractTableLookup(u);\n if (d !== void 0) {\n const [h, {\n writable: f,\n readonly: p\n }] = d;\n r.push(h), n.writable.push(...f), n.readonly.push(...p);\n }\n }\n const [o, a] = t.getMessageComponents(), c = new Vo(a, n).compileInstructions(e.instructions);\n return new jo({\n header: o,\n staticAccountKeys: a,\n recentBlockhash: e.recentBlockhash,\n compiledInstructions: c,\n addressTableLookups: r\n });\n }\n serialize() {\n const e = Array();\n xr(e, this.staticAccountKeys.length);\n const t = this.serializeInstructions(), r = Array();\n xr(r, this.compiledInstructions.length);\n const n = this.serializeAddressTableLookups(), i = Array();\n xr(i, this.addressTableLookups.length);\n const o = z.struct([z.u8(\"prefix\"), z.struct([z.u8(\"numRequiredSignatures\"), z.u8(\"numReadonlySignedAccounts\"), z.u8(\"numReadonlyUnsignedAccounts\")], \"header\"), z.blob(e.length, \"staticAccountKeysLength\"), z.seq(We(), this.staticAccountKeys.length, \"staticAccountKeys\"), We(\"recentBlockhash\"), z.blob(r.length, \"instructionsLength\"), z.blob(t.length, \"serializedInstructions\"), z.blob(i.length, \"addressTableLookupsLength\"), z.blob(n.length, \"serializedAddressTableLookups\")]), a = new Uint8Array(wn), c = o.encode({\n prefix: 128,\n header: this.header,\n staticAccountKeysLength: new Uint8Array(e),\n staticAccountKeys: this.staticAccountKeys.map((u) => u.toBytes()),\n recentBlockhash: ar.decode(this.recentBlockhash),\n instructionsLength: new Uint8Array(r),\n serializedInstructions: t,\n addressTableLookupsLength: new Uint8Array(i),\n serializedAddressTableLookups: n\n }, a);\n return a.slice(0, c);\n }\n serializeInstructions() {\n let e = 0;\n const t = new Uint8Array(wn);\n for (const r of this.compiledInstructions) {\n const n = Array();\n xr(n, r.accountKeyIndexes.length);\n const i = Array();\n xr(i, r.data.length);\n const o = z.struct([z.u8(\"programIdIndex\"), z.blob(n.length, \"encodedAccountKeyIndexesLength\"), z.seq(z.u8(), r.accountKeyIndexes.length, \"accountKeyIndexes\"), z.blob(i.length, \"encodedDataLength\"), z.blob(r.data.length, \"data\")]);\n e += o.encode({\n programIdIndex: r.programIdIndex,\n encodedAccountKeyIndexesLength: new Uint8Array(n),\n accountKeyIndexes: r.accountKeyIndexes,\n encodedDataLength: new Uint8Array(i),\n data: r.data\n }, t, e);\n }\n return t.slice(0, e);\n }\n serializeAddressTableLookups() {\n let e = 0;\n const t = new Uint8Array(wn);\n for (const r of this.addressTableLookups) {\n const n = Array();\n xr(n, r.writableIndexes.length);\n const i = Array();\n xr(i, r.readonlyIndexes.length);\n const o = z.struct([We(\"accountKey\"), z.blob(n.length, \"encodedWritableIndexesLength\"), z.seq(z.u8(), r.writableIndexes.length, \"writableIndexes\"), z.blob(i.length, \"encodedReadonlyIndexesLength\"), z.seq(z.u8(), r.readonlyIndexes.length, \"readonlyIndexes\")]);\n e += o.encode({\n accountKey: r.accountKey.toBytes(),\n encodedWritableIndexesLength: new Uint8Array(n),\n writableIndexes: r.writableIndexes,\n encodedReadonlyIndexesLength: new Uint8Array(i),\n readonlyIndexes: r.readonlyIndexes\n }, t, e);\n }\n return t.slice(0, e);\n }\n static deserialize(e) {\n let t = [...e];\n const r = ds(t), n = r & su;\n Kt(r !== n, \"Expected versioned message but received legacy message\");\n const i = n;\n Kt(i === 0, `Expected versioned message with version 0 but found version ${i}`);\n const o = {\n numRequiredSignatures: ds(t),\n numReadonlySignedAccounts: ds(t),\n numReadonlyUnsignedAccounts: ds(t)\n }, a = [], l = Er(t);\n for (let p = 0; p < l; p++)\n a.push(new Oe(Sr(t, 0, ks)));\n const c = ar.encode(Sr(t, 0, ks)), u = Er(t), d = [];\n for (let p = 0; p < u; p++) {\n const y = ds(t), E = Er(t), b = Sr(t, 0, E), R = Er(t), A = new Uint8Array(Sr(t, 0, R));\n d.push({\n programIdIndex: y,\n accountKeyIndexes: b,\n data: A\n });\n }\n const h = Er(t), f = [];\n for (let p = 0; p < h; p++) {\n const y = new Oe(Sr(t, 0, ks)), E = Er(t), b = Sr(t, 0, E), R = Er(t), A = Sr(t, 0, R);\n f.push({\n accountKey: y,\n writableIndexes: b,\n readonlyIndexes: A\n });\n }\n return new jo({\n header: o,\n staticAccountKeys: a,\n recentBlockhash: c,\n compiledInstructions: d,\n addressTableLookups: f\n });\n }\n}\nconst nu = {\n deserializeMessageVersion(s) {\n const e = s[0], t = e & su;\n return t === e ? \"legacy\" : t;\n },\n deserialize: (s) => {\n const e = nu.deserializeMessageVersion(s);\n if (e === \"legacy\")\n return Mn.from(s);\n if (e === 0)\n return jo.deserialize(s);\n throw new Error(`Transaction message version ${e} deserialization is not supported`);\n }\n}, mE = He.Buffer.alloc(Go).fill(0);\nclass Ud {\n constructor(e) {\n this.keys = void 0, this.programId = void 0, this.data = He.Buffer.alloc(0), this.programId = e.programId, this.keys = e.keys, e.data && (this.data = e.data);\n }\n /**\n * @internal\n */\n toJSON() {\n return {\n keys: this.keys.map(({\n pubkey: e,\n isSigner: t,\n isWritable: r\n }) => ({\n pubkey: e.toJSON(),\n isSigner: t,\n isWritable: r\n })),\n programId: this.programId.toJSON(),\n data: [...this.data]\n };\n }\n}\nclass Ko {\n /**\n * The first (payer) Transaction signature\n *\n * @returns {Buffer | null} Buffer of payer's signature\n */\n get signature() {\n return this.signatures.length > 0 ? this.signatures[0].signature : null;\n }\n /**\n * The transaction fee payer\n */\n // Construct a transaction with a blockhash and lastValidBlockHeight\n // Construct a transaction using a durable nonce\n /**\n * @deprecated `TransactionCtorFields` has been deprecated and will be removed in a future version.\n * Please supply a `TransactionBlockhashCtor` instead.\n */\n /**\n * Construct an empty Transaction\n */\n constructor(e) {\n if (this.signatures = [], this.feePayer = void 0, this.instructions = [], this.recentBlockhash = void 0, this.lastValidBlockHeight = void 0, this.nonceInfo = void 0, this.minNonceContextSlot = void 0, this._message = void 0, this._json = void 0, !!e)\n if (e.feePayer && (this.feePayer = e.feePayer), e.signatures && (this.signatures = e.signatures), Object.prototype.hasOwnProperty.call(e, \"nonceInfo\")) {\n const {\n minContextSlot: t,\n nonceInfo: r\n } = e;\n this.minNonceContextSlot = t, this.nonceInfo = r;\n } else if (Object.prototype.hasOwnProperty.call(e, \"lastValidBlockHeight\")) {\n const {\n blockhash: t,\n lastValidBlockHeight: r\n } = e;\n this.recentBlockhash = t, this.lastValidBlockHeight = r;\n } else {\n const {\n recentBlockhash: t,\n nonceInfo: r\n } = e;\n r && (this.nonceInfo = r), this.recentBlockhash = t;\n }\n }\n /**\n * @internal\n */\n toJSON() {\n return {\n recentBlockhash: this.recentBlockhash || null,\n feePayer: this.feePayer ? this.feePayer.toJSON() : null,\n nonceInfo: this.nonceInfo ? {\n nonce: this.nonceInfo.nonce,\n nonceInstruction: this.nonceInfo.nonceInstruction.toJSON()\n } : null,\n instructions: this.instructions.map((e) => e.toJSON()),\n signers: this.signatures.map(({\n publicKey: e\n }) => e.toJSON())\n };\n }\n /**\n * Add one or more instructions to this Transaction\n *\n * @param {Array< Transaction | TransactionInstruction | TransactionInstructionCtorFields >} items - Instructions to add to the Transaction\n */\n add(...e) {\n if (e.length === 0)\n throw new Error(\"No instructions\");\n return e.forEach((t) => {\n \"instructions\" in t ? this.instructions = this.instructions.concat(t.instructions) : \"data\" in t && \"programId\" in t && \"keys\" in t ? this.instructions.push(t) : this.instructions.push(new Ud(t));\n }), this;\n }\n /**\n * Compile transaction data\n */\n compileMessage() {\n if (this._message && JSON.stringify(this.toJSON()) === JSON.stringify(this._json))\n return this._message;\n let e, t;\n if (this.nonceInfo ? (e = this.nonceInfo.nonce, this.instructions[0] != this.nonceInfo.nonceInstruction ? t = [this.nonceInfo.nonceInstruction, ...this.instructions] : t = this.instructions) : (e = this.recentBlockhash, t = this.instructions), !e)\n throw new Error(\"Transaction recentBlockhash required\");\n t.length < 1 && console.warn(\"No instructions provided\");\n let r;\n if (this.feePayer)\n r = this.feePayer;\n else if (this.signatures.length > 0 && this.signatures[0].publicKey)\n r = this.signatures[0].publicKey;\n else\n throw new Error(\"Transaction fee payer required\");\n for (let y = 0; y < t.length; y++)\n if (t[y].programId === void 0)\n throw new Error(`Transaction instruction index ${y} has undefined program id`);\n const n = [], i = [];\n t.forEach((y) => {\n y.keys.forEach((b) => {\n i.push({\n ...b\n });\n });\n const E = y.programId.toString();\n n.includes(E) || n.push(E);\n }), n.forEach((y) => {\n i.push({\n pubkey: new Oe(y),\n isSigner: !1,\n isWritable: !1\n });\n });\n const o = [];\n i.forEach((y) => {\n const E = y.pubkey.toString(), b = o.findIndex((R) => R.pubkey.toString() === E);\n b > -1 ? (o[b].isWritable = o[b].isWritable || y.isWritable, o[b].isSigner = o[b].isSigner || y.isSigner) : o.push(y);\n }), o.sort(function(y, E) {\n if (y.isSigner !== E.isSigner)\n return y.isSigner ? -1 : 1;\n if (y.isWritable !== E.isWritable)\n return y.isWritable ? -1 : 1;\n const b = {\n localeMatcher: \"best fit\",\n usage: \"sort\",\n sensitivity: \"variant\",\n ignorePunctuation: !1,\n numeric: !1,\n caseFirst: \"lower\"\n };\n return y.pubkey.toBase58().localeCompare(E.pubkey.toBase58(), \"en\", b);\n });\n const a = o.findIndex((y) => y.pubkey.equals(r));\n if (a > -1) {\n const [y] = o.splice(a, 1);\n y.isSigner = !0, y.isWritable = !0, o.unshift(y);\n } else\n o.unshift({\n pubkey: r,\n isSigner: !0,\n isWritable: !0\n });\n for (const y of this.signatures) {\n const E = o.findIndex((b) => b.pubkey.equals(y.publicKey));\n if (E > -1)\n o[E].isSigner || (o[E].isSigner = !0, console.warn(\"Transaction references a signature that is unnecessary, only the fee payer and instruction signer accounts should sign a transaction. This behavior is deprecated and will throw an error in the next major version release.\"));\n else\n throw new Error(`unknown signer: ${y.publicKey.toString()}`);\n }\n let l = 0, c = 0, u = 0;\n const d = [], h = [];\n o.forEach(({\n pubkey: y,\n isSigner: E,\n isWritable: b\n }) => {\n E ? (d.push(y.toString()), l += 1, b || (c += 1)) : (h.push(y.toString()), b || (u += 1));\n });\n const f = d.concat(h), p = t.map((y) => {\n const {\n data: E,\n programId: b\n } = y;\n return {\n programIdIndex: f.indexOf(b.toString()),\n accounts: y.keys.map((R) => f.indexOf(R.pubkey.toString())),\n data: ar.encode(E)\n };\n });\n return p.forEach((y) => {\n Kt(y.programIdIndex >= 0), y.accounts.forEach((E) => Kt(E >= 0));\n }), new Mn({\n header: {\n numRequiredSignatures: l,\n numReadonlySignedAccounts: c,\n numReadonlyUnsignedAccounts: u\n },\n accountKeys: f,\n recentBlockhash: e,\n instructions: p\n });\n }\n /**\n * @internal\n */\n _compile() {\n const e = this.compileMessage(), t = e.accountKeys.slice(0, e.header.numRequiredSignatures);\n return this.signatures.length === t.length && this.signatures.every((n, i) => t[i].equals(n.publicKey)) || (this.signatures = t.map((r) => ({\n signature: null,\n publicKey: r\n }))), e;\n }\n /**\n * Get a buffer of the Transaction data that need to be covered by signatures\n */\n serializeMessage() {\n return this._compile().serialize();\n }\n /**\n * Get the estimated fee associated with a transaction\n *\n * @param {Connection} connection Connection to RPC Endpoint.\n *\n * @returns {Promise<number | null>} The estimated fee for the transaction\n */\n async getEstimatedFee(e) {\n return (await e.getFeeForMessage(this.compileMessage())).value;\n }\n /**\n * Specify the public keys which will be used to sign the Transaction.\n * The first signer will be used as the transaction fee payer account.\n *\n * Signatures can be added with either `partialSign` or `addSignature`\n *\n * @deprecated Deprecated since v0.84.0. Only the fee payer needs to be\n * specified and it can be set in the Transaction constructor or with the\n * `feePayer` property.\n */\n setSigners(...e) {\n if (e.length === 0)\n throw new Error(\"No signers\");\n const t = /* @__PURE__ */ new Set();\n this.signatures = e.filter((r) => {\n const n = r.toString();\n return t.has(n) ? !1 : (t.add(n), !0);\n }).map((r) => ({\n signature: null,\n publicKey: r\n }));\n }\n /**\n * Sign the Transaction with the specified signers. Multiple signatures may\n * be applied to a Transaction. The first signature is considered \"primary\"\n * and is used identify and confirm transactions.\n *\n * If the Transaction `feePayer` is not set, the first signer will be used\n * as the transaction fee payer account.\n *\n * Transaction fields should not be modified after the first call to `sign`,\n * as doing so may invalidate the signature and cause the Transaction to be\n * rejected.\n *\n * The Transaction must be assigned a valid `recentBlockhash` before invoking this method\n *\n * @param {Array<Signer>} signers Array of signers that will sign the transaction\n */\n sign(...e) {\n if (e.length === 0)\n throw new Error(\"No signers\");\n const t = /* @__PURE__ */ new Set(), r = [];\n for (const i of e) {\n const o = i.publicKey.toString();\n t.has(o) || (t.add(o), r.push(i));\n }\n this.signatures = r.map((i) => ({\n signature: null,\n publicKey: i.publicKey\n }));\n const n = this._compile();\n this._partialSign(n, ...r);\n }\n /**\n * Partially sign a transaction with the specified accounts. All accounts must\n * correspond to either the fee payer or a signer account in the transaction\n * instructions.\n *\n * All the caveats from the `sign` method apply to `partialSign`\n *\n * @param {Array<Signer>} signers Array of signers that will sign the transaction\n */\n partialSign(...e) {\n if (e.length === 0)\n throw new Error(\"No signers\");\n const t = /* @__PURE__ */ new Set(), r = [];\n for (const i of e) {\n const o = i.publicKey.toString();\n t.has(o) || (t.add(o), r.push(i));\n }\n const n = this._compile();\n this._partialSign(n, ...r);\n }\n /**\n * @internal\n */\n _partialSign(e, ...t) {\n const r = e.serialize();\n t.forEach((n) => {\n const i = O0(r, n.secretKey);\n this._addSignature(n.publicKey, ru(i));\n });\n }\n /**\n * Add an externally created signature to a transaction. The public key\n * must correspond to either the fee payer or a signer account in the transaction\n * instructions.\n *\n * @param {PublicKey} pubkey Public key that will be added to the transaction.\n * @param {Buffer} signature An externally created signature to add to the transaction.\n */\n addSignature(e, t) {\n this._compile(), this._addSignature(e, t);\n }\n /**\n * @internal\n */\n _addSignature(e, t) {\n Kt(t.length === 64);\n const r = this.signatures.findIndex((n) => e.equals(n.publicKey));\n if (r < 0)\n throw new Error(`unknown signer: ${e.toString()}`);\n this.signatures[r].signature = He.Buffer.from(t);\n }\n /**\n * Verify signatures of a Transaction\n * Optional parameter specifies if we're expecting a fully signed Transaction or a partially signed one.\n * If no boolean is provided, we expect a fully signed Transaction by default.\n *\n * @param {boolean} [requireAllSignatures=true] Require a fully signed Transaction\n */\n verifySignatures(e = !0) {\n return !this._getMessageSignednessErrors(this.serializeMessage(), e);\n }\n /**\n * @internal\n */\n _getMessageSignednessErrors(e, t) {\n const r = {};\n for (const {\n signature: n,\n publicKey: i\n } of this.signatures)\n n === null ? t && (r.missing || (r.missing = [])).push(i) : aE(n, e, i.toBytes()) || (r.invalid || (r.invalid = [])).push(i);\n return r.invalid || r.missing ? r : void 0;\n }\n /**\n * Serialize the Transaction in the wire format.\n *\n * @param {Buffer} [config] Config of transaction.\n *\n * @returns {Buffer} Signature of transaction in wire format.\n */\n serialize(e) {\n const {\n requireAllSignatures: t,\n verifySignatures: r\n } = Object.assign({\n requireAllSignatures: !0,\n verifySignatures: !0\n }, e), n = this.serializeMessage();\n if (r) {\n const i = this._getMessageSignednessErrors(n, t);\n if (i) {\n let o = \"Signature verification failed.\";\n throw i.invalid && (o += `\nInvalid signature for public key${i.invalid.length === 1 ? \"\" : \"(s)\"} [\\`${i.invalid.map((a) => a.toBase58()).join(\"`, `\")}\\`].`), i.missing && (o += `\nMissing signature for public key${i.missing.length === 1 ? \"\" : \"(s)\"} [\\`${i.missing.map((a) => a.toBase58()).join(\"`, `\")}\\`].`), new Error(o);\n }\n }\n return this._serialize(n);\n }\n /**\n * @internal\n */\n _serialize(e) {\n const {\n signatures: t\n } = this, r = [];\n xr(r, t.length);\n const n = r.length + t.length * 64 + e.length, i = He.Buffer.alloc(n);\n return Kt(t.length < 256), He.Buffer.from(r).copy(i, 0), t.forEach(({\n signature: o\n }, a) => {\n o !== null && (Kt(o.length === 64, \"signature has invalid length\"), He.Buffer.from(o).copy(i, r.length + a * 64));\n }), e.copy(i, r.length + t.length * 64), Kt(i.length <= wn, `Transaction too large: ${i.length} > ${wn}`), i;\n }\n /**\n * Deprecated method\n * @internal\n */\n get keys() {\n return Kt(this.instructions.length === 1), this.instructions[0].keys.map((e) => e.pubkey);\n }\n /**\n * Deprecated method\n * @internal\n */\n get programId() {\n return Kt(this.instructions.length === 1), this.instructions[0].programId;\n }\n /**\n * Deprecated method\n * @internal\n */\n get data() {\n return Kt(this.instructions.length === 1), this.instructions[0].data;\n }\n /**\n * Parse a wire transaction into a Transaction object.\n *\n * @param {Buffer | Uint8Array | Array<number>} buffer Signature of wire Transaction\n *\n * @returns {Transaction} Transaction associated with the signature\n */\n static from(e) {\n let t = [...e];\n const r = Er(t);\n let n = [];\n for (let i = 0; i < r; i++) {\n const o = Sr(t, 0, Go);\n n.push(ar.encode(He.Buffer.from(o)));\n }\n return Ko.populate(Mn.from(t), n);\n }\n /**\n * Populate Transaction object from message and signatures\n *\n * @param {Message} message Message of transaction\n * @param {Array<string>} signatures List of signatures to assign to the transaction\n *\n * @returns {Transaction} The populated Transaction\n */\n static populate(e, t = []) {\n const r = new Ko();\n return r.recentBlockhash = e.recentBlockhash, e.header.numRequiredSignatures > 0 && (r.feePayer = e.accountKeys[0]), t.forEach((n, i) => {\n const o = {\n signature: n == ar.encode(mE) ? null : ar.decode(n),\n publicKey: e.accountKeys[i]\n };\n r.signatures.push(o);\n }), e.instructions.forEach((n) => {\n const i = n.accounts.map((o) => {\n const a = e.accountKeys[o];\n return {\n pubkey: a,\n isSigner: r.signatures.some((l) => l.publicKey.toString() === a.toString()) || e.isAccountSigner(o),\n isWritable: e.isAccountWritable(o)\n };\n });\n r.instructions.push(new Ud({\n keys: i,\n programId: e.accountKeys[n.programIdIndex],\n data: ar.decode(n.data)\n }));\n }), r._message = e, r._json = r.toJSON(), r;\n }\n}\nclass iu {\n get version() {\n return this.message.version;\n }\n constructor(e, t) {\n if (this.signatures = void 0, this.message = void 0, t !== void 0)\n Kt(t.length === e.header.numRequiredSignatures, \"Expected signatures length to be equal to the number of required signatures\"), this.signatures = t;\n else {\n const r = [];\n for (let n = 0; n < e.header.numRequiredSignatures; n++)\n r.push(new Uint8Array(Go));\n this.signatures = r;\n }\n this.message = e;\n }\n serialize() {\n const e = this.message.serialize(), t = Array();\n xr(t, this.signatures.length);\n const r = z.struct([z.blob(t.length, \"encodedSignaturesLength\"), z.seq(dE(), this.signatures.length, \"signatures\"), z.blob(e.length, \"serializedMessage\")]), n = new Uint8Array(2048), i = r.encode({\n encodedSignaturesLength: new Uint8Array(t),\n signatures: this.signatures,\n serializedMessage: e\n }, n);\n return n.slice(0, i);\n }\n static deserialize(e) {\n let t = [...e];\n const r = [], n = Er(t);\n for (let o = 0; o < n; o++)\n r.push(new Uint8Array(Sr(t, 0, Go)));\n const i = nu.deserialize(new Uint8Array(t));\n return new iu(i, r);\n }\n sign(e) {\n const t = this.message.serialize(), r = this.message.staticAccountKeys.slice(0, this.message.header.numRequiredSignatures);\n for (const n of e) {\n const i = r.findIndex((o) => o.equals(n.publicKey));\n Kt(i >= 0, `Cannot sign with non signer key ${n.publicKey.toBase58()}`), this.signatures[i] = O0(t, n.secretKey);\n }\n }\n addSignature(e, t) {\n Kt(t.byteLength === 64, \"Signature must be 64 bytes long\");\n const n = this.message.staticAccountKeys.slice(0, this.message.header.numRequiredSignatures).findIndex((i) => i.equals(e));\n Kt(n >= 0, `Can not add signature; \\`${e.toBase58()}\\` is not required to sign this transaction`), this.signatures[n] = t;\n }\n}\nnew Oe(\"SysvarC1ock11111111111111111111111111111111\");\nnew Oe(\"SysvarEpochSchedu1e111111111111111111111111\");\nnew Oe(\"Sysvar1nstructions1111111111111111111111111\");\nnew Oe(\"SysvarRecentB1ockHashes11111111111111111111\");\nnew Oe(\"SysvarRent111111111111111111111111111111111\");\nnew Oe(\"SysvarRewards111111111111111111111111111111\");\nnew Oe(\"SysvarS1otHashes111111111111111111111111111\");\nnew Oe(\"SysvarS1otHistory11111111111111111111111111\");\nnew Oe(\"SysvarStakeHistory1111111111111111111111111\");\nconst yE = z.nu64(\"lamportsPerSignature\"), vE = z.struct([z.u32(\"version\"), z.u32(\"state\"), We(\"authorizedPubkey\"), We(\"nonce\"), z.struct([yE], \"feeCalculator\")]);\nvE.span;\nfunction On(s) {\n const e = z.blob(8, s), t = e.decode.bind(e), r = e.encode.bind(e), n = e, i = pv();\n return n.decode = (o, a) => {\n const l = t(o, a);\n return i.decode(l);\n }, n.encode = (o, a, l) => {\n const c = i.encode(o);\n return r(c, a, l);\n }, n;\n}\nObject.freeze({\n Create: {\n index: 0,\n layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\"), z.ns64(\"space\"), We(\"programId\")])\n },\n Assign: {\n index: 1,\n layout: z.struct([z.u32(\"instruction\"), We(\"programId\")])\n },\n Transfer: {\n index: 2,\n layout: z.struct([z.u32(\"instruction\"), On(\"lamports\")])\n },\n CreateWithSeed: {\n index: 3,\n layout: z.struct([z.u32(\"instruction\"), We(\"base\"), xn(\"seed\"), z.ns64(\"lamports\"), z.ns64(\"space\"), We(\"programId\")])\n },\n AdvanceNonceAccount: {\n index: 4,\n layout: z.struct([z.u32(\"instruction\")])\n },\n WithdrawNonceAccount: {\n index: 5,\n layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n },\n InitializeNonceAccount: {\n index: 6,\n layout: z.struct([z.u32(\"instruction\"), We(\"authorized\")])\n },\n AuthorizeNonceAccount: {\n index: 7,\n layout: z.struct([z.u32(\"instruction\"), We(\"authorized\")])\n },\n Allocate: {\n index: 8,\n layout: z.struct([z.u32(\"instruction\"), z.ns64(\"space\")])\n },\n AllocateWithSeed: {\n index: 9,\n layout: z.struct([z.u32(\"instruction\"), We(\"base\"), xn(\"seed\"), z.ns64(\"space\"), We(\"programId\")])\n },\n AssignWithSeed: {\n index: 10,\n layout: z.struct([z.u32(\"instruction\"), We(\"base\"), xn(\"seed\"), We(\"programId\")])\n },\n TransferWithSeed: {\n index: 11,\n layout: z.struct([z.u32(\"instruction\"), On(\"lamports\"), xn(\"seed\"), We(\"programId\")])\n },\n UpgradeNonceAccount: {\n index: 12,\n layout: z.struct([z.u32(\"instruction\")])\n }\n});\nnew Oe(\"11111111111111111111111111111111\");\nnew Oe(\"BPFLoader2111111111111111111111111111111111\");\nz.struct([\n z.u32(\"typeIndex\"),\n On(\"deactivationSlot\"),\n z.nu64(\"lastExtendedSlot\"),\n z.u8(\"lastExtendedStartIndex\"),\n z.u8(),\n // option\n z.seq(We(), z.offset(z.u8(), -1), \"authority\")\n]);\nconst St = Di(Qc(Oe), ce(), (s) => new Oe(s)), N0 = eu([ce(), pt(\"base64\")]), ou = Di(Qc(He.Buffer), N0, (s) => He.Buffer.from(s[0], \"base64\"));\nfunction U0(s) {\n return ur([oe({\n jsonrpc: pt(\"2.0\"),\n id: ce(),\n result: s\n }), oe({\n jsonrpc: pt(\"2.0\"),\n id: ce(),\n error: oe({\n code: Gn(),\n message: ce(),\n data: Se(bv())\n })\n })]);\n}\nconst EE = U0(Gn());\nfunction lt(s) {\n return Di(U0(s), EE, (e) => \"error\" in e ? e : {\n ...e,\n result: ti(e.result, s)\n });\n}\nfunction Fr(s) {\n return lt(oe({\n context: oe({\n slot: te()\n }),\n value: s\n }));\n}\nfunction ga(s) {\n return oe({\n context: oe({\n slot: te()\n }),\n value: s\n });\n}\nconst xE = oe({\n foundation: te(),\n foundationTerm: te(),\n initial: te(),\n taper: te(),\n terminal: te()\n});\nlt(fe(ge(oe({\n epoch: te(),\n effectiveSlot: te(),\n amount: te(),\n postBalance: te(),\n commission: Se(ge(te()))\n}))));\nconst SE = fe(oe({\n slot: te(),\n prioritizationFee: te()\n})), bE = oe({\n total: te(),\n validator: te(),\n foundation: te(),\n epoch: te()\n}), TE = oe({\n epoch: te(),\n slotIndex: te(),\n slotsInEpoch: te(),\n absoluteSlot: te(),\n blockHeight: Se(te()),\n transactionCount: Se(te())\n}), wE = oe({\n slotsPerEpoch: te(),\n leaderScheduleSlotOffset: te(),\n warmup: Xr(),\n firstNormalEpoch: te(),\n firstNormalSlot: te()\n}), AE = T0(ce(), fe(te())), rn = ge(ur([oe({}), ce()])), IE = oe({\n err: rn\n}), _E = pt(\"receivedSignature\");\noe({\n \"solana-core\": ce(),\n \"feature-set\": Se(te())\n});\nconst RE = oe({\n program: ce(),\n programId: St,\n parsed: Gn()\n}), LE = oe({\n programId: St,\n accounts: fe(St),\n data: ce()\n});\nFr(oe({\n err: ge(ur([oe({}), ce()])),\n logs: ge(fe(ce())),\n accounts: Se(ge(fe(ge(oe({\n executable: Xr(),\n owner: ce(),\n lamports: te(),\n data: fe(ce()),\n rentEpoch: Se(te())\n }))))),\n unitsConsumed: Se(te()),\n returnData: Se(ge(oe({\n programId: ce(),\n data: eu([ce(), pt(\"base64\")])\n }))),\n innerInstructions: Se(ge(fe(oe({\n index: te(),\n instructions: fe(ur([RE, LE]))\n }))))\n}));\nFr(oe({\n byIdentity: T0(ce(), fe(te())),\n range: oe({\n firstSlot: te(),\n lastSlot: te()\n })\n}));\nlt(xE);\nlt(bE);\nlt(SE);\nlt(TE);\nlt(wE);\nlt(AE);\nlt(te());\nFr(oe({\n total: te(),\n circulating: te(),\n nonCirculating: te(),\n nonCirculatingAccounts: fe(St)\n}));\nconst CE = oe({\n amount: ce(),\n uiAmount: ge(te()),\n decimals: te(),\n uiAmountString: Se(ce())\n});\nFr(fe(oe({\n address: St,\n amount: ce(),\n uiAmount: ge(te()),\n decimals: te(),\n uiAmountString: Se(ce())\n})));\nFr(fe(oe({\n pubkey: St,\n account: oe({\n executable: Xr(),\n owner: St,\n lamports: te(),\n data: ou,\n rentEpoch: te()\n })\n})));\nconst rc = oe({\n program: ce(),\n parsed: Gn(),\n space: te()\n});\nFr(fe(oe({\n pubkey: St,\n account: oe({\n executable: Xr(),\n owner: St,\n lamports: te(),\n data: rc,\n rentEpoch: te()\n })\n})));\nFr(fe(oe({\n lamports: te(),\n address: St\n})));\nconst au = oe({\n executable: Xr(),\n owner: St,\n lamports: te(),\n data: ou,\n rentEpoch: te()\n});\noe({\n pubkey: St,\n account: au\n});\nconst kE = Di(ur([Qc(He.Buffer), rc]), ur([N0, rc]), (s) => Array.isArray(s) ? ti(s, ou) : s), DE = oe({\n executable: Xr(),\n owner: St,\n lamports: te(),\n data: kE,\n rentEpoch: te()\n});\noe({\n pubkey: St,\n account: DE\n});\noe({\n state: ur([pt(\"active\"), pt(\"inactive\"), pt(\"activating\"), pt(\"deactivating\")]),\n active: te(),\n inactive: te()\n});\nlt(fe(oe({\n signature: ce(),\n slot: te(),\n err: rn,\n memo: ge(ce()),\n blockTime: Se(ge(te()))\n})));\nlt(fe(oe({\n signature: ce(),\n slot: te(),\n err: rn,\n memo: ge(ce()),\n blockTime: Se(ge(te()))\n})));\noe({\n subscription: te(),\n result: ga(au)\n});\nconst PE = oe({\n pubkey: St,\n account: au\n});\noe({\n subscription: te(),\n result: ga(PE)\n});\nconst ME = oe({\n parent: te(),\n slot: te(),\n root: te()\n});\noe({\n subscription: te(),\n result: ME\n});\nconst OE = ur([oe({\n type: ur([pt(\"firstShredReceived\"), pt(\"completed\"), pt(\"optimisticConfirmation\"), pt(\"root\")]),\n slot: te(),\n timestamp: te()\n}), oe({\n type: pt(\"createdBank\"),\n parent: te(),\n slot: te(),\n timestamp: te()\n}), oe({\n type: pt(\"frozen\"),\n slot: te(),\n timestamp: te(),\n stats: oe({\n numTransactionEntries: te(),\n numSuccessfulTransactions: te(),\n numFailedTransactions: te(),\n maxTransactionsPerEntry: te()\n })\n}), oe({\n type: pt(\"dead\"),\n slot: te(),\n timestamp: te(),\n err: ce()\n})]);\noe({\n subscription: te(),\n result: OE\n});\noe({\n subscription: te(),\n result: ga(ur([IE, _E]))\n});\noe({\n subscription: te(),\n result: te()\n});\noe({\n pubkey: ce(),\n gossip: ge(ce()),\n tpu: ge(ce()),\n rpc: ge(ce()),\n version: ge(ce())\n});\nconst $d = oe({\n votePubkey: ce(),\n nodePubkey: ce(),\n activatedStake: te(),\n epochVoteAccount: Xr(),\n epochCredits: fe(eu([te(), te(), te()])),\n commission: te(),\n lastVote: te(),\n rootSlot: ge(te())\n});\nlt(oe({\n current: fe($d),\n delinquent: fe($d)\n}));\nconst BE = ur([pt(\"processed\"), pt(\"confirmed\"), pt(\"finalized\")]), FE = oe({\n slot: te(),\n confirmations: ge(te()),\n err: rn,\n confirmationStatus: Se(BE)\n});\nFr(fe(ge(FE)));\nlt(te());\nconst $0 = oe({\n accountKey: St,\n writableIndexes: fe(te()),\n readonlyIndexes: fe(te())\n}), lu = oe({\n signatures: fe(ce()),\n message: oe({\n accountKeys: fe(ce()),\n header: oe({\n numRequiredSignatures: te(),\n numReadonlySignedAccounts: te(),\n numReadonlyUnsignedAccounts: te()\n }),\n instructions: fe(oe({\n accounts: fe(te()),\n data: ce(),\n programIdIndex: te()\n })),\n recentBlockhash: ce(),\n addressTableLookups: Se(fe($0))\n })\n}), G0 = oe({\n pubkey: St,\n signer: Xr(),\n writable: Xr(),\n source: Se(ur([pt(\"transaction\"), pt(\"lookupTable\")]))\n}), V0 = oe({\n accountKeys: fe(G0),\n signatures: fe(ce())\n}), j0 = oe({\n parsed: Gn(),\n program: ce(),\n programId: St\n}), K0 = oe({\n accounts: fe(St),\n data: ce(),\n programId: St\n}), NE = ur([K0, j0]), UE = ur([oe({\n parsed: Gn(),\n program: ce(),\n programId: ce()\n}), oe({\n accounts: fe(ce()),\n data: ce(),\n programId: ce()\n})]), H0 = Di(NE, UE, (s) => \"accounts\" in s ? ti(s, K0) : ti(s, j0)), q0 = oe({\n signatures: fe(ce()),\n message: oe({\n accountKeys: fe(G0),\n instructions: fe(H0),\n recentBlockhash: ce(),\n addressTableLookups: Se(ge(fe($0)))\n })\n}), Ho = oe({\n accountIndex: te(),\n mint: ce(),\n owner: Se(ce()),\n programId: Se(ce()),\n uiTokenAmount: CE\n}), W0 = oe({\n writable: fe(St),\n readonly: fe(St)\n}), pa = oe({\n err: rn,\n fee: te(),\n innerInstructions: Se(ge(fe(oe({\n index: te(),\n instructions: fe(oe({\n accounts: fe(te()),\n data: ce(),\n programIdIndex: te()\n }))\n })))),\n preBalances: fe(te()),\n postBalances: fe(te()),\n logMessages: Se(ge(fe(ce()))),\n preTokenBalances: Se(ge(fe(Ho))),\n postTokenBalances: Se(ge(fe(Ho))),\n loadedAddresses: Se(W0),\n computeUnitsConsumed: Se(te()),\n costUnits: Se(te())\n}), cu = oe({\n err: rn,\n fee: te(),\n innerInstructions: Se(ge(fe(oe({\n index: te(),\n instructions: fe(H0)\n })))),\n preBalances: fe(te()),\n postBalances: fe(te()),\n logMessages: Se(ge(fe(ce()))),\n preTokenBalances: Se(ge(fe(Ho))),\n postTokenBalances: Se(ge(fe(Ho))),\n loadedAddresses: Se(W0),\n computeUnitsConsumed: Se(te()),\n costUnits: Se(te())\n}), Vn = ur([pt(0), pt(\"legacy\")]), sn = oe({\n pubkey: ce(),\n lamports: te(),\n postBalance: ge(te()),\n rewardType: ge(ce()),\n commission: Se(ge(te()))\n});\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n transactions: fe(oe({\n transaction: lu,\n meta: ge(pa),\n version: Se(Vn)\n })),\n rewards: Se(fe(sn)),\n blockTime: ge(te()),\n blockHeight: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n rewards: Se(fe(sn)),\n blockTime: ge(te()),\n blockHeight: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n transactions: fe(oe({\n transaction: V0,\n meta: ge(pa),\n version: Se(Vn)\n })),\n rewards: Se(fe(sn)),\n blockTime: ge(te()),\n blockHeight: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n transactions: fe(oe({\n transaction: q0,\n meta: ge(cu),\n version: Se(Vn)\n })),\n rewards: Se(fe(sn)),\n blockTime: ge(te()),\n blockHeight: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n transactions: fe(oe({\n transaction: V0,\n meta: ge(cu),\n version: Se(Vn)\n })),\n rewards: Se(fe(sn)),\n blockTime: ge(te()),\n blockHeight: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n rewards: Se(fe(sn)),\n blockTime: ge(te()),\n blockHeight: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n transactions: fe(oe({\n transaction: lu,\n meta: ge(pa)\n })),\n rewards: Se(fe(sn)),\n blockTime: ge(te())\n})));\nlt(ge(oe({\n blockhash: ce(),\n previousBlockhash: ce(),\n parentSlot: te(),\n signatures: fe(ce()),\n blockTime: ge(te())\n})));\nlt(ge(oe({\n slot: te(),\n meta: ge(pa),\n blockTime: Se(ge(te())),\n transaction: lu,\n version: Se(Vn)\n})));\nlt(ge(oe({\n slot: te(),\n transaction: q0,\n meta: ge(cu),\n blockTime: Se(ge(te())),\n version: Se(Vn)\n})));\nFr(oe({\n blockhash: ce(),\n lastValidBlockHeight: te()\n}));\nFr(Xr());\nconst $E = oe({\n slot: te(),\n numTransactions: te(),\n numSlots: te(),\n samplePeriodSecs: te()\n});\nlt(fe($E));\nFr(ge(oe({\n feeCalculator: oe({\n lamportsPerSignature: te()\n })\n})));\nlt(ce());\nlt(ce());\nconst GE = oe({\n err: rn,\n logs: fe(ce()),\n signature: ce()\n});\noe({\n result: ga(GE),\n subscription: te()\n});\nObject.freeze({\n CreateLookupTable: {\n index: 0,\n layout: z.struct([z.u32(\"instruction\"), On(\"recentSlot\"), z.u8(\"bumpSeed\")])\n },\n FreezeLookupTable: {\n index: 1,\n layout: z.struct([z.u32(\"instruction\")])\n },\n ExtendLookupTable: {\n index: 2,\n layout: z.struct([z.u32(\"instruction\"), On(), z.seq(We(), z.offset(z.u32(), -8), \"addresses\")])\n },\n DeactivateLookupTable: {\n index: 3,\n layout: z.struct([z.u32(\"instruction\")])\n },\n CloseLookupTable: {\n index: 4,\n layout: z.struct([z.u32(\"instruction\")])\n }\n});\nnew Oe(\"AddressLookupTab1e1111111111111111111111111\");\nObject.freeze({\n RequestUnits: {\n index: 0,\n layout: z.struct([z.u8(\"instruction\"), z.u32(\"units\"), z.u32(\"additionalFee\")])\n },\n RequestHeapFrame: {\n index: 1,\n layout: z.struct([z.u8(\"instruction\"), z.u32(\"bytes\")])\n },\n SetComputeUnitLimit: {\n index: 2,\n layout: z.struct([z.u8(\"instruction\"), z.u32(\"units\")])\n },\n SetComputeUnitPrice: {\n index: 3,\n layout: z.struct([z.u8(\"instruction\"), On(\"microLamports\")])\n }\n});\nnew Oe(\"ComputeBudget111111111111111111111111111111\");\nz.struct([z.u8(\"numSignatures\"), z.u8(\"padding\"), z.u16(\"signatureOffset\"), z.u16(\"signatureInstructionIndex\"), z.u16(\"publicKeyOffset\"), z.u16(\"publicKeyInstructionIndex\"), z.u16(\"messageDataOffset\"), z.u16(\"messageDataSize\"), z.u16(\"messageInstructionIndex\")]);\nnew Oe(\"Ed25519SigVerify111111111111111111111111111\");\noE.utils.isValidPrivateKey;\nz.struct([z.u8(\"numSignatures\"), z.u16(\"signatureOffset\"), z.u8(\"signatureInstructionIndex\"), z.u16(\"ethAddressOffset\"), z.u8(\"ethAddressInstructionIndex\"), z.u16(\"messageDataOffset\"), z.u16(\"messageDataSize\"), z.u8(\"messageInstructionIndex\"), z.blob(20, \"ethAddress\"), z.blob(64, \"signature\"), z.u8(\"recoveryId\")]);\nnew Oe(\"KeccakSecp256k11111111111111111111111111111\");\nvar z0;\nnew Oe(\"StakeConfig11111111111111111111111111111111\");\nclass Y0 {\n /**\n * Create a new Lockup object\n */\n constructor(e, t, r) {\n this.unixTimestamp = void 0, this.epoch = void 0, this.custodian = void 0, this.unixTimestamp = e, this.epoch = t, this.custodian = r;\n }\n /**\n * Default, inactive Lockup value\n */\n}\nz0 = Y0;\nY0.default = new z0(0, 0, Oe.default);\nObject.freeze({\n Initialize: {\n index: 0,\n layout: z.struct([z.u32(\"instruction\"), hE(), fE()])\n },\n Authorize: {\n index: 1,\n layout: z.struct([z.u32(\"instruction\"), We(\"newAuthorized\"), z.u32(\"stakeAuthorizationType\")])\n },\n Delegate: {\n index: 2,\n layout: z.struct([z.u32(\"instruction\")])\n },\n Split: {\n index: 3,\n layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n },\n Withdraw: {\n index: 4,\n layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n },\n Deactivate: {\n index: 5,\n layout: z.struct([z.u32(\"instruction\")])\n },\n Merge: {\n index: 7,\n layout: z.struct([z.u32(\"instruction\")])\n },\n AuthorizeWithSeed: {\n index: 8,\n layout: z.struct([z.u32(\"instruction\"), We(\"newAuthorized\"), z.u32(\"stakeAuthorizationType\"), xn(\"authoritySeed\"), We(\"authorityOwner\")])\n }\n});\nnew Oe(\"Stake11111111111111111111111111111111111111\");\nObject.freeze({\n InitializeAccount: {\n index: 0,\n layout: z.struct([z.u32(\"instruction\"), gE()])\n },\n Authorize: {\n index: 1,\n layout: z.struct([z.u32(\"instruction\"), We(\"newAuthorized\"), z.u32(\"voteAuthorizationType\")])\n },\n Withdraw: {\n index: 3,\n layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n },\n UpdateValidatorIdentity: {\n index: 4,\n layout: z.struct([z.u32(\"instruction\")])\n },\n AuthorizeWithSeed: {\n index: 10,\n layout: z.struct([z.u32(\"instruction\"), pE()])\n }\n});\nnew Oe(\"Vote111111111111111111111111111111111111111\");\nnew Oe(\"Va1idator1nfo111111111111111111111111111111\");\noe({\n name: ce(),\n website: Se(ce()),\n details: Se(ce()),\n iconUrl: Se(ce()),\n keybaseUsername: Se(ce())\n});\nnew Oe(\"Vote111111111111111111111111111111111111111\");\nz.struct([\n We(\"nodePubkey\"),\n We(\"authorizedWithdrawer\"),\n z.u8(\"commission\"),\n z.nu64(),\n // votes.length\n z.seq(z.struct([z.nu64(\"slot\"), z.u32(\"confirmationCount\")]), z.offset(z.u32(), -8), \"votes\"),\n z.u8(\"rootSlotValid\"),\n z.nu64(\"rootSlot\"),\n z.nu64(),\n // authorizedVoters.length\n z.seq(z.struct([z.nu64(\"epoch\"), We(\"authorizedVoter\")]), z.offset(z.u32(), -8), \"authorizedVoters\"),\n z.struct([z.seq(z.struct([We(\"authorizedPubkey\"), z.nu64(\"epochOfLastAuthorizedSwitch\"), z.nu64(\"targetEpoch\")]), 32, \"buf\"), z.nu64(\"idx\"), z.u8(\"isEmpty\")], \"priorVoters\"),\n z.nu64(),\n // epochCredits.length\n z.seq(z.struct([z.nu64(\"epoch\"), z.nu64(\"credits\"), z.nu64(\"prevCredits\")]), z.offset(z.u32(), -8), \"epochCredits\"),\n z.struct([z.nu64(\"slot\"), z.nu64(\"timestamp\")], \"lastTimestamp\")\n]);\nconst VE = (s) => ({\n request: s,\n signMessage: (e) => s({ method: \"signMessage\", params: { message: e } }),\n signTransaction: (e) => s({ method: \"signTransaction\", params: { transaction: e } }),\n signAndSendTransaction: (e) => s({\n method: \"signAndSendTransaction\",\n params: e\n })\n});\nfunction Gd(s) {\n return Buffer.from(s.serialize({\n verifySignatures: !1\n })).toString(\"base64\");\n}\nfunction jE(s) {\n const e = Buffer.from(s, \"base64\");\n return nu.deserializeMessageVersion(e) === \"legacy\" ? iu.deserialize(e) : Ko.from(e);\n}\nfunction KE(s) {\n return async (t) => {\n if (t.method === \"connect\")\n return await s(t);\n if (t.method === \"signMessage\")\n return await s(t);\n if (t.method === \"signAndSendTransaction\") {\n const { transaction: r } = t.params, n = {\n transaction: Gd(r)\n };\n return await s({\n method: \"signAndSendTransaction\",\n params: n\n });\n }\n if (t.method === \"signTransaction\") {\n const { transaction: r } = t.params, n = {\n transaction: Gd(r)\n }, { signedTransaction: i } = await s({\n method: \"signTransaction\",\n params: n\n });\n return { signedTransaction: jE(i) };\n }\n };\n}\nconst HE = ({ miniAppHost: s, emitter: e }) => {\n let t, r = null;\n return {\n visible: !1,\n get onback() {\n return r;\n },\n set onback(n) {\n r && e.removeListener(\"backNavigationTriggered\", r), r = n, n && e.addListener(\"backNavigationTriggered\", n);\n },\n async show() {\n await s.updateBackState({\n visible: !0\n }), this.visible = !0;\n },\n async hide() {\n await s.updateBackState({\n visible: !1\n }), this.visible = !1;\n },\n async enableWebNavigation() {\n t = qE({\n back: this,\n emitter: e\n });\n },\n async disableWebNavigation() {\n t == null || t(), t = void 0;\n }\n };\n};\nfunction qE({ emitter: s, back: e }) {\n const t = WE();\n if (t)\n return zE({ emitter: s, back: e, navigation: t });\n if (typeof window < \"u\")\n return YE({ emitter: s, back: e, window });\n}\nfunction WE() {\n if (typeof window < \"u\" && window.navigation !== void 0)\n return window.navigation;\n}\nfunction zE({ emitter: s, back: e, navigation: t }) {\n function r() {\n t.canGoBack ? e.show() : e.hide();\n }\n function n() {\n e.visible && t.canGoBack && t.back();\n }\n return t.addEventListener(\"navigatesuccess\", r), s.addListener(\"backNavigationTriggered\", n), () => {\n t.removeEventListener(\"navigatesuccess\", r), s.removeListener(\"backNavigationTriggered\", n);\n };\n}\nfunction YE({ emitter: s, back: e, window: t }) {\n e.show();\n function r() {\n e.visible && t.history.back();\n }\n return s.addListener(\"backNavigationTriggered\", r), () => {\n s.removeListener(\"backNavigationTriggered\", r);\n };\n}\nconst ZE = \"0.1.1\";\nfunction XE() {\n return ZE;\n}\nlet JE = class sc extends Error {\n constructor(e, t = {}) {\n const r = (() => {\n var l;\n if (t.cause instanceof sc) {\n if (t.cause.details)\n return t.cause.details;\n if (t.cause.shortMessage)\n return t.cause.shortMessage;\n }\n return (l = t.cause) != null && l.message ? t.cause.message : t.details;\n })(), n = t.cause instanceof sc && t.cause.docsPath || t.docsPath, o = `https://oxlib.sh${n ?? \"\"}`, a = [\n e || \"An error occurred.\",\n ...t.metaMessages ? [\"\", ...t.metaMessages] : [],\n ...r || n ? [\n \"\",\n r ? `Details: ${r}` : void 0,\n n ? `See: ${o}` : void 0\n ] : []\n ].filter((l) => typeof l == \"string\").join(`\n`);\n super(a, t.cause ? { cause: t.cause } : void 0), Object.defineProperty(this, \"details\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"docs\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"docsPath\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"shortMessage\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"cause\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"BaseError\"\n }), Object.defineProperty(this, \"version\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: `ox@${XE()}`\n }), this.cause = t.cause, this.details = r, this.docs = o, this.docsPath = n, this.shortMessage = e;\n }\n walk(e) {\n return Z0(this, e);\n }\n};\nfunction Z0(s, e) {\n return e != null && e(s) ? s : s && typeof s == \"object\" && \"cause\" in s && s.cause ? Z0(s.cause, e) : e ? null : s;\n}\nfunction X0(s, e = {}) {\n const { raw: t = !1 } = e, r = s;\n if (t)\n return s;\n if (r.error) {\n const { code: n } = r.error, i = n === Bn.code ? Bn : n === ri.code ? ri : n === di.code ? di : n === ci.code ? ci : n === ai.code ? ai : n === ui.code ? ui : n === oi.code ? oi : n === hi.code ? hi : n === si.code ? si : n === ni.code ? ni : n === ii.code ? ii : n === li.code ? li : mr;\n throw new i(r.error);\n }\n return r.result;\n}\nlet mr = class extends Error {\n constructor(e) {\n const { code: t, message: r, data: n } = e;\n super(r), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.BaseError\"\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"data\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), this.code = t, this.data = n;\n }\n};\nclass ri extends mr {\n constructor(e = {}) {\n super({\n message: \"Missing or invalid parameters.\",\n ...e,\n code: ri.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32e3\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.InvalidInputError\"\n });\n }\n}\nObject.defineProperty(ri, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32e3\n});\nclass si extends mr {\n constructor(e = {}) {\n super({\n message: \"Requested resource not found.\",\n ...e,\n code: si.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32001\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.ResourceNotFoundError\"\n });\n }\n}\nObject.defineProperty(si, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32001\n});\nclass ni extends mr {\n constructor(e = {}) {\n super({\n message: \"Requested resource not available.\",\n ...e,\n code: ni.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32002\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.ResourceUnavailableError\"\n });\n }\n}\nObject.defineProperty(ni, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32002\n});\nclass ii extends mr {\n constructor(e = {}) {\n super({\n message: \"Transaction creation failed.\",\n ...e,\n code: ii.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32003\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.TransactionRejectedError\"\n });\n }\n}\nObject.defineProperty(ii, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32003\n});\nclass oi extends mr {\n constructor(e = {}) {\n super({\n message: \"Method is not implemented.\",\n ...e,\n code: oi.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32004\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.MethodNotSupportedError\"\n });\n }\n}\nObject.defineProperty(oi, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32004\n});\nclass ai extends mr {\n constructor(e = {}) {\n super({\n message: \"Rate limit exceeded.\",\n ...e,\n code: ai.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32005\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.LimitExceededError\"\n });\n }\n}\nObject.defineProperty(ai, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32005\n});\nclass li extends mr {\n constructor(e = {}) {\n super({\n message: \"JSON-RPC version not supported.\",\n ...e,\n code: li.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32006\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.VersionNotSupportedError\"\n });\n }\n}\nObject.defineProperty(li, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32006\n});\nclass ci extends mr {\n constructor(e = {}) {\n super({\n message: \"Input is not a valid JSON-RPC request.\",\n ...e,\n code: ci.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32600\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.InvalidRequestError\"\n });\n }\n}\nObject.defineProperty(ci, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32600\n});\nclass ui extends mr {\n constructor(e = {}) {\n super({\n message: \"Method does not exist.\",\n ...e,\n code: ui.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32601\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.MethodNotFoundError\"\n });\n }\n}\nObject.defineProperty(ui, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32601\n});\nclass di extends mr {\n constructor(e = {}) {\n super({\n message: \"Invalid method parameters.\",\n ...e,\n code: di.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32602\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.InvalidParamsError\"\n });\n }\n}\nObject.defineProperty(di, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32602\n});\nclass Bn extends mr {\n constructor(e = {}) {\n super({\n message: \"Internal JSON-RPC error.\",\n ...e,\n code: Bn.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32603\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.InternalErrorError\"\n });\n }\n}\nObject.defineProperty(Bn, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32603\n});\nclass hi extends mr {\n constructor(e = {}) {\n super({\n message: \"Failed to parse JSON-RPC response.\",\n ...e,\n code: hi.code\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32700\n }), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"RpcResponse.ParseError\"\n });\n }\n}\nObject.defineProperty(hi, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: -32700\n});\nclass nn extends Error {\n constructor(e, t) {\n super(t), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"ProviderRpcError\"\n }), Object.defineProperty(this, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), Object.defineProperty(this, \"details\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: void 0\n }), this.code = e, this.details = t;\n }\n}\nclass J0 extends nn {\n constructor({ message: e = \"The user rejected the request.\" } = {}) {\n super(4001, e), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"Provider.UserRejectedRequestError\"\n });\n }\n}\nObject.defineProperty(J0, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: 4001\n});\nclass Q0 extends nn {\n constructor({ message: e = \"The requested method and/or account has not been authorized by the user.\" } = {}) {\n super(4100, e), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"Provider.UnauthorizedError\"\n });\n }\n}\nObject.defineProperty(Q0, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: 4100\n});\nclass eg extends nn {\n constructor({ message: e = \"The provider does not support the requested method.\" } = {}) {\n super(4200, e), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"Provider.UnsupportedMethodError\"\n });\n }\n}\nObject.defineProperty(eg, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: 4200\n});\nclass tg extends nn {\n constructor({ message: e = \"The provider is disconnected from all chains.\" } = {}) {\n super(4900, e), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"Provider.DisconnectedError\"\n });\n }\n}\nObject.defineProperty(tg, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: 4900\n});\nclass rg extends nn {\n constructor({ message: e = \"The provider is not connected to the requested chain.\" } = {}) {\n super(4901, e), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"Provider.ChainDisconnectedError\"\n });\n }\n}\nObject.defineProperty(rg, \"code\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: 4901\n});\nfunction QE() {\n const s = new L0();\n return {\n get eventNames() {\n return s.eventNames.bind(s);\n },\n get listenerCount() {\n return s.listenerCount.bind(s);\n },\n get listeners() {\n return s.listeners.bind(s);\n },\n addListener: s.addListener.bind(s),\n emit: s.emit.bind(s),\n off: s.off.bind(s),\n on: s.on.bind(s),\n once: s.once.bind(s),\n removeAllListeners: s.removeAllListeners.bind(s),\n removeListener: s.removeListener.bind(s)\n };\n}\nfunction ex(s, e = {}) {\n var r, n;\n const { includeEvents: t = !0 } = e;\n if (!s)\n throw new tx();\n return {\n ...t ? {\n on: (r = s.on) == null ? void 0 : r.bind(s),\n removeListener: (n = s.removeListener) == null ? void 0 : n.bind(s)\n } : {},\n async request(i) {\n const o = await s.request(i);\n return o && typeof o == \"object\" && \"jsonrpc\" in o ? X0(o) : o;\n }\n };\n}\nclass tx extends JE {\n constructor() {\n super(\"`provider` is undefined.\"), Object.defineProperty(this, \"name\", {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: \"Provider.IsUndefinedError\"\n });\n }\n}\nfunction rx(s = {}) {\n let e = s.id ?? 0;\n return {\n prepare(t) {\n return sx({\n id: e++,\n ...t\n });\n },\n get id() {\n return e;\n }\n };\n}\nfunction sx(s) {\n return {\n ...s,\n jsonrpc: \"2.0\"\n };\n}\n/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst sg = Symbol(\"Comlink.proxy\"), nx = Symbol(\"Comlink.endpoint\"), ix = Symbol(\"Comlink.releaseProxy\"), ll = Symbol(\"Comlink.finalizer\"), ho = Symbol(\"Comlink.thrown\"), ng = (s) => typeof s == \"object\" && s !== null || typeof s == \"function\", ox = {\n canHandle: (s) => ng(s) && s[sg],\n serialize(s) {\n const { port1: e, port2: t } = new MessageChannel();\n return og(s, e), [t, [t]];\n },\n deserialize(s) {\n return s.start(), lg(s);\n }\n}, ax = {\n canHandle: (s) => ng(s) && ho in s,\n serialize({ value: s }) {\n let e;\n return s instanceof Error ? e = {\n isError: !0,\n value: {\n message: s.message,\n name: s.name,\n stack: s.stack\n }\n } : e = { isError: !1, value: s }, [e, []];\n },\n deserialize(s) {\n throw s.isError ? Object.assign(new Error(s.value.message), s.value) : s.value;\n }\n}, ig = /* @__PURE__ */ new Map([\n [\"proxy\", ox],\n [\"throw\", ax]\n]);\nfunction lx(s, e) {\n for (const t of s)\n if (e === t || t === \"*\" || t instanceof RegExp && t.test(e))\n return !0;\n return !1;\n}\nfunction og(s, e = globalThis, t = [\"*\"]) {\n e.addEventListener(\"message\", function r(n) {\n if (!n || !n.data)\n return;\n if (!lx(t, n.origin)) {\n console.warn(`Invalid origin '${n.origin}' for comlink proxy`);\n return;\n }\n const { id: i, type: o, path: a } = Object.assign({ path: [] }, n.data), l = (n.data.argumentList || []).map($s);\n let c;\n try {\n const u = a.slice(0, -1).reduce((h, f) => h[f], s), d = a.reduce((h, f) => h[f], s);\n switch (o) {\n case \"GET\":\n c = d;\n break;\n case \"SET\":\n u[a.slice(-1)[0]] = $s(n.data.value), c = !0;\n break;\n case \"APPLY\":\n c = d.apply(u, l);\n break;\n case \"CONSTRUCT\":\n {\n const h = new d(...l);\n c = gx(h);\n }\n break;\n case \"ENDPOINT\":\n {\n const { port1: h, port2: f } = new MessageChannel();\n og(s, f), c = fx(h, [h]);\n }\n break;\n case \"RELEASE\":\n c = void 0;\n break;\n default:\n return;\n }\n } catch (u) {\n c = { value: u, [ho]: 0 };\n }\n Promise.resolve(c).catch((u) => ({ value: u, [ho]: 0 })).then((u) => {\n const [d, h] = zo(u);\n e.postMessage(Object.assign(Object.assign({}, d), { id: i }), h), o === \"RELEASE\" && (e.removeEventListener(\"message\", r), ag(e), ll in s && typeof s[ll] == \"function\" && s[ll]());\n }).catch((u) => {\n const [d, h] = zo({\n value: new TypeError(\"Unserializable return value\"),\n [ho]: 0\n });\n e.postMessage(Object.assign(Object.assign({}, d), { id: i }), h);\n });\n }), e.start && e.start();\n}\nfunction cx(s) {\n return s.constructor.name === \"MessagePort\";\n}\nfunction ag(s) {\n cx(s) && s.close();\n}\nfunction lg(s, e) {\n const t = /* @__PURE__ */ new Map();\n return s.addEventListener(\"message\", function(n) {\n const { data: i } = n;\n if (!i || !i.id)\n return;\n const o = t.get(i.id);\n if (o)\n try {\n o(i);\n } finally {\n t.delete(i.id);\n }\n }), nc(s, t, [], e);\n}\nfunction Vi(s) {\n if (s)\n throw new Error(\"Proxy has been released and is not useable\");\n}\nfunction cg(s) {\n return yn(s, /* @__PURE__ */ new Map(), {\n type: \"RELEASE\"\n }).then(() => {\n ag(s);\n });\n}\nconst qo = /* @__PURE__ */ new WeakMap(), Wo = \"FinalizationRegistry\" in globalThis && new FinalizationRegistry((s) => {\n const e = (qo.get(s) || 0) - 1;\n qo.set(s, e), e === 0 && cg(s);\n});\nfunction ux(s, e) {\n const t = (qo.get(e) || 0) + 1;\n qo.set(e, t), Wo && Wo.register(s, e, s);\n}\nfunction dx(s) {\n Wo && Wo.unregister(s);\n}\nfunction nc(s, e, t = [], r = function() {\n}) {\n let n = !1;\n const i = new Proxy(r, {\n get(o, a) {\n if (Vi(n), a === ix)\n return () => {\n dx(i), cg(s), e.clear(), n = !0;\n };\n if (a === \"then\") {\n if (t.length === 0)\n return { then: () => i };\n const l = yn(s, e, {\n type: \"GET\",\n path: t.map((c) => c.toString())\n }).then($s);\n return l.then.bind(l);\n }\n return nc(s, e, [...t, a]);\n },\n set(o, a, l) {\n Vi(n);\n const [c, u] = zo(l);\n return yn(s, e, {\n type: \"SET\",\n path: [...t, a].map((d) => d.toString()),\n value: c\n }, u).then($s);\n },\n apply(o, a, l) {\n Vi(n);\n const c = t[t.length - 1];\n if (c === nx)\n return yn(s, e, {\n type: \"ENDPOINT\"\n }).then($s);\n if (c === \"bind\")\n return nc(s, e, t.slice(0, -1));\n const [u, d] = Vd(l);\n return yn(s, e, {\n type: \"APPLY\",\n path: t.map((h) => h.toString()),\n argumentList: u\n }, d).then($s);\n },\n construct(o, a) {\n Vi(n);\n const [l, c] = Vd(a);\n return yn(s, e, {\n type: \"CONSTRUCT\",\n path: t.map((u) => u.toString()),\n argumentList: l\n }, c).then($s);\n }\n });\n return ux(i, s), i;\n}\nfunction hx(s) {\n return Array.prototype.concat.apply([], s);\n}\nfunction Vd(s) {\n const e = s.map(zo);\n return [e.map((t) => t[0]), hx(e.map((t) => t[1]))];\n}\nconst ug = /* @__PURE__ */ new WeakMap();\nfunction fx(s, e) {\n return ug.set(s, e), s;\n}\nfunction gx(s) {\n return Object.assign(s, { [sg]: !0 });\n}\nfunction px(s, e = globalThis, t = \"*\") {\n return {\n postMessage: (r, n) => s.postMessage(r, t, n),\n addEventListener: e.addEventListener.bind(e),\n removeEventListener: e.removeEventListener.bind(e)\n };\n}\nfunction zo(s) {\n for (const [e, t] of ig)\n if (t.canHandle(s)) {\n const [r, n] = t.serialize(s);\n return [\n {\n type: \"HANDLER\",\n name: e,\n value: r\n },\n n\n ];\n }\n return [\n {\n type: \"RAW\",\n value: s\n },\n ug.get(s) || []\n ];\n}\nfunction $s(s) {\n switch (s.type) {\n case \"HANDLER\":\n return ig.get(s.name).deserialize(s.value);\n case \"RAW\":\n return s.value;\n }\n}\nfunction yn(s, e, t, r) {\n return new Promise((n) => {\n const i = mx();\n e.set(i, n), s.start && s.start(), s.postMessage(Object.assign({ id: i }, t), r);\n });\n}\nfunction mx() {\n return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join(\"-\");\n}\nconst yx = {\n postMessage() {\n },\n addEventListener: () => {\n },\n removeEventListener: () => {\n }\n}, vx = {\n postMessage: (s) => {\n window.ReactNativeWebView.postMessage(JSON.stringify(s));\n },\n addEventListener: (s, e, ...t) => {\n document.addEventListener(\"FarcasterFrameCallback\", e, ...t);\n },\n removeEventListener: (s, e) => {\n document.removeEventListener(\"FarcasterFrameCallback\", e);\n }\n}, Ex = typeof window > \"u\" ? yx : window != null && window.ReactNativeWebView ? vx : px((window == null ? void 0 : window.parent) ?? window), Me = lg(Ex), uu = QE(), xx = rx();\nfunction Sx({ code: s, details: e }) {\n switch (s) {\n case 4001:\n return new J0();\n case 4100:\n return new Q0();\n case 4200:\n return new eg();\n case 4900:\n return new tg();\n case 4901:\n return new rg();\n default:\n return new nn(s, e ?? \"Unknown provider RPC error\");\n }\n}\nconst fi = ex({\n ...uu,\n async request(s) {\n const e = xx.prepare(s);\n try {\n const t = await Me.ethProviderRequestV2(e).then((r) => X0(r, { request: e, raw: !0 }));\n if (t.error)\n throw Sx(t.error);\n return t.result;\n } catch (t) {\n if (t instanceof Error && t.message.match(/cannot read property 'apply'/i))\n return await Me.ethProviderRequest(e);\n throw t instanceof nn || t instanceof mr ? t : new Bn({\n message: t instanceof Error ? t.message : void 0\n });\n }\n }\n});\nasync function bx() {\n try {\n const s = await Me.getCapabilities();\n return !s.includes(\"wallet.getEthereumProvider\") && !s.includes(\"wallet.getEvmProvider\") ? void 0 : fi;\n } catch {\n return fi;\n }\n}\nfunction dg(s) {\n const e = new CustomEvent(\"eip6963:announceProvider\", { detail: Object.freeze(s) });\n window.dispatchEvent(e);\n const t = () => window.dispatchEvent(e);\n return window.addEventListener(\"eip6963:requestProvider\", t), () => window.removeEventListener(\"eip6963:requestProvider\", t);\n}\ntypeof document < \"u\" && (document.addEventListener(\"eip6963:requestProvider\", () => {\n Me.eip6963RequestProvider();\n}), document.addEventListener(\"FarcasterFrameEthProviderEvent\", (s) => {\n if (s instanceof MessageEvent) {\n const e = s.data;\n uu.emit(e.event, ...e.params);\n }\n}), document.addEventListener(\"FarcasterFrameEvent\", (s) => {\n if (s instanceof MessageEvent) {\n const e = s.data;\n e.event === \"eip6963:announceProvider\" && dg({\n info: e.info,\n provider: fi\n });\n }\n}));\ntypeof window < \"u\" && (window.addEventListener(\"eip6963:requestProvider\", () => {\n Me.eip6963RequestProvider();\n}), window.addEventListener(\"message\", (s) => {\n if (s instanceof MessageEvent && s.data.type === \"frameEthProviderEvent\") {\n const e = s.data;\n uu.emit(e.event, ...e.params);\n }\n}), window.addEventListener(\"message\", (s) => {\n if (s instanceof MessageEvent && s.data.type === \"frameEvent\") {\n const e = s.data.event;\n e.event === \"eip6963:announceProvider\" && dg({\n info: e.info,\n provider: fi\n });\n }\n}));\nnew TextEncoder();\nconst hg = new TextDecoder(), Tx = (s) => {\n const e = atob(s), t = new Uint8Array(e.length);\n for (let r = 0; r < e.length; r++)\n t[r] = e.charCodeAt(r);\n return t;\n}, wx = (s) => {\n let e = s;\n e instanceof Uint8Array && (e = hg.decode(e)), e = e.replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/\\s/g, \"\");\n try {\n return Tx(e);\n } catch {\n throw new TypeError(\"The input to be decoded is not correctly encoded.\");\n }\n}, Ax = wx;\nfunction Ix(s) {\n return typeof s == \"object\" && s !== null;\n}\nfunction _x(s) {\n if (!Ix(s) || Object.prototype.toString.call(s) !== \"[object Object]\")\n return !1;\n if (Object.getPrototypeOf(s) === null)\n return !0;\n let e = s;\n for (; Object.getPrototypeOf(e) !== null; )\n e = Object.getPrototypeOf(e);\n return Object.getPrototypeOf(s) === e;\n}\nclass dr extends Error {\n constructor(e, t) {\n var r;\n super(e, t), this.code = \"ERR_JOSE_GENERIC\", this.name = this.constructor.name, (r = Error.captureStackTrace) == null || r.call(Error, this, this.constructor);\n }\n}\ndr.code = \"ERR_JOSE_GENERIC\";\nclass Rx extends dr {\n constructor(e, t, r = \"unspecified\", n = \"unspecified\") {\n super(e, { cause: { claim: r, reason: n, payload: t } }), this.code = \"ERR_JWT_CLAIM_VALIDATION_FAILED\", this.claim = r, this.reason = n, this.payload = t;\n }\n}\nRx.code = \"ERR_JWT_CLAIM_VALIDATION_FAILED\";\nclass Lx extends dr {\n constructor(e, t, r = \"unspecified\", n = \"unspecified\") {\n super(e, { cause: { claim: r, reason: n, payload: t } }), this.code = \"ERR_JWT_EXPIRED\", this.claim = r, this.reason = n, this.payload = t;\n }\n}\nLx.code = \"ERR_JWT_EXPIRED\";\nclass Cx extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JOSE_ALG_NOT_ALLOWED\";\n }\n}\nCx.code = \"ERR_JOSE_ALG_NOT_ALLOWED\";\nclass kx extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JOSE_NOT_SUPPORTED\";\n }\n}\nkx.code = \"ERR_JOSE_NOT_SUPPORTED\";\nclass Dx extends dr {\n constructor(e = \"decryption operation failed\", t) {\n super(e, t), this.code = \"ERR_JWE_DECRYPTION_FAILED\";\n }\n}\nDx.code = \"ERR_JWE_DECRYPTION_FAILED\";\nclass Px extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JWE_INVALID\";\n }\n}\nPx.code = \"ERR_JWE_INVALID\";\nclass Mx extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JWS_INVALID\";\n }\n}\nMx.code = \"ERR_JWS_INVALID\";\nclass Ts extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JWT_INVALID\";\n }\n}\nTs.code = \"ERR_JWT_INVALID\";\nclass Ox extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JWK_INVALID\";\n }\n}\nOx.code = \"ERR_JWK_INVALID\";\nclass Bx extends dr {\n constructor() {\n super(...arguments), this.code = \"ERR_JWKS_INVALID\";\n }\n}\nBx.code = \"ERR_JWKS_INVALID\";\nclass Fx extends dr {\n constructor(e = \"no applicable key found in the JSON Web Key Set\", t) {\n super(e, t), this.code = \"ERR_JWKS_NO_MATCHING_KEY\";\n }\n}\nFx.code = \"ERR_JWKS_NO_MATCHING_KEY\";\nclass Nx extends dr {\n constructor(e = \"multiple matching keys found in the JSON Web Key Set\", t) {\n super(e, t), this.code = \"ERR_JWKS_MULTIPLE_MATCHING_KEYS\";\n }\n}\nNx.code = \"ERR_JWKS_MULTIPLE_MATCHING_KEYS\";\nclass Ux extends dr {\n constructor(e = \"request timed out\", t) {\n super(e, t), this.code = \"ERR_JWKS_TIMEOUT\";\n }\n}\nUx.code = \"ERR_JWKS_TIMEOUT\";\nclass $x extends dr {\n constructor(e = \"signature verification failed\", t) {\n super(e, t), this.code = \"ERR_JWS_SIGNATURE_VERIFICATION_FAILED\";\n }\n}\n$x.code = \"ERR_JWS_SIGNATURE_VERIFICATION_FAILED\";\nfunction Gx(s) {\n if (typeof s != \"string\")\n throw new Ts(\"JWTs must use Compact JWS serialization, JWT must be a string\");\n const { 1: e, length: t } = s.split(\".\");\n if (t === 5)\n throw new Ts(\"Only JWTs using Compact JWS serialization can be decoded\");\n if (t !== 3)\n throw new Ts(\"Invalid JWT\");\n if (!e)\n throw new Ts(\"JWTs must contain a payload\");\n let r;\n try {\n r = Ax(e);\n } catch {\n throw new Ts(\"Failed to base64url decode the payload\");\n }\n let n;\n try {\n n = JSON.parse(hg.decode(r));\n } catch {\n throw new Ts(\"Failed to parse the decoded payload as JSON\");\n }\n if (!_x(n))\n throw new Ts(\"Invalid JWT Claims Set\");\n return n;\n}\nfunction Vx(s) {\n return Gx(s);\n}\nclass ma extends Error {\n constructor(e, t = {}) {\n const r = (() => {\n var i;\n if (t.cause instanceof ma) {\n if (t.cause.details)\n return t.cause.details;\n if (t.cause.shortMessage)\n return t.cause.shortMessage;\n }\n return t.cause && \"details\" in t.cause && typeof t.cause.details == \"string\" ? t.cause.details : (i = t.cause) != null && i.message ? t.cause.message : t.details;\n })(), n = [\n e || \"An error occurred.\",\n ...t.metaMessages ? [\"\", ...t.metaMessages] : [],\n ...r ? [\n \"\",\n r ? `Details: ${r}` : void 0\n ] : []\n ].filter((i) => typeof i == \"string\").join(`\n`);\n super(n, t.cause ? { cause: t.cause } : void 0), this.name = \"BaseError\", this.cause = t.cause, this.details = r, this.shortMessage = e;\n }\n}\nclass fg extends ma {\n constructor({ status: e }) {\n super(`Request failed with status ${e}`), this.name = \"RequestFailedError\";\n }\n}\nclass jx extends ma {\n constructor(e) {\n super(e), this.name = \"InvalidToken\";\n }\n}\nasync function Kx({ origin: s }) {\n const e = await fetch(`${s}/nonce`, {\n method: \"POST\"\n });\n if (!e.ok)\n throw new fg({ status: e.status });\n return await e.json();\n}\nasync function Hx({ origin: s }, e) {\n const t = await fetch(`${s}/verify-siwf`, {\n method: \"POST\",\n headers: new Headers({ \"Content-Type\": \"application/json\" }),\n body: JSON.stringify(e)\n });\n if (!t.ok)\n throw new fg({ status: t.status });\n const r = await t.json();\n if (r.valid === !1)\n throw new jx(r.message ?? \"unknown\");\n return { token: r.token };\n}\nfunction qx(s = {}) {\n return {\n origin: s.origin ?? \"https://auth.farcaster.xyz\"\n };\n}\nfunction Wx(s = {}) {\n const e = qx(s);\n return {\n generateNonce: () => Kx(e),\n verifySiwf: (t) => Hx(e, t)\n };\n}\nconst zx = /^(?:(?<scheme>[a-zA-Z][a-zA-Z0-9+-.]*):\\/\\/)?(?<domain>[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\\n)(?<address>0x[a-fA-F0-9]{40})\\n\\n(?:(?<statement>.*)\\n\\n)?/, Yx = /(?:URI: (?<uri>.+))\\n(?:Version: (?<version>.+))\\n(?:Chain ID: (?<chainId>\\d+))\\n(?:Nonce: (?<nonce>[a-zA-Z0-9]+))\\n(?:Issued At: (?<issuedAt>.+))(?:\\nExpiration Time: (?<expirationTime>.+))?(?:\\nNot Before: (?<notBefore>.+))?(?:\\nRequest ID: (?<requestId>.+))?/;\nfunction Zx(s) {\n var d, h, f;\n const { scheme: e, statement: t, ...r } = ((d = s.match(zx)) == null ? void 0 : d.groups) ?? {}, { chainId: n, expirationTime: i, issuedAt: o, notBefore: a, requestId: l, ...c } = ((h = s.match(Yx)) == null ? void 0 : h.groups) ?? {}, u = (f = s.split(\"Resources:\")[1]) == null ? void 0 : f.split(`\n- `).slice(1);\n return {\n ...r,\n ...c,\n ...n ? { chainId: Number(n) } : {},\n ...i ? { expirationTime: new Date(i) } : {},\n ...o ? { issuedAt: new Date(o) } : {},\n ...a ? { notBefore: new Date(a) } : {},\n ...l ? { requestId: l } : {},\n ...u ? { resources: u } : {},\n ...e ? { scheme: e } : {},\n ...t ? { statement: t } : {}\n };\n}\nconst jd = /* @__PURE__ */ (() => {\n let s, e;\n async function t(r) {\n const n = Wx({\n origin: r.quickAuthServerOrigin\n }), { nonce: i } = await n.generateNonce(), o = await Me.signIn({\n nonce: i,\n acceptAuthAddress: !0\n });\n if (o.result) {\n const a = Zx(o.result.message);\n if (!a.domain)\n throw new Error(\"Missing domain on SIWE message\");\n const l = await n.verifySiwf({\n domain: a.domain,\n message: o.result.message,\n signature: o.result.signature\n });\n return s = {\n token: l.token,\n payload: Vx(l.token)\n }, l;\n }\n throw o.error.type === \"rejected_by_user\" ? new Of() : new Error(\"Unreachable\");\n }\n return {\n get token() {\n if (s && new Date(s.payload.exp * 1e3) > new Date(Date.now() + 15e3))\n return s.token;\n },\n async getToken(r = {}) {\n const n = r.force ?? !1;\n return s && !n && new Date(s.payload.exp * 1e3) > new Date(Date.now() + 15e3) ? { token: s.token } : (e || (e = t(r)), e.finally(() => {\n e = void 0;\n }), e);\n },\n async fetch(r, n) {\n const { token: i } = await this.getToken(), o = new Headers(n == null ? void 0 : n.headers);\n return o.set(\"Authorization\", `Bearer ${i}`), fetch(r, {\n ...n,\n headers: o\n });\n }\n };\n})();\nfunction Xx() {\n const s = new L0();\n return {\n get eventNames() {\n return s.eventNames.bind(s);\n },\n get listenerCount() {\n return s.listenerCount.bind(s);\n },\n get listeners() {\n return s.listeners.bind(s);\n },\n addListener: s.addListener.bind(s),\n emit: s.emit.bind(s),\n off: s.off.bind(s),\n on: s.on.bind(s),\n once: s.once.bind(s),\n removeAllListeners: s.removeAllListeners.bind(s),\n removeListener: s.removeListener.bind(s)\n };\n}\nconst nr = Xx(), { solanaProviderRequest: Kd } = Me;\nlet gg;\nKd && (gg = VE(KE(Kd)));\nasync function Hd() {\n let s;\n try {\n s = await Me.getCapabilities();\n } catch {\n }\n if (s != null && s.includes(\"wallet.getSolanaProvider\"))\n return gg;\n}\nlet qd = null;\nasync function Jx(s = 1e3) {\n if (qd === !0)\n return !0;\n if (typeof window > \"u\" || !window.ReactNativeWebView && window === window.parent)\n return !1;\n const e = await Promise.race([\n Me.context.then((t) => !!t),\n // Check if context resolves to truthy\n new Promise((t) => {\n setTimeout(() => t(!1), s);\n })\n ]).catch(() => !1);\n return e && (qd = !0), e;\n}\nconst Wd = async () => {\n const s = await Me.addFrame();\n if (s.result)\n return s.result;\n throw s.error.type === \"invalid_domain_manifest\" ? new Tm() : s.error.type === \"rejected_by_user\" ? new wm() : new Error(\"Unreachable\");\n}, ht = {\n ...nr,\n getCapabilities: Me.getCapabilities,\n getChains: Me.getChains,\n isInMiniApp: Jx,\n context: Me.context,\n back: HE({ miniAppHost: Me, emitter: nr }),\n quickAuth: jd,\n actions: {\n setPrimaryButton: Me.setPrimaryButton.bind(Me),\n ready: async (s = {}) => await Me.ready(s),\n close: Me.close.bind(Me),\n viewCast: Me.viewCast.bind(Me),\n viewProfile: Me.viewProfile.bind(Me),\n openMiniApp: Me.openMiniApp.bind(Me),\n signIn: async (s) => {\n const e = await Me.signIn(s);\n if (e.result)\n return e.result;\n throw e.error.type === \"rejected_by_user\" ? new Of() : new Error(\"Unreachable\");\n },\n openUrl: (s) => {\n const e = typeof s == \"string\" ? s : s.url;\n return Me.openUrl(e.trim());\n },\n addFrame: Wd,\n addMiniApp: Wd,\n composeCast(s = {}) {\n return Me.composeCast(s);\n },\n viewToken: Me.viewToken.bind(Me),\n sendToken: Me.sendToken.bind(Me),\n swapToken: Me.swapToken.bind(Me),\n requestCameraAndMicrophoneAccess: Me.requestCameraAndMicrophoneAccess.bind(Me)\n },\n experimental: {\n getSolanaProvider: Hd,\n signManifest: async (s) => {\n const e = await Me.signManifest(s);\n if (e.result)\n return e.result;\n throw e.error.type === \"rejected_by_user\" ? new Am() : e.error.type === \"invalid_domain\" ? new Im() : e.error.type === \"generic_error\" ? new _m(e.error.message) : new Error(\"Unreachable\");\n },\n quickAuth(s) {\n return jd.getToken(s);\n }\n },\n wallet: {\n ethProvider: fi,\n getEthereumProvider: bx,\n getSolanaProvider: Hd\n },\n haptics: {\n impactOccurred: Me.impactOccurred.bind(Me),\n notificationOccurred: Me.notificationOccurred.bind(Me),\n selectionChanged: Me.selectionChanged.bind(Me)\n }\n};\ntypeof document < \"u\" && document.addEventListener(\"FarcasterFrameEvent\", (s) => {\n if (s instanceof MessageEvent) {\n const e = s.data;\n e.event === \"primary_button_clicked\" ? nr.emit(\"primaryButtonClicked\") : e.event === \"miniapp_added\" ? nr.emit(\"miniAppAdded\", {\n notificationDetails: e.notificationDetails\n }) : e.event === \"miniapp_add_rejected\" ? nr.emit(\"miniAppAddRejected\", { reason: e.reason }) : e.event === \"miniapp_removed\" ? nr.emit(\"miniAppRemoved\") : e.event === \"notifications_enabled\" ? nr.emit(\"notificationsEnabled\", {\n notificationDetails: e.notificationDetails\n }) : e.event === \"notifications_disabled\" ? nr.emit(\"notificationsDisabled\") : e.event === \"back_navigation_triggered\" && nr.emit(\"backNavigationTriggered\");\n }\n});\ntypeof window < \"u\" && window.addEventListener(\"message\", (s) => {\n if (s instanceof MessageEvent && s.data.type === \"frameEvent\") {\n const e = s.data.event;\n e.event === \"primary_button_clicked\" ? nr.emit(\"primaryButtonClicked\") : e.event === \"miniapp_added\" ? nr.emit(\"miniAppAdded\", {\n notificationDetails: e.notificationDetails\n }) : e.event === \"miniapp_add_rejected\" ? nr.emit(\"miniAppAddRejected\", { reason: e.reason }) : e.event === \"miniapp_removed\" ? nr.emit(\"miniAppRemoved\") : e.event === \"notifications_enabled\" ? nr.emit(\"notificationsEnabled\", {\n notificationDetails: e.notificationDetails\n }) : e.event === \"notifications_disabled\" ? nr.emit(\"notificationsDisabled\") : e.event === \"back_navigation_triggered\" && nr.emit(\"backNavigationTriggered\");\n }\n});\nfunction Qx(s) {\n if (typeof window > \"u\")\n return;\n const e = (t) => s(t.detail);\n return window.addEventListener(\"eip6963:announceProvider\", e), window.dispatchEvent(new CustomEvent(\"eip6963:requestProvider\")), () => window.removeEventListener(\"eip6963:announceProvider\", e);\n}\nfunction eS() {\n const s = /* @__PURE__ */ new Set();\n let e = [];\n const t = () => Qx((n) => {\n e.some(({ info: i }) => i.uuid === n.info.uuid) || (e = [...e, n], s.forEach((i) => i(e, { added: [n] })));\n });\n let r = t();\n return {\n _listeners() {\n return s;\n },\n clear() {\n s.forEach((n) => n([], { removed: [...e] })), e = [];\n },\n destroy() {\n this.clear(), s.clear(), r == null || r();\n },\n findProvider({ rdns: n }) {\n return e.find((i) => i.info.rdns === n);\n },\n getProviders() {\n return e;\n },\n reset() {\n this.clear(), r == null || r(), r = t();\n },\n subscribe(n, { emitImmediately: i } = {}) {\n return s.add(n), i && n(e, { added: e }), () => s.delete(n);\n }\n };\n}\nfunction tS(s, e = {}, t) {\n if (!t || t === \"\") {\n console.debug(\"Amplitude: Skipping event tracking - no userId available yet\");\n return;\n }\n const r = {\n event_type: s,\n api_key: \"0c4fe46171b9bb8eca2ca61eb71f2e19\",\n time: Date.now(),\n user_id: t,\n ...Object.keys(e).length && {\n event_properties: e\n }\n };\n fetch(\"https://api2.amplitude.com/2/httpapi\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n api_key: \"0c4fe46171b9bb8eca2ca61eb71f2e19\",\n events: [r]\n })\n }).then((n) => {\n n.ok || console.debug(\"Amplitude response error:\", n.status, n.statusText);\n }).catch((n) => {\n console.debug(\"Amplitude tracking error:\", n);\n });\n}\nconst pg = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({\n analyticsEnabled: !1,\n backButtonEnabled: !1,\n returnUrl: void 0\n}), mg = react__WEBPACK_IMPORTED_MODULE_0___default().createContext(void 0);\nfunction rS() {\n const {\n analyticsEnabled: s,\n backButtonEnabled: e,\n returnUrl: t\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(pg), [r, n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [i, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [a, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [c, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [d, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [f, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}), [y, E] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [b, R] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [A, F] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(/* @__PURE__ */ new Set()), H = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(/* @__PURE__ */ new Map()), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({}), j = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(\"\");\n K.current = f, j.current = y;\n const C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((m, v = {}, P) => {\n s && tS(m, v, P);\n }, [s]), k = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((m) => {\n R((v) => {\n const P = [...v, m];\n return C(\"navigation.setActiveTab\", {\n ...K.current,\n toTab: m,\n historyLength: P.length\n }, j.current), P;\n }), F(m);\n }, [C]), $ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m) => {\n const v = typeof m == \"string\" ? m : m.url;\n await ht.isInMiniApp() ? await ht.actions.openUrl(v) : window.open(v, \"_blank\");\n }, []), W = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n await ht.isInMiniApp() ? await ht.actions.close() : window.close();\n }, []), _ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n R((m) => {\n if (m.length === 0)\n return t && $(t), m;\n const v = m.slice(0, -1), P = v.length > 0 ? v[v.length - 1] : \"\";\n return F(P), C(\"navigation.navBack\", {\n ...K.current,\n fromTab: m[m.length - 1],\n toTab: P,\n historyLength: v.length\n }, j.current), v;\n });\n }, [C, t, $]), g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((m) => {\n R([m]), F(m), C(\"navigation.setInitialTab\", {\n ...K.current,\n tab: m\n }, j.current);\n }, [C]), x = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m) => (C(\"haptics.impactOccurred\", {\n ...K.current,\n hapticType: m\n }, j.current), ht.haptics.impactOccurred(m)), [C]), w = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m) => (C(\"haptics.notificationOccurred\", {\n ...K.current,\n hapticType: m\n }, j.current), ht.haptics.notificationOccurred(m)), [C]), D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => (C(\"haptics.selectionChanged\", {\n ...K.current\n }, j.current), ht.haptics.selectionChanged()), [C]), O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m, v) => (v && s && C(\"cast.composed\", {\n ...K.current,\n castText: m == null ? void 0 : m.text,\n source: v\n }, j.current), ht.actions.composeCast(m)), [s, C]), U = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(_);\n U.current = _, (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (r)\n return;\n let m = !0, v = null;\n const P = async () => {\n const N = await ht.context;\n if (!m) return;\n if (o(N), ht.on(\"miniAppAdded\", ({\n notificationDetails: ee\n }) => {\n l(!0), u(ee ?? null), h(\"Frame added\"), C(\"frame.added\", K.current, j.current);\n }), ht.on(\"miniAppAddRejected\", ({\n reason: ee\n }) => {\n l(!1), h(`Frame add rejected: ${ee}`), C(\"frame.add.rejected\", K.current, j.current);\n }), ht.on(\"miniAppRemoved\", () => {\n l(!1), h(\"Frame removed\"), C(\"frame.removed\", K.current, j.current);\n }), ht.on(\"notificationsEnabled\", ({\n notificationDetails: ee\n }) => {\n u(ee ?? null), h(\"Notifications enabled\"), C(\"notifications.enabled\", K.current, j.current);\n }), ht.on(\"notificationsDisabled\", () => {\n u(null), h(\"Notifications disabled\"), C(\"notifications.disabled\", K.current, j.current);\n }), ht.on(\"primaryButtonClicked\", () => {\n h(\"Primary button clicked\"), C(\"primary-button.clicked\", K.current, j.current);\n }), v = eS().subscribe(() => {\n }), await ht.actions.ready(), e)\n try {\n ht.back.onback = () => {\n C(\"back-button.clicked\", K.current, j.current), U.current();\n }, await ht.back.show();\n } catch (ee) {\n console.warn(\"Back button not supported by this client:\", ee);\n }\n m && n(!0);\n };\n if (ht)\n return P(), () => {\n m = !1, ht.removeAllListeners(), ht.back.onback = null, ht.back.hide(), v && v(), H.current.forEach((N) => clearTimeout(N)), H.current.clear(), M.current.clear();\n };\n }, [\n // Only include stable references that won't change\n e,\n C\n ]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i != null && i.user && (i != null && i.client) && (p({\n username: i.user.username,\n clientFid: i.client.clientFid\n }), E(`${i.user.fid}`), C(\"frame.opened\", {\n username: i.user.username,\n clientFid: i.client.clientFid,\n location: i.location,\n added: i.client.added\n }, `${i.user.fid}`));\n }, [i, C]);\n const [V, L] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const m = () => {\n L(window.location.href);\n };\n m(), window.addEventListener(\"popstate\", m);\n const v = window.history.pushState, P = window.history.replaceState;\n return window.history.pushState = function(...N) {\n v.apply(window.history, N), m();\n }, window.history.replaceState = function(...N) {\n P.apply(window.history, N), m();\n }, () => {\n window.removeEventListener(\"popstate\", m), window.history.pushState = v, window.history.replaceState = P;\n };\n }, []), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var Y, ee;\n if (!((Y = i == null ? void 0 : i.user) != null && Y.fid) || !((ee = i == null ? void 0 : i.client) != null && ee.clientFid) || !V)\n return;\n const m = new URLSearchParams(window.location.search), v = m.get(\"utm_source\"), P = m.get(\"utm_medium\"), N = m.get(\"utm_campaign\");\n if (v === \"neynar\" && (P != null && P.startsWith(\"share-cast-\"))) {\n const ie = P.replace(\"share-cast-\", \"\");\n C(\"cast.shared\", {\n username: i.user.username,\n clientFid: i.client.clientFid,\n sharedByFid: ie\n }, `${i.user.fid}`);\n }\n if (v === \"neynar\" && N) {\n const ie = `${N}_${i.user.fid}_${Date.now()}`;\n if (M.current.has(ie))\n return;\n const Te = H.current.get(ie);\n Te && clearTimeout(Te), M.current.add(ie);\n const De = setTimeout(async () => {\n try {\n const ze = await fetch(\"https://api.neynar.com/v2/farcaster/frame/notifications/open\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({\n campaign_id: N,\n fid: i.user.fid,\n app_fid: i.client.clientFid\n })\n });\n ze.ok || console.error(\"Failed to mark notification as opened: \", await ze.text());\n } catch (ze) {\n console.error(\"Error marking notification as opened: \", ze);\n } finally {\n M.current.delete(ie), H.current.delete(ie);\n }\n }, 1e3);\n H.current.set(ie, De);\n }\n }, [i, C, V]), {\n ...ht,\n isSDKLoaded: r,\n context: i,\n added: a,\n notificationDetails: c,\n lastEvent: d,\n currentTab: A,\n setActiveTab: k,\n setInitialTab: g,\n haptics: {\n impactOccurred: x,\n notificationOccurred: w,\n selectionChanged: D\n },\n actions: {\n ...ht.actions,\n openUrl: $,\n close: W,\n composeCast: O\n }\n };\n}\nfunction sS({\n children: s\n}) {\n const e = rS();\n return e.isSDKLoaded ? /* @__PURE__ */ q.jsx(mg.Provider, {\n value: e,\n children: s\n }) : null;\n}\nfunction dR({\n children: s,\n analyticsEnabled: e = !1,\n backButtonEnabled: t = !1,\n returnUrl: r\n}) {\n const n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n analyticsEnabled: e,\n backButtonEnabled: t,\n returnUrl: r\n }), [e, t, r]);\n return /* @__PURE__ */ q.jsx(pg.Provider, {\n value: n,\n children: /* @__PURE__ */ q.jsx(sS, {\n children: s\n })\n });\n}\nfunction hR() {\n const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(mg);\n if (s === void 0)\n throw new Error(\"useMiniApp must be used within a MiniAppProvider\");\n return s;\n}\nvar yg = /* @__PURE__ */ ((s) => (s.Light = \"light\", s.Dark = \"dark\", s))(yg || {}), gs = /* @__PURE__ */ ((s) => (s.FARCASTER = \"farcaster\", s.NEYNAR = \"neynar\", s.WARPCAST = \"warpcast\", s))(gs || {});\nfunction du(s, e = \"\", {\n serialize: t = JSON.stringify,\n deserialize: r = JSON.parse\n} = {}) {\n const [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {\n if (typeof window > \"u\")\n return e;\n try {\n const l = window.localStorage.getItem(s);\n return l ? r(l) : e;\n } catch (l) {\n return console.error(\"Error reading from localStorage\", l), e;\n }\n });\n return [n, (l) => {\n try {\n const c = l instanceof Function ? l(n) : l;\n i(c), typeof window < \"u\" && window.localStorage.setItem(s, t(c));\n } catch (c) {\n console.error(\"Error writing to localStorage\", c);\n }\n }, () => {\n try {\n window.localStorage.removeItem(s), i(e);\n } catch (l) {\n console.error(\"Error removing from localStorage\", l);\n }\n }];\n}\nvar jn = /* @__PURE__ */ ((s) => (s.NEYNAR_AUTHENTICATED_USER = \"neynar_authenticated_user\", s))(jn || {});\nconst vg = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(void 0), nS = ({\n children: s,\n _setIsAuthenticated: e,\n _setUser: t,\n _onAuthSuccess: r,\n _onSignout: n\n}) => {\n const {\n isAuthenticated: i\n } = ts(), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [u] = du(jn.NEYNAR_AUTHENTICATED_USER);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n e(o);\n }, [o]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n a(i);\n }, [i]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n u ? (c(u), a(!0)) : (c(null), a(!1));\n }, []), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n t(l);\n }, [l]);\n const d = (p) => {\n r && r(p);\n }, h = (p) => {\n n && n(p);\n }, f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n isAuthenticated: o,\n user: l,\n setIsAuthenticated: a,\n setUser: c,\n onAuthSuccess: d,\n onSignout: h\n }), [o, l]);\n return /* @__PURE__ */ q.jsx(vg.Provider, {\n value: f,\n children: s\n });\n}, Eg = () => {\n const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(vg);\n if (!s)\n throw new Error(\"useAuth must be used within a AuthContextProvider\");\n return s;\n}, iS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"tbaom7c\"]\n}), oS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"t1ff44zi\"],\n variants: [{\n props: {\n type: \"success\"\n },\n className: \"t1ff44zi-1\"\n }, {\n props: {\n type: \"error\"\n },\n className: \"t1ff44zi-2\"\n }, {\n props: {\n type: \"warning\"\n },\n className: \"t1ff44zi-3\"\n }, {\n props: {\n type: \"info\"\n },\n className: \"t1ff44zi-4\"\n }]\n});\nvar xg = /* @__PURE__ */ ((s) => (s.Success = \"success\", s.Error = \"error\", s.Warning = \"warning\", s.Info = \"info\", s))(xg || {});\nconst Sg = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(void 0), fR = ({\n children: s,\n settings: {\n clientId: e,\n defaultTheme: t = yg.Light,\n eventsCallbacks: r\n }\n}) => {\n const [n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(e), [i, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [a, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(t), [c, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [d, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), f = (A, F) => {\n const M = {\n type: A,\n message: F\n };\n u((H) => [...H, M]), setTimeout(() => p(M), 5e3);\n }, p = (A) => {\n u((F) => F.filter((M) => M !== A));\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const A = document.querySelector(\":root\");\n A && (a === \"light\" ? (A.classList.add(\"theme-light\"), A.classList.remove(\"theme-dark\")) : a === \"dark\" && (A.classList.add(\"theme-dark\"), A.classList.remove(\"theme-light\")));\n }, [a]);\n const y = (A) => {\n o(A);\n }, E = (A) => {\n h(A);\n }, b = () => {\n if (d) {\n const {\n signer_uuid: A,\n ...F\n } = d;\n h(null), o(!1), localStorage.removeItem(jn.NEYNAR_AUTHENTICATED_USER), r != null && r.onSignout && r.onSignout(F);\n }\n }, R = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n client_id: n,\n theme: a,\n isAuthenticated: i,\n user: d,\n setTheme: l,\n showToast: f,\n logoutUser: b\n }), [n, a, i, d, l, f, b]);\n return /* @__PURE__ */ q.jsx(Sg.Provider, {\n value: R,\n children: /* @__PURE__ */ q.jsxs(nS, {\n _setIsAuthenticated: y,\n _setUser: E,\n _onAuthSuccess: r == null ? void 0 : r.onAuthSuccess,\n _onSignout: r == null ? void 0 : r.onSignout,\n children: [s, /* @__PURE__ */ q.jsx(iS, {\n children: c.map((A, F) => /* @__PURE__ */ q.jsx(oS, {\n type: A.type,\n children: A.message\n }, F))\n })]\n })\n });\n}, ts = () => {\n const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Sg);\n if (!s)\n throw new Error(\"useNeynarContext must be used within a NeynarContextProvider\");\n return s;\n}, aS = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n width: \"18\",\n height: \"17\",\n viewBox: \"0 0 18 17\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n children: [/* @__PURE__ */ q.jsx(\"path\", {\n d: \"M13.7222 0H4.27778C2.19137 0 0.5 1.69137 0.5 3.77778V13.2222C0.5 15.3086 2.19137 17 4.27778 17H13.7222C15.8086 17 17.5 15.3086 17.5 13.2222V3.77778C17.5 1.69137 15.8086 0 13.7222 0Z\",\n fill: \"#855DCD\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M4.88281 2.64453H13.1184V14.3556H11.9095V8.9912H11.8976C11.764 7.50859 10.518 6.34675 9.00059 6.34675C7.4832 6.34675 6.23717 7.50859 6.10356 8.9912H6.0917V14.3556H4.88281V2.64453Z\",\n fill: \"white\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M2.69141 4.30664L3.18252 5.96886H3.59807V12.6933C3.38943 12.6933 3.2203 12.8625 3.2203 13.0711V13.5244H3.14474C2.9361 13.5244 2.76696 13.6936 2.76696 13.9022V14.3555H6.99807V13.9022C6.99807 13.6936 6.82893 13.5244 6.6203 13.5244H6.54474V13.0711C6.54474 12.8625 6.3756 12.6933 6.16696 12.6933H5.71363V4.30664H2.69141Z\",\n fill: \"white\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M11.9854 12.6933C11.7768 12.6933 11.6076 12.8625 11.6076 13.0711V13.5244H11.5321C11.3235 13.5244 11.1543 13.6936 11.1543 13.9022V14.3555H15.3854V13.9022C15.3854 13.6936 15.2162 13.5244 15.0076 13.5244H14.9321V13.0711C14.9321 12.8625 14.7629 12.6933 14.5543 12.6933V5.96886H14.9699L15.461 4.30664H12.4387V12.6933H11.9854Z\",\n fill: \"white\"\n })]\n}), zd = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n width: \"32\",\n height: \"17\",\n viewBox: \"0 0 50 28\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n children: [/* @__PURE__ */ q.jsx(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M38.3744 13.7311C38.3744 16.1209 37.7639 18.368 36.6904 20.3252C32.5685 19.8525 27.847 18.9503 22.8999 17.6247C20.4058 16.9564 18.0151 16.2236 15.7697 15.4495L15.7693 15.4486C15.7579 15.445 15.7465 15.4413 15.7351 15.4376C15.6448 15.4064 15.5547 15.3752 15.4649 15.3439C12.8978 14.399 11.2356 12.2056 11.4168 10.0315L11.4482 10.0399L11.4215 10.0133C13.0427 4.23612 18.3483 0 24.6434 0C32.2268 0 38.3744 6.14762 38.3744 13.7311Z\",\n fill: \"black\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M11.3804 17.2987C12.4882 16.5313 13.9658 16.1804 15.5002 16.3953C17.7731 17.156 20.1682 17.8782 22.6535 18.5441C27.397 19.8151 31.9584 20.7444 36.0833 21.3275C33.623 25.0252 29.4177 27.4619 24.6434 27.4619C18.294 27.4619 12.9511 23.1524 11.3804 17.2987Z\",\n fill: \"black\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M43.0917 13.4458C41.6461 12.6648 39.9756 11.8759 38.1233 11.1029C38.0363 10.6544 37.9275 10.2136 37.7981 9.78174C39.9806 10.6648 41.9403 11.5752 43.6139 12.4794C45.7007 13.6069 47.3703 14.7394 48.4714 15.816C49.5356 16.8566 50.2295 18.0063 49.93 19.1241C49.6304 20.2419 48.4547 20.8906 47.0128 21.2597C45.5209 21.6415 43.5087 21.7875 41.1377 21.7206C39.6046 21.6773 37.9082 21.5444 36.0864 21.3234C36.3086 20.9891 36.5165 20.6446 36.7094 20.2906C38.3134 20.4733 39.8091 20.5841 41.1687 20.6225C43.4946 20.6882 45.3908 20.5409 46.7404 20.1955C48.14 19.8373 48.7389 19.3249 48.8689 18.8398C48.9989 18.3547 48.7364 17.6115 47.7034 16.6015C46.7073 15.6275 45.1388 14.5519 43.0917 13.4458ZM8.86229 3.16772C10.7583 3.22128 12.9038 3.41177 15.2278 3.73661C14.8974 4.04803 14.5824 4.37566 14.2841 4.71822C12.3016 4.46314 10.4678 4.312 8.83127 4.26577C6.50541 4.20006 4.6092 4.34737 3.25958 4.69279C1.86001 5.05099 1.26107 5.56342 1.13109 6.04849C1.00112 6.53356 1.2636 7.27681 2.29657 8.2868C3.29267 9.26075 4.86118 10.3364 6.90828 11.4425C6.94181 11.4606 6.97546 11.4787 7.00923 11.4968C6.84251 11.5938 6.72574 11.7161 6.66353 11.8645C6.57791 12.0688 6.60013 12.3121 6.72013 12.5874C6.60757 12.5279 6.49623 12.4684 6.38612 12.4089C4.29926 11.2814 2.62971 10.1489 1.5286 9.07223C0.464367 8.03166 -0.229485 6.882 0.0700354 5.76418C0.369556 4.64635 1.54528 3.99764 2.98722 3.6286C4.47911 3.24677 6.49126 3.10074 8.86229 3.16772Z\",\n fill: \"black\"\n }), /* @__PURE__ */ q.jsx(\"ellipse\", {\n cx: \"5.94866\",\n cy: \"11.5309\",\n rx: \"3.76009\",\n ry: \"0.575832\",\n transform: \"rotate(29.2824 5.94866 11.5309)\",\n fill: \"black\"\n })]\n}), lS = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n width: \"17\",\n height: \"17\",\n viewBox: \"0 0 17 17\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n children: [/* @__PURE__ */ q.jsx(\"mask\", {\n id: \"mask0_875_48\",\n maskUnits: \"userSpaceOnUse\",\n x: \"0\",\n y: \"0\",\n width: \"17\",\n height: \"17\",\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M16.9947 0H0V16.9947H16.9947V0Z\",\n fill: \"white\"\n })\n }), /* @__PURE__ */ q.jsxs(\"g\", {\n mask: \"url(#mask0_875_48)\",\n children: [/* @__PURE__ */ q.jsx(\"path\", {\n d: \"M12.7871 16.9947H4.20765C1.88755 16.9947 0 15.1073 0 12.7871V4.20771C0 1.88756 1.88755 0 4.20765 0H12.7871C15.1072 0 16.9947 1.88756 16.9947 4.20771V12.7871C16.9947 15.1073 15.1072 16.9947 12.7871 16.9947Z\",\n fill: \"#472A91\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M11.1523 5.37891L10.3143 8.52601L9.47364 5.37891H7.53893L6.69017 8.54919L5.84419 5.37891H3.64062L5.68823 12.3371H7.58931L8.49835 9.10599L9.40736 12.3371H11.3125L13.3557 5.37891H11.1523Z\",\n fill: \"white\"\n })]\n })]\n});\nvar cS = {};\nconst ic = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n classes: [\"ippfsqr\"]\n}), uS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n classes: [\"b1yzssjb\"]\n}), dS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"m1xn8b2e\"]\n}), hS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n classes: [\"mwuiqyg\"]\n}), fS = (s, e) => {\n if (e)\n return e;\n switch (s) {\n case gs.FARCASTER:\n return \"Sign in with Farcaster\";\n case gs.NEYNAR:\n return \"Sign in with Neynar\";\n case gs.WARPCAST:\n return \"Sign in with Warpcast\";\n default:\n return \"Sign in with Neynar\";\n }\n}, gS = (s, e, t) => {\n if (e)\n return e;\n if (t)\n return /* @__PURE__ */ q.jsx(ic, {\n src: t,\n alt: \"Custom logo\"\n });\n switch (s) {\n case gs.FARCASTER:\n return /* @__PURE__ */ q.jsx(aS, {});\n case gs.NEYNAR:\n return /* @__PURE__ */ q.jsx(zd, {});\n case gs.WARPCAST:\n return /* @__PURE__ */ q.jsx(lS, {});\n default:\n return /* @__PURE__ */ q.jsx(zd, {});\n }\n}, pS = ({\n children: s,\n label: e,\n variant: t = gs.NEYNAR,\n icon: r,\n customLogoUrl: n,\n modalStyle: i = {},\n modalButtonStyle: o = {},\n ...a\n}) => {\n const {\n client_id: l,\n user: c,\n isAuthenticated: u\n } = ts(), {\n setIsAuthenticated: d,\n setUser: h,\n onAuthSuccess: f,\n onSignout: p\n } = Eg(), [y, E, b] = du(jn.NEYNAR_AUTHENTICATED_USER), [R, A] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), F = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), M = `${cS.NEYNAR_LOGIN_URL ?? \"https://app.neynar.com/login\"}?client_id=${l}`, H = new URL(M).origin, K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), j = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (g) => {\n var x;\n if (g.origin === H && g.data && g.data.is_authenticated) {\n d(!0), (x = F.current) == null || x.close(), window.removeEventListener(\"message\", j);\n const w = {\n signer_uuid: g.data.signer_uuid,\n ...g.data.user\n };\n E(w), h(w), f({\n user: w\n });\n }\n }, [l, d]), C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const w = window.screen.width / 2 - 300, O = `width=600,height=700,top=${window.screen.height / 2 - 700 / 2},left=${w}`;\n if (F.current = window.open(M, \"_blank\", O), !F.current) {\n console.error(\"Failed to open the authentication window. Please check your pop-up blocker settings.\");\n return;\n }\n window.addEventListener(\"message\", j, !1);\n }, [l, j]), k = () => {\n if (c) {\n const g = c;\n b(), d(!1), W();\n const {\n signer_uuid: x,\n ...w\n } = g;\n p(w);\n }\n }, $ = () => A(!0), W = () => A(!1);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => () => {\n window.removeEventListener(\"message\", j);\n }, [j]);\n const _ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((g) => {\n K.current && !K.current.contains(g.target) && W();\n }, []);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => (R ? document.addEventListener(\"mousedown\", _) : document.removeEventListener(\"mousedown\", _), () => {\n document.removeEventListener(\"mousedown\", _);\n }), [R, _]), /* @__PURE__ */ q.jsxs(q.Fragment, {\n children: [R && /* @__PURE__ */ q.jsxs(dS, {\n style: i,\n ref: K,\n children: [/* @__PURE__ */ q.jsx(ic, {\n src: c == null ? void 0 : c.pfp_url,\n alt: c == null ? void 0 : c.username\n }), /* @__PURE__ */ q.jsxs(\"span\", {\n children: [\"@\", c == null ? void 0 : c.username]\n }), /* @__PURE__ */ q.jsx(hS, {\n style: o,\n onClick: k,\n children: \"Sign out\"\n })]\n }), /* @__PURE__ */ q.jsx(uS, {\n onClick: u ? $ : C,\n ...a,\n children: u ? /* @__PURE__ */ q.jsxs(q.Fragment, {\n children: [/* @__PURE__ */ q.jsx(ic, {\n src: c == null ? void 0 : c.pfp_url,\n alt: `${c == null ? void 0 : c.username} profile picture`\n }), /* @__PURE__ */ q.jsxs(\"span\", {\n style: {\n marginLeft: \"10px\"\n },\n children: [\"@\", c == null ? void 0 : c.username]\n })]\n }) : /* @__PURE__ */ q.jsxs(q.Fragment, {\n children: [gS(t, r, n), /* @__PURE__ */ q.jsx(\"span\", {\n style: {\n marginLeft: \"5px\"\n },\n children: fS(t, e)\n })]\n })\n })]\n });\n}, Yo = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n classes: [\"a11pt0xp\"],\n vars: {\n \"a11pt0xp-0\": [(s, e = Gr) => s.width || \"45px\", !1],\n \"a11pt0xp-1\": [(s, e = Gr) => s.width || \"45px\", !1]\n }\n}), Yd = \"https://farcaster.xyz\", bg = /(^|\\s)\\/\\w+/g, Tg = /@\\w+(\\.eth)?/g, wg = /((https?:\\/\\/)?([a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})(\\/[^\\s]*)?)/g, Zd = new RegExp(`(${bg.source})|(${Tg.source})|(${wg.source})`, \"g\"), mS = (s) => bg.test(s) ? `${Yd}/~/channel${s.trim()}` : Tg.test(s) ? `${Yd}/${s.substring(1)}` : wg.test(s) ? s.startsWith(\"http\") ? s : `http://${s}` : \"\", yS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n classes: [\"s4xymqs\"]\n}), vS = (s) => s.filter((e) => e.url).map((e) => e.url), ES = (s, e) => {\n if (!s) return [];\n const t = vS(e), r = [];\n let n = 0, i;\n for (; (i = Zd.exec(s)) !== null; ) {\n const o = i.index;\n n < o && r.push(s.slice(n, o));\n const a = i[0].trim();\n if (t.includes(a))\n r.push(a);\n else {\n const l = mS(a);\n r.push(/* @__PURE__ */ q.jsx(yS, {\n href: l,\n target: \"_blank\",\n children: a\n }, o));\n }\n n = Zd.lastIndex;\n }\n return n < s.length && r.push(s.slice(n)), r;\n}, Ir = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"be87m0m\"],\n vars: {\n \"be87m0m-0\": [(s, e = Gr) => s.alignItems || \"flex-start\", !1],\n \"be87m0m-1\": [(s, e = Gr) => s.justifyContent || \"flex-start\", !1],\n \"be87m0m-2\": [(s, e = Gr) => s.flexGrow || \"initial\", !0],\n \"be87m0m-3\": [(s, e = Gr) => s.flexShrink || \"initial\", !0],\n \"be87m0m-4\": [(s, e = Gr) => s.spacing ?? s.spacingVertical ?? s.spacingTop ?? \"0px\", !1],\n \"be87m0m-5\": [(s, e = Gr) => s.spacing ?? s.spacingHorizontal ?? s.spacingRight ?? \"0px\", !1],\n \"be87m0m-6\": [(s, e = Gr) => s.spacing ?? s.spacingVertical ?? s.spacingBottom ?? \"0px\", !1],\n \"be87m0m-7\": [(s, e = Gr) => s.spacing ?? s.spacingHorizontal ?? s.spacingLeft ?? \"0px\", !1]\n }\n}), xS = () => Ir, Pr = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(xS())({\n classes: [\"ha1dvpi\"]\n}), ue = Number.isFinite || function(s) {\n return typeof s == \"number\" && isFinite(s);\n}, SS = Number.isSafeInteger || function(s) {\n return typeof s == \"number\" && Math.abs(s) <= bS;\n}, bS = Number.MAX_SAFE_INTEGER || 9007199254740991;\nlet ve = /* @__PURE__ */ (function(s) {\n return s.NETWORK_ERROR = \"networkError\", s.MEDIA_ERROR = \"mediaError\", s.KEY_SYSTEM_ERROR = \"keySystemError\", s.MUX_ERROR = \"muxError\", s.OTHER_ERROR = \"otherError\", s;\n})({}), J = /* @__PURE__ */ (function(s) {\n return s.KEY_SYSTEM_NO_KEYS = \"keySystemNoKeys\", s.KEY_SYSTEM_NO_ACCESS = \"keySystemNoAccess\", s.KEY_SYSTEM_NO_SESSION = \"keySystemNoSession\", s.KEY_SYSTEM_NO_CONFIGURED_LICENSE = \"keySystemNoConfiguredLicense\", s.KEY_SYSTEM_LICENSE_REQUEST_FAILED = \"keySystemLicenseRequestFailed\", s.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED = \"keySystemServerCertificateRequestFailed\", s.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED = \"keySystemServerCertificateUpdateFailed\", s.KEY_SYSTEM_SESSION_UPDATE_FAILED = \"keySystemSessionUpdateFailed\", s.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED = \"keySystemStatusOutputRestricted\", s.KEY_SYSTEM_STATUS_INTERNAL_ERROR = \"keySystemStatusInternalError\", s.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR = \"keySystemDestroyMediaKeysError\", s.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR = \"keySystemDestroyCloseSessionError\", s.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR = \"keySystemDestroyRemoveSessionError\", s.MANIFEST_LOAD_ERROR = \"manifestLoadError\", s.MANIFEST_LOAD_TIMEOUT = \"manifestLoadTimeOut\", s.MANIFEST_PARSING_ERROR = \"manifestParsingError\", s.MANIFEST_INCOMPATIBLE_CODECS_ERROR = \"manifestIncompatibleCodecsError\", s.LEVEL_EMPTY_ERROR = \"levelEmptyError\", s.LEVEL_LOAD_ERROR = \"levelLoadError\", s.LEVEL_LOAD_TIMEOUT = \"levelLoadTimeOut\", s.LEVEL_PARSING_ERROR = \"levelParsingError\", s.LEVEL_SWITCH_ERROR = \"levelSwitchError\", s.AUDIO_TRACK_LOAD_ERROR = \"audioTrackLoadError\", s.AUDIO_TRACK_LOAD_TIMEOUT = \"audioTrackLoadTimeOut\", s.SUBTITLE_LOAD_ERROR = \"subtitleTrackLoadError\", s.SUBTITLE_TRACK_LOAD_TIMEOUT = \"subtitleTrackLoadTimeOut\", s.FRAG_LOAD_ERROR = \"fragLoadError\", s.FRAG_LOAD_TIMEOUT = \"fragLoadTimeOut\", s.FRAG_DECRYPT_ERROR = \"fragDecryptError\", s.FRAG_PARSING_ERROR = \"fragParsingError\", s.FRAG_GAP = \"fragGap\", s.REMUX_ALLOC_ERROR = \"remuxAllocError\", s.KEY_LOAD_ERROR = \"keyLoadError\", s.KEY_LOAD_TIMEOUT = \"keyLoadTimeOut\", s.BUFFER_ADD_CODEC_ERROR = \"bufferAddCodecError\", s.BUFFER_INCOMPATIBLE_CODECS_ERROR = \"bufferIncompatibleCodecsError\", s.BUFFER_APPEND_ERROR = \"bufferAppendError\", s.BUFFER_APPENDING_ERROR = \"bufferAppendingError\", s.BUFFER_STALLED_ERROR = \"bufferStalledError\", s.BUFFER_FULL_ERROR = \"bufferFullError\", s.BUFFER_SEEK_OVER_HOLE = \"bufferSeekOverHole\", s.BUFFER_NUDGE_ON_STALL = \"bufferNudgeOnStall\", s.ASSET_LIST_LOAD_ERROR = \"assetListLoadError\", s.ASSET_LIST_LOAD_TIMEOUT = \"assetListLoadTimeout\", s.ASSET_LIST_PARSING_ERROR = \"assetListParsingError\", s.INTERSTITIAL_ASSET_ITEM_ERROR = \"interstitialAssetItemError\", s.INTERNAL_EXCEPTION = \"internalException\", s.INTERNAL_ABORTED = \"aborted\", s.ATTACH_MEDIA_ERROR = \"attachMediaError\", s.UNKNOWN = \"unknown\", s;\n})({}), I = /* @__PURE__ */ (function(s) {\n return s.MEDIA_ATTACHING = \"hlsMediaAttaching\", s.MEDIA_ATTACHED = \"hlsMediaAttached\", s.MEDIA_DETACHING = \"hlsMediaDetaching\", s.MEDIA_DETACHED = \"hlsMediaDetached\", s.MEDIA_ENDED = \"hlsMediaEnded\", s.STALL_RESOLVED = \"hlsStallResolved\", s.BUFFER_RESET = \"hlsBufferReset\", s.BUFFER_CODECS = \"hlsBufferCodecs\", s.BUFFER_CREATED = \"hlsBufferCreated\", s.BUFFER_APPENDING = \"hlsBufferAppending\", s.BUFFER_APPENDED = \"hlsBufferAppended\", s.BUFFER_EOS = \"hlsBufferEos\", s.BUFFERED_TO_END = \"hlsBufferedToEnd\", s.BUFFER_FLUSHING = \"hlsBufferFlushing\", s.BUFFER_FLUSHED = \"hlsBufferFlushed\", s.MANIFEST_LOADING = \"hlsManifestLoading\", s.MANIFEST_LOADED = \"hlsManifestLoaded\", s.MANIFEST_PARSED = \"hlsManifestParsed\", s.LEVEL_SWITCHING = \"hlsLevelSwitching\", s.LEVEL_SWITCHED = \"hlsLevelSwitched\", s.LEVEL_LOADING = \"hlsLevelLoading\", s.LEVEL_LOADED = \"hlsLevelLoaded\", s.LEVEL_UPDATED = \"hlsLevelUpdated\", s.LEVEL_PTS_UPDATED = \"hlsLevelPtsUpdated\", s.LEVELS_UPDATED = \"hlsLevelsUpdated\", s.AUDIO_TRACKS_UPDATED = \"hlsAudioTracksUpdated\", s.AUDIO_TRACK_SWITCHING = \"hlsAudioTrackSwitching\", s.AUDIO_TRACK_SWITCHED = \"hlsAudioTrackSwitched\", s.AUDIO_TRACK_LOADING = \"hlsAudioTrackLoading\", s.AUDIO_TRACK_LOADED = \"hlsAudioTrackLoaded\", s.AUDIO_TRACK_UPDATED = \"hlsAudioTrackUpdated\", s.SUBTITLE_TRACKS_UPDATED = \"hlsSubtitleTracksUpdated\", s.SUBTITLE_TRACKS_CLEARED = \"hlsSubtitleTracksCleared\", s.SUBTITLE_TRACK_SWITCH = \"hlsSubtitleTrackSwitch\", s.SUBTITLE_TRACK_LOADING = \"hlsSubtitleTrackLoading\", s.SUBTITLE_TRACK_LOADED = \"hlsSubtitleTrackLoaded\", s.SUBTITLE_TRACK_UPDATED = \"hlsSubtitleTrackUpdated\", s.SUBTITLE_FRAG_PROCESSED = \"hlsSubtitleFragProcessed\", s.CUES_PARSED = \"hlsCuesParsed\", s.NON_NATIVE_TEXT_TRACKS_FOUND = \"hlsNonNativeTextTracksFound\", s.INIT_PTS_FOUND = \"hlsInitPtsFound\", s.FRAG_LOADING = \"hlsFragLoading\", s.FRAG_LOAD_EMERGENCY_ABORTED = \"hlsFragLoadEmergencyAborted\", s.FRAG_LOADED = \"hlsFragLoaded\", s.FRAG_DECRYPTED = \"hlsFragDecrypted\", s.FRAG_PARSING_INIT_SEGMENT = \"hlsFragParsingInitSegment\", s.FRAG_PARSING_USERDATA = \"hlsFragParsingUserdata\", s.FRAG_PARSING_METADATA = \"hlsFragParsingMetadata\", s.FRAG_PARSED = \"hlsFragParsed\", s.FRAG_BUFFERED = \"hlsFragBuffered\", s.FRAG_CHANGED = \"hlsFragChanged\", s.FPS_DROP = \"hlsFpsDrop\", s.FPS_DROP_LEVEL_CAPPING = \"hlsFpsDropLevelCapping\", s.MAX_AUTO_LEVEL_UPDATED = \"hlsMaxAutoLevelUpdated\", s.ERROR = \"hlsError\", s.DESTROYING = \"hlsDestroying\", s.KEY_LOADING = \"hlsKeyLoading\", s.KEY_LOADED = \"hlsKeyLoaded\", s.LIVE_BACK_BUFFER_REACHED = \"hlsLiveBackBufferReached\", s.BACK_BUFFER_REACHED = \"hlsBackBufferReached\", s.STEERING_MANIFEST_LOADED = \"hlsSteeringManifestLoaded\", s.ASSET_LIST_LOADING = \"hlsAssetListLoading\", s.ASSET_LIST_LOADED = \"hlsAssetListLoaded\", s.INTERSTITIALS_UPDATED = \"hlsInterstitialsUpdated\", s.INTERSTITIALS_BUFFERED_TO_BOUNDARY = \"hlsInterstitialsBufferedToBoundary\", s.INTERSTITIAL_ASSET_PLAYER_CREATED = \"hlsInterstitialAssetPlayerCreated\", s.INTERSTITIAL_STARTED = \"hlsInterstitialStarted\", s.INTERSTITIAL_ASSET_STARTED = \"hlsInterstitialAssetStarted\", s.INTERSTITIAL_ASSET_ENDED = \"hlsInterstitialAssetEnded\", s.INTERSTITIAL_ASSET_ERROR = \"hlsInterstitialAssetError\", s.INTERSTITIAL_ENDED = \"hlsInterstitialEnded\", s.INTERSTITIALS_PRIMARY_RESUMED = \"hlsInterstitialsPrimaryResumed\", s.PLAYOUT_LIMIT_REACHED = \"hlsPlayoutLimitReached\", s.EVENT_CUE_ENTER = \"hlsEventCueEnter\", s;\n})({});\nvar Ke = {\n MANIFEST: \"manifest\",\n LEVEL: \"level\",\n AUDIO_TRACK: \"audioTrack\",\n SUBTITLE_TRACK: \"subtitleTrack\"\n}, pe = {\n MAIN: \"main\",\n AUDIO: \"audio\",\n SUBTITLE: \"subtitle\"\n};\nclass hn {\n // About half of the estimated value will be from the last |halfLife| samples by weight.\n constructor(e, t = 0, r = 0) {\n this.halfLife = void 0, this.alpha_ = void 0, this.estimate_ = void 0, this.totalWeight_ = void 0, this.halfLife = e, this.alpha_ = e ? Math.exp(Math.log(0.5) / e) : 0, this.estimate_ = t, this.totalWeight_ = r;\n }\n sample(e, t) {\n const r = Math.pow(this.alpha_, e);\n this.estimate_ = t * (1 - r) + r * this.estimate_, this.totalWeight_ += e;\n }\n getTotalWeight() {\n return this.totalWeight_;\n }\n getEstimate() {\n if (this.alpha_) {\n const e = 1 - Math.pow(this.alpha_, this.totalWeight_);\n if (e)\n return this.estimate_ / e;\n }\n return this.estimate_;\n }\n}\nclass TS {\n constructor(e, t, r, n = 100) {\n this.defaultEstimate_ = void 0, this.minWeight_ = void 0, this.minDelayMs_ = void 0, this.slow_ = void 0, this.fast_ = void 0, this.defaultTTFB_ = void 0, this.ttfb_ = void 0, this.defaultEstimate_ = r, this.minWeight_ = 1e-3, this.minDelayMs_ = 50, this.slow_ = new hn(e), this.fast_ = new hn(t), this.defaultTTFB_ = n, this.ttfb_ = new hn(e);\n }\n update(e, t) {\n const {\n slow_: r,\n fast_: n,\n ttfb_: i\n } = this;\n r.halfLife !== e && (this.slow_ = new hn(e, r.getEstimate(), r.getTotalWeight())), n.halfLife !== t && (this.fast_ = new hn(t, n.getEstimate(), n.getTotalWeight())), i.halfLife !== e && (this.ttfb_ = new hn(e, i.getEstimate(), i.getTotalWeight()));\n }\n sample(e, t) {\n e = Math.max(e, this.minDelayMs_);\n const r = 8 * t, n = e / 1e3, i = r / n;\n this.fast_.sample(n, i), this.slow_.sample(n, i);\n }\n sampleTTFB(e) {\n const t = e / 1e3, r = Math.sqrt(2) * Math.exp(-Math.pow(t, 2) / 2);\n this.ttfb_.sample(r, Math.max(e, 5));\n }\n canEstimate() {\n return this.fast_.getTotalWeight() >= this.minWeight_;\n }\n getEstimate() {\n return this.canEstimate() ? Math.min(this.fast_.getEstimate(), this.slow_.getEstimate()) : this.defaultEstimate_;\n }\n getEstimateTTFB() {\n return this.ttfb_.getTotalWeight() >= this.minWeight_ ? this.ttfb_.getEstimate() : this.defaultTTFB_;\n }\n get defaultEstimate() {\n return this.defaultEstimate_;\n }\n destroy() {\n }\n}\nfunction wS(s, e, t) {\n return (e = IS(e)) in s ? Object.defineProperty(s, e, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : s[e] = t, s;\n}\nfunction nt() {\n return nt = Object.assign ? Object.assign.bind() : function(s) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (s[r] = t[r]);\n }\n return s;\n }, nt.apply(null, arguments);\n}\nfunction Xd(s, e) {\n var t = Object.keys(s);\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(s);\n e && (r = r.filter(function(n) {\n return Object.getOwnPropertyDescriptor(s, n).enumerable;\n })), t.push.apply(t, r);\n }\n return t;\n}\nfunction tt(s) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e] != null ? arguments[e] : {};\n e % 2 ? Xd(Object(t), !0).forEach(function(r) {\n wS(s, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(t)) : Xd(Object(t)).forEach(function(r) {\n Object.defineProperty(s, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return s;\n}\nfunction AS(s, e) {\n if (typeof s != \"object\" || !s) return s;\n var t = s[Symbol.toPrimitive];\n if (t !== void 0) {\n var r = t.call(s, e);\n if (typeof r != \"object\") return r;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (e === \"string\" ? String : Number)(s);\n}\nfunction IS(s) {\n var e = AS(s, \"string\");\n return typeof e == \"symbol\" ? e : e + \"\";\n}\nclass Lr {\n constructor(e, t) {\n this.trace = void 0, this.debug = void 0, this.log = void 0, this.warn = void 0, this.info = void 0, this.error = void 0;\n const r = `[${e}]:`;\n this.trace = As, this.debug = t.debug.bind(null, r), this.log = t.log.bind(null, r), this.warn = t.warn.bind(null, r), this.info = t.info.bind(null, r), this.error = t.error.bind(null, r);\n }\n}\nconst As = function() {\n}, _S = {\n trace: As,\n debug: As,\n log: As,\n warn: As,\n info: As,\n error: As\n};\nfunction oc() {\n return nt({}, _S);\n}\nfunction RS(s, e) {\n const t = self.console[s];\n return t ? t.bind(self.console, `${e ? \"[\" + e + \"] \" : \"\"}[${s}] >`) : As;\n}\nfunction Jd(s, e, t) {\n return e[s] ? e[s].bind(e) : RS(s, t);\n}\nconst ac = oc();\nfunction LS(s, e, t) {\n const r = oc();\n if (typeof console == \"object\" && s === !0 || typeof s == \"object\") {\n const n = [\n // Remove out from list here to hard-disable a log-level\n // 'trace',\n \"debug\",\n \"log\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n n.forEach((i) => {\n r[i] = Jd(i, s, t);\n });\n try {\n r.log(`Debug logs enabled for \"${e}\" in hls.js version 1.6.12`);\n } catch {\n return oc();\n }\n n.forEach((i) => {\n ac[i] = Jd(i, s);\n });\n } else\n nt(ac, r);\n return r;\n}\nconst rt = ac;\nfunction Ms(s = !0) {\n return typeof self > \"u\" ? void 0 : (s || !self.MediaSource) && self.ManagedMediaSource || self.MediaSource || self.WebKitMediaSource;\n}\nfunction CS(s) {\n return typeof self < \"u\" && s === self.ManagedMediaSource;\n}\nfunction Ag(s, e) {\n const t = Object.keys(s), r = Object.keys(e), n = t.length, i = r.length;\n return !n || !i || n === i && !t.some((o) => r.indexOf(o) === -1);\n}\nfunction Tr(s, e = !1) {\n if (typeof TextDecoder < \"u\") {\n const c = new TextDecoder(\"utf-8\").decode(s);\n if (e) {\n const u = c.indexOf(\"\\0\");\n return u !== -1 ? c.substring(0, u) : c;\n }\n return c.replace(/\\0/g, \"\");\n }\n const t = s.length;\n let r, n, i, o = \"\", a = 0;\n for (; a < t; ) {\n if (r = s[a++], r === 0 && e)\n return o;\n if (r === 0 || r === 3)\n continue;\n switch (r >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n o += String.fromCharCode(r);\n break;\n case 12:\n case 13:\n n = s[a++], o += String.fromCharCode((r & 31) << 6 | n & 63);\n break;\n case 14:\n n = s[a++], i = s[a++], o += String.fromCharCode((r & 15) << 12 | (n & 63) << 6 | (i & 63) << 0);\n break;\n }\n }\n return o;\n}\nfunction fr(s) {\n let e = \"\";\n for (let t = 0; t < s.length; t++) {\n let r = s[t].toString(16);\n r.length < 2 && (r = \"0\" + r), e += r;\n }\n return e;\n}\nfunction Ig(s) {\n return Uint8Array.from(s.replace(/^0x/, \"\").replace(/([\\da-fA-F]{2}) ?/g, \"0x$1 \").replace(/ +$/, \"\").split(\" \")).buffer;\n}\nfunction kS(s) {\n return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nvar cl = { exports: {} }, Qd;\nfunction DS() {\n return Qd || (Qd = 1, (function(s, e) {\n (function(t) {\n var r = /^(?=((?:[a-zA-Z0-9+\\-.]+:)?))\\1(?=((?:\\/\\/[^\\/?#]*)?))\\2(?=((?:(?:[^?#\\/]*\\/)*[^;?#\\/]*)?))\\3((?:;[^?#]*)?)(\\?[^#]*)?(#[^]*)?$/, n = /^(?=([^\\/?#]*))\\1([^]*)$/, i = /(?:\\/|^)\\.(?=\\/)/g, o = /(?:\\/|^)\\.\\.\\/(?!\\.\\.\\/)[^\\/]*(?=\\/)/g, a = {\n // If opts.alwaysNormalize is true then the path will always be normalized even when it starts with / or //\n // E.g\n // With opts.alwaysNormalize = false (default, spec compliant)\n // http://a.com/b/cd + /e/f/../g => http://a.com/e/f/../g\n // With opts.alwaysNormalize = true (not spec compliant)\n // http://a.com/b/cd + /e/f/../g => http://a.com/e/g\n buildAbsoluteURL: function(l, c, u) {\n if (u = u || {}, l = l.trim(), c = c.trim(), !c) {\n if (!u.alwaysNormalize)\n return l;\n var d = a.parseURL(l);\n if (!d)\n throw new Error(\"Error trying to parse base URL.\");\n return d.path = a.normalizePath(\n d.path\n ), a.buildURLFromParts(d);\n }\n var h = a.parseURL(c);\n if (!h)\n throw new Error(\"Error trying to parse relative URL.\");\n if (h.scheme)\n return u.alwaysNormalize ? (h.path = a.normalizePath(h.path), a.buildURLFromParts(h)) : c;\n var f = a.parseURL(l);\n if (!f)\n throw new Error(\"Error trying to parse base URL.\");\n if (!f.netLoc && f.path && f.path[0] !== \"/\") {\n var p = n.exec(f.path);\n f.netLoc = p[1], f.path = p[2];\n }\n f.netLoc && !f.path && (f.path = \"/\");\n var y = {\n // 2c) Otherwise, the embedded URL inherits the scheme of\n // the base URL.\n scheme: f.scheme,\n netLoc: h.netLoc,\n path: null,\n params: h.params,\n query: h.query,\n fragment: h.fragment\n };\n if (!h.netLoc && (y.netLoc = f.netLoc, h.path[0] !== \"/\"))\n if (!h.path)\n y.path = f.path, h.params || (y.params = f.params, h.query || (y.query = f.query));\n else {\n var E = f.path, b = E.substring(0, E.lastIndexOf(\"/\") + 1) + h.path;\n y.path = a.normalizePath(b);\n }\n return y.path === null && (y.path = u.alwaysNormalize ? a.normalizePath(h.path) : h.path), a.buildURLFromParts(y);\n },\n parseURL: function(l) {\n var c = r.exec(l);\n return c ? {\n scheme: c[1] || \"\",\n netLoc: c[2] || \"\",\n path: c[3] || \"\",\n params: c[4] || \"\",\n query: c[5] || \"\",\n fragment: c[6] || \"\"\n } : null;\n },\n normalizePath: function(l) {\n for (l = l.split(\"\").reverse().join(\"\").replace(i, \"\"); l.length !== (l = l.replace(o, \"\")).length; )\n ;\n return l.split(\"\").reverse().join(\"\");\n },\n buildURLFromParts: function(l) {\n return l.scheme + l.netLoc + l.path + l.params + l.query + l.fragment;\n }\n };\n s.exports = a;\n })();\n })(cl)), cl.exports;\n}\nvar hu = DS();\nclass fu {\n constructor() {\n this.aborted = !1, this.loaded = 0, this.retry = 0, this.total = 0, this.chunkCount = 0, this.bwEstimate = 0, this.loading = {\n start: 0,\n first: 0,\n end: 0\n }, this.parsing = {\n start: 0,\n end: 0\n }, this.buffering = {\n start: 0,\n first: 0,\n end: 0\n };\n }\n}\nvar ot = {\n AUDIO: \"audio\",\n VIDEO: \"video\",\n AUDIOVIDEO: \"audiovideo\"\n};\nclass _g {\n constructor(e) {\n this._byteRange = null, this._url = null, this._stats = null, this._streams = null, this.base = void 0, this.relurl = void 0, typeof e == \"string\" && (e = {\n url: e\n }), this.base = e, MS(this, \"stats\");\n }\n // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array\n setByteRange(e, t) {\n const r = e.split(\"@\", 2);\n let n;\n r.length === 1 ? n = (t == null ? void 0 : t.byteRangeEndOffset) || 0 : n = parseInt(r[1]), this._byteRange = [n, parseInt(r[0]) + n];\n }\n get baseurl() {\n return this.base.url;\n }\n get byteRange() {\n return this._byteRange === null ? [] : this._byteRange;\n }\n get byteRangeStartOffset() {\n return this.byteRange[0];\n }\n get byteRangeEndOffset() {\n return this.byteRange[1];\n }\n get elementaryStreams() {\n return this._streams === null && (this._streams = {\n [ot.AUDIO]: null,\n [ot.VIDEO]: null,\n [ot.AUDIOVIDEO]: null\n }), this._streams;\n }\n set elementaryStreams(e) {\n this._streams = e;\n }\n get hasStats() {\n return this._stats !== null;\n }\n get hasStreams() {\n return this._streams !== null;\n }\n get stats() {\n return this._stats === null && (this._stats = new fu()), this._stats;\n }\n set stats(e) {\n this._stats = e;\n }\n get url() {\n return !this._url && this.baseurl && this.relurl && (this._url = hu.buildAbsoluteURL(this.baseurl, this.relurl, {\n alwaysNormalize: !0\n })), this._url || \"\";\n }\n set url(e) {\n this._url = e;\n }\n clearElementaryStreamInfo() {\n const {\n elementaryStreams: e\n } = this;\n e[ot.AUDIO] = null, e[ot.VIDEO] = null, e[ot.AUDIOVIDEO] = null;\n }\n}\nfunction Vt(s) {\n return s.sn !== \"initSegment\";\n}\nclass ul extends _g {\n constructor(e, t) {\n super(t), this._decryptdata = null, this._programDateTime = null, this._ref = null, this._bitrate = void 0, this.rawProgramDateTime = null, this.tagList = [], this.duration = 0, this.sn = 0, this.levelkeys = void 0, this.type = void 0, this.loader = null, this.keyLoader = null, this.level = -1, this.cc = 0, this.startPTS = void 0, this.endPTS = void 0, this.startDTS = void 0, this.endDTS = void 0, this.start = 0, this.playlistOffset = 0, this.deltaPTS = void 0, this.maxStartPTS = void 0, this.minEndPTS = void 0, this.data = void 0, this.bitrateTest = !1, this.title = null, this.initSegment = null, this.endList = void 0, this.gap = void 0, this.urlId = 0, this.type = e;\n }\n get byteLength() {\n if (this.hasStats) {\n const e = this.stats.total;\n if (e)\n return e;\n }\n if (this.byteRange.length) {\n const e = this.byteRange[0], t = this.byteRange[1];\n if (ue(e) && ue(t))\n return t - e;\n }\n return null;\n }\n get bitrate() {\n return this.byteLength ? this.byteLength * 8 / this.duration : this._bitrate ? this._bitrate : null;\n }\n set bitrate(e) {\n this._bitrate = e;\n }\n get decryptdata() {\n const {\n levelkeys: e\n } = this;\n if (!e && !this._decryptdata)\n return null;\n if (!this._decryptdata && this.levelkeys && !this.levelkeys.NONE) {\n const t = this.levelkeys.identity;\n if (t)\n this._decryptdata = t.getDecryptData(this.sn);\n else {\n const r = Object.keys(this.levelkeys);\n if (r.length === 1) {\n const n = this._decryptdata = this.levelkeys[r[0]] || null;\n if (n)\n return n.getDecryptData(this.sn);\n }\n }\n }\n return this._decryptdata;\n }\n get end() {\n return this.start + this.duration;\n }\n get endProgramDateTime() {\n if (this.programDateTime === null)\n return null;\n const e = ue(this.duration) ? this.duration : 0;\n return this.programDateTime + e * 1e3;\n }\n get encrypted() {\n var e;\n if ((e = this._decryptdata) != null && e.encrypted)\n return !0;\n if (this.levelkeys) {\n var t;\n const r = Object.keys(this.levelkeys), n = r.length;\n if (n > 1 || n === 1 && (t = this.levelkeys[r[0]]) != null && t.encrypted)\n return !0;\n }\n return !1;\n }\n get programDateTime() {\n return this._programDateTime === null && this.rawProgramDateTime && (this.programDateTime = Date.parse(this.rawProgramDateTime)), this._programDateTime;\n }\n set programDateTime(e) {\n if (!ue(e)) {\n this._programDateTime = this.rawProgramDateTime = null;\n return;\n }\n this._programDateTime = e;\n }\n get ref() {\n return Vt(this) ? (this._ref || (this._ref = {\n base: this.base,\n start: this.start,\n duration: this.duration,\n sn: this.sn,\n programDateTime: this.programDateTime\n }), this._ref) : null;\n }\n addStart(e) {\n this.setStart(this.start + e);\n }\n setStart(e) {\n this.start = e, this._ref && (this._ref.start = e);\n }\n setDuration(e) {\n this.duration = e, this._ref && (this._ref.duration = e);\n }\n setKeyFormat(e) {\n if (this.levelkeys) {\n const t = this.levelkeys[e];\n t && !this._decryptdata && (this._decryptdata = t.getDecryptData(this.sn));\n }\n }\n abortRequests() {\n var e, t;\n (e = this.loader) == null || e.abort(), (t = this.keyLoader) == null || t.abort();\n }\n setElementaryStreamInfo(e, t, r, n, i, o = !1) {\n const {\n elementaryStreams: a\n } = this, l = a[e];\n if (!l) {\n a[e] = {\n startPTS: t,\n endPTS: r,\n startDTS: n,\n endDTS: i,\n partial: o\n };\n return;\n }\n l.startPTS = Math.min(l.startPTS, t), l.endPTS = Math.max(l.endPTS, r), l.startDTS = Math.min(l.startDTS, n), l.endDTS = Math.max(l.endDTS, i);\n }\n}\nclass PS extends _g {\n constructor(e, t, r, n, i) {\n super(r), this.fragOffset = 0, this.duration = 0, this.gap = !1, this.independent = !1, this.relurl = void 0, this.fragment = void 0, this.index = void 0, this.duration = e.decimalFloatingPoint(\"DURATION\"), this.gap = e.bool(\"GAP\"), this.independent = e.bool(\"INDEPENDENT\"), this.relurl = e.enumeratedString(\"URI\"), this.fragment = t, this.index = n;\n const o = e.enumeratedString(\"BYTERANGE\");\n o && this.setByteRange(o, i), i && (this.fragOffset = i.fragOffset + i.duration);\n }\n get start() {\n return this.fragment.start + this.fragOffset;\n }\n get end() {\n return this.start + this.duration;\n }\n get loaded() {\n const {\n elementaryStreams: e\n } = this;\n return !!(e.audio || e.video || e.audiovideo);\n }\n}\nfunction Rg(s, e) {\n const t = Object.getPrototypeOf(s);\n if (t) {\n const r = Object.getOwnPropertyDescriptor(t, e);\n return r || Rg(t, e);\n }\n}\nfunction MS(s, e) {\n const t = Rg(s, e);\n t && (t.enumerable = !0, Object.defineProperty(s, e, t));\n}\nconst eh = Math.pow(2, 32) - 1, OS = [].push, Lg = {\n video: 1,\n audio: 2,\n id3: 3,\n text: 4\n};\nfunction jt(s) {\n return String.fromCharCode.apply(null, s);\n}\nfunction Cg(s, e) {\n const t = s[e] << 8 | s[e + 1];\n return t < 0 ? 65536 + t : t;\n}\nfunction Ie(s, e) {\n const t = kg(s, e);\n return t < 0 ? 4294967296 + t : t;\n}\nfunction th(s, e) {\n let t = Ie(s, e);\n return t *= Math.pow(2, 32), t += Ie(s, e + 4), t;\n}\nfunction kg(s, e) {\n return s[e] << 24 | s[e + 1] << 16 | s[e + 2] << 8 | s[e + 3];\n}\nfunction BS(s) {\n const e = s.byteLength;\n for (let t = 0; t < e; ) {\n const r = Ie(s, t);\n if (r > 8 && s[t + 4] === 109 && s[t + 5] === 111 && s[t + 6] === 111 && s[t + 7] === 102)\n return !0;\n t = r > 1 ? t + r : e;\n }\n return !1;\n}\nfunction Ge(s, e) {\n const t = [];\n if (!e.length)\n return t;\n const r = s.byteLength;\n for (let n = 0; n < r; ) {\n const i = Ie(s, n), o = jt(s.subarray(n + 4, n + 8)), a = i > 1 ? n + i : r;\n if (o === e[0])\n if (e.length === 1)\n t.push(s.subarray(n + 8, a));\n else {\n const l = Ge(s.subarray(n + 8, a), e.slice(1));\n l.length && OS.apply(t, l);\n }\n n = a;\n }\n return t;\n}\nfunction FS(s) {\n const e = [], t = s[0];\n let r = 8;\n const n = Ie(s, r);\n r += 4;\n let i = 0, o = 0;\n t === 0 ? (i = Ie(s, r), o = Ie(s, r + 4), r += 8) : (i = th(s, r), o = th(s, r + 8), r += 16), r += 2;\n let a = s.length + o;\n const l = Cg(s, r);\n r += 2;\n for (let c = 0; c < l; c++) {\n let u = r;\n const d = Ie(s, u);\n u += 4;\n const h = d & 2147483647;\n if ((d & 2147483648) >>> 31 === 1)\n return rt.warn(\"SIDX has hierarchical references (not supported)\"), null;\n const p = Ie(s, u);\n u += 4, e.push({\n referenceSize: h,\n subsegmentDuration: p,\n // unscaled\n info: {\n duration: p / n,\n start: a,\n end: a + h - 1\n }\n }), a += h, u += 4, r = u;\n }\n return {\n earliestPresentationTime: i,\n timescale: n,\n version: t,\n referencesCount: l,\n references: e\n };\n}\nfunction Dg(s) {\n const e = [], t = Ge(s, [\"moov\", \"trak\"]);\n for (let n = 0; n < t.length; n++) {\n const i = t[n], o = Ge(i, [\"tkhd\"])[0];\n if (o) {\n let a = o[0];\n const l = Ie(o, a === 0 ? 12 : 20), c = Ge(i, [\"mdia\", \"mdhd\"])[0];\n if (c) {\n a = c[0];\n const u = Ie(c, a === 0 ? 12 : 20), d = Ge(i, [\"mdia\", \"hdlr\"])[0];\n if (d) {\n const h = jt(d.subarray(8, 12)), f = {\n soun: ot.AUDIO,\n vide: ot.VIDEO\n }[h], p = Ge(i, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0], y = NS(p);\n f ? (e[l] = {\n timescale: u,\n type: f,\n stsd: y\n }, e[f] = tt({\n timescale: u,\n id: l\n }, y)) : e[l] = {\n timescale: u,\n type: h,\n stsd: y\n };\n }\n }\n }\n }\n return Ge(s, [\"moov\", \"mvex\", \"trex\"]).forEach((n) => {\n const i = Ie(n, 4), o = e[i];\n o && (o.default = {\n duration: Ie(n, 12),\n flags: Ie(n, 20)\n });\n }), e;\n}\nfunction NS(s) {\n const e = s.subarray(8), t = e.subarray(86), r = jt(e.subarray(4, 8));\n let n = r, i;\n const o = r === \"enca\" || r === \"encv\";\n if (o) {\n const c = Ge(e, [r])[0].subarray(r === \"enca\" ? 28 : 78);\n Ge(c, [\"sinf\"]).forEach((d) => {\n const h = Ge(d, [\"schm\"])[0];\n if (h) {\n const f = jt(h.subarray(4, 8));\n if (f === \"cbcs\" || f === \"cenc\") {\n const p = Ge(d, [\"frma\"])[0];\n p && (n = jt(p));\n }\n }\n });\n }\n const a = n;\n switch (n) {\n case \"avc1\":\n case \"avc2\":\n case \"avc3\":\n case \"avc4\": {\n const l = Ge(t, [\"avcC\"])[0];\n l && l.length > 3 && (n += \".\" + Ki(l[1]) + Ki(l[2]) + Ki(l[3]), i = ji(a === \"avc1\" ? \"dva1\" : \"dvav\", t));\n break;\n }\n case \"mp4a\": {\n const l = Ge(e, [r])[0], c = Ge(l.subarray(28), [\"esds\"])[0];\n if (c && c.length > 7) {\n let u = 4;\n if (c[u++] !== 3)\n break;\n u = dl(c, u), u += 2;\n const d = c[u++];\n if (d & 128 && (u += 2), d & 64 && (u += c[u++]), c[u++] !== 4)\n break;\n u = dl(c, u);\n const h = c[u++];\n if (h === 64)\n n += \".\" + Ki(h);\n else\n break;\n if (u += 12, c[u++] !== 5)\n break;\n u = dl(c, u);\n const f = c[u++];\n let p = (f & 248) >> 3;\n p === 31 && (p += 1 + ((f & 7) << 3) + ((c[u] & 224) >> 5)), n += \".\" + p;\n }\n break;\n }\n case \"hvc1\":\n case \"hev1\": {\n const l = Ge(t, [\"hvcC\"])[0];\n if (l && l.length > 12) {\n const c = l[1], u = [\"\", \"A\", \"B\", \"C\"][c >> 6], d = c & 31, h = Ie(l, 2), f = (c & 32) >> 5 ? \"H\" : \"L\", p = l[12], y = l.subarray(6, 12);\n n += \".\" + u + d, n += \".\" + US(h).toString(16).toUpperCase(), n += \".\" + f + p;\n let E = \"\";\n for (let b = y.length; b--; ) {\n const R = y[b];\n (R || E) && (E = \".\" + R.toString(16).toUpperCase() + E);\n }\n n += E;\n }\n i = ji(a == \"hev1\" ? \"dvhe\" : \"dvh1\", t);\n break;\n }\n case \"dvh1\":\n case \"dvhe\":\n case \"dvav\":\n case \"dva1\":\n case \"dav1\": {\n n = ji(n, t) || n;\n break;\n }\n case \"vp09\": {\n const l = Ge(t, [\"vpcC\"])[0];\n if (l && l.length > 6) {\n const c = l[4], u = l[5], d = l[6] >> 4 & 15;\n n += \".\" + Vr(c) + \".\" + Vr(u) + \".\" + Vr(d);\n }\n break;\n }\n case \"av01\": {\n const l = Ge(t, [\"av1C\"])[0];\n if (l && l.length > 2) {\n const c = l[1] >>> 5, u = l[1] & 31, d = l[2] >>> 7 ? \"H\" : \"M\", h = (l[2] & 64) >> 6, f = (l[2] & 32) >> 5, p = c === 2 && h ? f ? 12 : 10 : h ? 10 : 8, y = (l[2] & 16) >> 4, E = (l[2] & 8) >> 3, b = (l[2] & 4) >> 2, R = l[2] & 3;\n n += \".\" + c + \".\" + Vr(u) + d + \".\" + Vr(p) + \".\" + y + \".\" + E + b + R + \".\" + Vr(1) + \".\" + Vr(1) + \".\" + Vr(1) + \".\" + 0, i = ji(\"dav1\", t);\n }\n break;\n }\n }\n return {\n codec: n,\n encrypted: o,\n supplemental: i\n };\n}\nfunction ji(s, e) {\n const t = Ge(e, [\"dvvC\"]), r = t.length ? t[0] : Ge(e, [\"dvcC\"])[0];\n if (r) {\n const n = r[2] >> 1 & 127, i = r[2] << 5 & 32 | r[3] >> 3 & 31;\n return s + \".\" + Vr(n) + \".\" + Vr(i);\n }\n}\nfunction US(s) {\n let e = 0;\n for (let t = 0; t < 32; t++)\n e |= (s >> t & 1) << 31 - t;\n return e >>> 0;\n}\nfunction dl(s, e) {\n const t = e + 5;\n for (; s[e++] & 128 && e < t; )\n ;\n return e;\n}\nfunction Ki(s) {\n return (\"0\" + s.toString(16).toUpperCase()).slice(-2);\n}\nfunction Vr(s) {\n return (s < 10 ? \"0\" : \"\") + s;\n}\nfunction $S(s, e) {\n if (!s || !e)\n return;\n const t = e.keyId;\n t && e.isCommonEncryption && Ge(s, [\"moov\", \"trak\"]).forEach((n) => {\n const o = Ge(n, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0].subarray(8);\n let a = Ge(o, [\"enca\"]);\n const l = a.length > 0;\n l || (a = Ge(o, [\"encv\"])), a.forEach((c) => {\n const u = l ? c.subarray(28) : c.subarray(78);\n Ge(u, [\"sinf\"]).forEach((h) => {\n const f = Pg(h);\n if (f) {\n const p = f.subarray(8, 24);\n p.some((y) => y !== 0) || (rt.log(`[eme] Patching keyId in 'enc${l ? \"a\" : \"v\"}>sinf>>tenc' box: ${fr(p)} -> ${fr(t)}`), f.set(t, 8));\n }\n });\n });\n });\n}\nfunction Pg(s) {\n const e = Ge(s, [\"schm\"])[0];\n if (e) {\n const t = jt(e.subarray(4, 8));\n if (t === \"cbcs\" || t === \"cenc\")\n return Ge(s, [\"schi\", \"tenc\"])[0];\n }\n return null;\n}\nfunction GS(s, e, t) {\n const r = {}, n = Ge(s, [\"moof\", \"traf\"]);\n for (let i = 0; i < n.length; i++) {\n const o = n[i], a = Ge(o, [\"tfhd\"])[0], l = Ie(a, 4), c = e[l];\n if (!c)\n continue;\n r[l] || (r[l] = {\n start: NaN,\n duration: 0,\n sampleCount: 0,\n timescale: c.timescale,\n type: c.type\n });\n const u = r[l], d = Ge(o, [\"tfdt\"])[0];\n if (d) {\n const A = d[0];\n let F = Ie(d, 4);\n A === 1 && (F === eh ? t.warn(\"[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time\") : (F *= eh + 1, F += Ie(d, 8))), ue(F) && (!ue(u.start) || F < u.start) && (u.start = F);\n }\n const h = c.default, f = Ie(a, 0) | (h == null ? void 0 : h.flags);\n let p = (h == null ? void 0 : h.duration) || 0;\n f & 8 && (f & 2 ? p = Ie(a, 12) : p = Ie(a, 8));\n const y = Ge(o, [\"trun\"]);\n let E = u.start || 0, b = 0, R = p;\n for (let A = 0; A < y.length; A++) {\n const F = y[A], M = Ie(F, 4), H = u.sampleCount;\n u.sampleCount += M;\n const K = F[3] & 1, j = F[3] & 4, C = F[2] & 1, k = F[2] & 2, $ = F[2] & 4, W = F[2] & 8;\n let _ = 8, g = M;\n for (K && (_ += 4), j && M && (!(F[_ + 1] & 1) && u.keyFrameIndex === void 0 && (u.keyFrameIndex = H), _ += 4, C ? (R = Ie(F, _), _ += 4) : R = p, k && (_ += 4), W && (_ += 4), E += R, b += R, g--); g--; )\n C ? (R = Ie(F, _), _ += 4) : R = p, k && (_ += 4), $ && (F[_ + 1] & 1 || u.keyFrameIndex === void 0 && (u.keyFrameIndex = u.sampleCount - (g + 1), u.keyFrameStart = E), _ += 4), W && (_ += 4), E += R, b += R;\n !b && p && (b += p * M);\n }\n u.duration += b;\n }\n if (!Object.keys(r).some((i) => r[i].duration)) {\n let i = 1 / 0, o = 0;\n const a = Ge(s, [\"sidx\"]);\n for (let l = 0; l < a.length; l++) {\n const c = FS(a[l]);\n if (c != null && c.references) {\n i = Math.min(i, c.earliestPresentationTime / c.timescale);\n const u = c.references.reduce((d, h) => d + h.info.duration || 0, 0);\n o = Math.max(o, u + c.earliestPresentationTime / c.timescale);\n }\n }\n o && ue(o) && Object.keys(r).forEach((l) => {\n r[l].duration || (r[l].duration = o * r[l].timescale - r[l].start);\n });\n }\n return r;\n}\nfunction VS(s) {\n const e = {\n valid: null,\n remainder: null\n }, t = Ge(s, [\"moof\"]);\n if (t.length < 2)\n return e.remainder = s, e;\n const r = t[t.length - 1];\n return e.valid = s.slice(0, r.byteOffset - 8), e.remainder = s.slice(r.byteOffset - 8), e;\n}\nfunction _r(s, e) {\n const t = new Uint8Array(s.length + e.length);\n return t.set(s), t.set(e, s.length), t;\n}\nfunction rh(s, e) {\n const t = [], r = e.samples, n = e.timescale, i = e.id;\n let o = !1;\n return Ge(r, [\"moof\"]).map((l) => {\n const c = l.byteOffset - 8;\n Ge(l, [\"traf\"]).map((d) => {\n const h = Ge(d, [\"tfdt\"]).map((f) => {\n const p = f[0];\n let y = Ie(f, 4);\n return p === 1 && (y *= Math.pow(2, 32), y += Ie(f, 8)), y / n;\n })[0];\n return h !== void 0 && (s = h), Ge(d, [\"tfhd\"]).map((f) => {\n const p = Ie(f, 4), y = Ie(f, 0) & 16777215, E = (y & 1) !== 0, b = (y & 2) !== 0, R = (y & 8) !== 0;\n let A = 0;\n const F = (y & 16) !== 0;\n let M = 0;\n const H = (y & 32) !== 0;\n let K = 8;\n p === i && (E && (K += 8), b && (K += 4), R && (A = Ie(f, K), K += 4), F && (M = Ie(f, K), K += 4), H && (K += 4), e.type === \"video\" && (o = ya(e.codec)), Ge(d, [\"trun\"]).map((j) => {\n const C = j[0], k = Ie(j, 0) & 16777215, $ = (k & 1) !== 0;\n let W = 0;\n const _ = (k & 4) !== 0, g = (k & 256) !== 0;\n let x = 0;\n const w = (k & 512) !== 0;\n let D = 0;\n const O = (k & 1024) !== 0, U = (k & 2048) !== 0;\n let V = 0;\n const L = Ie(j, 4);\n let m = 8;\n $ && (W = Ie(j, m), m += 4), _ && (m += 4);\n let v = W + c;\n for (let P = 0; P < L; P++) {\n if (g ? (x = Ie(j, m), m += 4) : x = A, w ? (D = Ie(j, m), m += 4) : D = M, O && (m += 4), U && (C === 0 ? V = Ie(j, m) : V = kg(j, m), m += 4), e.type === ot.VIDEO) {\n let N = 0;\n for (; N < D; ) {\n const Y = Ie(r, v);\n if (v += 4, jS(o, r[v])) {\n const ee = r.subarray(v, v + Y);\n gu(ee, o ? 2 : 1, s + V / n, t);\n }\n v += Y, N += Y + 4;\n }\n }\n s += x / n;\n }\n }));\n });\n });\n }), t;\n}\nfunction ya(s) {\n if (!s)\n return !1;\n const e = s.substring(0, 4);\n return e === \"hvc1\" || e === \"hev1\" || // Dolby Vision\n e === \"dvh1\" || e === \"dvhe\";\n}\nfunction jS(s, e) {\n if (s) {\n const t = e >> 1 & 63;\n return t === 39 || t === 40;\n } else\n return (e & 31) === 6;\n}\nfunction gu(s, e, t, r) {\n const n = Mg(s);\n let i = 0;\n i += e;\n let o = 0, a = 0, l = 0;\n for (; i < n.length; ) {\n o = 0;\n do {\n if (i >= n.length)\n break;\n l = n[i++], o += l;\n } while (l === 255);\n a = 0;\n do {\n if (i >= n.length)\n break;\n l = n[i++], a += l;\n } while (l === 255);\n const c = n.length - i;\n let u = i;\n if (a < c)\n i += a;\n else if (a > c) {\n rt.error(`Malformed SEI payload. ${a} is too small, only ${c} bytes left to parse.`);\n break;\n }\n if (o === 4) {\n if (n[u++] === 181) {\n const h = Cg(n, u);\n if (u += 2, h === 49) {\n const f = Ie(n, u);\n if (u += 4, f === 1195456820) {\n const p = n[u++];\n if (p === 3) {\n const y = n[u++], E = 31 & y, b = 64 & y, R = b ? 2 + E * 3 : 0, A = new Uint8Array(R);\n if (b) {\n A[0] = y;\n for (let F = 1; F < R; F++)\n A[F] = n[u++];\n }\n r.push({\n type: p,\n payloadType: o,\n pts: t,\n bytes: A\n });\n }\n }\n }\n }\n } else if (o === 5 && a > 16) {\n const d = [];\n for (let p = 0; p < 16; p++) {\n const y = n[u++].toString(16);\n d.push(y.length == 1 ? \"0\" + y : y), (p === 3 || p === 5 || p === 7 || p === 9) && d.push(\"-\");\n }\n const h = a - 16, f = new Uint8Array(h);\n for (let p = 0; p < h; p++)\n f[p] = n[u++];\n r.push({\n payloadType: o,\n pts: t,\n uuid: d.join(\"\"),\n userData: Tr(f),\n userDataBytes: f\n });\n }\n }\n}\nfunction Mg(s) {\n const e = s.byteLength, t = [];\n let r = 1;\n for (; r < e - 2; )\n s[r] === 0 && s[r + 1] === 0 && s[r + 2] === 3 ? (t.push(r + 2), r += 2) : r++;\n if (t.length === 0)\n return s;\n const n = e - t.length, i = new Uint8Array(n);\n let o = 0;\n for (r = 0; r < n; o++, r++)\n o === t[0] && (o++, t.shift()), i[r] = s[o];\n return i;\n}\nfunction KS(s) {\n const e = s[0];\n let t = \"\", r = \"\", n = 0, i = 0, o = 0, a = 0, l = 0, c = 0;\n if (e === 0) {\n for (; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n t += jt(s.subarray(c, c + 1)), c += 1;\n for (t += jt(s.subarray(c, c + 1)), c += 1; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n r += jt(s.subarray(c, c + 1)), c += 1;\n r += jt(s.subarray(c, c + 1)), c += 1, n = Ie(s, 12), i = Ie(s, 16), a = Ie(s, 20), l = Ie(s, 24), c = 28;\n } else if (e === 1) {\n c += 4, n = Ie(s, c), c += 4;\n const d = Ie(s, c);\n c += 4;\n const h = Ie(s, c);\n for (c += 4, o = 2 ** 32 * d + h, SS(o) || (o = Number.MAX_SAFE_INTEGER, rt.warn(\"Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box\")), a = Ie(s, c), c += 4, l = Ie(s, c), c += 4; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n t += jt(s.subarray(c, c + 1)), c += 1;\n for (t += jt(s.subarray(c, c + 1)), c += 1; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n r += jt(s.subarray(c, c + 1)), c += 1;\n r += jt(s.subarray(c, c + 1)), c += 1;\n }\n const u = s.subarray(c, s.byteLength);\n return {\n schemeIdUri: t,\n value: r,\n timeScale: n,\n presentationTime: o,\n presentationTimeDelta: i,\n eventDuration: a,\n id: l,\n payload: u\n };\n}\nfunction HS(s, ...e) {\n const t = e.length;\n let r = 8, n = t;\n for (; n--; )\n r += e[n].byteLength;\n const i = new Uint8Array(r);\n for (i[0] = r >> 24 & 255, i[1] = r >> 16 & 255, i[2] = r >> 8 & 255, i[3] = r & 255, i.set(s, 4), n = 0, r = 8; n < t; n++)\n i.set(e[n], r), r += e[n].byteLength;\n return i;\n}\nfunction qS(s, e, t) {\n if (s.byteLength !== 16)\n throw new RangeError(\"Invalid system id\");\n let r, n;\n r = 0, n = new Uint8Array();\n let i;\n r > 0 ? (i = new Uint8Array(4), e.length > 0 && new DataView(i.buffer).setUint32(0, e.length, !1)) : i = new Uint8Array();\n const o = new Uint8Array(4);\n return t.byteLength > 0 && new DataView(o.buffer).setUint32(0, t.byteLength, !1), HS(\n [112, 115, 115, 104],\n new Uint8Array([\n r,\n 0,\n 0,\n 0\n // Flags\n ]),\n s,\n // 16 bytes\n i,\n n,\n o,\n t\n );\n}\nfunction WS(s) {\n const e = [];\n if (s instanceof ArrayBuffer) {\n const t = s.byteLength;\n let r = 0;\n for (; r + 32 < t; ) {\n const n = new DataView(s, r), i = zS(n);\n e.push(i), r += i.size;\n }\n }\n return e;\n}\nfunction zS(s) {\n const e = s.getUint32(0), t = s.byteOffset, r = s.byteLength;\n if (r < e)\n return {\n offset: t,\n size: r\n };\n if (s.getUint32(4) !== 1886614376)\n return {\n offset: t,\n size: e\n };\n const i = s.getUint32(8) >>> 24;\n if (i !== 0 && i !== 1)\n return {\n offset: t,\n size: e\n };\n const o = s.buffer, a = fr(new Uint8Array(o, t + 12, 16));\n let l = null, c = null, u = 0;\n if (i === 0)\n u = 28;\n else {\n const h = s.getUint32(28);\n if (!h || r < 32 + h * 16)\n return {\n offset: t,\n size: e\n };\n l = [];\n for (let f = 0; f < h; f++)\n l.push(new Uint8Array(o, t + 32 + f * 16, 16));\n u = 32 + h * 16;\n }\n if (!u)\n return {\n offset: t,\n size: e\n };\n const d = s.getUint32(u);\n return e - 32 < d ? {\n offset: t,\n size: e\n } : (c = new Uint8Array(o, t + u + 4, d), {\n version: i,\n systemId: a,\n kids: l,\n data: c,\n offset: t,\n size: e\n });\n}\nconst Og = () => /\\(Windows.+Firefox\\//i.test(navigator.userAgent), Fn = {\n audio: {\n a3ds: 1,\n \"ac-3\": 0.95,\n \"ac-4\": 1,\n alac: 0.9,\n alaw: 1,\n dra1: 1,\n \"dts+\": 1,\n \"dts-\": 1,\n dtsc: 1,\n dtse: 1,\n dtsh: 1,\n \"ec-3\": 0.9,\n enca: 1,\n fLaC: 0.9,\n // MP4-RA listed codec entry for FLAC\n flac: 0.9,\n // legacy browser codec name for FLAC\n FLAC: 0.9,\n // some manifests may list \"FLAC\" with Apple's tools\n g719: 1,\n g726: 1,\n m4ae: 1,\n mha1: 1,\n mha2: 1,\n mhm1: 1,\n mhm2: 1,\n mlpa: 1,\n mp4a: 1,\n \"raw \": 1,\n Opus: 1,\n opus: 1,\n // browsers expect this to be lowercase despite MP4RA says 'Opus'\n samr: 1,\n sawb: 1,\n sawp: 1,\n sevc: 1,\n sqcp: 1,\n ssmv: 1,\n twos: 1,\n ulaw: 1\n },\n video: {\n avc1: 1,\n avc2: 1,\n avc3: 1,\n avc4: 1,\n avcp: 1,\n av01: 0.8,\n dav1: 0.8,\n drac: 1,\n dva1: 1,\n dvav: 1,\n dvh1: 0.7,\n dvhe: 0.7,\n encv: 1,\n hev1: 0.75,\n hvc1: 0.75,\n mjp2: 1,\n mp4v: 1,\n mvc1: 1,\n mvc2: 1,\n mvc3: 1,\n mvc4: 1,\n resv: 1,\n rv60: 1,\n s263: 1,\n svc1: 1,\n svc2: 1,\n \"vc-1\": 1,\n vp08: 1,\n vp09: 0.9\n },\n text: {\n stpp: 1,\n wvtt: 1\n }\n};\nfunction pu(s, e) {\n const t = Fn[e];\n return !!t && !!t[s.slice(0, 4)];\n}\nfunction gi(s, e, t = !0) {\n return !s.split(\",\").some((r) => !mu(r, e, t));\n}\nfunction mu(s, e, t = !0) {\n var r;\n const n = Ms(t);\n return (r = n == null ? void 0 : n.isTypeSupported(pi(s, e))) != null ? r : !1;\n}\nfunction pi(s, e) {\n return `${e}/mp4;codecs=${s}`;\n}\nfunction sh(s) {\n if (s) {\n const e = s.substring(0, 4);\n return Fn.video[e];\n }\n return 2;\n}\nfunction Zo(s) {\n const e = Og();\n return s.split(\",\").reduce((t, r) => {\n const i = e && ya(r) ? 9 : Fn.video[r];\n return i ? (i * 2 + t) / (t ? 3 : 2) : (Fn.audio[r] + t) / (t ? 2 : 1);\n }, 0);\n}\nconst hl = {};\nfunction YS(s, e = !0) {\n if (hl[s])\n return hl[s];\n const t = {\n // Idealy fLaC and Opus would be first (spec-compliant) but\n // some browsers will report that fLaC is supported then fail.\n // see: https://bugs.chromium.org/p/chromium/issues/detail?id=1422728\n flac: [\"flac\", \"fLaC\", \"FLAC\"],\n opus: [\"opus\", \"Opus\"],\n // Replace audio codec info if browser does not support mp4a.40.34,\n // and demuxer can fallback to 'audio/mpeg' or 'audio/mp4;codecs=\"mp3\"'\n \"mp4a.40.34\": [\"mp3\"]\n }[s];\n for (let n = 0; n < t.length; n++) {\n var r;\n if (mu(t[n], \"audio\", e))\n return hl[s] = t[n], t[n];\n if (t[n] === \"mp3\" && (r = Ms(e)) != null && r.isTypeSupported(\"audio/mpeg\"))\n return \"\";\n }\n return s;\n}\nconst ZS = /flac|opus|mp4a\\.40\\.34/i;\nfunction Xo(s, e = !0) {\n return s.replace(ZS, (t) => YS(t.toLowerCase(), e));\n}\nfunction XS(s, e) {\n const t = [];\n if (s) {\n const r = s.split(\",\");\n for (let n = 0; n < r.length; n++)\n pu(r[n], \"video\") || t.push(r[n]);\n }\n return e && t.push(e), t.join(\",\");\n}\nfunction fo(s, e) {\n if (s && (s.length > 4 || [\"ac-3\", \"ec-3\", \"alac\", \"fLaC\", \"Opus\"].indexOf(s) !== -1) && (nh(s, \"audio\") || nh(s, \"video\")))\n return s;\n if (e) {\n const t = e.split(\",\");\n if (t.length > 1) {\n if (s) {\n for (let r = t.length; r--; )\n if (t[r].substring(0, 4) === s.substring(0, 4))\n return t[r];\n }\n return t[0];\n }\n }\n return e || s;\n}\nfunction nh(s, e) {\n return pu(s, e) && mu(s, e);\n}\nfunction JS(s) {\n const e = s.split(\",\");\n for (let t = 0; t < e.length; t++) {\n const r = e[t].split(\".\");\n r.length > 2 && r[0] === \"avc1\" && (e[t] = `avc1.${parseInt(r[1]).toString(16)}${(\"000\" + parseInt(r[2]).toString(16)).slice(-4)}`);\n }\n return e.join(\",\");\n}\nfunction QS(s) {\n if (s.startsWith(\"av01.\")) {\n const e = s.split(\".\"), t = [\"0\", \"111\", \"01\", \"01\", \"01\", \"0\"];\n for (let r = e.length; r > 4 && r < 10; r++)\n e[r] = t[r - 4];\n return e.join(\".\");\n }\n return s;\n}\nfunction ih(s) {\n const e = Ms(s) || {\n isTypeSupported: () => !1\n };\n return {\n mpeg: e.isTypeSupported(\"audio/mpeg\"),\n mp3: e.isTypeSupported('audio/mp4; codecs=\"mp3\"'),\n ac3: e.isTypeSupported('audio/mp4; codecs=\"ac-3\"')\n };\n}\nfunction lc(s) {\n return s.replace(/^.+codecs=[\"']?([^\"']+).*$/, \"$1\");\n}\nconst eb = {\n supported: !0,\n powerEfficient: !0,\n smooth: !0\n // keySystemAccess: null,\n}, tb = {\n supported: !1,\n smooth: !1,\n powerEfficient: !1\n // keySystemAccess: null,\n}, Bg = {\n supported: !0,\n configurations: [],\n decodingInfoResults: [eb]\n};\nfunction Fg(s, e) {\n return {\n supported: !1,\n configurations: e,\n decodingInfoResults: [tb],\n error: s\n };\n}\nfunction rb(s, e, t, r, n, i) {\n const o = s.videoCodec, a = s.audioCodec ? s.audioGroups : null, l = i == null ? void 0 : i.audioCodec, c = i == null ? void 0 : i.channels, u = c ? parseInt(c) : l ? 1 / 0 : 2;\n let d = null;\n if (a != null && a.length)\n try {\n a.length === 1 && a[0] ? d = e.groups[a[0]].channels : d = a.reduce((h, f) => {\n if (f) {\n const p = e.groups[f];\n if (!p)\n throw new Error(`Audio track group ${f} not found`);\n Object.keys(p.channels).forEach((y) => {\n h[y] = (h[y] || 0) + p.channels[y];\n });\n }\n return h;\n }, {\n 2: 0\n });\n } catch {\n return !0;\n }\n return o !== void 0 && // Force media capabilities check for HEVC to avoid failure on Windows\n (o.split(\",\").some((h) => ya(h)) || s.width > 1920 && s.height > 1088 || s.height > 1920 && s.width > 1088 || s.frameRate > Math.max(r, 30) || s.videoRange !== \"SDR\" && s.videoRange !== t || s.bitrate > Math.max(n, 8e6)) || !!d && ue(u) && Object.keys(d).some((h) => parseInt(h) > u);\n}\nfunction Ng(s, e, t, r = {}) {\n const n = s.videoCodec;\n if (!n && !s.audioCodec || !t)\n return Promise.resolve(Bg);\n const i = [], o = sb(s), a = o.length, l = nb(s, e, a > 0), c = l.length;\n for (let u = a || 1 * c || 1; u--; ) {\n const d = {\n type: \"media-source\"\n };\n if (a && (d.video = o[u % a]), c) {\n d.audio = l[u % c];\n const h = d.audio.bitrate;\n d.video && h && (d.video.bitrate -= h);\n }\n i.push(d);\n }\n if (n) {\n const u = navigator.userAgent;\n if (n.split(\",\").some((d) => ya(d)) && Og())\n return Promise.resolve(Fg(new Error(`Overriding Windows Firefox HEVC MediaCapabilities result based on user-agent string: (${u})`), i));\n }\n return Promise.all(i.map((u) => {\n const d = ob(u);\n return r[d] || (r[d] = t.decodingInfo(u));\n })).then((u) => ({\n supported: !u.some((d) => !d.supported),\n configurations: i,\n decodingInfoResults: u\n })).catch((u) => ({\n supported: !1,\n configurations: i,\n decodingInfoResults: [],\n error: u\n }));\n}\nfunction sb(s) {\n var e;\n const t = (e = s.videoCodec) == null ? void 0 : e.split(\",\"), r = Ug(s), n = s.width || 640, i = s.height || 480, o = s.frameRate || 30, a = s.videoRange.toLowerCase();\n return t ? t.map((l) => {\n const c = {\n contentType: pi(QS(l), \"video\"),\n width: n,\n height: i,\n bitrate: r,\n framerate: o\n };\n return a !== \"sdr\" && (c.transferFunction = a), c;\n }) : [];\n}\nfunction nb(s, e, t) {\n var r;\n const n = (r = s.audioCodec) == null ? void 0 : r.split(\",\"), i = Ug(s);\n return n && s.audioGroups ? s.audioGroups.reduce((o, a) => {\n var l;\n const c = a ? (l = e.groups[a]) == null ? void 0 : l.tracks : null;\n return c ? c.reduce((u, d) => {\n if (d.groupId === a) {\n const h = parseFloat(d.channels || \"\");\n n.forEach((f) => {\n const p = {\n contentType: pi(f, \"audio\"),\n bitrate: t ? ib(f, i) : i\n };\n h && (p.channels = \"\" + h), u.push(p);\n });\n }\n return u;\n }, o) : o;\n }, []) : [];\n}\nfunction ib(s, e) {\n if (e <= 1)\n return 1;\n let t = 128e3;\n return s === \"ec-3\" ? t = 768e3 : s === \"ac-3\" && (t = 64e4), Math.min(e / 2, t);\n}\nfunction Ug(s) {\n return Math.ceil(Math.max(s.bitrate * 0.9, s.averageBitrate) / 1e3) * 1e3 || 1;\n}\nfunction ob(s) {\n let e = \"\";\n const {\n audio: t,\n video: r\n } = s;\n if (r) {\n const n = lc(r.contentType);\n e += `${n}_r${r.height}x${r.width}f${Math.ceil(r.framerate)}${r.transferFunction || \"sd\"}_${Math.ceil(r.bitrate / 1e5)}`;\n }\n if (t) {\n const n = lc(t.contentType);\n e += `${r ? \"_\" : \"\"}${n}_c${t.channels}`;\n }\n return e;\n}\nconst cc = [\"NONE\", \"TYPE-0\", \"TYPE-1\", null];\nfunction ab(s) {\n return cc.indexOf(s) > -1;\n}\nconst Jo = [\"SDR\", \"PQ\", \"HLG\"];\nfunction lb(s) {\n return !!s && Jo.indexOf(s) > -1;\n}\nvar go = {\n No: \"\",\n Yes: \"YES\",\n v2: \"v2\"\n};\nfunction oh(s) {\n const {\n canSkipUntil: e,\n canSkipDateRanges: t,\n age: r\n } = s, n = r < e / 2;\n return e && n ? t ? go.v2 : go.Yes : go.No;\n}\nclass ah {\n constructor(e, t, r) {\n this.msn = void 0, this.part = void 0, this.skip = void 0, this.msn = e, this.part = t, this.skip = r;\n }\n addDirectives(e) {\n const t = new self.URL(e);\n return this.msn !== void 0 && t.searchParams.set(\"_HLS_msn\", this.msn.toString()), this.part !== void 0 && t.searchParams.set(\"_HLS_part\", this.part.toString()), this.skip && t.searchParams.set(\"_HLS_skip\", this.skip), t.href;\n }\n}\nclass mi {\n constructor(e) {\n if (this._attrs = void 0, this.audioCodec = void 0, this.bitrate = void 0, this.codecSet = void 0, this.url = void 0, this.frameRate = void 0, this.height = void 0, this.id = void 0, this.name = void 0, this.supplemental = void 0, this.videoCodec = void 0, this.width = void 0, this.details = void 0, this.fragmentError = 0, this.loadError = 0, this.loaded = void 0, this.realBitrate = 0, this.supportedPromise = void 0, this.supportedResult = void 0, this._avgBitrate = 0, this._audioGroups = void 0, this._subtitleGroups = void 0, this._urlId = 0, this.url = [e.url], this._attrs = [e.attrs], this.bitrate = e.bitrate, e.details && (this.details = e.details), this.id = e.id || 0, this.name = e.name, this.width = e.width || 0, this.height = e.height || 0, this.frameRate = e.attrs.optionalFloat(\"FRAME-RATE\", 0), this._avgBitrate = e.attrs.decimalInteger(\"AVERAGE-BANDWIDTH\"), this.audioCodec = e.audioCodec, this.videoCodec = e.videoCodec, this.codecSet = [e.videoCodec, e.audioCodec].filter((r) => !!r).map((r) => r.substring(0, 4)).join(\",\"), \"supplemental\" in e) {\n var t;\n this.supplemental = e.supplemental;\n const r = (t = e.supplemental) == null ? void 0 : t.videoCodec;\n r && r !== e.videoCodec && (this.codecSet += `,${r.substring(0, 4)}`);\n }\n this.addGroupId(\"audio\", e.attrs.AUDIO), this.addGroupId(\"text\", e.attrs.SUBTITLES);\n }\n get maxBitrate() {\n return Math.max(this.realBitrate, this.bitrate);\n }\n get averageBitrate() {\n return this._avgBitrate || this.realBitrate || this.bitrate;\n }\n get attrs() {\n return this._attrs[0];\n }\n get codecs() {\n return this.attrs.CODECS || \"\";\n }\n get pathwayId() {\n return this.attrs[\"PATHWAY-ID\"] || \".\";\n }\n get videoRange() {\n return this.attrs[\"VIDEO-RANGE\"] || \"SDR\";\n }\n get score() {\n return this.attrs.optionalFloat(\"SCORE\", 0);\n }\n get uri() {\n return this.url[0] || \"\";\n }\n hasAudioGroup(e) {\n return lh(this._audioGroups, e);\n }\n hasSubtitleGroup(e) {\n return lh(this._subtitleGroups, e);\n }\n get audioGroups() {\n return this._audioGroups;\n }\n get subtitleGroups() {\n return this._subtitleGroups;\n }\n addGroupId(e, t) {\n if (t) {\n if (e === \"audio\") {\n let r = this._audioGroups;\n r || (r = this._audioGroups = []), r.indexOf(t) === -1 && r.push(t);\n } else if (e === \"text\") {\n let r = this._subtitleGroups;\n r || (r = this._subtitleGroups = []), r.indexOf(t) === -1 && r.push(t);\n }\n }\n }\n // Deprecated methods (retained for backwards compatibility)\n get urlId() {\n return 0;\n }\n set urlId(e) {\n }\n get audioGroupIds() {\n return this.audioGroups ? [this.audioGroupId] : void 0;\n }\n get textGroupIds() {\n return this.subtitleGroups ? [this.textGroupId] : void 0;\n }\n get audioGroupId() {\n var e;\n return (e = this.audioGroups) == null ? void 0 : e[0];\n }\n get textGroupId() {\n var e;\n return (e = this.subtitleGroups) == null ? void 0 : e[0];\n }\n addFallback() {\n }\n}\nfunction lh(s, e) {\n return !e || !s ? !1 : s.indexOf(e) !== -1;\n}\nfunction cb() {\n if (typeof matchMedia == \"function\") {\n const s = matchMedia(\"(dynamic-range: high)\"), e = matchMedia(\"bad query\");\n if (s.media !== e.media)\n return s.matches === !0;\n }\n return !1;\n}\nfunction ub(s, e) {\n let t = !1, r = [];\n if (s && (t = s !== \"SDR\", r = [s]), e) {\n r = e.allowedVideoRanges || Jo.slice(0);\n const n = r.join(\"\") !== \"SDR\" && !e.videoCodec;\n t = e.preferHDR !== void 0 ? e.preferHDR : n && cb(), t || (r = [\"SDR\"]);\n }\n return {\n preferHDR: t,\n allowedVideoRanges: r\n };\n}\nconst db = (s) => {\n const e = /* @__PURE__ */ new WeakSet();\n return (t, r) => {\n if (s && (r = s(t, r)), typeof r == \"object\" && r !== null) {\n if (e.has(r))\n return;\n e.add(r);\n }\n return r;\n };\n}, at = (s, e) => JSON.stringify(s, db(e));\nfunction hb(s, e, t, r, n) {\n const i = Object.keys(s), o = r == null ? void 0 : r.channels, a = r == null ? void 0 : r.audioCodec, l = n == null ? void 0 : n.videoCodec, c = o && parseInt(o) === 2;\n let u = !1, d = !1, h = 1 / 0, f = 1 / 0, p = 1 / 0, y = 1 / 0, E = 0, b = [];\n const {\n preferHDR: R,\n allowedVideoRanges: A\n } = ub(e, n);\n for (let j = i.length; j--; ) {\n const C = s[i[j]];\n u || (u = C.channels[2] > 0), h = Math.min(h, C.minHeight), f = Math.min(f, C.minFramerate), p = Math.min(p, C.minBitrate), A.filter(($) => C.videoRanges[$] > 0).length > 0 && (d = !0);\n }\n h = ue(h) ? h : 0, f = ue(f) ? f : 0;\n const F = Math.max(1080, h), M = Math.max(30, f);\n p = ue(p) ? p : t, t = Math.max(p, t), d || (e = void 0);\n const H = i.length > 1;\n return {\n codecSet: i.reduce((j, C) => {\n const k = s[C];\n if (C === j)\n return j;\n if (b = d ? A.filter(($) => k.videoRanges[$] > 0) : [], H) {\n if (k.minBitrate > t)\n return Ur(C, `min bitrate of ${k.minBitrate} > current estimate of ${t}`), j;\n if (!k.hasDefaultAudio)\n return Ur(C, \"no renditions with default or auto-select sound found\"), j;\n if (a && C.indexOf(a.substring(0, 4)) % 5 !== 0)\n return Ur(C, `audio codec preference \"${a}\" not found`), j;\n if (o && !c) {\n if (!k.channels[o])\n return Ur(C, `no renditions with ${o} channel sound found (channels options: ${Object.keys(k.channels)})`), j;\n } else if ((!a || c) && u && k.channels[2] === 0)\n return Ur(C, \"no renditions with stereo sound found\"), j;\n if (k.minHeight > F)\n return Ur(C, `min resolution of ${k.minHeight} > maximum of ${F}`), j;\n if (k.minFramerate > M)\n return Ur(C, `min framerate of ${k.minFramerate} > maximum of ${M}`), j;\n if (!b.some(($) => k.videoRanges[$] > 0))\n return Ur(C, `no variants with VIDEO-RANGE of ${at(b)} found`), j;\n if (l && C.indexOf(l.substring(0, 4)) % 5 !== 0)\n return Ur(C, `video codec preference \"${l}\" not found`), j;\n if (k.maxScore < E)\n return Ur(C, `max score of ${k.maxScore} < selected max of ${E}`), j;\n }\n return j && (Zo(C) >= Zo(j) || k.fragmentError > s[j].fragmentError) ? j : (y = k.minIndex, E = k.maxScore, C);\n }, void 0),\n videoRanges: b,\n preferHDR: R,\n minFramerate: f,\n minBitrate: p,\n minIndex: y\n };\n}\nfunction Ur(s, e) {\n rt.log(`[abr] start candidates with \"${s}\" ignored because ${e}`);\n}\nfunction $g(s) {\n return s.reduce((e, t) => {\n let r = e.groups[t.groupId];\n r || (r = e.groups[t.groupId] = {\n tracks: [],\n channels: {\n 2: 0\n },\n hasDefault: !1,\n hasAutoSelect: !1\n }), r.tracks.push(t);\n const n = t.channels || \"2\";\n return r.channels[n] = (r.channels[n] || 0) + 1, r.hasDefault = r.hasDefault || t.default, r.hasAutoSelect = r.hasAutoSelect || t.autoselect, r.hasDefault && (e.hasDefaultAudio = !0), r.hasAutoSelect && (e.hasAutoSelectAudio = !0), e;\n }, {\n hasDefaultAudio: !1,\n hasAutoSelectAudio: !1,\n groups: {}\n });\n}\nfunction fb(s, e, t, r) {\n return s.slice(t, r + 1).reduce((n, i, o) => {\n if (!i.codecSet)\n return n;\n const a = i.audioGroups;\n let l = n[i.codecSet];\n l || (n[i.codecSet] = l = {\n minBitrate: 1 / 0,\n minHeight: 1 / 0,\n minFramerate: 1 / 0,\n minIndex: o,\n maxScore: 0,\n videoRanges: {\n SDR: 0\n },\n channels: {\n 2: 0\n },\n hasDefaultAudio: !a,\n fragmentError: 0\n }), l.minBitrate = Math.min(l.minBitrate, i.bitrate);\n const c = Math.min(i.height, i.width);\n return l.minHeight = Math.min(l.minHeight, c), l.minFramerate = Math.min(l.minFramerate, i.frameRate), l.minIndex = Math.min(l.minIndex, o), l.maxScore = Math.max(l.maxScore, i.score), l.fragmentError += i.fragmentError, l.videoRanges[i.videoRange] = (l.videoRanges[i.videoRange] || 0) + 1, a && a.forEach((u) => {\n if (!u)\n return;\n const d = e.groups[u];\n d && (l.hasDefaultAudio = l.hasDefaultAudio || e.hasDefaultAudio ? d.hasDefault : d.hasAutoSelect || !e.hasDefaultAudio && !e.hasAutoSelectAudio, Object.keys(d.channels).forEach((h) => {\n l.channels[h] = (l.channels[h] || 0) + d.channels[h];\n }));\n }), n;\n }, {});\n}\nfunction ch(s) {\n if (!s)\n return s;\n const {\n lang: e,\n assocLang: t,\n characteristics: r,\n channels: n,\n audioCodec: i\n } = s;\n return {\n lang: e,\n assocLang: t,\n characteristics: r,\n channels: n,\n audioCodec: i\n };\n}\nfunction Wr(s, e, t) {\n if (\"attrs\" in s) {\n const r = e.indexOf(s);\n if (r !== -1)\n return r;\n }\n for (let r = 0; r < e.length; r++) {\n const n = e[r];\n if (qs(s, n, t))\n return r;\n }\n return -1;\n}\nfunction qs(s, e, t) {\n const {\n groupId: r,\n name: n,\n lang: i,\n assocLang: o,\n default: a\n } = s, l = s.forced;\n return (r === void 0 || e.groupId === r) && (n === void 0 || e.name === n) && (i === void 0 || gb(i, e.lang)) && (i === void 0 || e.assocLang === o) && (a === void 0 || e.default === a) && (l === void 0 || e.forced === l) && (!(\"characteristics\" in s) || pb(s.characteristics || \"\", e.characteristics)) && (t === void 0 || t(s, e));\n}\nfunction gb(s, e = \"--\") {\n return s.length === e.length ? s === e : s.startsWith(e) || e.startsWith(s);\n}\nfunction pb(s, e = \"\") {\n const t = s.split(\",\"), r = e.split(\",\");\n return t.length === r.length && !t.some((n) => r.indexOf(n) === -1);\n}\nfunction Us(s, e) {\n const {\n audioCodec: t,\n channels: r\n } = s;\n return (t === void 0 || (e.audioCodec || \"\").substring(0, 4) === t.substring(0, 4)) && (r === void 0 || r === (e.channels || \"2\"));\n}\nfunction mb(s, e, t, r, n) {\n const i = e[r], a = e.reduce((h, f, p) => {\n const y = f.uri;\n return (h[y] || (h[y] = [])).push(p), h;\n }, {})[i.uri];\n a.length > 1 && (r = Math.max.apply(Math, a));\n const l = i.videoRange, c = i.frameRate, u = i.codecSet.substring(0, 4), d = uh(e, r, (h) => {\n if (h.videoRange !== l || h.frameRate !== c || h.codecSet.substring(0, 4) !== u)\n return !1;\n const f = h.audioGroups, p = t.filter((y) => !f || f.indexOf(y.groupId) !== -1);\n return Wr(s, p, n) > -1;\n });\n return d > -1 ? d : uh(e, r, (h) => {\n const f = h.audioGroups, p = t.filter((y) => !f || f.indexOf(y.groupId) !== -1);\n return Wr(s, p, n) > -1;\n });\n}\nfunction uh(s, e, t) {\n for (let r = e; r > -1; r--)\n if (t(s[r]))\n return r;\n for (let r = e + 1; r < s.length; r++)\n if (t(s[r]))\n return r;\n return -1;\n}\nfunction Qo(s, e) {\n var t;\n return !!s && s !== ((t = e.loadLevelObj) == null ? void 0 : t.uri);\n}\nclass yb extends Lr {\n constructor(e) {\n super(\"abr\", e.logger), this.hls = void 0, this.lastLevelLoadSec = 0, this.lastLoadedFragLevel = -1, this.firstSelection = -1, this._nextAutoLevel = -1, this.nextAutoLevelKey = \"\", this.audioTracksByGroup = null, this.codecTiers = null, this.timer = -1, this.fragCurrent = null, this.partCurrent = null, this.bitrateTestDelay = 0, this.rebufferNotice = -1, this.supportedCache = {}, this.bwEstimator = void 0, this._abandonRulesCheck = (t) => {\n var r;\n const {\n fragCurrent: n,\n partCurrent: i,\n hls: o\n } = this, {\n autoLevelEnabled: a,\n media: l\n } = o;\n if (!n || !l)\n return;\n const c = performance.now(), u = i ? i.stats : n.stats, d = i ? i.duration : n.duration, h = c - u.loading.start, f = o.minAutoLevel, p = n.level, y = this._nextAutoLevel;\n if (u.aborted || u.loaded && u.loaded === u.total || p <= f) {\n this.clearTimer(), this._nextAutoLevel = -1;\n return;\n }\n if (!a)\n return;\n const E = y > -1 && y !== p, b = !!t || E;\n if (!b && (l.paused || !l.playbackRate || !l.readyState))\n return;\n const R = o.mainForwardBufferInfo;\n if (!b && R === null)\n return;\n const A = this.bwEstimator.getEstimateTTFB(), F = Math.abs(l.playbackRate);\n if (h <= Math.max(A, 1e3 * (d / (F * 2))))\n return;\n const M = R ? R.len / F : 0, H = u.loading.first ? u.loading.first - u.loading.start : -1, K = u.loaded && H > -1, j = this.getBwEstimate(), C = o.levels, k = C[p], $ = Math.max(u.loaded, Math.round(d * (n.bitrate || k.averageBitrate) / 8));\n let W = K ? h - H : h;\n W < 1 && K && (W = Math.min(h, u.loaded * 8 / j));\n const _ = K ? u.loaded * 1e3 / W : 0, g = A / 1e3, x = _ ? ($ - u.loaded) / _ : $ * 8 / j + g;\n if (x <= M)\n return;\n const w = _ ? _ * 8 : j, D = ((r = (t == null ? void 0 : t.details) || this.hls.latestLevelDetails) == null ? void 0 : r.live) === !0, O = this.hls.config.abrBandWidthUpFactor;\n let U = Number.POSITIVE_INFINITY, V;\n for (V = p - 1; V > f; V--) {\n const P = C[V].maxBitrate, N = !C[V].details || D;\n if (U = this.getTimeToLoadFrag(g, w, d * P, N), U < Math.min(M, d + g))\n break;\n }\n if (U >= x || U > d * 10)\n return;\n K ? this.bwEstimator.sample(h - Math.min(A, H), u.loaded) : this.bwEstimator.sampleTTFB(h);\n const L = C[V].maxBitrate;\n this.getBwEstimate() * O > L && this.resetEstimator(L);\n const m = this.findBestLevel(L, f, V, 0, M, 1, 1);\n m > -1 && (V = m), this.warn(`Fragment ${n.sn}${i ? \" part \" + i.index : \"\"} of level ${p} is loading too slowly;\n Fragment duration: ${n.duration.toFixed(3)}\n Time to underbuffer: ${M.toFixed(3)} s\n Estimated load time for current fragment: ${x.toFixed(3)} s\n Estimated load time for down switch fragment: ${U.toFixed(3)} s\n TTFB estimate: ${H | 0} ms\n Current BW estimate: ${ue(j) ? j | 0 : \"Unknown\"} bps\n New BW estimate: ${this.getBwEstimate() | 0} bps\n Switching to level ${V} @ ${L | 0} bps`), o.nextLoadLevel = o.nextAutoLevel = V, this.clearTimer();\n const v = () => {\n if (this.clearTimer(), this.fragCurrent === n && this.hls.loadLevel === V && V > 0) {\n const P = this.getStarvationDelay();\n if (this.warn(`Aborting inflight request ${V > 0 ? \"and switching down\" : \"\"}\n Fragment duration: ${n.duration.toFixed(3)} s\n Time to underbuffer: ${P.toFixed(3)} s`), n.abortRequests(), this.fragCurrent = this.partCurrent = null, V > f) {\n let N = this.findBestLevel(this.hls.levels[f].bitrate, f, V, 0, P, 1, 1);\n N === -1 && (N = f), this.hls.nextLoadLevel = this.hls.nextAutoLevel = N, this.resetEstimator(this.hls.levels[N].bitrate);\n }\n }\n };\n E || x > U * 2 ? v() : this.timer = self.setInterval(v, U * 1e3), o.trigger(I.FRAG_LOAD_EMERGENCY_ABORTED, {\n frag: n,\n part: i,\n stats: u\n });\n }, this.hls = e, this.bwEstimator = this.initEstimator(), this.registerListeners();\n }\n resetEstimator(e) {\n e && (this.log(`setting initial bwe to ${e}`), this.hls.config.abrEwmaDefaultEstimate = e), this.firstSelection = -1, this.bwEstimator = this.initEstimator();\n }\n initEstimator() {\n const e = this.hls.config;\n return new TS(e.abrEwmaSlowVoD, e.abrEwmaFastVoD, e.abrEwmaDefaultEstimate);\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.FRAG_LOADING, this.onFragLoading, this), e.on(I.FRAG_LOADED, this.onFragLoaded, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this), e.on(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this), e.on(I.ERROR, this.onError, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e && (e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.FRAG_LOADING, this.onFragLoading, this), e.off(I.FRAG_LOADED, this.onFragLoaded, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this), e.off(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this), e.off(I.ERROR, this.onError, this));\n }\n destroy() {\n this.unregisterListeners(), this.clearTimer(), this.hls = this._abandonRulesCheck = this.supportedCache = null, this.fragCurrent = this.partCurrent = null;\n }\n onManifestLoading(e, t) {\n this.lastLoadedFragLevel = -1, this.firstSelection = -1, this.lastLevelLoadSec = 0, this.supportedCache = {}, this.fragCurrent = this.partCurrent = null, this.onLevelsUpdated(), this.clearTimer();\n }\n onLevelsUpdated() {\n this.lastLoadedFragLevel > -1 && this.fragCurrent && (this.lastLoadedFragLevel = this.fragCurrent.level), this._nextAutoLevel = -1, this.onMaxAutoLevelUpdated(), this.codecTiers = null, this.audioTracksByGroup = null;\n }\n onMaxAutoLevelUpdated() {\n this.firstSelection = -1, this.nextAutoLevelKey = \"\";\n }\n onFragLoading(e, t) {\n const r = t.frag;\n if (!this.ignoreFragment(r)) {\n if (!r.bitrateTest) {\n var n;\n this.fragCurrent = r, this.partCurrent = (n = t.part) != null ? n : null;\n }\n this.clearTimer(), this.timer = self.setInterval(this._abandonRulesCheck, 100);\n }\n }\n onLevelSwitching(e, t) {\n this.clearTimer();\n }\n onError(e, t) {\n if (!t.fatal)\n switch (t.details) {\n case J.BUFFER_ADD_CODEC_ERROR:\n case J.BUFFER_APPEND_ERROR:\n this.lastLoadedFragLevel = -1, this.firstSelection = -1;\n break;\n case J.FRAG_LOAD_TIMEOUT: {\n const r = t.frag, {\n fragCurrent: n,\n partCurrent: i\n } = this;\n if (r && n && r.sn === n.sn && r.level === n.level) {\n const o = performance.now(), a = i ? i.stats : r.stats, l = o - a.loading.start, c = a.loading.first ? a.loading.first - a.loading.start : -1;\n if (a.loaded && c > -1) {\n const d = this.bwEstimator.getEstimateTTFB();\n this.bwEstimator.sample(l - Math.min(d, c), a.loaded);\n } else\n this.bwEstimator.sampleTTFB(l);\n }\n break;\n }\n }\n }\n getTimeToLoadFrag(e, t, r, n) {\n const i = e + r / t, o = n ? e + this.lastLevelLoadSec : 0;\n return i + o;\n }\n onLevelLoaded(e, t) {\n const r = this.hls.config, {\n loading: n\n } = t.stats, i = n.end - n.first;\n ue(i) && (this.lastLevelLoadSec = i / 1e3), t.details.live ? this.bwEstimator.update(r.abrEwmaSlowLive, r.abrEwmaFastLive) : this.bwEstimator.update(r.abrEwmaSlowVoD, r.abrEwmaFastVoD), this.timer > -1 && this._abandonRulesCheck(t.levelInfo);\n }\n onFragLoaded(e, {\n frag: t,\n part: r\n }) {\n const n = r ? r.stats : t.stats;\n if (t.type === pe.MAIN && this.bwEstimator.sampleTTFB(n.loading.first - n.loading.start), !this.ignoreFragment(t)) {\n if (this.clearTimer(), t.level === this._nextAutoLevel && (this._nextAutoLevel = -1), this.firstSelection = -1, this.hls.config.abrMaxWithRealBitrate) {\n const i = r ? r.duration : t.duration, o = this.hls.levels[t.level], a = (o.loaded ? o.loaded.bytes : 0) + n.loaded, l = (o.loaded ? o.loaded.duration : 0) + i;\n o.loaded = {\n bytes: a,\n duration: l\n }, o.realBitrate = Math.round(8 * a / l);\n }\n if (t.bitrateTest) {\n const i = {\n stats: n,\n frag: t,\n part: r,\n id: t.type\n };\n this.onFragBuffered(I.FRAG_BUFFERED, i), t.bitrateTest = !1;\n } else\n this.lastLoadedFragLevel = t.level;\n }\n }\n onFragBuffered(e, t) {\n const {\n frag: r,\n part: n\n } = t, i = n != null && n.stats.loaded ? n.stats : r.stats;\n if (i.aborted || this.ignoreFragment(r))\n return;\n const o = i.parsing.end - i.loading.start - Math.min(i.loading.first - i.loading.start, this.bwEstimator.getEstimateTTFB());\n this.bwEstimator.sample(o, i.loaded), i.bwEstimate = this.getBwEstimate(), r.bitrateTest ? this.bitrateTestDelay = o / 1e3 : this.bitrateTestDelay = 0;\n }\n ignoreFragment(e) {\n return e.type !== pe.MAIN || e.sn === \"initSegment\";\n }\n clearTimer() {\n this.timer > -1 && (self.clearInterval(this.timer), this.timer = -1);\n }\n get firstAutoLevel() {\n const {\n maxAutoLevel: e,\n minAutoLevel: t\n } = this.hls, r = this.getBwEstimate(), n = this.hls.config.maxStarvationDelay, i = this.findBestLevel(r, t, e, 0, n, 1, 1);\n if (i > -1)\n return i;\n const o = this.hls.firstLevel, a = Math.min(Math.max(o, t), e);\n return this.warn(`Could not find best starting auto level. Defaulting to first in playlist ${o} clamped to ${a}`), a;\n }\n get forcedAutoLevel() {\n return this.nextAutoLevelKey ? -1 : this._nextAutoLevel;\n }\n // return next auto level\n get nextAutoLevel() {\n const e = this.forcedAutoLevel, r = this.bwEstimator.canEstimate(), n = this.lastLoadedFragLevel > -1;\n if (e !== -1 && (!r || !n || this.nextAutoLevelKey === this.getAutoLevelKey()))\n return e;\n const i = r && n ? this.getNextABRAutoLevel() : this.firstAutoLevel;\n if (e !== -1) {\n const o = this.hls.levels;\n if (o.length > Math.max(e, i) && o[e].loadError <= o[i].loadError)\n return e;\n }\n return this._nextAutoLevel = i, this.nextAutoLevelKey = this.getAutoLevelKey(), i;\n }\n getAutoLevelKey() {\n return `${this.getBwEstimate()}_${this.getStarvationDelay().toFixed(2)}`;\n }\n getNextABRAutoLevel() {\n const {\n fragCurrent: e,\n partCurrent: t,\n hls: r\n } = this;\n if (r.levels.length <= 1)\n return r.loadLevel;\n const {\n maxAutoLevel: n,\n config: i,\n minAutoLevel: o\n } = r, a = t ? t.duration : e ? e.duration : 0, l = this.getBwEstimate(), c = this.getStarvationDelay();\n let u = i.abrBandWidthFactor, d = i.abrBandWidthUpFactor;\n if (c) {\n const E = this.findBestLevel(l, o, n, c, 0, u, d);\n if (E >= 0)\n return this.rebufferNotice = -1, E;\n }\n let h = a ? Math.min(a, i.maxStarvationDelay) : i.maxStarvationDelay;\n if (!c) {\n const E = this.bitrateTestDelay;\n E && (h = (a ? Math.min(a, i.maxLoadingDelay) : i.maxLoadingDelay) - E, this.info(`bitrate test took ${Math.round(1e3 * E)}ms, set first fragment max fetchDuration to ${Math.round(1e3 * h)} ms`), u = d = 1);\n }\n const f = this.findBestLevel(l, o, n, c, h, u, d);\n if (this.rebufferNotice !== f && (this.rebufferNotice = f, this.info(`${c ? \"rebuffering expected\" : \"buffer is empty\"}, optimal quality level ${f}`)), f > -1)\n return f;\n const p = r.levels[o], y = r.loadLevelObj;\n return y && (p == null ? void 0 : p.bitrate) < y.bitrate ? o : r.loadLevel;\n }\n getStarvationDelay() {\n const e = this.hls, t = e.media;\n if (!t)\n return 1 / 0;\n const r = t && t.playbackRate !== 0 ? Math.abs(t.playbackRate) : 1, n = e.mainForwardBufferInfo;\n return (n ? n.len : 0) / r;\n }\n getBwEstimate() {\n return this.bwEstimator.canEstimate() ? this.bwEstimator.getEstimate() : this.hls.config.abrEwmaDefaultEstimate;\n }\n findBestLevel(e, t, r, n, i, o, a) {\n var l;\n const c = n + i, u = this.lastLoadedFragLevel, d = u === -1 ? this.hls.firstLevel : u, {\n fragCurrent: h,\n partCurrent: f\n } = this, {\n levels: p,\n allAudioTracks: y,\n loadLevel: E,\n config: b\n } = this.hls;\n if (p.length === 1)\n return 0;\n const R = p[d], A = !!((l = this.hls.latestLevelDetails) != null && l.live), F = E === -1 || u === -1;\n let M, H = \"SDR\", K = (R == null ? void 0 : R.frameRate) || 0;\n const {\n audioPreference: j,\n videoPreference: C\n } = b, k = this.audioTracksByGroup || (this.audioTracksByGroup = $g(y));\n let $ = -1;\n if (F) {\n if (this.firstSelection !== -1)\n return this.firstSelection;\n const w = this.codecTiers || (this.codecTiers = fb(p, k, t, r)), D = hb(w, H, e, j, C), {\n codecSet: O,\n videoRanges: U,\n minFramerate: V,\n minBitrate: L,\n minIndex: m,\n preferHDR: v\n } = D;\n $ = m, M = O, H = v ? U[U.length - 1] : U[0], K = V, e = Math.max(e, L), this.log(`picked start tier ${at(D)}`);\n } else\n M = R == null ? void 0 : R.codecSet, H = R == null ? void 0 : R.videoRange;\n const W = f ? f.duration : h ? h.duration : 0, _ = this.bwEstimator.getEstimateTTFB() / 1e3, g = [];\n for (let w = r; w >= t; w--) {\n var x;\n const D = p[w], O = w > d;\n if (!D)\n continue;\n if (b.useMediaCapabilities && !D.supportedResult && !D.supportedPromise) {\n const N = navigator.mediaCapabilities;\n typeof (N == null ? void 0 : N.decodingInfo) == \"function\" && rb(D, k, H, K, e, j) ? (D.supportedPromise = Ng(D, k, N, this.supportedCache), D.supportedPromise.then((Y) => {\n if (!this.hls)\n return;\n D.supportedResult = Y;\n const ee = this.hls.levels, ie = ee.indexOf(D);\n Y.error ? this.warn(`MediaCapabilities decodingInfo error: \"${Y.error}\" for level ${ie} ${at(Y)}`) : Y.supported ? Y.decodingInfoResults.some((le) => le.smooth === !1 || le.powerEfficient === !1) && this.log(`MediaCapabilities decodingInfo for level ${ie} not smooth or powerEfficient: ${at(Y)}`) : (this.warn(`Unsupported MediaCapabilities decodingInfo result for level ${ie} ${at(Y)}`), ie > -1 && ee.length > 1 && (this.log(`Removing unsupported level ${ie}`), this.hls.removeLevel(ie), this.hls.loadLevel === -1 && (this.hls.nextLoadLevel = 0)));\n }).catch((Y) => {\n this.warn(`Error handling MediaCapabilities decodingInfo: ${Y}`);\n })) : D.supportedResult = Bg;\n }\n if ((M && D.codecSet !== M || H && D.videoRange !== H || O && K > D.frameRate || !O && K > 0 && K < D.frameRate || (x = D.supportedResult) != null && (x = x.decodingInfoResults) != null && x.some((N) => N.smooth === !1)) && (!F || w !== $)) {\n g.push(w);\n continue;\n }\n const U = D.details, V = (f ? U == null ? void 0 : U.partTarget : U == null ? void 0 : U.averagetargetduration) || W;\n let L;\n O ? L = a * e : L = o * e;\n const m = W && n >= W * 2 && i === 0 ? D.averageBitrate : D.maxBitrate, v = this.getTimeToLoadFrag(_, L, m * V, U === void 0);\n if (\n // if adjusted bw is greater than level bitrate AND\n L >= m && // no level change, or new level has no error history\n (w === u || D.loadError === 0 && D.fragmentError === 0) && // fragment fetchDuration unknown OR live stream OR fragment fetchDuration less than max allowed fetch duration, then this level matches\n // we don't account for max Fetch Duration for live streams, this is to avoid switching down when near the edge of live sliding window ...\n // special case to support startLevel = -1 (bitrateTest) on live streams : in that case we should not exit loop so that findBestLevel will return -1\n (v <= _ || !ue(v) || A && !this.bitrateTestDelay || v < c)\n ) {\n const N = this.forcedAutoLevel;\n return w !== E && (N === -1 || N !== E) && (g.length && this.trace(`Skipped level(s) ${g.join(\",\")} of ${r} max with CODECS and VIDEO-RANGE:\"${p[g[0]].codecs}\" ${p[g[0]].videoRange}; not compatible with \"${M}\" ${H}`), this.info(`switch candidate:${d}->${w} adjustedbw(${Math.round(L)})-bitrate=${Math.round(L - m)} ttfb:${_.toFixed(1)} avgDuration:${V.toFixed(1)} maxFetchDuration:${c.toFixed(1)} fetchDuration:${v.toFixed(1)} firstSelection:${F} codecSet:${D.codecSet} videoRange:${D.videoRange} hls.loadLevel:${E}`)), F && (this.firstSelection = w), w;\n }\n }\n return -1;\n }\n set nextAutoLevel(e) {\n const t = this.deriveNextAutoLevel(e);\n this._nextAutoLevel !== t && (this.nextAutoLevelKey = \"\", this._nextAutoLevel = t);\n }\n deriveNextAutoLevel(e) {\n const {\n maxAutoLevel: t,\n minAutoLevel: r\n } = this.hls;\n return Math.min(Math.max(e, r), t);\n }\n}\nconst Gg = {\n /**\n * Searches for an item in an array which matches a certain condition.\n * This requires the condition to only match one item in the array,\n * and for the array to be ordered.\n *\n * @param list The array to search.\n * @param comparisonFn\n * Called and provided a candidate item as the first argument.\n * Should return:\n * > -1 if the item should be located at a lower index than the provided item.\n * > 1 if the item should be located at a higher index than the provided item.\n * > 0 if the item is the item you're looking for.\n *\n * @returns the object if found, otherwise returns null\n */\n search: function(s, e) {\n let t = 0, r = s.length - 1, n = null, i = null;\n for (; t <= r; ) {\n n = (t + r) / 2 | 0, i = s[n];\n const o = e(i);\n if (o > 0)\n t = n + 1;\n else if (o < 0)\n r = n - 1;\n else\n return i;\n }\n return null;\n }\n};\nfunction vb(s, e, t) {\n if (e === null || !Array.isArray(s) || !s.length || !ue(e))\n return null;\n const r = s[0].programDateTime;\n if (e < (r || 0))\n return null;\n const n = s[s.length - 1].endProgramDateTime;\n if (e >= (n || 0))\n return null;\n for (let i = 0; i < s.length; ++i) {\n const o = s[i];\n if (xb(e, t, o))\n return o;\n }\n return null;\n}\nfunction Js(s, e, t = 0, r = 0, n = 5e-3) {\n let i = null;\n if (s) {\n i = e[1 + s.sn - e[0].sn] || null;\n const a = s.endDTS - t;\n a > 0 && a < 15e-7 && (t += 15e-7), i && s.level !== i.level && i.end <= s.end && (i = e[2 + s.sn - e[0].sn] || null);\n } else t === 0 && e[0].start === 0 && (i = e[0]);\n if (i && ((!s || s.level === i.level) && dh(t, r, i) === 0 || Eb(i, s, Math.min(n, r))))\n return i;\n const o = Gg.search(e, dh.bind(null, t, r));\n return o && (o !== s || !i) ? o : i;\n}\nfunction Eb(s, e, t) {\n if (e && e.start === 0 && e.level < s.level && (e.endPTS || 0) > 0) {\n const r = e.tagList.reduce((n, i) => (i[0] === \"INF\" && (n += parseFloat(i[1])), n), t);\n return s.start <= r;\n }\n return !1;\n}\nfunction dh(s = 0, e = 0, t) {\n if (t.start <= s && t.start + t.duration > s)\n return 0;\n const r = Math.min(e, t.duration + (t.deltaPTS ? t.deltaPTS : 0));\n return t.start + t.duration - r <= s ? 1 : t.start - r > s && t.start ? -1 : 0;\n}\nfunction xb(s, e, t) {\n const r = Math.min(e, t.duration + (t.deltaPTS ? t.deltaPTS : 0)) * 1e3;\n return (t.endProgramDateTime || 0) - r > s;\n}\nfunction Vg(s, e, t) {\n if (s && s.startCC <= e && s.endCC >= e) {\n let r = s.fragments;\n const {\n fragmentHint: n\n } = s;\n n && (r = r.concat(n));\n let i;\n return Gg.search(r, (o) => o.cc < e ? 1 : o.cc > e ? -1 : (i = o, o.end <= t ? 1 : o.start > t ? -1 : 0)), i || null;\n }\n return null;\n}\nfunction ea(s) {\n switch (s.details) {\n case J.FRAG_LOAD_TIMEOUT:\n case J.KEY_LOAD_TIMEOUT:\n case J.LEVEL_LOAD_TIMEOUT:\n case J.MANIFEST_LOAD_TIMEOUT:\n return !0;\n }\n return !1;\n}\nfunction jg(s) {\n return s.details.startsWith(\"key\");\n}\nfunction Kg(s) {\n return jg(s) && !!s.frag && !s.frag.decryptdata;\n}\nfunction hh(s, e) {\n const t = ea(e);\n return s.default[`${t ? \"timeout\" : \"error\"}Retry`];\n}\nfunction yu(s, e) {\n const t = s.backoff === \"linear\" ? 1 : Math.pow(2, e);\n return Math.min(t * s.retryDelayMs, s.maxRetryDelayMs);\n}\nfunction fh(s) {\n return tt(tt({}, s), {\n errorRetry: null,\n timeoutRetry: null\n });\n}\nfunction ta(s, e, t, r) {\n if (!s)\n return !1;\n const n = r == null ? void 0 : r.code, i = e < s.maxNumRetry && (Sb(n) || !!t);\n return s.shouldRetry ? s.shouldRetry(s, e, t, r, i) : i;\n}\nfunction Sb(s) {\n return uc(s) || !!s && (s < 400 || s > 499);\n}\nfunction uc(s) {\n return s === 0 && navigator.onLine === !1;\n}\nvar Zt = {\n DoNothing: 0,\n SendAlternateToPenaltyBox: 2,\n RemoveAlternatePermanently: 3,\n RetryRequest: 5\n}, vr = {\n None: 0,\n MoveAllAlternatesMatchingHost: 1,\n MoveAllAlternatesMatchingHDCP: 2,\n MoveAllAlternatesMatchingKey: 4\n};\nclass bb extends Lr {\n constructor(e) {\n super(\"error-controller\", e.logger), this.hls = void 0, this.playlistError = 0, this.hls = e, this.registerListeners();\n }\n registerListeners() {\n const e = this.hls;\n e.on(I.ERROR, this.onError, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this);\n }\n unregisterListeners() {\n const e = this.hls;\n e && (e.off(I.ERROR, this.onError, this), e.off(I.ERROR, this.onErrorOut, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this));\n }\n destroy() {\n this.unregisterListeners(), this.hls = null;\n }\n startLoad(e) {\n }\n stopLoad() {\n this.playlistError = 0;\n }\n getVariantLevelIndex(e) {\n return (e == null ? void 0 : e.type) === pe.MAIN ? e.level : this.getVariantIndex();\n }\n getVariantIndex() {\n var e;\n const t = this.hls, r = t.currentLevel;\n return (e = t.loadLevelObj) != null && e.details || r === -1 ? t.loadLevel : r;\n }\n variantHasKey(e, t) {\n if (e) {\n var r;\n if ((r = e.details) != null && r.hasKey(t))\n return !0;\n const n = e.audioGroups;\n if (n)\n return this.hls.allAudioTracks.filter((o) => n.indexOf(o.groupId) >= 0).some((o) => {\n var a;\n return (a = o.details) == null ? void 0 : a.hasKey(t);\n });\n }\n return !1;\n }\n onManifestLoading() {\n this.playlistError = 0;\n }\n onLevelUpdated() {\n this.playlistError = 0;\n }\n onError(e, t) {\n var r;\n if (t.fatal)\n return;\n const n = this.hls, i = t.context;\n switch (t.details) {\n case J.FRAG_LOAD_ERROR:\n case J.FRAG_LOAD_TIMEOUT:\n case J.KEY_LOAD_ERROR:\n case J.KEY_LOAD_TIMEOUT:\n t.errorAction = this.getFragRetryOrSwitchAction(t);\n return;\n case J.FRAG_PARSING_ERROR:\n if ((r = t.frag) != null && r.gap) {\n t.errorAction = An();\n return;\n }\n // falls through\n case J.FRAG_GAP:\n case J.FRAG_DECRYPT_ERROR: {\n t.errorAction = this.getFragRetryOrSwitchAction(t), t.errorAction.action = Zt.SendAlternateToPenaltyBox;\n return;\n }\n case J.LEVEL_EMPTY_ERROR:\n case J.LEVEL_PARSING_ERROR:\n {\n var o;\n const l = t.parent === pe.MAIN ? t.level : n.loadLevel;\n t.details === J.LEVEL_EMPTY_ERROR && ((o = t.context) != null && (o = o.levelDetails) != null && o.live) ? t.errorAction = this.getPlaylistRetryOrSwitchAction(t, l) : (t.levelRetry = !1, t.errorAction = this.getLevelSwitchAction(t, l));\n }\n return;\n case J.LEVEL_LOAD_ERROR:\n case J.LEVEL_LOAD_TIMEOUT:\n typeof (i == null ? void 0 : i.level) == \"number\" && (t.errorAction = this.getPlaylistRetryOrSwitchAction(t, i.level));\n return;\n case J.AUDIO_TRACK_LOAD_ERROR:\n case J.AUDIO_TRACK_LOAD_TIMEOUT:\n case J.SUBTITLE_LOAD_ERROR:\n case J.SUBTITLE_TRACK_LOAD_TIMEOUT:\n if (i) {\n const l = n.loadLevelObj;\n if (l && (i.type === Ke.AUDIO_TRACK && l.hasAudioGroup(i.groupId) || i.type === Ke.SUBTITLE_TRACK && l.hasSubtitleGroup(i.groupId))) {\n t.errorAction = this.getPlaylistRetryOrSwitchAction(t, n.loadLevel), t.errorAction.action = Zt.SendAlternateToPenaltyBox, t.errorAction.flags = vr.MoveAllAlternatesMatchingHost;\n return;\n }\n }\n return;\n case J.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:\n t.errorAction = {\n action: Zt.SendAlternateToPenaltyBox,\n flags: vr.MoveAllAlternatesMatchingHDCP\n };\n return;\n case J.KEY_SYSTEM_SESSION_UPDATE_FAILED:\n case J.KEY_SYSTEM_STATUS_INTERNAL_ERROR:\n case J.KEY_SYSTEM_NO_SESSION:\n t.errorAction = {\n action: Zt.SendAlternateToPenaltyBox,\n flags: vr.MoveAllAlternatesMatchingKey\n };\n return;\n case J.BUFFER_ADD_CODEC_ERROR:\n case J.REMUX_ALLOC_ERROR:\n case J.BUFFER_APPEND_ERROR:\n if (!t.errorAction) {\n var a;\n t.errorAction = this.getLevelSwitchAction(t, (a = t.level) != null ? a : n.loadLevel);\n }\n return;\n case J.INTERNAL_EXCEPTION:\n case J.BUFFER_APPENDING_ERROR:\n case J.BUFFER_FULL_ERROR:\n case J.LEVEL_SWITCH_ERROR:\n case J.BUFFER_STALLED_ERROR:\n case J.BUFFER_SEEK_OVER_HOLE:\n case J.BUFFER_NUDGE_ON_STALL:\n t.errorAction = An();\n return;\n }\n t.type === ve.KEY_SYSTEM_ERROR && (t.levelRetry = !1, t.errorAction = An());\n }\n getPlaylistRetryOrSwitchAction(e, t) {\n const r = this.hls, n = hh(r.config.playlistLoadPolicy, e), i = this.playlistError++;\n if (ta(n, i, ea(e), e.response))\n return {\n action: Zt.RetryRequest,\n flags: vr.None,\n retryConfig: n,\n retryCount: i\n };\n const a = this.getLevelSwitchAction(e, t);\n return n && (a.retryConfig = n, a.retryCount = i), a;\n }\n getFragRetryOrSwitchAction(e) {\n const t = this.hls, r = this.getVariantLevelIndex(e.frag), n = t.levels[r], {\n fragLoadPolicy: i,\n keyLoadPolicy: o\n } = t.config, a = hh(jg(e) ? o : i, e), l = t.levels.reduce((u, d) => u + d.fragmentError, 0);\n if (n && (e.details !== J.FRAG_GAP && n.fragmentError++, !Kg(e) && ta(a, l, ea(e), e.response)))\n return {\n action: Zt.RetryRequest,\n flags: vr.None,\n retryConfig: a,\n retryCount: l\n };\n const c = this.getLevelSwitchAction(e, r);\n return a && (c.retryConfig = a, c.retryCount = l), c;\n }\n getLevelSwitchAction(e, t) {\n const r = this.hls;\n t == null && (t = r.loadLevel);\n const n = this.hls.levels[t];\n if (n) {\n var i, o;\n const c = e.details;\n n.loadError++, c === J.BUFFER_APPEND_ERROR && n.fragmentError++;\n let u = -1;\n const {\n levels: d,\n loadLevel: h,\n minAutoLevel: f,\n maxAutoLevel: p\n } = r;\n !r.autoLevelEnabled && !r.config.preserveManualLevelOnError && (r.loadLevel = -1);\n const y = (i = e.frag) == null ? void 0 : i.type, b = (y === pe.AUDIO && c === J.FRAG_PARSING_ERROR || e.sourceBufferName === \"audio\" && (c === J.BUFFER_ADD_CODEC_ERROR || c === J.BUFFER_APPEND_ERROR)) && d.some(({\n audioCodec: H\n }) => n.audioCodec !== H), A = e.sourceBufferName === \"video\" && (c === J.BUFFER_ADD_CODEC_ERROR || c === J.BUFFER_APPEND_ERROR) && d.some(({\n codecSet: H,\n audioCodec: K\n }) => n.codecSet !== H && n.audioCodec === K), {\n type: F,\n groupId: M\n } = (o = e.context) != null ? o : {};\n for (let H = d.length; H--; ) {\n const K = (H + h) % d.length;\n if (K !== h && K >= f && K <= p && d[K].loadError === 0) {\n var a, l;\n const j = d[K];\n if (c === J.FRAG_GAP && y === pe.MAIN && e.frag) {\n const C = d[K].details;\n if (C) {\n const k = Js(e.frag, C.fragments, e.frag.start);\n if (k != null && k.gap)\n continue;\n }\n } else {\n if (F === Ke.AUDIO_TRACK && j.hasAudioGroup(M) || F === Ke.SUBTITLE_TRACK && j.hasSubtitleGroup(M))\n continue;\n if (y === pe.AUDIO && (a = n.audioGroups) != null && a.some((C) => j.hasAudioGroup(C)) || y === pe.SUBTITLE && (l = n.subtitleGroups) != null && l.some((C) => j.hasSubtitleGroup(C)) || b && n.audioCodec === j.audioCodec || A && n.codecSet === j.codecSet || !b && n.codecSet !== j.codecSet)\n continue;\n }\n u = K;\n break;\n }\n }\n if (u > -1 && r.loadLevel !== u)\n return e.levelRetry = !0, this.playlistError = 0, {\n action: Zt.SendAlternateToPenaltyBox,\n flags: vr.None,\n nextAutoLevel: u\n };\n }\n return {\n action: Zt.SendAlternateToPenaltyBox,\n flags: vr.MoveAllAlternatesMatchingHost\n };\n }\n onErrorOut(e, t) {\n var r;\n switch ((r = t.errorAction) == null ? void 0 : r.action) {\n case Zt.DoNothing:\n break;\n case Zt.SendAlternateToPenaltyBox:\n this.sendAlternateToPenaltyBox(t), !t.errorAction.resolved && t.details !== J.FRAG_GAP ? t.fatal = !0 : /MediaSource readyState: ended/.test(t.error.message) && (this.warn(`MediaSource ended after \"${t.sourceBufferName}\" sourceBuffer append error. Attempting to recover from media error.`), this.hls.recoverMediaError());\n break;\n }\n if (t.fatal) {\n this.hls.stopLoad();\n return;\n }\n }\n sendAlternateToPenaltyBox(e) {\n const t = this.hls, r = e.errorAction;\n if (!r)\n return;\n const {\n flags: n\n } = r, i = r.nextAutoLevel;\n switch (n) {\n case vr.None:\n this.switchLevel(e, i);\n break;\n case vr.MoveAllAlternatesMatchingHDCP: {\n const l = this.getVariantLevelIndex(e.frag), c = t.levels[l], u = c == null ? void 0 : c.attrs[\"HDCP-LEVEL\"];\n if (r.hdcpLevel = u, u === \"NONE\")\n this.warn(\"HDCP policy resticted output with HDCP-LEVEL=NONE\");\n else if (u) {\n t.maxHdcpLevel = cc[cc.indexOf(u) - 1], r.resolved = !0, this.warn(`Restricting playback to HDCP-LEVEL of \"${t.maxHdcpLevel}\" or lower`);\n break;\n }\n }\n // eslint-disable-next-line no-fallthrough\n case vr.MoveAllAlternatesMatchingKey: {\n const l = e.decryptdata;\n if (l) {\n const c = this.hls.levels, u = c.length;\n for (let h = u; h--; )\n if (this.variantHasKey(c[h], l)) {\n var o, a;\n this.log(`Banned key found in level ${h} (${c[h].bitrate}bps) or audio group \"${(o = c[h].audioGroups) == null ? void 0 : o.join(\",\")}\" (${(a = e.frag) == null ? void 0 : a.type} fragment) ${fr(l.keyId || [])}`), c[h].fragmentError++, c[h].loadError++, this.log(`Removing level ${h} with key error (${e.error})`), this.hls.removeLevel(h);\n }\n const d = e.frag;\n if (this.hls.levels.length < u)\n r.resolved = !0;\n else if (d && d.type !== pe.MAIN) {\n const h = d.decryptdata;\n h && !l.matches(h) && (r.resolved = !0);\n }\n }\n break;\n }\n }\n r.resolved || this.switchLevel(e, i);\n }\n switchLevel(e, t) {\n if (t !== void 0 && e.errorAction && (this.warn(`switching to level ${t} after ${e.details}`), this.hls.nextAutoLevel = t, e.errorAction.resolved = !0, this.hls.nextLoadLevel = this.hls.nextAutoLevel, e.details === J.BUFFER_ADD_CODEC_ERROR && e.mimeType && e.sourceBufferName !== \"audiovideo\")) {\n const r = lc(e.mimeType), n = this.hls.levels;\n for (let i = n.length; i--; )\n n[i][`${e.sourceBufferName}Codec`] === r && (this.log(`Removing level ${i} for ${e.details} (\"${r}\" not supported)`), this.hls.removeLevel(i));\n }\n }\n}\nfunction An(s) {\n const e = {\n action: Zt.DoNothing,\n flags: vr.None\n };\n return s && (e.resolved = !0), e;\n}\nvar Ht = {\n NOT_LOADED: \"NOT_LOADED\",\n APPENDING: \"APPENDING\",\n PARTIAL: \"PARTIAL\",\n OK: \"OK\"\n};\nclass Tb {\n constructor(e) {\n this.activePartLists = /* @__PURE__ */ Object.create(null), this.endListFragments = /* @__PURE__ */ Object.create(null), this.fragments = /* @__PURE__ */ Object.create(null), this.timeRanges = /* @__PURE__ */ Object.create(null), this.bufferPadding = 0.2, this.hls = void 0, this.hasGaps = !1, this.hls = e, this._registerListeners();\n }\n _registerListeners() {\n const {\n hls: e\n } = this;\n e && (e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.BUFFER_APPENDED, this.onBufferAppended, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this), e.on(I.FRAG_LOADED, this.onFragLoaded, this));\n }\n _unregisterListeners() {\n const {\n hls: e\n } = this;\n e && (e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.BUFFER_APPENDED, this.onBufferAppended, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this), e.off(I.FRAG_LOADED, this.onFragLoaded, this));\n }\n destroy() {\n this._unregisterListeners(), this.hls = // @ts-ignore\n this.fragments = // @ts-ignore\n this.activePartLists = // @ts-ignore\n this.endListFragments = this.timeRanges = null;\n }\n /**\n * Return a Fragment or Part with an appended range that matches the position and levelType\n * Otherwise, return null\n */\n getAppendedFrag(e, t) {\n const r = this.activePartLists[t];\n if (r)\n for (let n = r.length; n--; ) {\n const i = r[n];\n if (!i)\n break;\n if (i.start <= e && e <= i.end && i.loaded)\n return i;\n }\n return this.getBufferedFrag(e, t);\n }\n /**\n * Return a buffered Fragment that matches the position and levelType.\n * A buffered Fragment is one whose loading, parsing and appending is done (completed or \"partial\" meaning aborted).\n * If not found any Fragment, return null\n */\n getBufferedFrag(e, t) {\n return this.getFragAtPos(e, t, !0);\n }\n getFragAtPos(e, t, r) {\n const {\n fragments: n\n } = this, i = Object.keys(n);\n for (let o = i.length; o--; ) {\n const a = n[i[o]];\n if ((a == null ? void 0 : a.body.type) === t && (!r || a.buffered)) {\n const l = a.body;\n if (l.start <= e && e <= l.end)\n return l;\n }\n }\n return null;\n }\n /**\n * Partial fragments effected by coded frame eviction will be removed\n * The browser will unload parts of the buffer to free up memory for new buffer data\n * Fragments will need to be reloaded when the buffer is freed up, removing partial fragments will allow them to reload(since there might be parts that are still playable)\n */\n detectEvictedFragments(e, t, r, n, i) {\n this.timeRanges && (this.timeRanges[e] = t);\n const o = (n == null ? void 0 : n.fragment.sn) || -1;\n Object.keys(this.fragments).forEach((a) => {\n const l = this.fragments[a];\n if (!l || o >= l.body.sn)\n return;\n if (!l.buffered && (!l.loaded || i)) {\n l.body.type === r && this.removeFragment(l.body);\n return;\n }\n const c = l.range[e];\n if (c) {\n if (c.time.length === 0) {\n this.removeFragment(l.body);\n return;\n }\n c.time.some((u) => {\n const d = !this.isTimeBuffered(u.startPTS, u.endPTS, t);\n return d && this.removeFragment(l.body), d;\n });\n }\n });\n }\n /**\n * Checks if the fragment passed in is loaded in the buffer properly\n * Partially loaded fragments will be registered as a partial fragment\n */\n detectPartialFragments(e) {\n const t = this.timeRanges;\n if (!t || e.frag.sn === \"initSegment\")\n return;\n const r = e.frag, n = fn(r), i = this.fragments[n];\n if (!i || i.buffered && r.gap)\n return;\n const o = !r.relurl;\n Object.keys(t).forEach((a) => {\n const l = r.elementaryStreams[a];\n if (!l)\n return;\n const c = t[a], u = o || l.partial === !0;\n i.range[a] = this.getBufferedTimes(r, e.part, u, c);\n }), i.loaded = null, Object.keys(i.range).length ? (i.buffered = !0, (i.body.endList = r.endList || i.body.endList) && (this.endListFragments[i.body.type] = i), Hi(i) || this.removeParts(r.sn - 1, r.type)) : this.removeFragment(i.body);\n }\n removeParts(e, t) {\n const r = this.activePartLists[t];\n r && (this.activePartLists[t] = gh(r, (n) => n.fragment.sn >= e));\n }\n fragBuffered(e, t) {\n const r = fn(e);\n let n = this.fragments[r];\n !n && t && (n = this.fragments[r] = {\n body: e,\n appendedPTS: null,\n loaded: null,\n buffered: !1,\n range: /* @__PURE__ */ Object.create(null)\n }, e.gap && (this.hasGaps = !0)), n && (n.loaded = null, n.buffered = !0);\n }\n getBufferedTimes(e, t, r, n) {\n const i = {\n time: [],\n partial: r\n }, o = e.start, a = e.end, l = e.minEndPTS || a, c = e.maxStartPTS || o;\n for (let u = 0; u < n.length; u++) {\n const d = n.start(u) - this.bufferPadding, h = n.end(u) + this.bufferPadding;\n if (c >= d && l <= h) {\n i.time.push({\n startPTS: Math.max(o, n.start(u)),\n endPTS: Math.min(a, n.end(u))\n });\n break;\n } else if (o < h && a > d) {\n const f = Math.max(o, n.start(u)), p = Math.min(a, n.end(u));\n p > f && (i.partial = !0, i.time.push({\n startPTS: f,\n endPTS: p\n }));\n } else if (a <= d)\n break;\n }\n return i;\n }\n /**\n * Gets the partial fragment for a certain time\n */\n getPartialFragment(e) {\n let t = null, r, n, i, o = 0;\n const {\n bufferPadding: a,\n fragments: l\n } = this;\n return Object.keys(l).forEach((c) => {\n const u = l[c];\n u && Hi(u) && (n = u.body.start - a, i = u.body.end + a, e >= n && e <= i && (r = Math.min(e - n, i - e), o <= r && (t = u.body, o = r)));\n }), t;\n }\n isEndListAppended(e) {\n const t = this.endListFragments[e];\n return t !== void 0 && (t.buffered || Hi(t));\n }\n getState(e) {\n const t = fn(e), r = this.fragments[t];\n return r ? r.buffered ? Hi(r) ? Ht.PARTIAL : Ht.OK : Ht.APPENDING : Ht.NOT_LOADED;\n }\n isTimeBuffered(e, t, r) {\n let n, i;\n for (let o = 0; o < r.length; o++) {\n if (n = r.start(o) - this.bufferPadding, i = r.end(o) + this.bufferPadding, e >= n && t <= i)\n return !0;\n if (t <= n)\n return !1;\n }\n return !1;\n }\n onManifestLoading() {\n this.removeAllFragments();\n }\n onFragLoaded(e, t) {\n if (t.frag.sn === \"initSegment\" || t.frag.bitrateTest)\n return;\n const r = t.frag, n = t.part ? null : t, i = fn(r);\n this.fragments[i] = {\n body: r,\n appendedPTS: null,\n loaded: n,\n buffered: !1,\n range: /* @__PURE__ */ Object.create(null)\n };\n }\n onBufferAppended(e, t) {\n const {\n frag: r,\n part: n,\n timeRanges: i,\n type: o\n } = t;\n if (r.sn === \"initSegment\")\n return;\n const a = r.type;\n if (n) {\n let c = this.activePartLists[a];\n c || (this.activePartLists[a] = c = []), c.push(n);\n }\n this.timeRanges = i;\n const l = i[o];\n this.detectEvictedFragments(o, l, a, n);\n }\n onFragBuffered(e, t) {\n this.detectPartialFragments(t);\n }\n hasFragment(e) {\n const t = fn(e);\n return !!this.fragments[t];\n }\n hasFragments(e) {\n const {\n fragments: t\n } = this, r = Object.keys(t);\n if (!e)\n return r.length > 0;\n for (let n = r.length; n--; ) {\n const i = t[r[n]];\n if ((i == null ? void 0 : i.body.type) === e)\n return !0;\n }\n return !1;\n }\n hasParts(e) {\n var t;\n return !!((t = this.activePartLists[e]) != null && t.length);\n }\n removeFragmentsInRange(e, t, r, n, i) {\n n && !this.hasGaps || Object.keys(this.fragments).forEach((o) => {\n const a = this.fragments[o];\n if (!a)\n return;\n const l = a.body;\n l.type !== r || n && !l.gap || l.start < t && l.end > e && (a.buffered || i) && this.removeFragment(l);\n });\n }\n removeFragment(e) {\n const t = fn(e);\n e.clearElementaryStreamInfo();\n const r = this.activePartLists[e.type];\n if (r) {\n const n = e.sn;\n this.activePartLists[e.type] = gh(r, (i) => i.fragment.sn !== n);\n }\n delete this.fragments[t], e.endList && delete this.endListFragments[e.type];\n }\n removeAllFragments() {\n var e;\n this.fragments = /* @__PURE__ */ Object.create(null), this.endListFragments = /* @__PURE__ */ Object.create(null), this.activePartLists = /* @__PURE__ */ Object.create(null), this.hasGaps = !1;\n const t = (e = this.hls) == null || (e = e.latestLevelDetails) == null ? void 0 : e.partList;\n t && t.forEach((r) => r.clearElementaryStreamInfo());\n }\n}\nfunction Hi(s) {\n var e, t, r;\n return s.buffered && !!(s.body.gap || (e = s.range.video) != null && e.partial || (t = s.range.audio) != null && t.partial || (r = s.range.audiovideo) != null && r.partial);\n}\nfunction fn(s) {\n return `${s.type}_${s.level}_${s.sn}`;\n}\nfunction gh(s, e) {\n return s.filter((t) => {\n const r = e(t);\n return r || t.clearElementaryStreamInfo(), r;\n });\n}\nvar Os = {\n cbc: 0,\n ctr: 1\n};\nclass wb {\n constructor(e, t, r) {\n this.subtle = void 0, this.aesIV = void 0, this.aesMode = void 0, this.subtle = e, this.aesIV = t, this.aesMode = r;\n }\n decrypt(e, t) {\n switch (this.aesMode) {\n case Os.cbc:\n return this.subtle.decrypt({\n name: \"AES-CBC\",\n iv: this.aesIV\n }, t, e);\n case Os.ctr:\n return this.subtle.decrypt(\n {\n name: \"AES-CTR\",\n counter: this.aesIV,\n length: 64\n },\n //64 : NIST SP800-38A standard suggests that the counter should occupy half of the counter block\n t,\n e\n );\n default:\n throw new Error(`[AESCrypto] invalid aes mode ${this.aesMode}`);\n }\n }\n}\nfunction Ab(s) {\n const e = s.byteLength, t = e && new DataView(s.buffer).getUint8(e - 1);\n return t ? s.slice(0, e - t) : s;\n}\nclass Ib {\n constructor() {\n this.rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], this.subMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)], this.invSubMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)], this.sBox = new Uint32Array(256), this.invSBox = new Uint32Array(256), this.key = new Uint32Array(0), this.ksRows = 0, this.keySize = 0, this.keySchedule = void 0, this.invKeySchedule = void 0, this.initTable();\n }\n // Using view.getUint32() also swaps the byte order.\n uint8ArrayToUint32Array_(e) {\n const t = new DataView(e), r = new Uint32Array(4);\n for (let n = 0; n < 4; n++)\n r[n] = t.getUint32(n * 4);\n return r;\n }\n initTable() {\n const e = this.sBox, t = this.invSBox, r = this.subMix, n = r[0], i = r[1], o = r[2], a = r[3], l = this.invSubMix, c = l[0], u = l[1], d = l[2], h = l[3], f = new Uint32Array(256);\n let p = 0, y = 0, E = 0;\n for (E = 0; E < 256; E++)\n E < 128 ? f[E] = E << 1 : f[E] = E << 1 ^ 283;\n for (E = 0; E < 256; E++) {\n let b = y ^ y << 1 ^ y << 2 ^ y << 3 ^ y << 4;\n b = b >>> 8 ^ b & 255 ^ 99, e[p] = b, t[b] = p;\n const R = f[p], A = f[R], F = f[A];\n let M = f[b] * 257 ^ b * 16843008;\n n[p] = M << 24 | M >>> 8, i[p] = M << 16 | M >>> 16, o[p] = M << 8 | M >>> 24, a[p] = M, M = F * 16843009 ^ A * 65537 ^ R * 257 ^ p * 16843008, c[b] = M << 24 | M >>> 8, u[b] = M << 16 | M >>> 16, d[b] = M << 8 | M >>> 24, h[b] = M, p ? (p = R ^ f[f[f[F ^ R]]], y ^= f[f[y]]) : p = y = 1;\n }\n }\n expandKey(e) {\n const t = this.uint8ArrayToUint32Array_(e);\n let r = !0, n = 0;\n for (; n < t.length && r; )\n r = t[n] === this.key[n], n++;\n if (r)\n return;\n this.key = t;\n const i = this.keySize = t.length;\n if (i !== 4 && i !== 6 && i !== 8)\n throw new Error(\"Invalid aes key size=\" + i);\n const o = this.ksRows = (i + 6 + 1) * 4;\n let a, l;\n const c = this.keySchedule = new Uint32Array(o), u = this.invKeySchedule = new Uint32Array(o), d = this.sBox, h = this.rcon, f = this.invSubMix, p = f[0], y = f[1], E = f[2], b = f[3];\n let R, A;\n for (a = 0; a < o; a++) {\n if (a < i) {\n R = c[a] = t[a];\n continue;\n }\n A = R, a % i === 0 ? (A = A << 8 | A >>> 24, A = d[A >>> 24] << 24 | d[A >>> 16 & 255] << 16 | d[A >>> 8 & 255] << 8 | d[A & 255], A ^= h[a / i | 0] << 24) : i > 6 && a % i === 4 && (A = d[A >>> 24] << 24 | d[A >>> 16 & 255] << 16 | d[A >>> 8 & 255] << 8 | d[A & 255]), c[a] = R = (c[a - i] ^ A) >>> 0;\n }\n for (l = 0; l < o; l++)\n a = o - l, l & 3 ? A = c[a] : A = c[a - 4], l < 4 || a <= 4 ? u[l] = A : u[l] = p[d[A >>> 24]] ^ y[d[A >>> 16 & 255]] ^ E[d[A >>> 8 & 255]] ^ b[d[A & 255]], u[l] = u[l] >>> 0;\n }\n // Adding this as a method greatly improves performance.\n networkToHostOrderSwap(e) {\n return e << 24 | (e & 65280) << 8 | (e & 16711680) >> 8 | e >>> 24;\n }\n decrypt(e, t, r) {\n const n = this.keySize + 6, i = this.invKeySchedule, o = this.invSBox, a = this.invSubMix, l = a[0], c = a[1], u = a[2], d = a[3], h = this.uint8ArrayToUint32Array_(r);\n let f = h[0], p = h[1], y = h[2], E = h[3];\n const b = new Int32Array(e), R = new Int32Array(b.length);\n let A, F, M, H, K, j, C, k, $, W, _, g, x, w;\n const D = this.networkToHostOrderSwap;\n for (; t < b.length; ) {\n for ($ = D(b[t]), W = D(b[t + 1]), _ = D(b[t + 2]), g = D(b[t + 3]), K = $ ^ i[0], j = g ^ i[1], C = _ ^ i[2], k = W ^ i[3], x = 4, w = 1; w < n; w++)\n A = l[K >>> 24] ^ c[j >> 16 & 255] ^ u[C >> 8 & 255] ^ d[k & 255] ^ i[x], F = l[j >>> 24] ^ c[C >> 16 & 255] ^ u[k >> 8 & 255] ^ d[K & 255] ^ i[x + 1], M = l[C >>> 24] ^ c[k >> 16 & 255] ^ u[K >> 8 & 255] ^ d[j & 255] ^ i[x + 2], H = l[k >>> 24] ^ c[K >> 16 & 255] ^ u[j >> 8 & 255] ^ d[C & 255] ^ i[x + 3], K = A, j = F, C = M, k = H, x = x + 4;\n A = o[K >>> 24] << 24 ^ o[j >> 16 & 255] << 16 ^ o[C >> 8 & 255] << 8 ^ o[k & 255] ^ i[x], F = o[j >>> 24] << 24 ^ o[C >> 16 & 255] << 16 ^ o[k >> 8 & 255] << 8 ^ o[K & 255] ^ i[x + 1], M = o[C >>> 24] << 24 ^ o[k >> 16 & 255] << 16 ^ o[K >> 8 & 255] << 8 ^ o[j & 255] ^ i[x + 2], H = o[k >>> 24] << 24 ^ o[K >> 16 & 255] << 16 ^ o[j >> 8 & 255] << 8 ^ o[C & 255] ^ i[x + 3], R[t] = D(A ^ f), R[t + 1] = D(H ^ p), R[t + 2] = D(M ^ y), R[t + 3] = D(F ^ E), f = $, p = W, y = _, E = g, t = t + 4;\n }\n return R.buffer;\n }\n}\nclass _b {\n constructor(e, t, r) {\n this.subtle = void 0, this.key = void 0, this.aesMode = void 0, this.subtle = e, this.key = t, this.aesMode = r;\n }\n expandKey() {\n const e = Rb(this.aesMode);\n return this.subtle.importKey(\"raw\", this.key, {\n name: e\n }, !1, [\"encrypt\", \"decrypt\"]);\n }\n}\nfunction Rb(s) {\n switch (s) {\n case Os.cbc:\n return \"AES-CBC\";\n case Os.ctr:\n return \"AES-CTR\";\n default:\n throw new Error(`[FastAESKey] invalid aes mode ${s}`);\n }\n}\nconst Lb = 16;\nclass vu {\n constructor(e, {\n removePKCS7Padding: t = !0\n } = {}) {\n if (this.logEnabled = !0, this.removePKCS7Padding = void 0, this.subtle = null, this.softwareDecrypter = null, this.key = null, this.fastAesKey = null, this.remainderData = null, this.currentIV = null, this.currentResult = null, this.useSoftware = void 0, this.enableSoftwareAES = void 0, this.enableSoftwareAES = e.enableSoftwareAES, this.removePKCS7Padding = t, t)\n try {\n const r = self.crypto;\n r && (this.subtle = r.subtle || r.webkitSubtle);\n } catch {\n }\n this.useSoftware = !this.subtle;\n }\n destroy() {\n this.subtle = null, this.softwareDecrypter = null, this.key = null, this.fastAesKey = null, this.remainderData = null, this.currentIV = null, this.currentResult = null;\n }\n isSync() {\n return this.useSoftware;\n }\n flush() {\n const {\n currentResult: e,\n remainderData: t\n } = this;\n if (!e || t)\n return this.reset(), null;\n const r = new Uint8Array(e);\n return this.reset(), this.removePKCS7Padding ? Ab(r) : r;\n }\n reset() {\n this.currentResult = null, this.currentIV = null, this.remainderData = null, this.softwareDecrypter && (this.softwareDecrypter = null);\n }\n decrypt(e, t, r, n) {\n return this.useSoftware ? new Promise((i, o) => {\n const a = ArrayBuffer.isView(e) ? e : new Uint8Array(e);\n this.softwareDecrypt(a, t, r, n);\n const l = this.flush();\n l ? i(l.buffer) : o(new Error(\"[softwareDecrypt] Failed to decrypt data\"));\n }) : this.webCryptoDecrypt(new Uint8Array(e), t, r, n);\n }\n // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached\n // data is handled in the flush() call\n softwareDecrypt(e, t, r, n) {\n const {\n currentIV: i,\n currentResult: o,\n remainderData: a\n } = this;\n if (n !== Os.cbc || t.byteLength !== 16)\n return rt.warn(\"SoftwareDecrypt: can only handle AES-128-CBC\"), null;\n this.logOnce(\"JS AES decrypt\"), a && (e = _r(a, e), this.remainderData = null);\n const l = this.getValidChunk(e);\n if (!l.length)\n return null;\n i && (r = i);\n let c = this.softwareDecrypter;\n c || (c = this.softwareDecrypter = new Ib()), c.expandKey(t);\n const u = o;\n return this.currentResult = c.decrypt(l.buffer, 0, r), this.currentIV = l.slice(-16).buffer, u || null;\n }\n webCryptoDecrypt(e, t, r, n) {\n if (this.key !== t || !this.fastAesKey) {\n if (!this.subtle)\n return Promise.resolve(this.onWebCryptoError(e, t, r, n));\n this.key = t, this.fastAesKey = new _b(this.subtle, t, n);\n }\n return this.fastAesKey.expandKey().then((i) => this.subtle ? (this.logOnce(\"WebCrypto AES decrypt\"), new wb(this.subtle, new Uint8Array(r), n).decrypt(e.buffer, i)) : Promise.reject(new Error(\"web crypto not initialized\"))).catch((i) => (rt.warn(`[decrypter]: WebCrypto Error, disable WebCrypto API, ${i.name}: ${i.message}`), this.onWebCryptoError(e, t, r, n)));\n }\n onWebCryptoError(e, t, r, n) {\n const i = this.enableSoftwareAES;\n if (i) {\n this.useSoftware = !0, this.logEnabled = !0, this.softwareDecrypt(e, t, r, n);\n const o = this.flush();\n if (o)\n return o.buffer;\n }\n throw new Error(\"WebCrypto\" + (i ? \" and softwareDecrypt\" : \"\") + \": failed to decrypt data\");\n }\n getValidChunk(e) {\n let t = e;\n const r = e.length - e.length % Lb;\n return r !== e.length && (t = e.slice(0, r), this.remainderData = e.slice(r)), t;\n }\n logOnce(e) {\n this.logEnabled && (rt.log(`[decrypter]: ${e}`), this.logEnabled = !1);\n }\n}\nconst ph = Math.pow(2, 17);\nclass Cb {\n constructor(e) {\n this.config = void 0, this.loader = null, this.partLoadTimeout = -1, this.config = e;\n }\n destroy() {\n this.loader && (this.loader.destroy(), this.loader = null);\n }\n abort() {\n this.loader && this.loader.abort();\n }\n load(e, t) {\n const r = e.url;\n if (!r)\n return Promise.reject(new as({\n type: ve.NETWORK_ERROR,\n details: J.FRAG_LOAD_ERROR,\n fatal: !1,\n frag: e,\n error: new Error(`Fragment does not have a ${r ? \"part list\" : \"url\"}`),\n networkDetails: null\n }));\n this.abort();\n const n = this.config, i = n.fLoader, o = n.loader;\n return new Promise((a, l) => {\n if (this.loader && this.loader.destroy(), e.gap)\n if (e.tagList.some((p) => p[0] === \"GAP\")) {\n l(yh(e));\n return;\n } else\n e.gap = !1;\n const c = this.loader = i ? new i(n) : new o(n), u = mh(e);\n e.loader = c;\n const d = fh(n.fragLoadPolicy.default), h = {\n loadPolicy: d,\n timeout: d.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0,\n highWaterMark: e.sn === \"initSegment\" ? 1 / 0 : ph\n };\n e.stats = c.stats;\n const f = {\n onSuccess: (p, y, E, b) => {\n this.resetLoader(e, c);\n let R = p.data;\n E.resetIV && e.decryptdata && (e.decryptdata.iv = new Uint8Array(R.slice(0, 16)), R = R.slice(16)), a({\n frag: e,\n part: null,\n payload: R,\n networkDetails: b\n });\n },\n onError: (p, y, E, b) => {\n this.resetLoader(e, c), l(new as({\n type: ve.NETWORK_ERROR,\n details: J.FRAG_LOAD_ERROR,\n fatal: !1,\n frag: e,\n response: tt({\n url: r,\n data: void 0\n }, p),\n error: new Error(`HTTP Error ${p.code} ${p.text}`),\n networkDetails: E,\n stats: b\n }));\n },\n onAbort: (p, y, E) => {\n this.resetLoader(e, c), l(new as({\n type: ve.NETWORK_ERROR,\n details: J.INTERNAL_ABORTED,\n fatal: !1,\n frag: e,\n error: new Error(\"Aborted\"),\n networkDetails: E,\n stats: p\n }));\n },\n onTimeout: (p, y, E) => {\n this.resetLoader(e, c), l(new as({\n type: ve.NETWORK_ERROR,\n details: J.FRAG_LOAD_TIMEOUT,\n fatal: !1,\n frag: e,\n error: new Error(`Timeout after ${h.timeout}ms`),\n networkDetails: E,\n stats: p\n }));\n }\n };\n t && (f.onProgress = (p, y, E, b) => t({\n frag: e,\n part: null,\n payload: E,\n networkDetails: b\n })), c.load(u, h, f);\n });\n }\n loadPart(e, t, r) {\n this.abort();\n const n = this.config, i = n.fLoader, o = n.loader;\n return new Promise((a, l) => {\n if (this.loader && this.loader.destroy(), e.gap || t.gap) {\n l(yh(e, t));\n return;\n }\n const c = this.loader = i ? new i(n) : new o(n), u = mh(e, t);\n e.loader = c;\n const d = fh(n.fragLoadPolicy.default), h = {\n loadPolicy: d,\n timeout: d.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0,\n highWaterMark: ph\n };\n t.stats = c.stats, c.load(u, h, {\n onSuccess: (f, p, y, E) => {\n this.resetLoader(e, c), this.updateStatsFromPart(e, t);\n const b = {\n frag: e,\n part: t,\n payload: f.data,\n networkDetails: E\n };\n r(b), a(b);\n },\n onError: (f, p, y, E) => {\n this.resetLoader(e, c), l(new as({\n type: ve.NETWORK_ERROR,\n details: J.FRAG_LOAD_ERROR,\n fatal: !1,\n frag: e,\n part: t,\n response: tt({\n url: u.url,\n data: void 0\n }, f),\n error: new Error(`HTTP Error ${f.code} ${f.text}`),\n networkDetails: y,\n stats: E\n }));\n },\n onAbort: (f, p, y) => {\n e.stats.aborted = t.stats.aborted, this.resetLoader(e, c), l(new as({\n type: ve.NETWORK_ERROR,\n details: J.INTERNAL_ABORTED,\n fatal: !1,\n frag: e,\n part: t,\n error: new Error(\"Aborted\"),\n networkDetails: y,\n stats: f\n }));\n },\n onTimeout: (f, p, y) => {\n this.resetLoader(e, c), l(new as({\n type: ve.NETWORK_ERROR,\n details: J.FRAG_LOAD_TIMEOUT,\n fatal: !1,\n frag: e,\n part: t,\n error: new Error(`Timeout after ${h.timeout}ms`),\n networkDetails: y,\n stats: f\n }));\n }\n });\n });\n }\n updateStatsFromPart(e, t) {\n const r = e.stats, n = t.stats, i = n.total;\n if (r.loaded += n.loaded, i) {\n const l = Math.round(e.duration / t.duration), c = Math.min(Math.round(r.loaded / i), l), d = (l - c) * Math.round(r.loaded / c);\n r.total = r.loaded + d;\n } else\n r.total = Math.max(r.loaded, r.total);\n const o = r.loading, a = n.loading;\n o.start ? o.first += a.first - a.start : (o.start = a.start, o.first = a.first), o.end = a.end;\n }\n resetLoader(e, t) {\n e.loader = null, this.loader === t && (self.clearTimeout(this.partLoadTimeout), this.loader = null), t.destroy();\n }\n}\nfunction mh(s, e = null) {\n const t = e || s, r = {\n frag: s,\n part: e,\n responseType: \"arraybuffer\",\n url: t.url,\n headers: {},\n rangeStart: 0,\n rangeEnd: 0\n }, n = t.byteRangeStartOffset, i = t.byteRangeEndOffset;\n if (ue(n) && ue(i)) {\n var o;\n let a = n, l = i;\n if (s.sn === \"initSegment\" && kb((o = s.decryptdata) == null ? void 0 : o.method)) {\n const c = i - n;\n c % 16 && (l = i + (16 - c % 16)), n !== 0 && (r.resetIV = !0, a = n - 16);\n }\n r.rangeStart = a, r.rangeEnd = l;\n }\n return r;\n}\nfunction yh(s, e) {\n const t = new Error(`GAP ${s.gap ? \"tag\" : \"attribute\"} found`), r = {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_GAP,\n fatal: !1,\n frag: s,\n error: t,\n networkDetails: null\n };\n return e && (r.part = e), (e || s).stats.aborted = !0, new as(r);\n}\nfunction kb(s) {\n return s === \"AES-128\" || s === \"AES-256\";\n}\nclass as extends Error {\n constructor(e) {\n super(e.error.message), this.data = void 0, this.data = e;\n }\n}\nclass Hg extends Lr {\n constructor(e, t) {\n super(e, t), this._boundTick = void 0, this._tickTimer = null, this._tickInterval = null, this._tickCallCount = 0, this._boundTick = this.tick.bind(this);\n }\n destroy() {\n this.onHandlerDestroying(), this.onHandlerDestroyed();\n }\n onHandlerDestroying() {\n this.clearNextTick(), this.clearInterval();\n }\n onHandlerDestroyed() {\n }\n hasInterval() {\n return !!this._tickInterval;\n }\n hasNextTick() {\n return !!this._tickTimer;\n }\n /**\n * @param millis - Interval time (ms)\n * @eturns True when interval has been scheduled, false when already scheduled (no effect)\n */\n setInterval(e) {\n return this._tickInterval ? !1 : (this._tickCallCount = 0, this._tickInterval = self.setInterval(this._boundTick, e), !0);\n }\n /**\n * @returns True when interval was cleared, false when none was set (no effect)\n */\n clearInterval() {\n return this._tickInterval ? (self.clearInterval(this._tickInterval), this._tickInterval = null, !0) : !1;\n }\n /**\n * @returns True when timeout was cleared, false when none was set (no effect)\n */\n clearNextTick() {\n return this._tickTimer ? (self.clearTimeout(this._tickTimer), this._tickTimer = null, !0) : !1;\n }\n /**\n * Will call the subclass doTick implementation in this main loop tick\n * or in the next one (via setTimeout(,0)) in case it has already been called\n * in this tick (in case this is a re-entrant call).\n */\n tick() {\n this._tickCallCount++, this._tickCallCount === 1 && (this.doTick(), this._tickCallCount > 1 && this.tickImmediate(), this._tickCallCount = 0);\n }\n tickImmediate() {\n this.clearNextTick(), this._tickTimer = self.setTimeout(this._boundTick, 0);\n }\n /**\n * For subclass to implement task logic\n * @abstract\n */\n doTick() {\n }\n}\nclass Eu {\n constructor(e, t, r, n = 0, i = -1, o = !1) {\n this.level = void 0, this.sn = void 0, this.part = void 0, this.id = void 0, this.size = void 0, this.partial = void 0, this.transmuxing = qi(), this.buffering = {\n audio: qi(),\n video: qi(),\n audiovideo: qi()\n }, this.level = e, this.sn = t, this.id = r, this.size = n, this.part = i, this.partial = o;\n }\n}\nfunction qi() {\n return {\n start: 0,\n executeStart: 0,\n executeEnd: 0,\n end: 0\n };\n}\nconst vh = {\n length: 0,\n start: () => 0,\n end: () => 0\n};\nclass Ce {\n /**\n * Return true if `media`'s buffered include `position`\n */\n static isBuffered(e, t) {\n if (e) {\n const r = Ce.getBuffered(e);\n for (let n = r.length; n--; )\n if (t >= r.start(n) && t <= r.end(n))\n return !0;\n }\n return !1;\n }\n static bufferedRanges(e) {\n if (e) {\n const t = Ce.getBuffered(e);\n return Ce.timeRangesToArray(t);\n }\n return [];\n }\n static timeRangesToArray(e) {\n const t = [];\n for (let r = 0; r < e.length; r++)\n t.push({\n start: e.start(r),\n end: e.end(r)\n });\n return t;\n }\n static bufferInfo(e, t, r) {\n if (e) {\n const n = Ce.bufferedRanges(e);\n if (n.length)\n return Ce.bufferedInfo(n, t, r);\n }\n return {\n len: 0,\n start: t,\n end: t,\n bufferedIndex: -1\n };\n }\n static bufferedInfo(e, t, r) {\n t = Math.max(0, t), e.length > 1 && e.sort((u, d) => u.start - d.start || d.end - u.end);\n let n = -1, i = [];\n if (r)\n for (let u = 0; u < e.length; u++) {\n t >= e[u].start && t <= e[u].end && (n = u);\n const d = i.length;\n if (d) {\n const h = i[d - 1].end;\n e[u].start - h < r ? e[u].end > h && (i[d - 1].end = e[u].end) : i.push(e[u]);\n } else\n i.push(e[u]);\n }\n else\n i = e;\n let o = 0, a, l = t, c = t;\n for (let u = 0; u < i.length; u++) {\n const d = i[u].start, h = i[u].end;\n if (n === -1 && t >= d && t <= h && (n = u), t + r >= d && t < h)\n l = d, c = h, o = c - t;\n else if (t + r < d) {\n a = d;\n break;\n }\n }\n return {\n len: o,\n start: l || 0,\n end: c || 0,\n nextStart: a,\n buffered: e,\n bufferedIndex: n\n };\n }\n /**\n * Safe method to get buffered property.\n * SourceBuffer.buffered may throw if SourceBuffer is removed from it's MediaSource\n */\n static getBuffered(e) {\n try {\n return e.buffered || vh;\n } catch (t) {\n return rt.log(\"failed to get media.buffered\", t), vh;\n }\n }\n}\nconst qg = /\\{\\$([a-zA-Z0-9-_]+)\\}/g;\nfunction Eh(s) {\n return qg.test(s);\n}\nfunction dc(s, e) {\n if (s.variableList !== null || s.hasVariableRefs) {\n const t = s.variableList;\n return e.replace(qg, (r) => {\n const n = r.substring(2, r.length - 1), i = t == null ? void 0 : t[n];\n return i === void 0 ? (s.playlistParsingError || (s.playlistParsingError = new Error(`Missing preceding EXT-X-DEFINE tag for Variable Reference: \"${n}\"`)), r) : i;\n });\n }\n return e;\n}\nfunction xh(s, e, t) {\n let r = s.variableList;\n r || (s.variableList = r = {});\n let n, i;\n if (\"QUERYPARAM\" in e) {\n n = e.QUERYPARAM;\n try {\n const o = new self.URL(t).searchParams;\n if (o.has(n))\n i = o.get(n);\n else\n throw new Error(`\"${n}\" does not match any query parameter in URI: \"${t}\"`);\n } catch (o) {\n s.playlistParsingError || (s.playlistParsingError = new Error(`EXT-X-DEFINE QUERYPARAM: ${o.message}`));\n }\n } else\n n = e.NAME, i = e.VALUE;\n n in r ? s.playlistParsingError || (s.playlistParsingError = new Error(`EXT-X-DEFINE duplicate Variable Name declarations: \"${n}\"`)) : r[n] = i || \"\";\n}\nfunction Db(s, e, t) {\n const r = e.IMPORT;\n if (t && r in t) {\n let n = s.variableList;\n n || (s.variableList = n = {}), n[r] = t[r];\n } else\n s.playlistParsingError || (s.playlistParsingError = new Error(`EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: \"${r}\"`));\n}\nconst Pb = /^(\\d+)x(\\d+)$/, Sh = /(.+?)=(\".*?\"|.*?)(?:,|$)/g;\nclass gt {\n constructor(e, t) {\n typeof e == \"string\" && (e = gt.parseAttrList(e, t)), nt(this, e);\n }\n get clientAttrs() {\n return Object.keys(this).filter((e) => e.substring(0, 2) === \"X-\");\n }\n decimalInteger(e) {\n const t = parseInt(this[e], 10);\n return t > Number.MAX_SAFE_INTEGER ? 1 / 0 : t;\n }\n hexadecimalInteger(e) {\n if (this[e]) {\n let t = (this[e] || \"0x\").slice(2);\n t = (t.length & 1 ? \"0\" : \"\") + t;\n const r = new Uint8Array(t.length / 2);\n for (let n = 0; n < t.length / 2; n++)\n r[n] = parseInt(t.slice(n * 2, n * 2 + 2), 16);\n return r;\n }\n return null;\n }\n hexadecimalIntegerAsNumber(e) {\n const t = parseInt(this[e], 16);\n return t > Number.MAX_SAFE_INTEGER ? 1 / 0 : t;\n }\n decimalFloatingPoint(e) {\n return parseFloat(this[e]);\n }\n optionalFloat(e, t) {\n const r = this[e];\n return r ? parseFloat(r) : t;\n }\n enumeratedString(e) {\n return this[e];\n }\n enumeratedStringList(e, t) {\n const r = this[e];\n return (r ? r.split(/[ ,]+/) : []).reduce((n, i) => (n[i.toLowerCase()] = !0, n), t);\n }\n bool(e) {\n return this[e] === \"YES\";\n }\n decimalResolution(e) {\n const t = Pb.exec(this[e]);\n if (t !== null)\n return {\n width: parseInt(t[1], 10),\n height: parseInt(t[2], 10)\n };\n }\n static parseAttrList(e, t) {\n let r;\n const n = {};\n for (Sh.lastIndex = 0; (r = Sh.exec(e)) !== null; ) {\n const o = r[1].trim();\n let a = r[2];\n const l = a.indexOf('\"') === 0 && a.lastIndexOf('\"') === a.length - 1;\n let c = !1;\n if (l)\n a = a.slice(1, -1);\n else\n switch (o) {\n case \"IV\":\n case \"SCTE35-CMD\":\n case \"SCTE35-IN\":\n case \"SCTE35-OUT\":\n c = !0;\n }\n if (t && (l || c))\n a = dc(t, a);\n else if (!c && !l)\n switch (o) {\n case \"CLOSED-CAPTIONS\":\n if (a === \"NONE\")\n break;\n // falls through\n case \"ALLOWED-CPC\":\n case \"CLASS\":\n case \"ASSOC-LANGUAGE\":\n case \"AUDIO\":\n case \"BYTERANGE\":\n case \"CHANNELS\":\n case \"CHARACTERISTICS\":\n case \"CODECS\":\n case \"DATA-ID\":\n case \"END-DATE\":\n case \"GROUP-ID\":\n case \"ID\":\n case \"IMPORT\":\n case \"INSTREAM-ID\":\n case \"KEYFORMAT\":\n case \"KEYFORMATVERSIONS\":\n case \"LANGUAGE\":\n case \"NAME\":\n case \"PATHWAY-ID\":\n case \"QUERYPARAM\":\n case \"RECENTLY-REMOVED-DATERANGES\":\n case \"SERVER-URI\":\n case \"STABLE-RENDITION-ID\":\n case \"STABLE-VARIANT-ID\":\n case \"START-DATE\":\n case \"SUBTITLES\":\n case \"SUPPLEMENTAL-CODECS\":\n case \"URI\":\n case \"VALUE\":\n case \"VIDEO\":\n case \"X-ASSET-LIST\":\n case \"X-ASSET-URI\":\n rt.warn(`${e}: attribute ${o} is missing quotes`);\n }\n n[o] = a;\n }\n return n;\n }\n}\nconst Mb = \"com.apple.hls.interstitial\";\nfunction Ob(s) {\n return s !== \"ID\" && s !== \"CLASS\" && s !== \"CUE\" && s !== \"START-DATE\" && s !== \"DURATION\" && s !== \"END-DATE\" && s !== \"END-ON-NEXT\";\n}\nfunction Bb(s) {\n return s === \"SCTE35-OUT\" || s === \"SCTE35-IN\" || s === \"SCTE35-CMD\";\n}\nclass Wg {\n constructor(e, t, r = 0) {\n var n;\n if (this.attr = void 0, this.tagAnchor = void 0, this.tagOrder = void 0, this._startDate = void 0, this._endDate = void 0, this._dateAtEnd = void 0, this._cue = void 0, this._badValueForSameId = void 0, this.tagAnchor = (t == null ? void 0 : t.tagAnchor) || null, this.tagOrder = (n = t == null ? void 0 : t.tagOrder) != null ? n : r, t) {\n const i = t.attr;\n for (const o in i)\n if (Object.prototype.hasOwnProperty.call(e, o) && e[o] !== i[o]) {\n rt.warn(`DATERANGE tag attribute: \"${o}\" does not match for tags with ID: \"${e.ID}\"`), this._badValueForSameId = o;\n break;\n }\n e = nt(new gt({}), i, e);\n }\n if (this.attr = e, t ? (this._startDate = t._startDate, this._cue = t._cue, this._endDate = t._endDate, this._dateAtEnd = t._dateAtEnd) : this._startDate = new Date(e[\"START-DATE\"]), \"END-DATE\" in this.attr) {\n const i = (t == null ? void 0 : t.endDate) || new Date(this.attr[\"END-DATE\"]);\n ue(i.getTime()) && (this._endDate = i);\n }\n }\n get id() {\n return this.attr.ID;\n }\n get class() {\n return this.attr.CLASS;\n }\n get cue() {\n const e = this._cue;\n return e === void 0 ? this._cue = this.attr.enumeratedStringList(this.attr.CUE ? \"CUE\" : \"X-CUE\", {\n pre: !1,\n post: !1,\n once: !1\n }) : e;\n }\n get startTime() {\n const {\n tagAnchor: e\n } = this;\n return e === null || e.programDateTime === null ? (rt.warn(`Expected tagAnchor Fragment with PDT set for DateRange \"${this.id}\": ${e}`), NaN) : e.start + (this.startDate.getTime() - e.programDateTime) / 1e3;\n }\n get startDate() {\n return this._startDate;\n }\n get endDate() {\n const e = this._endDate || this._dateAtEnd;\n if (e)\n return e;\n const t = this.duration;\n return t !== null ? this._dateAtEnd = new Date(this._startDate.getTime() + t * 1e3) : null;\n }\n get duration() {\n if (\"DURATION\" in this.attr) {\n const e = this.attr.decimalFloatingPoint(\"DURATION\");\n if (ue(e))\n return e;\n } else if (this._endDate)\n return (this._endDate.getTime() - this._startDate.getTime()) / 1e3;\n return null;\n }\n get plannedDuration() {\n return \"PLANNED-DURATION\" in this.attr ? this.attr.decimalFloatingPoint(\"PLANNED-DURATION\") : null;\n }\n get endOnNext() {\n return this.attr.bool(\"END-ON-NEXT\");\n }\n get isInterstitial() {\n return this.class === Mb;\n }\n get isValid() {\n return !!this.id && !this._badValueForSameId && ue(this.startDate.getTime()) && (this.duration === null || this.duration >= 0) && (!this.endOnNext || !!this.class) && (!this.attr.CUE || !this.cue.pre && !this.cue.post || this.cue.pre !== this.cue.post) && (!this.isInterstitial || \"X-ASSET-URI\" in this.attr || \"X-ASSET-LIST\" in this.attr);\n }\n}\nconst Fb = 10;\nclass Nb {\n constructor(e) {\n this.PTSKnown = !1, this.alignedSliding = !1, this.averagetargetduration = void 0, this.endCC = 0, this.endSN = 0, this.fragments = void 0, this.fragmentHint = void 0, this.partList = null, this.dateRanges = void 0, this.dateRangeTagCount = 0, this.live = !0, this.requestScheduled = -1, this.ageHeader = 0, this.advancedDateTime = void 0, this.updated = !0, this.advanced = !0, this.misses = 0, this.startCC = 0, this.startSN = 0, this.startTimeOffset = null, this.targetduration = 0, this.totalduration = 0, this.type = null, this.url = void 0, this.m3u8 = \"\", this.version = null, this.canBlockReload = !1, this.canSkipUntil = 0, this.canSkipDateRanges = !1, this.skippedSegments = 0, this.recentlyRemovedDateranges = void 0, this.partHoldBack = 0, this.holdBack = 0, this.partTarget = 0, this.preloadHint = void 0, this.renditionReports = void 0, this.tuneInGoal = 0, this.deltaUpdateFailed = void 0, this.driftStartTime = 0, this.driftEndTime = 0, this.driftStart = 0, this.driftEnd = 0, this.encryptedFragments = void 0, this.playlistParsingError = null, this.variableList = null, this.hasVariableRefs = !1, this.appliedTimelineOffset = void 0, this.fragments = [], this.encryptedFragments = [], this.dateRanges = {}, this.url = e;\n }\n reloaded(e) {\n if (!e) {\n this.advanced = !0, this.updated = !0;\n return;\n }\n const t = this.lastPartSn - e.lastPartSn, r = this.lastPartIndex - e.lastPartIndex;\n this.updated = this.endSN !== e.endSN || !!r || !!t || !this.live, this.advanced = this.endSN > e.endSN || t > 0 || t === 0 && r > 0, this.updated || this.advanced ? this.misses = Math.floor(e.misses * 0.6) : this.misses = e.misses + 1;\n }\n hasKey(e) {\n return this.encryptedFragments.some((t) => {\n let r = t.decryptdata;\n return r || (t.setKeyFormat(e.keyFormat), r = t.decryptdata), !!r && e.matches(r);\n });\n }\n get hasProgramDateTime() {\n return this.fragments.length ? ue(this.fragments[this.fragments.length - 1].programDateTime) : !1;\n }\n get levelTargetDuration() {\n return this.averagetargetduration || this.targetduration || Fb;\n }\n get drift() {\n const e = this.driftEndTime - this.driftStartTime;\n return e > 0 ? (this.driftEnd - this.driftStart) * 1e3 / e : 1;\n }\n get edge() {\n return this.partEnd || this.fragmentEnd;\n }\n get partEnd() {\n var e;\n return (e = this.partList) != null && e.length ? this.partList[this.partList.length - 1].end : this.fragmentEnd;\n }\n get fragmentEnd() {\n return this.fragments.length ? this.fragments[this.fragments.length - 1].end : 0;\n }\n get fragmentStart() {\n return this.fragments.length ? this.fragments[0].start : 0;\n }\n get age() {\n return this.advancedDateTime ? Math.max(Date.now() - this.advancedDateTime, 0) / 1e3 : 0;\n }\n get lastPartIndex() {\n var e;\n return (e = this.partList) != null && e.length ? this.partList[this.partList.length - 1].index : -1;\n }\n get maxPartIndex() {\n const e = this.partList;\n if (e) {\n const t = this.lastPartIndex;\n if (t !== -1) {\n for (let r = e.length; r--; )\n if (e[r].index > t)\n return e[r].index;\n return t;\n }\n }\n return 0;\n }\n get lastPartSn() {\n var e;\n return (e = this.partList) != null && e.length ? this.partList[this.partList.length - 1].fragment.sn : this.endSN;\n }\n get expired() {\n if (this.live && this.age && this.misses < 3) {\n const e = this.partEnd - this.fragmentStart;\n return this.age > Math.max(e, this.totalduration) + this.levelTargetDuration;\n }\n return !1;\n }\n}\nfunction xu(s, e) {\n return s.length === e.length ? !s.some((t, r) => t !== e[r]) : !1;\n}\nfunction bh(s, e) {\n return !s && !e ? !0 : !s || !e ? !1 : xu(s, e);\n}\nfunction In(s) {\n return s === \"AES-128\" || s === \"AES-256\" || s === \"AES-256-CTR\";\n}\nfunction Su(s) {\n switch (s) {\n case \"AES-128\":\n case \"AES-256\":\n return Os.cbc;\n case \"AES-256-CTR\":\n return Os.ctr;\n default:\n throw new Error(`invalid full segment method ${s}`);\n }\n}\nfunction bu(s) {\n return Uint8Array.from(atob(s), (e) => e.charCodeAt(0));\n}\nfunction hc(s) {\n return Uint8Array.from(unescape(encodeURIComponent(s)), (e) => e.charCodeAt(0));\n}\nfunction Ub(s) {\n const e = hc(s).subarray(0, 16), t = new Uint8Array(16);\n return t.set(e, 16 - e.length), t;\n}\nfunction zg(s) {\n const e = function(r, n, i) {\n const o = r[n];\n r[n] = r[i], r[i] = o;\n };\n e(s, 0, 3), e(s, 1, 2), e(s, 4, 5), e(s, 6, 7);\n}\nfunction $b(s) {\n const e = s.split(\":\");\n let t = null;\n if (e[0] === \"data\" && e.length === 2) {\n const r = e[1].split(\";\"), n = r[r.length - 1].split(\",\");\n if (n.length === 2) {\n const i = n[0] === \"base64\", o = n[1];\n i ? (r.splice(-1, 1), t = bu(o)) : t = Ub(o);\n }\n }\n return t;\n}\nconst ra = typeof self < \"u\" ? self : void 0;\nvar mt = {\n CLEARKEY: \"org.w3.clearkey\",\n FAIRPLAY: \"com.apple.fps\",\n PLAYREADY: \"com.microsoft.playready\",\n WIDEVINE: \"com.widevine.alpha\"\n}, lr = {\n CLEARKEY: \"org.w3.clearkey\",\n FAIRPLAY: \"com.apple.streamingkeydelivery\",\n PLAYREADY: \"com.microsoft.playready\",\n WIDEVINE: \"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed\"\n};\nfunction po(s) {\n switch (s) {\n case lr.FAIRPLAY:\n return mt.FAIRPLAY;\n case lr.PLAYREADY:\n return mt.PLAYREADY;\n case lr.WIDEVINE:\n return mt.WIDEVINE;\n case lr.CLEARKEY:\n return mt.CLEARKEY;\n }\n}\nfunction fl(s) {\n switch (s) {\n case mt.FAIRPLAY:\n return lr.FAIRPLAY;\n case mt.PLAYREADY:\n return lr.PLAYREADY;\n case mt.WIDEVINE:\n return lr.WIDEVINE;\n case mt.CLEARKEY:\n return lr.CLEARKEY;\n }\n}\nfunction zn(s) {\n const {\n drmSystems: e,\n widevineLicenseUrl: t\n } = s, r = e ? [mt.FAIRPLAY, mt.WIDEVINE, mt.PLAYREADY, mt.CLEARKEY].filter((n) => !!e[n]) : [];\n return !r[mt.WIDEVINE] && t && r.push(mt.WIDEVINE), r;\n}\nconst Yg = (function(s) {\n return ra != null && (s = ra.navigator) != null && s.requestMediaKeySystemAccess ? self.navigator.requestMediaKeySystemAccess.bind(self.navigator) : null;\n})();\nfunction Gb(s, e, t, r) {\n let n;\n switch (s) {\n case mt.FAIRPLAY:\n n = [\"cenc\", \"sinf\"];\n break;\n case mt.WIDEVINE:\n case mt.PLAYREADY:\n n = [\"cenc\"];\n break;\n case mt.CLEARKEY:\n n = [\"cenc\", \"keyids\"];\n break;\n default:\n throw new Error(`Unknown key-system: ${s}`);\n }\n return Vb(n, e, t, r);\n}\nfunction Vb(s, e, t, r) {\n return [{\n initDataTypes: s,\n persistentState: r.persistentState || \"optional\",\n distinctiveIdentifier: r.distinctiveIdentifier || \"optional\",\n sessionTypes: r.sessionTypes || [r.sessionType || \"temporary\"],\n audioCapabilities: e.map((i) => ({\n contentType: `audio/mp4; codecs=${i}`,\n robustness: r.audioRobustness || \"\",\n encryptionScheme: r.audioEncryptionScheme || null\n })),\n videoCapabilities: t.map((i) => ({\n contentType: `video/mp4; codecs=${i}`,\n robustness: r.videoRobustness || \"\",\n encryptionScheme: r.videoEncryptionScheme || null\n }))\n }];\n}\nfunction jb(s) {\n var e;\n return !!s && (s.sessionType === \"persistent-license\" || !!((e = s.sessionTypes) != null && e.some((t) => t === \"persistent-license\")));\n}\nfunction Kb(s) {\n const e = new Uint16Array(s.buffer, s.byteOffset, s.byteLength / 2), t = String.fromCharCode.apply(null, Array.from(e)), r = t.substring(t.indexOf(\"<\"), t.length), o = new DOMParser().parseFromString(r, \"text/xml\").getElementsByTagName(\"KID\")[0];\n if (o) {\n const a = o.childNodes[0] ? o.childNodes[0].nodeValue : o.getAttribute(\"VALUE\");\n if (a) {\n const l = bu(a).subarray(0, 16);\n return zg(l), l;\n }\n }\n return null;\n}\nlet Wi = {};\nclass yi {\n static clearKeyUriToKeyIdMap() {\n Wi = {};\n }\n static setKeyIdForUri(e, t) {\n Wi[e] = t;\n }\n constructor(e, t, r, n = [1], i = null, o) {\n this.uri = void 0, this.method = void 0, this.keyFormat = void 0, this.keyFormatVersions = void 0, this.encrypted = void 0, this.isCommonEncryption = void 0, this.iv = null, this.key = null, this.keyId = null, this.pssh = null, this.method = e, this.uri = t, this.keyFormat = r, this.keyFormatVersions = n, this.iv = i, this.encrypted = e ? e !== \"NONE\" : !1, this.isCommonEncryption = this.encrypted && !In(e), o != null && o.startsWith(\"0x\") && (this.keyId = new Uint8Array(Ig(o)));\n }\n matches(e) {\n return e.uri === this.uri && e.method === this.method && e.encrypted === this.encrypted && e.keyFormat === this.keyFormat && xu(e.keyFormatVersions, this.keyFormatVersions) && bh(e.iv, this.iv) && bh(e.keyId, this.keyId);\n }\n isSupported() {\n if (this.method) {\n if (In(this.method) || this.method === \"NONE\")\n return !0;\n if (this.keyFormat === \"identity\")\n return this.method === \"SAMPLE-AES\";\n switch (this.keyFormat) {\n case lr.FAIRPLAY:\n case lr.WIDEVINE:\n case lr.PLAYREADY:\n case lr.CLEARKEY:\n return [\"SAMPLE-AES\", \"SAMPLE-AES-CENC\", \"SAMPLE-AES-CTR\"].indexOf(this.method) !== -1;\n }\n }\n return !1;\n }\n getDecryptData(e) {\n if (!this.encrypted || !this.uri)\n return null;\n if (In(this.method)) {\n let n = this.iv;\n return n || (typeof e != \"number\" && (rt.warn(`missing IV for initialization segment with method=\"${this.method}\" - compliance issue`), e = 0), n = Hb(e)), new yi(this.method, this.uri, \"identity\", this.keyFormatVersions, n);\n }\n if (this.pssh && this.keyId)\n return this;\n const t = $b(this.uri);\n if (t)\n switch (this.keyFormat) {\n case lr.WIDEVINE:\n if (this.pssh = t, !this.keyId) {\n const n = WS(t.buffer);\n if (n.length) {\n var r;\n const i = n[0];\n this.keyId = (r = i.kids) != null && r.length ? i.kids[0] : null;\n }\n }\n if (!this.keyId) {\n const n = t.length - 22;\n this.keyId = t.subarray(n, n + 16);\n }\n break;\n case lr.PLAYREADY: {\n const n = new Uint8Array([154, 4, 240, 121, 152, 64, 66, 134, 171, 146, 230, 91, 224, 136, 95, 149]);\n this.pssh = qS(n, null, t), this.keyId = Kb(t);\n break;\n }\n default: {\n let n = t.subarray(0, 16);\n if (n.length !== 16) {\n const i = new Uint8Array(16);\n i.set(n, 16 - n.length), n = i;\n }\n this.keyId = n;\n break;\n }\n }\n if (!this.keyId || this.keyId.byteLength !== 16) {\n let n = Wi[this.uri];\n if (!n) {\n const i = Object.keys(Wi).length % Number.MAX_SAFE_INTEGER;\n n = new Uint8Array(16), new DataView(n.buffer, 12, 4).setUint32(0, i), yi.setKeyIdForUri(this.uri, n);\n }\n this.keyId = n;\n }\n return this;\n }\n}\nfunction Hb(s) {\n const e = new Uint8Array(16);\n for (let t = 12; t < 16; t++)\n e[t] = s >> 8 * (15 - t) & 255;\n return e;\n}\nconst Th = /#EXT-X-STREAM-INF:([^\\r\\n]*)(?:[\\r\\n](?:#[^\\r\\n]*)?)*([^\\r\\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\\r\\n]*)[\\r\\n]+/g, wh = /#EXT-X-MEDIA:(.*)/g, qb = /^#EXT(?:INF|-X-TARGETDURATION):/m, gl = new RegExp([\n /#EXTINF:\\s*(\\d*(?:\\.\\d+)?)(?:,(.*)\\s+)?/.source,\n // duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title\n /(?!#) *(\\S[^\\r\\n]*)/.source,\n // segment URI, group 3 => the URI (note newline is not eaten)\n /#.*/.source\n // All other non-segment oriented tags will match with all groups empty\n].join(\"|\"), \"g\"), Wb = new RegExp([/#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\\r?\\n?/.source].join(\"|\"));\nclass zr {\n static findGroup(e, t) {\n for (let r = 0; r < e.length; r++) {\n const n = e[r];\n if (n.id === t)\n return n;\n }\n }\n static resolve(e, t) {\n return hu.buildAbsoluteURL(t, e, {\n alwaysNormalize: !0\n });\n }\n static isMediaPlaylist(e) {\n return qb.test(e);\n }\n static parseMasterPlaylist(e, t) {\n const r = Eh(e), n = {\n contentSteering: null,\n levels: [],\n playlistParsingError: null,\n sessionData: null,\n sessionKeys: null,\n startTimeOffset: null,\n variableList: null,\n hasVariableRefs: r\n }, i = [];\n if (Th.lastIndex = 0, !e.startsWith(\"#EXTM3U\"))\n return n.playlistParsingError = new Error(\"no EXTM3U delimiter\"), n;\n let o;\n for (; (o = Th.exec(e)) != null; )\n if (o[1]) {\n var a;\n const c = new gt(o[1], n), u = dc(n, o[2]), d = {\n attrs: c,\n bitrate: c.decimalInteger(\"BANDWIDTH\") || c.decimalInteger(\"AVERAGE-BANDWIDTH\"),\n name: c.NAME,\n url: zr.resolve(u, t)\n }, h = c.decimalResolution(\"RESOLUTION\");\n h && (d.width = h.width, d.height = h.height), _h(c.CODECS, d);\n const f = c[\"SUPPLEMENTAL-CODECS\"];\n f && (d.supplemental = {}, _h(f, d.supplemental)), (a = d.unknownCodecs) != null && a.length || i.push(d), n.levels.push(d);\n } else if (o[3]) {\n const c = o[3], u = o[4];\n switch (c) {\n case \"SESSION-DATA\": {\n const d = new gt(u, n), h = d[\"DATA-ID\"];\n h && (n.sessionData === null && (n.sessionData = {}), n.sessionData[h] = d);\n break;\n }\n case \"SESSION-KEY\": {\n const d = Ah(u, t, n);\n d.encrypted && d.isSupported() ? (n.sessionKeys === null && (n.sessionKeys = []), n.sessionKeys.push(d)) : rt.warn(`[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: \"${u}\"`);\n break;\n }\n case \"DEFINE\": {\n {\n const d = new gt(u, n);\n xh(n, d, t);\n }\n break;\n }\n case \"CONTENT-STEERING\": {\n const d = new gt(u, n);\n n.contentSteering = {\n uri: zr.resolve(d[\"SERVER-URI\"], t),\n pathwayId: d[\"PATHWAY-ID\"] || \".\"\n };\n break;\n }\n case \"START\": {\n n.startTimeOffset = Ih(u);\n break;\n }\n }\n }\n const l = i.length > 0 && i.length < n.levels.length;\n return n.levels = l ? i : n.levels, n.levels.length === 0 && (n.playlistParsingError = new Error(\"no levels found in manifest\")), n;\n }\n static parseMasterPlaylistMedia(e, t, r) {\n let n;\n const i = {}, o = r.levels, a = {\n AUDIO: o.map((c) => ({\n id: c.attrs.AUDIO,\n audioCodec: c.audioCodec\n })),\n SUBTITLES: o.map((c) => ({\n id: c.attrs.SUBTITLES,\n textCodec: c.textCodec\n })),\n \"CLOSED-CAPTIONS\": []\n };\n let l = 0;\n for (wh.lastIndex = 0; (n = wh.exec(e)) !== null; ) {\n const c = new gt(n[1], r), u = c.TYPE;\n if (u) {\n const d = a[u], h = i[u] || [];\n i[u] = h;\n const f = c.LANGUAGE, p = c[\"ASSOC-LANGUAGE\"], y = c.CHANNELS, E = c.CHARACTERISTICS, b = c[\"INSTREAM-ID\"], R = {\n attrs: c,\n bitrate: 0,\n id: l++,\n groupId: c[\"GROUP-ID\"] || \"\",\n name: c.NAME || f || \"\",\n type: u,\n default: c.bool(\"DEFAULT\"),\n autoselect: c.bool(\"AUTOSELECT\"),\n forced: c.bool(\"FORCED\"),\n lang: f,\n url: c.URI ? zr.resolve(c.URI, t) : \"\"\n };\n if (p && (R.assocLang = p), y && (R.channels = y), E && (R.characteristics = E), b && (R.instreamId = b), d != null && d.length) {\n const A = zr.findGroup(d, R.groupId) || d[0];\n Rh(R, A, \"audioCodec\"), Rh(R, A, \"textCodec\");\n }\n h.push(R);\n }\n }\n return i;\n }\n static parseLevelPlaylist(e, t, r, n, i, o) {\n var a;\n const l = {\n url: t\n }, c = new Nb(t), u = c.fragments, d = [];\n let h = null, f = 0, p = 0, y = 0, E = 0, b = 0, R = null, A = new ul(n, l), F, M, H, K = -1, j = !1, C = null, k;\n if (gl.lastIndex = 0, c.m3u8 = e, c.hasVariableRefs = Eh(e), ((a = gl.exec(e)) == null ? void 0 : a[0]) !== \"#EXTM3U\")\n return c.playlistParsingError = new Error(\"Missing format identifier #EXTM3U\"), c;\n for (; (F = gl.exec(e)) !== null; ) {\n j && (j = !1, A = new ul(n, l), A.playlistOffset = y, A.setStart(y), A.sn = f, A.cc = E, b && (A.bitrate = b), A.level = r, h && (A.initSegment = h, h.rawProgramDateTime && (A.rawProgramDateTime = h.rawProgramDateTime, h.rawProgramDateTime = null), C && (A.setByteRange(C), C = null)));\n const g = F[1];\n if (g) {\n A.duration = parseFloat(g);\n const x = (\" \" + F[2]).slice(1);\n A.title = x || null, A.tagList.push(x ? [\"INF\", g, x] : [\"INF\", g]);\n } else if (F[3]) {\n if (ue(A.duration)) {\n A.playlistOffset = y, A.setStart(y), H && Ch(A, H, c), A.sn = f, A.level = r, A.cc = E, u.push(A);\n const x = (\" \" + F[3]).slice(1);\n A.relurl = dc(c, x), fc(A, R, d), R = A, y += A.duration, f++, p = 0, j = !0;\n }\n } else {\n if (F = F[0].match(Wb), !F) {\n rt.warn(\"No matches on slow regex match for level playlist!\");\n continue;\n }\n for (M = 1; M < F.length && F[M] === void 0; M++)\n ;\n const x = (\" \" + F[M]).slice(1), w = (\" \" + F[M + 1]).slice(1), D = F[M + 2] ? (\" \" + F[M + 2]).slice(1) : null;\n switch (x) {\n case \"BYTERANGE\":\n R ? A.setByteRange(w, R) : A.setByteRange(w);\n break;\n case \"PROGRAM-DATE-TIME\":\n A.rawProgramDateTime = w, A.tagList.push([\"PROGRAM-DATE-TIME\", w]), K === -1 && (K = u.length);\n break;\n case \"PLAYLIST-TYPE\":\n c.type && ns(c, x, F), c.type = w.toUpperCase();\n break;\n case \"MEDIA-SEQUENCE\":\n c.startSN !== 0 ? ns(c, x, F) : u.length > 0 && kh(c, x, F), f = c.startSN = parseInt(w);\n break;\n case \"SKIP\": {\n c.skippedSegments && ns(c, x, F);\n const O = new gt(w, c), U = O.decimalInteger(\"SKIPPED-SEGMENTS\");\n if (ue(U)) {\n c.skippedSegments += U;\n for (let L = U; L--; )\n u.push(null);\n f += U;\n }\n const V = O.enumeratedString(\"RECENTLY-REMOVED-DATERANGES\");\n V && (c.recentlyRemovedDateranges = (c.recentlyRemovedDateranges || []).concat(V.split(\"\t\")));\n break;\n }\n case \"TARGETDURATION\":\n c.targetduration !== 0 && ns(c, x, F), c.targetduration = Math.max(parseInt(w), 1);\n break;\n case \"VERSION\":\n c.version !== null && ns(c, x, F), c.version = parseInt(w);\n break;\n case \"INDEPENDENT-SEGMENTS\":\n break;\n case \"ENDLIST\":\n c.live || ns(c, x, F), c.live = !1;\n break;\n case \"#\":\n (w || D) && A.tagList.push(D ? [w, D] : [w]);\n break;\n case \"DISCONTINUITY\":\n E++, A.tagList.push([\"DIS\"]);\n break;\n case \"GAP\":\n A.gap = !0, A.tagList.push([x]);\n break;\n case \"BITRATE\":\n A.tagList.push([x, w]), b = parseInt(w) * 1e3, ue(b) ? A.bitrate = b : b = 0;\n break;\n case \"DATERANGE\": {\n const O = new gt(w, c), U = new Wg(O, c.dateRanges[O.ID], c.dateRangeTagCount);\n c.dateRangeTagCount++, U.isValid || c.skippedSegments ? c.dateRanges[U.id] = U : rt.warn(`Ignoring invalid DATERANGE tag: \"${w}\"`), A.tagList.push([\"EXT-X-DATERANGE\", w]);\n break;\n }\n case \"DEFINE\": {\n {\n const O = new gt(w, c);\n \"IMPORT\" in O ? Db(c, O, o) : xh(c, O, t);\n }\n break;\n }\n case \"DISCONTINUITY-SEQUENCE\":\n c.startCC !== 0 ? ns(c, x, F) : u.length > 0 && kh(c, x, F), c.startCC = E = parseInt(w);\n break;\n case \"KEY\": {\n const O = Ah(w, t, c);\n if (O.isSupported()) {\n if (O.method === \"NONE\") {\n H = void 0;\n break;\n }\n H || (H = {});\n const U = H[O.keyFormat];\n U != null && U.matches(O) || (U && (H = nt({}, H)), H[O.keyFormat] = O);\n } else\n rt.warn(`[Keys] Ignoring unsupported EXT-X-KEY tag: \"${w}\"`);\n break;\n }\n case \"START\":\n c.startTimeOffset = Ih(w);\n break;\n case \"MAP\": {\n const O = new gt(w, c);\n if (A.duration) {\n const U = new ul(n, l);\n Lh(U, O, r, H), h = U, A.initSegment = h, h.rawProgramDateTime && !A.rawProgramDateTime && (A.rawProgramDateTime = h.rawProgramDateTime);\n } else {\n const U = A.byteRangeEndOffset;\n if (U) {\n const V = A.byteRangeStartOffset;\n C = `${U - V}@${V}`;\n } else\n C = null;\n Lh(A, O, r, H), h = A, j = !0;\n }\n h.cc = E;\n break;\n }\n case \"SERVER-CONTROL\": {\n k && ns(c, x, F), k = new gt(w), c.canBlockReload = k.bool(\"CAN-BLOCK-RELOAD\"), c.canSkipUntil = k.optionalFloat(\"CAN-SKIP-UNTIL\", 0), c.canSkipDateRanges = c.canSkipUntil > 0 && k.bool(\"CAN-SKIP-DATERANGES\"), c.partHoldBack = k.optionalFloat(\"PART-HOLD-BACK\", 0), c.holdBack = k.optionalFloat(\"HOLD-BACK\", 0);\n break;\n }\n case \"PART-INF\": {\n c.partTarget && ns(c, x, F);\n const O = new gt(w);\n c.partTarget = O.decimalFloatingPoint(\"PART-TARGET\");\n break;\n }\n case \"PART\": {\n let O = c.partList;\n O || (O = c.partList = []);\n const U = p > 0 ? O[O.length - 1] : void 0, V = p++, L = new gt(w, c), m = new PS(L, A, l, V, U);\n O.push(m), A.duration += m.duration;\n break;\n }\n case \"PRELOAD-HINT\": {\n const O = new gt(w, c);\n c.preloadHint = O;\n break;\n }\n case \"RENDITION-REPORT\": {\n const O = new gt(w, c);\n c.renditionReports = c.renditionReports || [], c.renditionReports.push(O);\n break;\n }\n default:\n rt.warn(`line parsed but not handled: ${F}`);\n break;\n }\n }\n }\n R && !R.relurl ? (u.pop(), y -= R.duration, c.partList && (c.fragmentHint = R)) : c.partList && (fc(A, R, d), A.cc = E, c.fragmentHint = A, H && Ch(A, H, c)), c.targetduration || (c.playlistParsingError = new Error(\"Missing Target Duration\"));\n const $ = u.length, W = u[0], _ = u[$ - 1];\n if (y += c.skippedSegments * c.targetduration, y > 0 && $ && _) {\n c.averagetargetduration = y / $;\n const g = _.sn;\n c.endSN = g !== \"initSegment\" ? g : 0, c.live || (_.endList = !0), K > 0 && (Yb(u, K), W && d.unshift(W));\n }\n return c.fragmentHint && (y += c.fragmentHint.duration), c.totalduration = y, d.length && c.dateRangeTagCount && W && Zg(d, c), c.endCC = E, c;\n }\n}\nfunction Zg(s, e) {\n let t = s.length;\n if (!t)\n if (e.hasProgramDateTime) {\n const a = e.fragments[e.fragments.length - 1];\n s.push(a), t++;\n } else\n return;\n const r = s[t - 1], n = e.live ? 1 / 0 : e.totalduration, i = Object.keys(e.dateRanges);\n for (let a = i.length; a--; ) {\n const l = e.dateRanges[i[a]], c = l.startDate.getTime();\n l.tagAnchor = r.ref;\n for (let u = t; u--; ) {\n var o;\n if (((o = s[u]) == null ? void 0 : o.sn) < e.startSN)\n break;\n const d = zb(e, c, s, u, n);\n if (d !== -1) {\n l.tagAnchor = e.fragments[d].ref;\n break;\n }\n }\n }\n}\nfunction zb(s, e, t, r, n) {\n const i = t[r];\n if (i) {\n const a = i.programDateTime;\n if (e >= a || r === 0) {\n var o;\n const l = (((o = t[r + 1]) == null ? void 0 : o.start) || n) - i.start;\n if (e <= a + l * 1e3) {\n const c = t[r].sn - s.startSN;\n if (c < 0)\n return -1;\n const u = s.fragments;\n if (u.length > t.length) {\n const h = (t[r + 1] || u[u.length - 1]).sn - s.startSN;\n for (let f = h; f > c; f--) {\n const p = u[f].programDateTime;\n if (e >= p && e < p + u[f].duration * 1e3)\n return f;\n }\n }\n return c;\n }\n }\n }\n return -1;\n}\nfunction Ah(s, e, t) {\n var r, n;\n const i = new gt(s, t), o = (r = i.METHOD) != null ? r : \"\", a = i.URI, l = i.hexadecimalInteger(\"IV\"), c = i.KEYFORMATVERSIONS, u = (n = i.KEYFORMAT) != null ? n : \"identity\";\n a && i.IV && !l && rt.error(`Invalid IV: ${i.IV}`);\n const d = a ? zr.resolve(a, e) : \"\", h = (c || \"1\").split(\"/\").map(Number).filter(Number.isFinite);\n return new yi(o, d, u, h, l, i.KEYID);\n}\nfunction Ih(s) {\n const t = new gt(s).decimalFloatingPoint(\"TIME-OFFSET\");\n return ue(t) ? t : null;\n}\nfunction _h(s, e) {\n let t = (s || \"\").split(/[ ,]+/).filter((r) => r);\n [\"video\", \"audio\", \"text\"].forEach((r) => {\n const n = t.filter((i) => pu(i, r));\n n.length && (e[`${r}Codec`] = n.map((i) => i.split(\"/\")[0]).join(\",\"), t = t.filter((i) => n.indexOf(i) === -1));\n }), e.unknownCodecs = t;\n}\nfunction Rh(s, e, t) {\n const r = e[t];\n r && (s[t] = r);\n}\nfunction Yb(s, e) {\n let t = s[e];\n for (let r = e; r--; ) {\n const n = s[r];\n if (!n)\n return;\n n.programDateTime = t.programDateTime - n.duration * 1e3, t = n;\n }\n}\nfunction fc(s, e, t) {\n s.rawProgramDateTime ? t.push(s) : e != null && e.programDateTime && (s.programDateTime = e.endProgramDateTime);\n}\nfunction Lh(s, e, t, r) {\n s.relurl = e.URI, e.BYTERANGE && s.setByteRange(e.BYTERANGE), s.level = t, s.sn = \"initSegment\", r && (s.levelkeys = r), s.initSegment = null;\n}\nfunction Ch(s, e, t) {\n s.levelkeys = e;\n const {\n encryptedFragments: r\n } = t;\n (!r.length || r[r.length - 1].levelkeys !== e) && Object.keys(e).some((n) => e[n].isCommonEncryption) && r.push(s);\n}\nfunction ns(s, e, t) {\n s.playlistParsingError = new Error(`#EXT-X-${e} must not appear more than once (${t[0]})`);\n}\nfunction kh(s, e, t) {\n s.playlistParsingError = new Error(`#EXT-X-${e} must appear before the first Media Segment (${t[0]})`);\n}\nfunction pl(s, e) {\n const t = e.startPTS;\n if (ue(t)) {\n let r = 0, n;\n e.sn > s.sn ? (r = t - s.start, n = s) : (r = s.start - t, n = e), n.duration !== r && n.setDuration(r);\n } else e.sn > s.sn ? s.cc === e.cc && s.minEndPTS ? e.setStart(s.start + (s.minEndPTS - s.start)) : e.setStart(s.start + s.duration) : e.setStart(Math.max(s.start - e.duration, 0));\n}\nfunction Xg(s, e, t, r, n, i, o) {\n r - t <= 0 && (o.warn(\"Fragment should have a positive duration\", e), r = t + e.duration, i = n + e.duration);\n let l = t, c = r;\n const u = e.startPTS, d = e.endPTS;\n if (ue(u)) {\n const b = Math.abs(u - t);\n s && b > s.totalduration ? o.warn(`media timestamps and playlist times differ by ${b}s for level ${e.level} ${s.url}`) : ue(e.deltaPTS) ? e.deltaPTS = Math.max(b, e.deltaPTS) : e.deltaPTS = b, l = Math.max(t, u), t = Math.min(t, u), n = e.startDTS !== void 0 ? Math.min(n, e.startDTS) : n, c = Math.min(r, d), r = Math.max(r, d), i = e.endDTS !== void 0 ? Math.max(i, e.endDTS) : i;\n }\n const h = t - e.start;\n e.start !== 0 && e.setStart(t), e.setDuration(r - e.start), e.startPTS = t, e.maxStartPTS = l, e.startDTS = n, e.endPTS = r, e.minEndPTS = c, e.endDTS = i;\n const f = e.sn;\n if (!s || f < s.startSN || f > s.endSN)\n return 0;\n let p;\n const y = f - s.startSN, E = s.fragments;\n for (E[y] = e, p = y; p > 0; p--)\n pl(E[p], E[p - 1]);\n for (p = y; p < E.length - 1; p++)\n pl(E[p], E[p + 1]);\n return s.fragmentHint && pl(E[E.length - 1], s.fragmentHint), s.PTSKnown = s.alignedSliding = !0, h;\n}\nfunction Zb(s, e, t) {\n if (s === e)\n return;\n let r = null;\n const n = s.fragments;\n for (let u = n.length - 1; u >= 0; u--) {\n const d = n[u].initSegment;\n if (d) {\n r = d;\n break;\n }\n }\n s.fragmentHint && delete s.fragmentHint.endPTS;\n let i;\n Qb(s, e, (u, d, h, f) => {\n if ((!e.startCC || e.skippedSegments) && d.cc !== u.cc) {\n const p = u.cc - d.cc;\n for (let y = h; y < f.length; y++)\n f[y].cc += p;\n e.endCC = f[f.length - 1].cc;\n }\n ue(u.startPTS) && ue(u.endPTS) && (d.setStart(d.startPTS = u.startPTS), d.startDTS = u.startDTS, d.maxStartPTS = u.maxStartPTS, d.endPTS = u.endPTS, d.endDTS = u.endDTS, d.minEndPTS = u.minEndPTS, d.setDuration(u.endPTS - u.startPTS), d.duration && (i = d), e.PTSKnown = e.alignedSliding = !0), u.hasStreams && (d.elementaryStreams = u.elementaryStreams), d.loader = u.loader, u.hasStats && (d.stats = u.stats), u.initSegment && (d.initSegment = u.initSegment, r = u.initSegment);\n });\n const o = e.fragments, a = e.fragmentHint ? o.concat(e.fragmentHint) : o;\n if (r && a.forEach((u) => {\n var d;\n u && (!u.initSegment || u.initSegment.relurl === ((d = r) == null ? void 0 : d.relurl)) && (u.initSegment = r);\n }), e.skippedSegments) {\n if (e.deltaUpdateFailed = o.some((u) => !u), e.deltaUpdateFailed) {\n t.warn(\"[level-helper] Previous playlist missing segments skipped in delta playlist\");\n for (let u = e.skippedSegments; u--; )\n o.shift();\n e.startSN = o[0].sn;\n } else {\n e.canSkipDateRanges && (e.dateRanges = Xb(s.dateRanges, e, t));\n const u = s.fragments.filter((d) => d.rawProgramDateTime);\n if (s.hasProgramDateTime && !e.hasProgramDateTime)\n for (let d = 1; d < a.length; d++)\n a[d].programDateTime === null && fc(a[d], a[d - 1], u);\n Zg(u, e);\n }\n e.endCC = o[o.length - 1].cc;\n }\n if (!e.startCC) {\n var l;\n const u = ep(s, e.startSN - 1);\n e.startCC = (l = u == null ? void 0 : u.cc) != null ? l : o[0].cc;\n }\n Jb(s.partList, e.partList, (u, d) => {\n d.elementaryStreams = u.elementaryStreams, d.stats = u.stats;\n }), i ? Xg(e, i, i.startPTS, i.endPTS, i.startDTS, i.endDTS, t) : Jg(s, e), o.length && (e.totalduration = e.edge - o[0].start), e.driftStartTime = s.driftStartTime, e.driftStart = s.driftStart;\n const c = e.advancedDateTime;\n if (e.advanced && c) {\n const u = e.edge;\n e.driftStart || (e.driftStartTime = c, e.driftStart = u), e.driftEndTime = c, e.driftEnd = u;\n } else\n e.driftEndTime = s.driftEndTime, e.driftEnd = s.driftEnd, e.advancedDateTime = s.advancedDateTime;\n e.requestScheduled === -1 && (e.requestScheduled = s.requestScheduled);\n}\nfunction Xb(s, e, t) {\n const {\n dateRanges: r,\n recentlyRemovedDateranges: n\n } = e, i = nt({}, s);\n n && n.forEach((l) => {\n delete i[l];\n });\n const a = Object.keys(i).length;\n return a ? (Object.keys(r).forEach((l) => {\n const c = i[l], u = new Wg(r[l].attr, c);\n u.isValid ? (i[l] = u, c || (u.tagOrder += a)) : t.warn(`Ignoring invalid Playlist Delta Update DATERANGE tag: \"${at(r[l].attr)}\"`);\n }), i) : r;\n}\nfunction Jb(s, e, t) {\n if (s && e) {\n let r = 0;\n for (let n = 0, i = s.length; n <= i; n++) {\n const o = s[n], a = e[n + r];\n o && a && o.index === a.index && o.fragment.sn === a.fragment.sn ? t(o, a) : r--;\n }\n }\n}\nfunction Qb(s, e, t) {\n const r = e.skippedSegments, n = Math.max(s.startSN, e.startSN) - e.startSN, i = (s.fragmentHint ? 1 : 0) + (r ? e.endSN : Math.min(s.endSN, e.endSN)) - e.startSN, o = e.startSN - s.startSN, a = e.fragmentHint ? e.fragments.concat(e.fragmentHint) : e.fragments, l = s.fragmentHint ? s.fragments.concat(s.fragmentHint) : s.fragments;\n for (let c = n; c <= i; c++) {\n const u = l[o + c];\n let d = a[c];\n if (r && !d && u && (d = e.fragments[c] = u), u && d) {\n t(u, d, c, a);\n const h = u.relurl, f = d.relurl;\n if (h && eT(h, f)) {\n e.playlistParsingError = Dh(`media sequence mismatch ${d.sn}:`, s, e, u, d);\n return;\n } else if (u.cc !== d.cc) {\n e.playlistParsingError = Dh(`discontinuity sequence mismatch (${u.cc}!=${d.cc})`, s, e, u, d);\n return;\n }\n }\n }\n}\nfunction Dh(s, e, t, r, n) {\n return new Error(`${s} ${n.url}\nPlaylist starting @${e.startSN}\n${e.m3u8}\n\nPlaylist starting @${t.startSN}\n${t.m3u8}`);\n}\nfunction Jg(s, e, t = !0) {\n const r = e.startSN + e.skippedSegments - s.startSN, n = s.fragments, i = r >= 0;\n let o = 0;\n if (i && r < n.length)\n o = n[r].start;\n else if (i && e.startSN === s.endSN + 1)\n o = s.fragmentEnd;\n else if (i && t)\n o = s.fragmentStart + r * e.levelTargetDuration;\n else if (!e.skippedSegments && e.fragmentStart === 0)\n o = s.fragmentStart;\n else\n return;\n gc(e, o);\n}\nfunction gc(s, e) {\n if (e) {\n const t = s.fragments;\n for (let r = s.skippedSegments; r < t.length; r++)\n t[r].addStart(e);\n s.fragmentHint && s.fragmentHint.addStart(e);\n }\n}\nfunction Qg(s, e = 1 / 0) {\n let t = 1e3 * s.targetduration;\n if (s.updated) {\n const r = s.fragments;\n if (r.length && t * 4 > e) {\n const i = r[r.length - 1].duration * 1e3;\n i < t && (t = i);\n }\n } else\n t /= 2;\n return Math.round(t);\n}\nfunction ep(s, e, t) {\n if (!s)\n return null;\n let r = s.fragments[e - s.startSN];\n return r || (r = s.fragmentHint, r && r.sn === e) ? r : e < s.startSN && t && t.sn === e ? t : null;\n}\nfunction Ph(s, e, t) {\n return s ? tp(s.partList, e, t) : null;\n}\nfunction tp(s, e, t) {\n if (s)\n for (let r = s.length; r--; ) {\n const n = s[r];\n if (n.index === t && n.fragment.sn === e)\n return n;\n }\n return null;\n}\nfunction rp(s) {\n s.forEach((e, t) => {\n var r;\n (r = e.details) == null || r.fragments.forEach((n) => {\n n.level = t, n.initSegment && (n.initSegment.level = t);\n });\n });\n}\nfunction eT(s, e) {\n return s !== e && e ? Mh(s) !== Mh(e) : !1;\n}\nfunction Mh(s) {\n return s.replace(/\\?[^?]*$/, \"\");\n}\nfunction Yn(s, e) {\n for (let r = 0, n = s.length; r < n; r++) {\n var t;\n if (((t = s[r]) == null ? void 0 : t.cc) === e)\n return s[r];\n }\n return null;\n}\nfunction tT(s, e) {\n return !!(s && e.startCC < s.endCC && e.endCC > s.startCC);\n}\nfunction Oh(s, e) {\n const t = s.start + e;\n s.startPTS = t, s.setStart(t), s.endPTS = t + s.duration;\n}\nfunction sp(s, e) {\n const t = e.fragments;\n for (let r = 0, n = t.length; r < n; r++)\n Oh(t[r], s);\n e.fragmentHint && Oh(e.fragmentHint, s), e.alignedSliding = !0;\n}\nfunction rT(s, e) {\n s && (np(e, s), e.alignedSliding || sa(e, s), !e.alignedSliding && !e.skippedSegments && Jg(s, e, !1));\n}\nfunction np(s, e) {\n if (!tT(e, s))\n return;\n const t = Math.min(e.endCC, s.endCC), r = Yn(e.fragments, t), n = Yn(s.fragments, t);\n if (!r || !n)\n return;\n rt.log(`Aligning playlist at start of dicontinuity sequence ${t}`);\n const i = r.start - n.start;\n sp(i, s);\n}\nfunction sa(s, e) {\n if (!s.hasProgramDateTime || !e.hasProgramDateTime)\n return;\n const t = s.fragments, r = e.fragments;\n if (!t.length || !r.length)\n return;\n let n, i;\n const o = Math.min(e.endCC, s.endCC);\n e.startCC < o && s.startCC < o && (n = Yn(r, o), i = Yn(t, o)), (!n || !i) && (n = r[Math.floor(r.length / 2)], i = Yn(t, n.cc) || t[Math.floor(t.length / 2)]);\n const a = n.programDateTime, l = i.programDateTime;\n if (!a || !l)\n return;\n const c = (l - a) / 1e3 - (i.start - n.start);\n sp(c, s);\n}\nfunction cr(s, e, t) {\n pr(s, e, t), s.addEventListener(e, t);\n}\nfunction pr(s, e, t) {\n s.removeEventListener(e, t);\n}\nconst sT = {\n toString: function(s) {\n let e = \"\";\n const t = s.length;\n for (let r = 0; r < t; r++)\n e += `[${s.start(r).toFixed(3)}-${s.end(r).toFixed(3)}]`;\n return e;\n }\n}, ne = {\n STOPPED: \"STOPPED\",\n IDLE: \"IDLE\",\n KEY_LOADING: \"KEY_LOADING\",\n FRAG_LOADING: \"FRAG_LOADING\",\n FRAG_LOADING_WAITING_RETRY: \"FRAG_LOADING_WAITING_RETRY\",\n WAITING_TRACK: \"WAITING_TRACK\",\n PARSING: \"PARSING\",\n PARSED: \"PARSED\",\n ENDED: \"ENDED\",\n ERROR: \"ERROR\",\n WAITING_INIT_PTS: \"WAITING_INIT_PTS\",\n WAITING_LEVEL: \"WAITING_LEVEL\"\n};\nclass Tu extends Hg {\n constructor(e, t, r, n, i) {\n super(n, e.logger), this.hls = void 0, this.fragPrevious = null, this.fragCurrent = null, this.fragmentTracker = void 0, this.transmuxer = null, this._state = ne.STOPPED, this.playlistType = void 0, this.media = null, this.mediaBuffer = null, this.config = void 0, this.bitrateTest = !1, this.lastCurrentTime = 0, this.nextLoadPosition = 0, this.startPosition = 0, this.startTimeOffset = null, this.retryDate = 0, this.levels = null, this.fragmentLoader = void 0, this.keyLoader = void 0, this.levelLastLoaded = null, this.startFragRequested = !1, this.decrypter = void 0, this.initPTS = [], this.buffering = !0, this.loadingParts = !1, this.loopSn = void 0, this.onMediaSeeking = () => {\n const {\n config: o,\n fragCurrent: a,\n media: l,\n mediaBuffer: c,\n state: u\n } = this, d = l ? l.currentTime : 0, h = Ce.bufferInfo(c || l, d, o.maxBufferHole), f = !h.len;\n if (this.log(`Media seeking to ${ue(d) ? d.toFixed(3) : d}, state: ${u}, ${f ? \"out of\" : \"in\"} buffer`), this.state === ne.ENDED)\n this.resetLoadingState();\n else if (a) {\n const p = o.maxFragLookUpTolerance, y = a.start - p, E = a.start + a.duration + p;\n if (f || E < h.start || y > h.end) {\n const b = d > E;\n (d < y || b) && (b && a.loader && (this.log(`Cancelling fragment load for seek (sn: ${a.sn})`), a.abortRequests(), this.resetLoadingState()), this.fragPrevious = null);\n }\n }\n if (l) {\n this.fragmentTracker.removeFragmentsInRange(d, 1 / 0, this.playlistType, !0);\n const p = this.lastCurrentTime;\n if (d > p && (this.lastCurrentTime = d), !this.loadingParts) {\n const y = Math.max(h.end, d), E = this.shouldLoadParts(this.getLevelDetails(), y);\n E && (this.log(`LL-Part loading ON after seeking to ${d.toFixed(2)} with buffer @${y.toFixed(2)}`), this.loadingParts = E);\n }\n }\n this.hls.hasEnoughToStart || (this.log(`Setting ${f ? \"startPosition\" : \"nextLoadPosition\"} to ${d} for seek without enough to start`), this.nextLoadPosition = d, f && (this.startPosition = d)), f && this.state === ne.IDLE && this.tickImmediate();\n }, this.onMediaEnded = () => {\n this.log(\"setting startPosition to 0 because media ended\"), this.startPosition = this.lastCurrentTime = 0;\n }, this.playlistType = i, this.hls = e, this.fragmentLoader = new Cb(e.config), this.keyLoader = r, this.fragmentTracker = t, this.config = e.config, this.decrypter = new vu(e.config);\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.ERROR, this.onError, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.ERROR, this.onError, this);\n }\n doTick() {\n this.onTickEnd();\n }\n onTickEnd() {\n }\n startLoad(e) {\n }\n stopLoad() {\n if (this.state === ne.STOPPED)\n return;\n this.fragmentLoader.abort(), this.keyLoader.abort(this.playlistType);\n const e = this.fragCurrent;\n e != null && e.loader && (e.abortRequests(), this.fragmentTracker.removeFragment(e)), this.resetTransmuxer(), this.fragCurrent = null, this.fragPrevious = null, this.clearInterval(), this.clearNextTick(), this.state = ne.STOPPED;\n }\n get startPositionValue() {\n const {\n nextLoadPosition: e,\n startPosition: t\n } = this;\n return t === -1 && e ? e : t;\n }\n get bufferingEnabled() {\n return this.buffering;\n }\n pauseBuffering() {\n this.buffering = !1;\n }\n resumeBuffering() {\n this.buffering = !0;\n }\n get inFlightFrag() {\n return {\n frag: this.fragCurrent,\n state: this.state\n };\n }\n _streamEnded(e, t) {\n if (t.live || !this.media)\n return !1;\n const r = e.end || 0, n = this.config.timelineOffset || 0;\n if (r <= n)\n return !1;\n const i = e.buffered;\n this.config.maxBufferHole && i && i.length > 1 && (e = Ce.bufferedInfo(i, e.start, 0));\n const o = e.nextStart;\n if (o && o > n && o < t.edge || this.media.currentTime < e.start)\n return !1;\n const l = t.partList;\n if (l != null && l.length) {\n const u = l[l.length - 1];\n return Ce.isBuffered(this.media, u.start + u.duration / 2);\n }\n const c = t.fragments[t.fragments.length - 1].type;\n return this.fragmentTracker.isEndListAppended(c);\n }\n getLevelDetails() {\n if (this.levels && this.levelLastLoaded !== null)\n return this.levelLastLoaded.details;\n }\n get timelineOffset() {\n const e = this.config.timelineOffset;\n if (e) {\n var t;\n return ((t = this.getLevelDetails()) == null ? void 0 : t.appliedTimelineOffset) || e;\n }\n return 0;\n }\n onMediaAttached(e, t) {\n const r = this.media = this.mediaBuffer = t.media;\n cr(r, \"seeking\", this.onMediaSeeking), cr(r, \"ended\", this.onMediaEnded);\n const n = this.config;\n this.levels && n.autoStartLoad && this.state === ne.STOPPED && this.startLoad(n.startPosition);\n }\n onMediaDetaching(e, t) {\n const r = !!t.transferMedia, n = this.media;\n if (n !== null) {\n if (n.ended && (this.log(\"MSE detaching and video ended, reset startPosition\"), this.startPosition = this.lastCurrentTime = 0), pr(n, \"seeking\", this.onMediaSeeking), pr(n, \"ended\", this.onMediaEnded), this.keyLoader && !r && this.keyLoader.detach(), this.media = this.mediaBuffer = null, this.loopSn = void 0, r) {\n this.resetLoadingState(), this.resetTransmuxer();\n return;\n }\n this.loadingParts = !1, this.fragmentTracker.removeAllFragments(), this.stopLoad();\n }\n }\n onManifestLoading() {\n this.initPTS = [], this.levels = this.levelLastLoaded = this.fragCurrent = null, this.lastCurrentTime = this.startPosition = 0, this.startFragRequested = !1;\n }\n onError(e, t) {\n }\n onManifestLoaded(e, t) {\n this.startTimeOffset = t.startTimeOffset;\n }\n onHandlerDestroying() {\n this.stopLoad(), this.transmuxer && (this.transmuxer.destroy(), this.transmuxer = null), super.onHandlerDestroying(), this.hls = this.onMediaSeeking = this.onMediaEnded = null;\n }\n onHandlerDestroyed() {\n this.state = ne.STOPPED, this.fragmentLoader && this.fragmentLoader.destroy(), this.keyLoader && this.keyLoader.destroy(), this.decrypter && this.decrypter.destroy(), this.hls = this.log = this.warn = this.decrypter = this.keyLoader = this.fragmentLoader = this.fragmentTracker = null, super.onHandlerDestroyed();\n }\n loadFragment(e, t, r) {\n this.startFragRequested = !0, this._loadFragForPlayback(e, t, r);\n }\n _loadFragForPlayback(e, t, r) {\n const n = (i) => {\n const o = i.frag;\n if (this.fragContextChanged(o)) {\n this.warn(`${o.type} sn: ${o.sn}${i.part ? \" part: \" + i.part.index : \"\"} of ${this.fragInfo(o, !1, i.part)}) was dropped during download.`), this.fragmentTracker.removeFragment(o);\n return;\n }\n o.stats.chunkCount++, this._handleFragmentLoadProgress(i);\n };\n this._doFragLoad(e, t, r, n).then((i) => {\n if (!i)\n return;\n const o = this.state, a = i.frag;\n if (this.fragContextChanged(a)) {\n (o === ne.FRAG_LOADING || !this.fragCurrent && o === ne.PARSING) && (this.fragmentTracker.removeFragment(a), this.state = ne.IDLE);\n return;\n }\n \"payload\" in i && (this.log(`Loaded ${a.type} sn: ${a.sn} of ${this.playlistLabel()} ${a.level}`), this.hls.trigger(I.FRAG_LOADED, i)), this._handleFragmentLoadComplete(i);\n }).catch((i) => {\n this.state === ne.STOPPED || this.state === ne.ERROR || (this.warn(`Frag error: ${(i == null ? void 0 : i.message) || i}`), this.resetFragmentLoading(e));\n });\n }\n clearTrackerIfNeeded(e) {\n var t;\n const {\n fragmentTracker: r\n } = this;\n if (r.getState(e) === Ht.APPENDING) {\n const i = e.type, o = this.getFwdBufferInfo(this.mediaBuffer, i), a = Math.max(e.duration, o ? o.len : this.config.maxBufferLength), l = this.backtrackFragment;\n ((l ? e.sn - l.sn : 0) === 1 || this.reduceMaxBufferLength(a, e.duration)) && r.removeFragment(e);\n } else ((t = this.mediaBuffer) == null ? void 0 : t.buffered.length) === 0 ? r.removeAllFragments() : r.hasParts(e.type) && (r.detectPartialFragments({\n frag: e,\n part: null,\n stats: e.stats,\n id: e.type\n }), r.getState(e) === Ht.PARTIAL && r.removeFragment(e));\n }\n checkLiveUpdate(e) {\n if (e.updated && !e.live) {\n const t = e.fragments[e.fragments.length - 1];\n this.fragmentTracker.detectPartialFragments({\n frag: t,\n part: null,\n stats: t.stats,\n id: t.type\n });\n }\n e.fragments[0] || (e.deltaUpdateFailed = !0);\n }\n waitForLive(e) {\n const t = e.details;\n return (t == null ? void 0 : t.live) && t.type !== \"EVENT\" && (this.levelLastLoaded !== e || t.expired);\n }\n flushMainBuffer(e, t, r = null) {\n if (!(e - t))\n return;\n const n = {\n startOffset: e,\n endOffset: t,\n type: r\n };\n this.hls.trigger(I.BUFFER_FLUSHING, n);\n }\n _loadInitSegment(e, t) {\n this._doFragLoad(e, t).then((r) => {\n const n = r == null ? void 0 : r.frag;\n if (!n || this.fragContextChanged(n) || !this.levels)\n throw new Error(\"init load aborted\");\n return r;\n }).then((r) => {\n const {\n hls: n\n } = this, {\n frag: i,\n payload: o\n } = r, a = i.decryptdata;\n if (o && o.byteLength > 0 && a != null && a.key && a.iv && In(a.method)) {\n const l = self.performance.now();\n return this.decrypter.decrypt(new Uint8Array(o), a.key.buffer, a.iv.buffer, Su(a.method)).catch((c) => {\n throw n.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_DECRYPT_ERROR,\n fatal: !1,\n error: c,\n reason: c.message,\n frag: i\n }), c;\n }).then((c) => {\n const u = self.performance.now();\n return n.trigger(I.FRAG_DECRYPTED, {\n frag: i,\n payload: c,\n stats: {\n tstart: l,\n tdecrypt: u\n }\n }), r.payload = c, this.completeInitSegmentLoad(r);\n });\n }\n return this.completeInitSegmentLoad(r);\n }).catch((r) => {\n this.state === ne.STOPPED || this.state === ne.ERROR || (this.warn(r), this.resetFragmentLoading(e));\n });\n }\n completeInitSegmentLoad(e) {\n const {\n levels: t\n } = this;\n if (!t)\n throw new Error(\"init load aborted, missing levels\");\n const r = e.frag.stats;\n this.state !== ne.STOPPED && (this.state = ne.IDLE), e.frag.data = new Uint8Array(e.payload), r.parsing.start = r.buffering.start = self.performance.now(), r.parsing.end = r.buffering.end = self.performance.now(), this.tick();\n }\n unhandledEncryptionError(e, t) {\n var r, n;\n const i = e.tracks;\n if (i && !t.encrypted && ((r = i.audio) != null && r.encrypted || (n = i.video) != null && n.encrypted) && (!this.config.emeEnabled || !this.keyLoader.emeController)) {\n const o = this.media, a = new Error(`Encrypted track with no key in ${this.fragInfo(t)} (media ${o ? \"attached mediaKeys: \" + o.mediaKeys : \"detached\"})`);\n return this.warn(a.message), !o || o.mediaKeys ? !1 : (this.hls.trigger(I.ERROR, {\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_NO_KEYS,\n fatal: !1,\n error: a,\n frag: t\n }), this.resetTransmuxer(), !0);\n }\n return !1;\n }\n fragContextChanged(e) {\n const {\n fragCurrent: t\n } = this;\n return !e || !t || e.sn !== t.sn || e.level !== t.level;\n }\n fragBufferedComplete(e, t) {\n const r = this.mediaBuffer ? this.mediaBuffer : this.media;\n if (this.log(`Buffered ${e.type} sn: ${e.sn}${t ? \" part: \" + t.index : \"\"} of ${this.fragInfo(e, !1, t)} > buffer:${r ? sT.toString(Ce.getBuffered(r)) : \"(detached)\"})`), Vt(e)) {\n var n;\n if (e.type !== pe.SUBTITLE) {\n const o = e.elementaryStreams;\n if (!Object.keys(o).some((a) => !!o[a])) {\n this.state = ne.IDLE;\n return;\n }\n }\n const i = (n = this.levels) == null ? void 0 : n[e.level];\n i != null && i.fragmentError && (this.log(`Resetting level fragment error count of ${i.fragmentError} on frag buffered`), i.fragmentError = 0);\n }\n this.state = ne.IDLE;\n }\n _handleFragmentLoadComplete(e) {\n const {\n transmuxer: t\n } = this;\n if (!t)\n return;\n const {\n frag: r,\n part: n,\n partsLoaded: i\n } = e, o = !i || i.length === 0 || i.some((l) => !l), a = new Eu(r.level, r.sn, r.stats.chunkCount + 1, 0, n ? n.index : -1, !o);\n t.flush(a);\n }\n _handleFragmentLoadProgress(e) {\n }\n _doFragLoad(e, t, r = null, n) {\n var i;\n this.fragCurrent = e;\n const o = t.details;\n if (!this.levels || !o)\n throw new Error(`frag load aborted, missing level${o ? \"\" : \" detail\"}s`);\n let a = null;\n if (e.encrypted && !((i = e.decryptdata) != null && i.key)) {\n if (this.log(`Loading key for ${e.sn} of [${o.startSN}-${o.endSN}], ${this.playlistLabel()} ${e.level}`), this.state = ne.KEY_LOADING, this.fragCurrent = e, a = this.keyLoader.load(e).then((h) => {\n if (!this.fragContextChanged(h.frag))\n return this.hls.trigger(I.KEY_LOADED, h), this.state === ne.KEY_LOADING && (this.state = ne.IDLE), h;\n }), this.hls.trigger(I.KEY_LOADING, {\n frag: e\n }), this.fragCurrent === null)\n return this.log(\"context changed in KEY_LOADING\"), Promise.resolve(null);\n } else e.encrypted || (a = this.keyLoader.loadClear(e, o.encryptedFragments, this.startFragRequested), a && this.log(\"[eme] blocking frag load until media-keys acquired\"));\n const l = this.fragPrevious;\n if (Vt(e) && (!l || e.sn !== l.sn)) {\n const h = this.shouldLoadParts(t.details, e.end);\n h !== this.loadingParts && (this.log(`LL-Part loading ${h ? \"ON\" : \"OFF\"} loading sn ${l == null ? void 0 : l.sn}->${e.sn}`), this.loadingParts = h);\n }\n if (r = Math.max(e.start, r || 0), this.loadingParts && Vt(e)) {\n const h = o.partList;\n if (h && n) {\n r > o.fragmentEnd && o.fragmentHint && (e = o.fragmentHint);\n const f = this.getNextPart(h, e, r);\n if (f > -1) {\n const p = h[f];\n e = this.fragCurrent = p.fragment, this.log(`Loading ${e.type} sn: ${e.sn} part: ${p.index} (${f}/${h.length - 1}) of ${this.fragInfo(e, !1, p)}) cc: ${e.cc} [${o.startSN}-${o.endSN}], target: ${parseFloat(r.toFixed(3))}`), this.nextLoadPosition = p.start + p.duration, this.state = ne.FRAG_LOADING;\n let y;\n return a ? y = a.then((E) => !E || this.fragContextChanged(E.frag) ? null : this.doFragPartsLoad(e, p, t, n)).catch((E) => this.handleFragLoadError(E)) : y = this.doFragPartsLoad(e, p, t, n).catch((E) => this.handleFragLoadError(E)), this.hls.trigger(I.FRAG_LOADING, {\n frag: e,\n part: p,\n targetBufferTime: r\n }), this.fragCurrent === null ? Promise.reject(new Error(\"frag load aborted, context changed in FRAG_LOADING parts\")) : y;\n } else if (!e.url || this.loadedEndOfParts(h, r))\n return Promise.resolve(null);\n }\n }\n if (Vt(e) && this.loadingParts) {\n var c;\n this.log(`LL-Part loading OFF after next part miss @${r.toFixed(2)} Check buffer at sn: ${e.sn} loaded parts: ${(c = o.partList) == null ? void 0 : c.filter((h) => h.loaded).map((h) => `[${h.start}-${h.end}]`)}`), this.loadingParts = !1;\n } else if (!e.url)\n return Promise.resolve(null);\n this.log(`Loading ${e.type} sn: ${e.sn} of ${this.fragInfo(e, !1)}) cc: ${e.cc} ${\"[\" + o.startSN + \"-\" + o.endSN + \"]\"}, target: ${parseFloat(r.toFixed(3))}`), ue(e.sn) && !this.bitrateTest && (this.nextLoadPosition = e.start + e.duration), this.state = ne.FRAG_LOADING;\n const u = this.config.progressive;\n let d;\n return u && a ? d = a.then((h) => !h || this.fragContextChanged(h.frag) ? null : this.fragmentLoader.load(e, n)).catch((h) => this.handleFragLoadError(h)) : d = Promise.all([this.fragmentLoader.load(e, u ? n : void 0), a]).then(([h]) => (!u && n && n(h), h)).catch((h) => this.handleFragLoadError(h)), this.hls.trigger(I.FRAG_LOADING, {\n frag: e,\n targetBufferTime: r\n }), this.fragCurrent === null ? Promise.reject(new Error(\"frag load aborted, context changed in FRAG_LOADING\")) : d;\n }\n doFragPartsLoad(e, t, r, n) {\n return new Promise((i, o) => {\n var a;\n const l = [], c = (a = r.details) == null ? void 0 : a.partList, u = (d) => {\n this.fragmentLoader.loadPart(e, d, n).then((h) => {\n l[d.index] = h;\n const f = h.part;\n this.hls.trigger(I.FRAG_LOADED, h);\n const p = Ph(r.details, e.sn, d.index + 1) || tp(c, e.sn, d.index + 1);\n if (p)\n u(p);\n else\n return i({\n frag: e,\n part: f,\n partsLoaded: l\n });\n }).catch(o);\n };\n u(t);\n });\n }\n handleFragLoadError(e) {\n if (\"data\" in e) {\n const t = e.data;\n t.frag && t.details === J.INTERNAL_ABORTED ? this.handleFragLoadAborted(t.frag, t.part) : t.frag && t.type === ve.KEY_SYSTEM_ERROR ? (t.frag.abortRequests(), this.resetStartWhenNotLoaded(), this.resetFragmentLoading(t.frag)) : this.hls.trigger(I.ERROR, t);\n } else\n this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.INTERNAL_EXCEPTION,\n err: e,\n error: e,\n fatal: !0\n });\n return null;\n }\n _handleTransmuxerFlush(e) {\n const t = this.getCurrentContext(e);\n if (!t || this.state !== ne.PARSING) {\n !this.fragCurrent && this.state !== ne.STOPPED && this.state !== ne.ERROR && (this.state = ne.IDLE);\n return;\n }\n const {\n frag: r,\n part: n,\n level: i\n } = t, o = self.performance.now();\n r.stats.parsing.end = o, n && (n.stats.parsing.end = o);\n const a = this.getLevelDetails(), c = a && r.sn > a.endSN || this.shouldLoadParts(a, r.end);\n c !== this.loadingParts && (this.log(`LL-Part loading ${c ? \"ON\" : \"OFF\"} after parsing segment ending @${r.end.toFixed(2)}`), this.loadingParts = c), this.updateLevelTiming(r, n, i, e.partial);\n }\n shouldLoadParts(e, t) {\n if (this.config.lowLatencyMode) {\n if (!e)\n return this.loadingParts;\n if (e.partList) {\n var r;\n const i = e.partList[0];\n if (i.fragment.type === pe.SUBTITLE)\n return !1;\n const o = i.end + (((r = e.fragmentHint) == null ? void 0 : r.duration) || 0);\n if (t >= o) {\n var n;\n if ((this.hls.hasEnoughToStart ? ((n = this.media) == null ? void 0 : n.currentTime) || this.lastCurrentTime : this.getLoadPosition()) > i.start - i.fragment.duration)\n return !0;\n }\n }\n }\n return !1;\n }\n getCurrentContext(e) {\n const {\n levels: t,\n fragCurrent: r\n } = this, {\n level: n,\n sn: i,\n part: o\n } = e;\n if (!(t != null && t[n]))\n return this.warn(`Levels object was unset while buffering fragment ${i} of ${this.playlistLabel()} ${n}. The current chunk will not be buffered.`), null;\n const a = t[n], l = a.details, c = o > -1 ? Ph(l, i, o) : null, u = c ? c.fragment : ep(l, i, r);\n return u ? (r && r !== u && (u.stats = r.stats), {\n frag: u,\n part: c,\n level: a\n }) : null;\n }\n bufferFragmentData(e, t, r, n, i) {\n if (this.state !== ne.PARSING)\n return;\n const {\n data1: o,\n data2: a\n } = e;\n let l = o;\n if (a && (l = _r(o, a)), !l.length)\n return;\n const c = this.initPTS[t.cc], u = c ? -c.baseTime / c.timescale : void 0, d = {\n type: e.type,\n frag: t,\n part: r,\n chunkMeta: n,\n offset: u,\n parent: t.type,\n data: l\n };\n if (this.hls.trigger(I.BUFFER_APPENDING, d), e.dropped && e.independent && !r) {\n if (i)\n return;\n this.flushBufferGap(t);\n }\n }\n flushBufferGap(e) {\n const t = this.media;\n if (!t)\n return;\n if (!Ce.isBuffered(t, t.currentTime)) {\n this.flushMainBuffer(0, e.start);\n return;\n }\n const r = t.currentTime, n = Ce.bufferInfo(t, r, 0), i = e.duration, o = Math.min(this.config.maxFragLookUpTolerance * 2, i * 0.25), a = Math.max(Math.min(e.start - o, n.end - o), r + o);\n e.start - a > o && this.flushMainBuffer(a, e.start);\n }\n getFwdBufferInfo(e, t) {\n var r;\n const n = this.getLoadPosition();\n if (!ue(n))\n return null;\n const o = this.lastCurrentTime > n || (r = this.media) != null && r.paused ? 0 : this.config.maxBufferHole;\n return this.getFwdBufferInfoAtPos(e, n, t, o);\n }\n getFwdBufferInfoAtPos(e, t, r, n) {\n const i = Ce.bufferInfo(e, t, n);\n if (i.len === 0 && i.nextStart !== void 0) {\n const o = this.fragmentTracker.getBufferedFrag(t, r);\n if (o && (i.nextStart <= o.end || o.gap)) {\n const a = Math.max(Math.min(i.nextStart, o.end) - t, n);\n return Ce.bufferInfo(e, t, a);\n }\n }\n return i;\n }\n getMaxBufferLength(e) {\n const {\n config: t\n } = this;\n let r;\n return e ? r = Math.max(8 * t.maxBufferSize / e, t.maxBufferLength) : r = t.maxBufferLength, Math.min(r, t.maxMaxBufferLength);\n }\n reduceMaxBufferLength(e, t) {\n const r = this.config, n = Math.max(Math.min(e - t, r.maxBufferLength), t), i = Math.max(e - t * 3, r.maxMaxBufferLength / 2, n);\n return i >= n ? (r.maxMaxBufferLength = i, this.warn(`Reduce max buffer length to ${i}s`), !0) : !1;\n }\n getAppendedFrag(e, t = pe.MAIN) {\n const r = this.fragmentTracker ? this.fragmentTracker.getAppendedFrag(e, t) : null;\n return r && \"fragment\" in r ? r.fragment : r;\n }\n getNextFragment(e, t) {\n const r = t.fragments, n = r.length;\n if (!n)\n return null;\n const {\n config: i\n } = this, o = r[0].start, a = i.lowLatencyMode && !!t.partList;\n let l = null;\n if (t.live) {\n const d = i.initialLiveManifestSize;\n if (n < d)\n return this.warn(`Not enough fragments to start playback (have: ${n}, need: ${d})`), null;\n if (!t.PTSKnown && !this.startFragRequested && this.startPosition === -1 || e < o) {\n var c;\n a && !this.loadingParts && (this.log(\"LL-Part loading ON for initial live fragment\"), this.loadingParts = !0), l = this.getInitialLiveFragment(t);\n const h = this.hls.startPosition, f = this.hls.liveSyncPosition, p = l ? (h !== -1 && h >= o ? h : f) || l.start : e;\n this.log(`Setting startPosition to ${p} to match start frag at live edge. mainStart: ${h} liveSyncPosition: ${f} frag.start: ${(c = l) == null ? void 0 : c.start}`), this.startPosition = this.nextLoadPosition = p;\n }\n } else e <= o && (l = r[0]);\n if (!l) {\n const d = this.loadingParts ? t.partEnd : t.fragmentEnd;\n l = this.getFragmentAtPosition(e, d, t);\n }\n let u = this.filterReplacedPrimary(l, t);\n if (!u && l) {\n const d = l.sn - t.startSN;\n u = this.filterReplacedPrimary(r[d + 1] || null, t);\n }\n return this.mapToInitFragWhenRequired(u);\n }\n isLoopLoading(e, t) {\n const r = this.fragmentTracker.getState(e);\n return (r === Ht.OK || r === Ht.PARTIAL && !!e.gap) && this.nextLoadPosition > t;\n }\n getNextFragmentLoopLoading(e, t, r, n, i) {\n let o = null;\n if (e.gap && (o = this.getNextFragment(this.nextLoadPosition, t), o && !o.gap && r.nextStart)) {\n const a = this.getFwdBufferInfoAtPos(this.mediaBuffer ? this.mediaBuffer : this.media, r.nextStart, n, 0);\n if (a !== null && r.len + a.len >= i) {\n const l = o.sn;\n return this.loopSn !== l && (this.log(`buffer full after gaps in \"${n}\" playlist starting at sn: ${l}`), this.loopSn = l), null;\n }\n }\n return this.loopSn = void 0, o;\n }\n get primaryPrefetch() {\n if (Bh(this.config)) {\n var e;\n if ((e = this.hls.interstitialsManager) == null || (e = e.playingItem) == null ? void 0 : e.event)\n return !0;\n }\n return !1;\n }\n filterReplacedPrimary(e, t) {\n if (!e)\n return e;\n if (Bh(this.config) && e.type !== pe.SUBTITLE) {\n const r = this.hls.interstitialsManager, n = r == null ? void 0 : r.bufferingItem;\n if (n) {\n const o = n.event;\n if (o) {\n if (o.appendInPlace || Math.abs(e.start - n.start) > 1 || n.start === 0)\n return null;\n } else if (e.end <= n.start && (t == null ? void 0 : t.live) === !1 || e.start > n.end && n.nextEvent && (n.nextEvent.appendInPlace || e.start - n.end > 1))\n return null;\n }\n const i = r == null ? void 0 : r.playerQueue;\n if (i)\n for (let o = i.length; o--; ) {\n const a = i[o].interstitial;\n if (a.appendInPlace && e.start >= a.startTime && e.end <= a.resumeTime)\n return null;\n }\n }\n return e;\n }\n mapToInitFragWhenRequired(e) {\n return e != null && e.initSegment && !e.initSegment.data && !this.bitrateTest ? e.initSegment : e;\n }\n getNextPart(e, t, r) {\n let n = -1, i = !1, o = !0;\n for (let a = 0, l = e.length; a < l; a++) {\n const c = e[a];\n if (o = o && !c.independent, n > -1 && r < c.start)\n break;\n const u = c.loaded;\n u ? n = -1 : (i || (c.independent || o) && c.fragment === t) && (c.fragment !== t && this.warn(`Need buffer at ${r} but next unloaded part starts at ${c.start}`), n = a), i = u;\n }\n return n;\n }\n loadedEndOfParts(e, t) {\n let r;\n for (let n = e.length; n--; ) {\n if (r = e[n], !r.loaded)\n return !1;\n if (t > r.start)\n return !0;\n }\n return !1;\n }\n /*\n This method is used find the best matching first fragment for a live playlist. This fragment is used to calculate the\n \"sliding\" of the playlist, which is its offset from the start of playback. After sliding we can compute the real\n start and end times for each fragment in the playlist (after which this method will not need to be called).\n */\n getInitialLiveFragment(e) {\n const t = e.fragments, r = this.fragPrevious;\n let n = null;\n if (r) {\n if (e.hasProgramDateTime && (this.log(`Live playlist, switching playlist, load frag with same PDT: ${r.programDateTime}`), n = vb(t, r.endProgramDateTime, this.config.maxFragLookUpTolerance)), !n) {\n const i = r.sn + 1;\n if (i >= e.startSN && i <= e.endSN) {\n const o = t[i - e.startSN];\n r.cc === o.cc && (n = o, this.log(`Live playlist, switching playlist, load frag with next SN: ${n.sn}`));\n }\n n || (n = Vg(e, r.cc, r.end), n && this.log(`Live playlist, switching playlist, load frag with same CC: ${n.sn}`));\n }\n } else {\n const i = this.hls.liveSyncPosition;\n i !== null && (n = this.getFragmentAtPosition(i, this.bitrateTest ? e.fragmentEnd : e.edge, e));\n }\n return n;\n }\n /*\n This method finds the best matching fragment given the provided position.\n */\n getFragmentAtPosition(e, t, r) {\n const {\n config: n\n } = this;\n let {\n fragPrevious: i\n } = this, {\n fragments: o,\n endSN: a\n } = r;\n const {\n fragmentHint: l\n } = r, {\n maxFragLookUpTolerance: c\n } = n, u = r.partList, d = !!(this.loadingParts && u != null && u.length && l);\n d && !this.bitrateTest && u[u.length - 1].fragment.sn === l.sn && (o = o.concat(l), a = l.sn);\n let h;\n if (e < t) {\n var f;\n const y = e < this.lastCurrentTime || e > t - c || (f = this.media) != null && f.paused || !this.startFragRequested ? 0 : c;\n h = Js(i, o, e, y);\n } else\n h = o[o.length - 1];\n if (h) {\n const p = h.sn - r.startSN, y = this.fragmentTracker.getState(h);\n if ((y === Ht.OK || y === Ht.PARTIAL && h.gap) && (i = h), i && h.sn === i.sn && (!d || u[0].fragment.sn > h.sn || !r.live) && h.level === i.level) {\n const b = o[p + 1];\n h.sn < a && this.fragmentTracker.getState(b) !== Ht.OK ? h = b : h = null;\n }\n }\n return h;\n }\n alignPlaylists(e, t, r) {\n const n = e.fragments.length;\n if (!n)\n return this.warn(\"No fragments in live playlist\"), 0;\n const i = e.fragmentStart, o = !t, a = e.alignedSliding && ue(i);\n if (o || !a && !i) {\n rT(r, e);\n const l = e.fragmentStart;\n return this.log(`Live playlist sliding: ${l.toFixed(2)} start-sn: ${t ? t.startSN : \"na\"}->${e.startSN} fragments: ${n}`), l;\n }\n return i;\n }\n waitForCdnTuneIn(e) {\n return e.live && e.canBlockReload && e.partTarget && e.tuneInGoal > Math.max(e.partHoldBack, e.partTarget * 3);\n }\n setStartPosition(e, t) {\n let r = this.startPosition;\n r < t && (r = -1);\n const n = this.timelineOffset;\n if (r === -1) {\n const i = this.startTimeOffset !== null, o = i ? this.startTimeOffset : e.startTimeOffset;\n o !== null && ue(o) ? (r = t + o, o < 0 && (r += e.edge), r = Math.min(Math.max(t, r), t + e.totalduration), this.log(`Setting startPosition to ${r} for start time offset ${o} found in ${i ? \"multivariant\" : \"media\"} playlist`), this.startPosition = r) : e.live ? (r = this.hls.liveSyncPosition || t, this.log(`Setting startPosition to -1 to start at live edge ${r}`), this.startPosition = -1) : (this.log(\"setting startPosition to 0 by default\"), this.startPosition = r = 0), this.lastCurrentTime = r + n;\n }\n this.nextLoadPosition = r + n;\n }\n getLoadPosition() {\n var e;\n const {\n media: t\n } = this;\n let r = 0;\n return (e = this.hls) != null && e.hasEnoughToStart && t ? r = t.currentTime : this.nextLoadPosition >= 0 && (r = this.nextLoadPosition), r;\n }\n handleFragLoadAborted(e, t) {\n this.transmuxer && e.type === this.playlistType && Vt(e) && e.stats.aborted && (this.log(`Fragment ${e.sn}${t ? \" part \" + t.index : \"\"} of ${this.playlistLabel()} ${e.level} was aborted`), this.resetFragmentLoading(e));\n }\n resetFragmentLoading(e) {\n (!this.fragCurrent || !this.fragContextChanged(e) && this.state !== ne.FRAG_LOADING_WAITING_RETRY) && (this.state = ne.IDLE);\n }\n onFragmentOrKeyLoadError(e, t) {\n var r;\n if (t.chunkMeta && !t.frag) {\n const b = this.getCurrentContext(t.chunkMeta);\n b && (t.frag = b.frag);\n }\n const n = t.frag;\n if (!n || n.type !== e || !this.levels)\n return;\n if (this.fragContextChanged(n)) {\n var i;\n this.warn(`Frag load error must match current frag to retry ${n.url} > ${(i = this.fragCurrent) == null ? void 0 : i.url}`);\n return;\n }\n const o = t.details === J.FRAG_GAP;\n o && this.fragmentTracker.fragBuffered(n, !0);\n const a = t.errorAction;\n if (!a) {\n this.state = ne.ERROR;\n return;\n }\n const {\n action: l,\n flags: c,\n retryCount: u = 0,\n retryConfig: d\n } = a, h = !!d, f = h && l === Zt.RetryRequest, p = h && !a.resolved && c === vr.MoveAllAlternatesMatchingHost, y = (r = this.hls.latestLevelDetails) == null ? void 0 : r.live;\n if (!f && p && Vt(n) && !n.endList && y && !Kg(t))\n this.resetFragmentErrors(e), this.treatAsGap(n), a.resolved = !0;\n else if ((f || p) && u < d.maxNumRetry) {\n var E;\n const b = uc((E = t.response) == null ? void 0 : E.code), R = yu(d, u);\n if (this.resetStartWhenNotLoaded(), this.retryDate = self.performance.now() + R, this.state = ne.FRAG_LOADING_WAITING_RETRY, a.resolved = !0, b) {\n this.log(\"Waiting for connection (offline)\"), this.retryDate = 1 / 0, t.reason = \"offline\";\n return;\n }\n this.warn(`Fragment ${n.sn} of ${e} ${n.level} errored with ${t.details}, retrying loading ${u + 1}/${d.maxNumRetry} in ${R}ms`);\n } else if (d)\n if (this.resetFragmentErrors(e), u < d.maxNumRetry)\n !o && l !== Zt.RemoveAlternatePermanently && (a.resolved = !0);\n else {\n this.warn(`${t.details} reached or exceeded max retry (${u})`);\n return;\n }\n else l === Zt.SendAlternateToPenaltyBox ? this.state = ne.WAITING_LEVEL : this.state = ne.ERROR;\n this.tickImmediate();\n }\n checkRetryDate() {\n const e = self.performance.now(), t = this.retryDate, r = t === 1 / 0;\n (!t || e >= t || r && !uc(0)) && (r && this.log(\"Connection restored (online)\"), this.resetStartWhenNotLoaded(), this.state = ne.IDLE);\n }\n reduceLengthAndFlushBuffer(e) {\n if (this.state === ne.PARSING || this.state === ne.PARSED) {\n const t = e.frag, r = e.parent, n = this.getFwdBufferInfo(this.mediaBuffer, r), i = n && n.len > 0.5;\n i && this.reduceMaxBufferLength(n.len, (t == null ? void 0 : t.duration) || 10);\n const o = !i;\n return o && this.warn(`Buffer full error while media.currentTime (${this.getLoadPosition()}) is not buffered, flush ${r} buffer`), t && (this.fragmentTracker.removeFragment(t), this.nextLoadPosition = t.start), this.resetLoadingState(), o;\n }\n return !1;\n }\n resetFragmentErrors(e) {\n e === pe.AUDIO && (this.fragCurrent = null), this.hls.hasEnoughToStart || (this.startFragRequested = !1), this.state !== ne.STOPPED && (this.state = ne.IDLE);\n }\n afterBufferFlushed(e, t, r) {\n if (!e)\n return;\n const n = Ce.getBuffered(e);\n this.fragmentTracker.detectEvictedFragments(t, n, r), this.state === ne.ENDED && this.resetLoadingState();\n }\n resetLoadingState() {\n this.log(\"Reset loading state\"), this.fragCurrent = null, this.fragPrevious = null, this.state !== ne.STOPPED && (this.state = ne.IDLE);\n }\n resetStartWhenNotLoaded() {\n if (!this.hls.hasEnoughToStart) {\n this.startFragRequested = !1;\n const e = this.levelLastLoaded, t = e ? e.details : null;\n t != null && t.live ? (this.log(\"resetting startPosition for live start\"), this.startPosition = -1, this.setStartPosition(t, t.fragmentStart), this.resetLoadingState()) : this.nextLoadPosition = this.startPosition;\n }\n }\n resetWhenMissingContext(e) {\n this.log(`Loading context changed while buffering sn ${e.sn} of ${this.playlistLabel()} ${e.level === -1 ? \"<removed>\" : e.level}. This chunk will not be buffered.`), this.removeUnbufferedFrags(), this.resetStartWhenNotLoaded(), this.resetLoadingState();\n }\n removeUnbufferedFrags(e = 0) {\n this.fragmentTracker.removeFragmentsInRange(e, 1 / 0, this.playlistType, !1, !0);\n }\n updateLevelTiming(e, t, r, n) {\n const i = r.details;\n if (!i) {\n this.warn(\"level.details undefined\");\n return;\n }\n if (!Object.keys(e.elementaryStreams).reduce((l, c) => {\n const u = e.elementaryStreams[c];\n if (u) {\n const d = u.endPTS - u.startPTS;\n if (d <= 0)\n return this.warn(`Could not parse fragment ${e.sn} ${c} duration reliably (${d})`), l || !1;\n const h = n ? 0 : Xg(i, e, u.startPTS, u.endPTS, u.startDTS, u.endDTS, this);\n return this.hls.trigger(I.LEVEL_PTS_UPDATED, {\n details: i,\n level: r,\n drift: h,\n type: c,\n frag: e,\n start: u.startPTS,\n end: u.endPTS\n }), !0;\n }\n return l;\n }, !1)) {\n var a;\n if (r.fragmentError === 0 && this.treatAsGap(e, r), ((a = this.transmuxer) == null ? void 0 : a.error) === null) {\n const l = new Error(`Found no media in fragment ${e.sn} of ${this.playlistLabel()} ${e.level} resetting transmuxer to fallback to playlist timing`);\n if (this.warn(l.message), this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_PARSING_ERROR,\n fatal: !1,\n error: l,\n frag: e,\n reason: `Found no media in msn ${e.sn} of ${this.playlistLabel()} \"${r.url}\"`\n }), !this.hls)\n return;\n this.resetTransmuxer();\n }\n }\n this.state = ne.PARSED, this.log(`Parsed ${e.type} sn: ${e.sn}${t ? \" part: \" + t.index : \"\"} of ${this.fragInfo(e, !1, t)})`), this.hls.trigger(I.FRAG_PARSED, {\n frag: e,\n part: t\n });\n }\n playlistLabel() {\n return this.playlistType === pe.MAIN ? \"level\" : \"track\";\n }\n fragInfo(e, t = !0, r) {\n var n, i;\n return `${this.playlistLabel()} ${e.level} (${r ? \"part\" : \"frag\"}:[${((n = t && !r ? e.startPTS : (r || e).start) != null ? n : NaN).toFixed(3)}-${((i = t && !r ? e.endPTS : (r || e).end) != null ? i : NaN).toFixed(3)}]${r && e.type === \"main\" ? \"INDEPENDENT=\" + (r.independent ? \"YES\" : \"NO\") : \"\"}`;\n }\n treatAsGap(e, t) {\n t && t.fragmentError++, e.gap = !0, this.fragmentTracker.removeFragment(e), this.fragmentTracker.fragBuffered(e, !0);\n }\n resetTransmuxer() {\n var e;\n (e = this.transmuxer) == null || e.reset();\n }\n recoverWorkerError(e) {\n e.event === \"demuxerWorker\" && (this.fragmentTracker.removeAllFragments(), this.transmuxer && (this.transmuxer.destroy(), this.transmuxer = null), this.resetStartWhenNotLoaded(), this.resetLoadingState());\n }\n set state(e) {\n const t = this._state;\n t !== e && (this._state = e, this.log(`${t}->${e}`));\n }\n get state() {\n return this._state;\n }\n}\nfunction Bh(s) {\n return !!s.interstitialsController && s.enableInterstitialPlayback !== !1;\n}\nclass ip {\n constructor() {\n this.chunks = [], this.dataLength = 0;\n }\n push(e) {\n this.chunks.push(e), this.dataLength += e.length;\n }\n flush() {\n const {\n chunks: e,\n dataLength: t\n } = this;\n let r;\n if (e.length)\n e.length === 1 ? r = e[0] : r = nT(e, t);\n else return new Uint8Array(0);\n return this.reset(), r;\n }\n reset() {\n this.chunks.length = 0, this.dataLength = 0;\n }\n}\nfunction nT(s, e) {\n const t = new Uint8Array(e);\n let r = 0;\n for (let n = 0; n < s.length; n++) {\n const i = s[n];\n t.set(i, r), r += i.length;\n }\n return t;\n}\nvar ml = { exports: {} }, Fh;\nfunction iT() {\n return Fh || (Fh = 1, (function(s) {\n var e = Object.prototype.hasOwnProperty, t = \"~\";\n function r() {\n }\n Object.create && (r.prototype = /* @__PURE__ */ Object.create(null), new r().__proto__ || (t = !1));\n function n(l, c, u) {\n this.fn = l, this.context = c, this.once = u || !1;\n }\n function i(l, c, u, d, h) {\n if (typeof u != \"function\")\n throw new TypeError(\"The listener must be a function\");\n var f = new n(u, d || l, h), p = t ? t + c : c;\n return l._events[p] ? l._events[p].fn ? l._events[p] = [l._events[p], f] : l._events[p].push(f) : (l._events[p] = f, l._eventsCount++), l;\n }\n function o(l, c) {\n --l._eventsCount === 0 ? l._events = new r() : delete l._events[c];\n }\n function a() {\n this._events = new r(), this._eventsCount = 0;\n }\n a.prototype.eventNames = function() {\n var c = [], u, d;\n if (this._eventsCount === 0) return c;\n for (d in u = this._events)\n e.call(u, d) && c.push(t ? d.slice(1) : d);\n return Object.getOwnPropertySymbols ? c.concat(Object.getOwnPropertySymbols(u)) : c;\n }, a.prototype.listeners = function(c) {\n var u = t ? t + c : c, d = this._events[u];\n if (!d) return [];\n if (d.fn) return [d.fn];\n for (var h = 0, f = d.length, p = new Array(f); h < f; h++)\n p[h] = d[h].fn;\n return p;\n }, a.prototype.listenerCount = function(c) {\n var u = t ? t + c : c, d = this._events[u];\n return d ? d.fn ? 1 : d.length : 0;\n }, a.prototype.emit = function(c, u, d, h, f, p) {\n var y = t ? t + c : c;\n if (!this._events[y]) return !1;\n var E = this._events[y], b = arguments.length, R, A;\n if (E.fn) {\n switch (E.once && this.removeListener(c, E.fn, void 0, !0), b) {\n case 1:\n return E.fn.call(E.context), !0;\n case 2:\n return E.fn.call(E.context, u), !0;\n case 3:\n return E.fn.call(E.context, u, d), !0;\n case 4:\n return E.fn.call(E.context, u, d, h), !0;\n case 5:\n return E.fn.call(E.context, u, d, h, f), !0;\n case 6:\n return E.fn.call(E.context, u, d, h, f, p), !0;\n }\n for (A = 1, R = new Array(b - 1); A < b; A++)\n R[A - 1] = arguments[A];\n E.fn.apply(E.context, R);\n } else {\n var F = E.length, M;\n for (A = 0; A < F; A++)\n switch (E[A].once && this.removeListener(c, E[A].fn, void 0, !0), b) {\n case 1:\n E[A].fn.call(E[A].context);\n break;\n case 2:\n E[A].fn.call(E[A].context, u);\n break;\n case 3:\n E[A].fn.call(E[A].context, u, d);\n break;\n case 4:\n E[A].fn.call(E[A].context, u, d, h);\n break;\n default:\n if (!R) for (M = 1, R = new Array(b - 1); M < b; M++)\n R[M - 1] = arguments[M];\n E[A].fn.apply(E[A].context, R);\n }\n }\n return !0;\n }, a.prototype.on = function(c, u, d) {\n return i(this, c, u, d, !1);\n }, a.prototype.once = function(c, u, d) {\n return i(this, c, u, d, !0);\n }, a.prototype.removeListener = function(c, u, d, h) {\n var f = t ? t + c : c;\n if (!this._events[f]) return this;\n if (!u)\n return o(this, f), this;\n var p = this._events[f];\n if (p.fn)\n p.fn === u && (!h || p.once) && (!d || p.context === d) && o(this, f);\n else {\n for (var y = 0, E = [], b = p.length; y < b; y++)\n (p[y].fn !== u || h && !p[y].once || d && p[y].context !== d) && E.push(p[y]);\n E.length ? this._events[f] = E.length === 1 ? E[0] : E : o(this, f);\n }\n return this;\n }, a.prototype.removeAllListeners = function(c) {\n var u;\n return c ? (u = t ? t + c : c, this._events[u] && o(this, u)) : (this._events = new r(), this._eventsCount = 0), this;\n }, a.prototype.off = a.prototype.removeListener, a.prototype.addListener = a.prototype.on, a.prefixed = t, a.EventEmitter = a, s.exports = a;\n })(ml)), ml.exports;\n}\nvar oT = iT(), wu = /* @__PURE__ */ kS(oT);\nconst vi = \"1.6.12\", Nn = {};\nfunction aT() {\n return typeof __HLS_WORKER_BUNDLE__ == \"function\";\n}\nfunction lT() {\n const s = Nn[vi];\n if (s)\n return s.clientCount++, s;\n const e = new self.Blob([`var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(${__HLS_WORKER_BUNDLE__.toString()})(true);`], {\n type: \"text/javascript\"\n }), t = self.URL.createObjectURL(e), n = {\n worker: new self.Worker(t),\n objectURL: t,\n clientCount: 1\n };\n return Nn[vi] = n, n;\n}\nfunction cT(s) {\n const e = Nn[s];\n if (e)\n return e.clientCount++, e;\n const t = new self.URL(s, self.location.href).href, n = {\n worker: new self.Worker(t),\n scriptURL: t,\n clientCount: 1\n };\n return Nn[s] = n, n;\n}\nfunction uT(s) {\n const e = Nn[s || vi];\n if (e && e.clientCount-- === 1) {\n const {\n worker: r,\n objectURL: n\n } = e;\n delete Nn[s || vi], n && self.URL.revokeObjectURL(n), r.terminate();\n }\n}\nfunction op(s, e) {\n return e + 10 <= s.length && s[e] === 51 && s[e + 1] === 68 && s[e + 2] === 73 && s[e + 3] < 255 && s[e + 4] < 255 && s[e + 6] < 128 && s[e + 7] < 128 && s[e + 8] < 128 && s[e + 9] < 128;\n}\nfunction Au(s, e) {\n return e + 10 <= s.length && s[e] === 73 && s[e + 1] === 68 && s[e + 2] === 51 && s[e + 3] < 255 && s[e + 4] < 255 && s[e + 6] < 128 && s[e + 7] < 128 && s[e + 8] < 128 && s[e + 9] < 128;\n}\nfunction va(s, e) {\n let t = 0;\n return t = (s[e] & 127) << 21, t |= (s[e + 1] & 127) << 14, t |= (s[e + 2] & 127) << 7, t |= s[e + 3] & 127, t;\n}\nfunction Ei(s, e) {\n const t = e;\n let r = 0;\n for (; Au(s, e); ) {\n r += 10;\n const n = va(s, e + 6);\n r += n, op(s, e + 10) && (r += 10), e += r;\n }\n if (r > 0)\n return s.subarray(t, t + r);\n}\nfunction dT(s, e, t, r) {\n const n = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350], i = e[t + 2], o = i >> 2 & 15;\n if (o > 12) {\n const f = new Error(`invalid ADTS sampling index:${o}`);\n s.emit(I.ERROR, I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_PARSING_ERROR,\n fatal: !0,\n error: f,\n reason: f.message\n });\n return;\n }\n const a = (i >> 6 & 3) + 1, l = e[t + 3] >> 6 & 3 | (i & 1) << 2, c = \"mp4a.40.\" + a, u = n[o];\n let d = o;\n (a === 5 || a === 29) && (d -= 3);\n const h = [a << 3 | (d & 14) >> 1, (d & 1) << 7 | l << 3];\n return rt.log(`manifest codec:${r}, parsed codec:${c}, channels:${l}, rate:${u} (ADTS object type:${a} sampling index:${o})`), {\n config: h,\n samplerate: u,\n channelCount: l,\n codec: c,\n parsedCodec: c,\n manifestCodec: r\n };\n}\nfunction ap(s, e) {\n return s[e] === 255 && (s[e + 1] & 246) === 240;\n}\nfunction lp(s, e) {\n return s[e + 1] & 1 ? 7 : 9;\n}\nfunction Iu(s, e) {\n return (s[e + 3] & 3) << 11 | s[e + 4] << 3 | (s[e + 5] & 224) >>> 5;\n}\nfunction hT(s, e) {\n return e + 5 < s.length;\n}\nfunction na(s, e) {\n return e + 1 < s.length && ap(s, e);\n}\nfunction fT(s, e) {\n return hT(s, e) && ap(s, e) && Iu(s, e) <= s.length - e;\n}\nfunction gT(s, e) {\n if (na(s, e)) {\n const t = lp(s, e);\n if (e + t >= s.length)\n return !1;\n const r = Iu(s, e);\n if (r <= t)\n return !1;\n const n = e + r;\n return n === s.length || na(s, n);\n }\n return !1;\n}\nfunction cp(s, e, t, r, n) {\n if (!s.samplerate) {\n const i = dT(e, t, r, n);\n if (!i)\n return;\n nt(s, i);\n }\n}\nfunction up(s) {\n return 1024 * 9e4 / s;\n}\nfunction pT(s, e) {\n const t = lp(s, e);\n if (e + t <= s.length) {\n const r = Iu(s, e) - t;\n if (r > 0)\n return {\n headerLength: t,\n frameLength: r\n };\n }\n}\nfunction dp(s, e, t, r, n) {\n const i = up(s.samplerate), o = r + n * i, a = pT(e, t);\n let l;\n if (a) {\n const {\n frameLength: d,\n headerLength: h\n } = a, f = h + d, p = Math.max(0, t + f - e.length);\n p ? (l = new Uint8Array(f - h), l.set(e.subarray(t + h, e.length), 0)) : l = e.subarray(t + h, t + f);\n const y = {\n unit: l,\n pts: o\n };\n return p || s.samples.push(y), {\n sample: y,\n length: f,\n missing: p\n };\n }\n const c = e.length - t;\n return l = new Uint8Array(c), l.set(e.subarray(t, e.length), 0), {\n sample: {\n unit: l,\n pts: o\n },\n length: c,\n missing: -1\n };\n}\nfunction mT(s, e) {\n return Au(s, e) && va(s, e + 6) + 10 <= s.length - e;\n}\nfunction yT(s) {\n return s instanceof ArrayBuffer ? s : s.byteOffset == 0 && s.byteLength == s.buffer.byteLength ? s.buffer : new Uint8Array(s).buffer;\n}\nfunction yl(s, e = 0, t = 1 / 0) {\n return vT(s, e, t, Uint8Array);\n}\nfunction vT(s, e, t, r) {\n const n = ET(s);\n let i = 1;\n \"BYTES_PER_ELEMENT\" in r && (i = r.BYTES_PER_ELEMENT);\n const o = xT(s) ? s.byteOffset : 0, a = (o + s.byteLength) / i, l = (o + e) / i, c = Math.floor(Math.max(0, Math.min(l, a))), u = Math.floor(Math.min(c + Math.max(t, 0), a));\n return new r(n, c, u - c);\n}\nfunction ET(s) {\n return s instanceof ArrayBuffer ? s : s.buffer;\n}\nfunction xT(s) {\n return s && s.buffer instanceof ArrayBuffer && s.byteLength !== void 0 && s.byteOffset !== void 0;\n}\nfunction ST(s) {\n const e = {\n key: s.type,\n description: \"\",\n data: \"\",\n mimeType: null,\n pictureType: null\n }, t = 3;\n if (s.size < 2)\n return;\n if (s.data[0] !== t) {\n console.log(\"Ignore frame with unrecognized character encoding\");\n return;\n }\n const r = s.data.subarray(1).indexOf(0);\n if (r === -1)\n return;\n const n = Tr(yl(s.data, 1, r)), i = s.data[2 + r], o = s.data.subarray(3 + r).indexOf(0);\n if (o === -1)\n return;\n const a = Tr(yl(s.data, 3 + r, o));\n let l;\n return n === \"-->\" ? l = Tr(yl(s.data, 4 + r + o)) : l = yT(s.data.subarray(4 + r + o)), e.mimeType = n, e.pictureType = i, e.description = a, e.data = l, e;\n}\nfunction bT(s) {\n if (s.size < 2)\n return;\n const e = Tr(s.data, !0), t = new Uint8Array(s.data.subarray(e.length + 1));\n return {\n key: s.type,\n info: e,\n data: t.buffer\n };\n}\nfunction TT(s) {\n if (s.size < 2)\n return;\n if (s.type === \"TXXX\") {\n let t = 1;\n const r = Tr(s.data.subarray(t), !0);\n t += r.length + 1;\n const n = Tr(s.data.subarray(t));\n return {\n key: s.type,\n info: r,\n data: n\n };\n }\n const e = Tr(s.data.subarray(1));\n return {\n key: s.type,\n info: \"\",\n data: e\n };\n}\nfunction wT(s) {\n if (s.type === \"WXXX\") {\n if (s.size < 2)\n return;\n let t = 1;\n const r = Tr(s.data.subarray(t), !0);\n t += r.length + 1;\n const n = Tr(s.data.subarray(t));\n return {\n key: s.type,\n info: r,\n data: n\n };\n }\n const e = Tr(s.data);\n return {\n key: s.type,\n info: \"\",\n data: e\n };\n}\nfunction AT(s) {\n return s.type === \"PRIV\" ? bT(s) : s.type[0] === \"W\" ? wT(s) : s.type === \"APIC\" ? ST(s) : TT(s);\n}\nfunction IT(s) {\n const e = String.fromCharCode(s[0], s[1], s[2], s[3]), t = va(s, 4), r = 10;\n return {\n type: e,\n size: t,\n data: s.subarray(r, r + t)\n };\n}\nconst zi = 10, _T = 10;\nfunction hp(s) {\n let e = 0;\n const t = [];\n for (; Au(s, e); ) {\n const r = va(s, e + 6);\n s[e + 5] >> 6 & 1 && (e += zi), e += zi;\n const n = e + r;\n for (; e + _T < n; ) {\n const i = IT(s.subarray(e)), o = AT(i);\n o && t.push(o), e += i.size + zi;\n }\n op(s, e) && (e += zi);\n }\n return t;\n}\nfunction fp(s) {\n return s && s.key === \"PRIV\" && s.info === \"com.apple.streaming.transportStreamTimestamp\";\n}\nfunction RT(s) {\n if (s.data.byteLength === 8) {\n const e = new Uint8Array(s.data), t = e[3] & 1;\n let r = (e[4] << 23) + (e[5] << 15) + (e[6] << 7) + e[7];\n return r /= 45, t && (r += 4772185884e-2), Math.round(r);\n }\n}\nfunction _u(s) {\n const e = hp(s);\n for (let t = 0; t < e.length; t++) {\n const r = e[t];\n if (fp(r))\n return RT(r);\n }\n}\nlet br = /* @__PURE__ */ (function(s) {\n return s.audioId3 = \"org.id3\", s.dateRange = \"com.apple.quicktime.HLS\", s.emsg = \"https://aomedia.org/emsg/ID3\", s.misbklv = \"urn:misb:KLV:bin:1910.1\", s;\n})({});\nfunction jr(s = \"\", e = 9e4) {\n return {\n type: s,\n id: -1,\n pid: -1,\n inputTimeScale: e,\n sequenceNumber: -1,\n samples: [],\n dropped: 0\n };\n}\nclass Ru {\n constructor() {\n this._audioTrack = void 0, this._id3Track = void 0, this.frameIndex = 0, this.cachedData = null, this.basePTS = null, this.initPTS = null, this.lastPTS = null;\n }\n resetInitSegment(e, t, r, n) {\n this._id3Track = {\n type: \"id3\",\n id: 3,\n pid: -1,\n inputTimeScale: 9e4,\n sequenceNumber: 0,\n samples: [],\n dropped: 0\n };\n }\n resetTimeStamp(e) {\n this.initPTS = e, this.resetContiguity();\n }\n resetContiguity() {\n this.basePTS = null, this.lastPTS = null, this.frameIndex = 0;\n }\n canParse(e, t) {\n return !1;\n }\n appendFrame(e, t, r) {\n }\n // feed incoming data to the front of the parsing pipeline\n demux(e, t) {\n this.cachedData && (e = _r(this.cachedData, e), this.cachedData = null);\n let r = Ei(e, 0), n = r ? r.length : 0, i;\n const o = this._audioTrack, a = this._id3Track, l = r ? _u(r) : void 0, c = e.length;\n for ((this.basePTS === null || this.frameIndex === 0 && ue(l)) && (this.basePTS = LT(l, t, this.initPTS), this.lastPTS = this.basePTS), this.lastPTS === null && (this.lastPTS = this.basePTS), r && r.length > 0 && a.samples.push({\n pts: this.lastPTS,\n dts: this.lastPTS,\n data: r,\n type: br.audioId3,\n duration: Number.POSITIVE_INFINITY\n }); n < c; ) {\n if (this.canParse(e, n)) {\n const u = this.appendFrame(o, e, n);\n u ? (this.frameIndex++, this.lastPTS = u.sample.pts, n += u.length, i = n) : n = c;\n } else mT(e, n) ? (r = Ei(e, n), a.samples.push({\n pts: this.lastPTS,\n dts: this.lastPTS,\n data: r,\n type: br.audioId3,\n duration: Number.POSITIVE_INFINITY\n }), n += r.length, i = n) : n++;\n if (n === c && i !== c) {\n const u = e.slice(i);\n this.cachedData ? this.cachedData = _r(this.cachedData, u) : this.cachedData = u;\n }\n }\n return {\n audioTrack: o,\n videoTrack: jr(),\n id3Track: a,\n textTrack: jr()\n };\n }\n demuxSampleAes(e, t, r) {\n return Promise.reject(new Error(`[${this}] This demuxer does not support Sample-AES decryption`));\n }\n flush(e) {\n const t = this.cachedData;\n return t && (this.cachedData = null, this.demux(t, 0)), {\n audioTrack: this._audioTrack,\n videoTrack: jr(),\n id3Track: this._id3Track,\n textTrack: jr()\n };\n }\n destroy() {\n this.cachedData = null, this._audioTrack = this._id3Track = void 0;\n }\n}\nconst LT = (s, e, t) => {\n if (ue(s))\n return s * 90;\n const r = t ? t.baseTime * 9e4 / t.timescale : 0;\n return e * 9e4 + r;\n};\nlet Yi = null;\nconst CT = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160], kT = [44100, 48e3, 32e3, 22050, 24e3, 16e3, 11025, 12e3, 8e3], DT = [\n // MPEG 2.5\n [\n 0,\n // Reserved\n 72,\n // Layer3\n 144,\n // Layer2\n 12\n // Layer1\n ],\n // Reserved\n [\n 0,\n // Reserved\n 0,\n // Layer3\n 0,\n // Layer2\n 0\n // Layer1\n ],\n // MPEG 2\n [\n 0,\n // Reserved\n 72,\n // Layer3\n 144,\n // Layer2\n 12\n // Layer1\n ],\n // MPEG 1\n [\n 0,\n // Reserved\n 144,\n // Layer3\n 144,\n // Layer2\n 12\n // Layer1\n ]\n], PT = [\n 0,\n // Reserved\n 1,\n // Layer3\n 1,\n // Layer2\n 4\n // Layer1\n];\nfunction gp(s, e, t, r, n) {\n if (t + 24 > e.length)\n return;\n const i = pp(e, t);\n if (i && t + i.frameLength <= e.length) {\n const o = i.samplesPerFrame * 9e4 / i.sampleRate, a = r + n * o, l = {\n unit: e.subarray(t, t + i.frameLength),\n pts: a,\n dts: a\n };\n return s.config = [], s.channelCount = i.channelCount, s.samplerate = i.sampleRate, s.samples.push(l), {\n sample: l,\n length: i.frameLength,\n missing: 0\n };\n }\n}\nfunction pp(s, e) {\n const t = s[e + 1] >> 3 & 3, r = s[e + 1] >> 1 & 3, n = s[e + 2] >> 4 & 15, i = s[e + 2] >> 2 & 3;\n if (t !== 1 && n !== 0 && n !== 15 && i !== 3) {\n const o = s[e + 2] >> 1 & 1, a = s[e + 3] >> 6, l = t === 3 ? 3 - r : r === 3 ? 3 : 4, c = CT[l * 14 + n - 1] * 1e3, d = kT[(t === 3 ? 0 : t === 2 ? 1 : 2) * 3 + i], h = a === 3 ? 1 : 2, f = DT[t][r], p = PT[r], y = f * 8 * p, E = Math.floor(f * c / d + o) * p;\n if (Yi === null) {\n const A = (navigator.userAgent || \"\").match(/Chrome\\/(\\d+)/i);\n Yi = A ? parseInt(A[1]) : 0;\n }\n return !!Yi && Yi <= 87 && r === 2 && c >= 224e3 && a === 0 && (s[e + 3] = s[e + 3] | 128), {\n sampleRate: d,\n channelCount: h,\n frameLength: E,\n samplesPerFrame: y\n };\n }\n}\nfunction Lu(s, e) {\n return s[e] === 255 && (s[e + 1] & 224) === 224 && (s[e + 1] & 6) !== 0;\n}\nfunction mp(s, e) {\n return e + 1 < s.length && Lu(s, e);\n}\nfunction MT(s, e) {\n return Lu(s, e) && 4 <= s.length - e;\n}\nfunction yp(s, e) {\n if (e + 1 < s.length && Lu(s, e)) {\n const r = pp(s, e);\n let n = 4;\n r != null && r.frameLength && (n = r.frameLength);\n const i = e + n;\n return i === s.length || mp(s, i);\n }\n return !1;\n}\nclass OT extends Ru {\n constructor(e, t) {\n super(), this.observer = void 0, this.config = void 0, this.observer = e, this.config = t;\n }\n resetInitSegment(e, t, r, n) {\n super.resetInitSegment(e, t, r, n), this._audioTrack = {\n container: \"audio/adts\",\n type: \"audio\",\n id: 2,\n pid: -1,\n sequenceNumber: 0,\n segmentCodec: \"aac\",\n samples: [],\n manifestCodec: t,\n duration: n,\n inputTimeScale: 9e4,\n dropped: 0\n };\n }\n // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS\n static probe(e, t) {\n if (!e)\n return !1;\n const r = Ei(e, 0);\n let n = (r == null ? void 0 : r.length) || 0;\n if (yp(e, n))\n return !1;\n for (let i = e.length; n < i; n++)\n if (gT(e, n))\n return t.log(\"ADTS sync word found !\"), !0;\n return !1;\n }\n canParse(e, t) {\n return fT(e, t);\n }\n appendFrame(e, t, r) {\n cp(e, this.observer, t, r, e.manifestCodec);\n const n = dp(e, t, r, this.basePTS, this.frameIndex);\n if (n && n.missing === 0)\n return n;\n }\n}\nconst vp = (s, e) => {\n let t = 0, r = 5;\n e += r;\n const n = new Uint32Array(1), i = new Uint32Array(1), o = new Uint8Array(1);\n for (; r > 0; ) {\n o[0] = s[e];\n const a = Math.min(r, 8), l = 8 - a;\n i[0] = 4278190080 >>> 24 + l << l, n[0] = (o[0] & i[0]) >> l, t = t ? t << a | n[0] : n[0], e += 1, r -= a;\n }\n return t;\n};\nclass BT extends Ru {\n constructor(e) {\n super(), this.observer = void 0, this.observer = e;\n }\n resetInitSegment(e, t, r, n) {\n super.resetInitSegment(e, t, r, n), this._audioTrack = {\n container: \"audio/ac-3\",\n type: \"audio\",\n id: 2,\n pid: -1,\n sequenceNumber: 0,\n segmentCodec: \"ac3\",\n samples: [],\n manifestCodec: t,\n duration: n,\n inputTimeScale: 9e4,\n dropped: 0\n };\n }\n canParse(e, t) {\n return t + 64 < e.length;\n }\n appendFrame(e, t, r) {\n const n = Ep(e, t, r, this.basePTS, this.frameIndex);\n if (n !== -1)\n return {\n sample: e.samples[e.samples.length - 1],\n length: n,\n missing: 0\n };\n }\n static probe(e) {\n if (!e)\n return !1;\n const t = Ei(e, 0);\n if (!t)\n return !1;\n const r = t.length;\n return e[r] === 11 && e[r + 1] === 119 && _u(t) !== void 0 && // check the bsid to confirm ac-3\n vp(e, r) < 16;\n }\n}\nfunction Ep(s, e, t, r, n) {\n if (t + 8 > e.length || e[t] !== 11 || e[t + 1] !== 119)\n return -1;\n const i = e[t + 4] >> 6;\n if (i >= 3)\n return -1;\n const a = [48e3, 44100, 32e3][i], l = e[t + 4] & 63, u = [64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105, 144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160, 174, 240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336, 224, 244, 336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349, 480, 384, 417, 576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512, 557, 768, 512, 558, 768, 640, 696, 960, 640, 697, 960, 768, 835, 1152, 768, 836, 1152, 896, 975, 1344, 896, 976, 1344, 1024, 1114, 1536, 1024, 1115, 1536, 1152, 1253, 1728, 1152, 1254, 1728, 1280, 1393, 1920, 1280, 1394, 1920][l * 3 + i] * 2;\n if (t + u > e.length)\n return -1;\n const d = e[t + 6] >> 5;\n let h = 0;\n d === 2 ? h += 2 : (d & 1 && d !== 1 && (h += 2), d & 4 && (h += 2));\n const f = (e[t + 6] << 8 | e[t + 7]) >> 12 - h & 1, y = [2, 1, 2, 3, 3, 4, 4, 5][d] + f, E = e[t + 5] >> 3, b = e[t + 5] & 7, R = new Uint8Array([i << 6 | E << 1 | b >> 2, (b & 3) << 6 | d << 3 | f << 2 | l >> 4, l << 4 & 224]), A = 1536 / a * 9e4, F = r + n * A, M = e.subarray(t, t + u);\n return s.config = R, s.channelCount = y, s.samplerate = a, s.samples.push({\n unit: M,\n pts: F\n }), u;\n}\nclass FT extends Ru {\n resetInitSegment(e, t, r, n) {\n super.resetInitSegment(e, t, r, n), this._audioTrack = {\n container: \"audio/mpeg\",\n type: \"audio\",\n id: 2,\n pid: -1,\n sequenceNumber: 0,\n segmentCodec: \"mp3\",\n samples: [],\n manifestCodec: t,\n duration: n,\n inputTimeScale: 9e4,\n dropped: 0\n };\n }\n static probe(e) {\n if (!e)\n return !1;\n const t = Ei(e, 0);\n let r = (t == null ? void 0 : t.length) || 0;\n if (t && e[r] === 11 && e[r + 1] === 119 && _u(t) !== void 0 && // check the bsid to confirm ac-3 or ec-3 (not mp3)\n vp(e, r) <= 16)\n return !1;\n for (let n = e.length; r < n; r++)\n if (yp(e, r))\n return rt.log(\"MPEG Audio sync word found !\"), !0;\n return !1;\n }\n canParse(e, t) {\n return MT(e, t);\n }\n appendFrame(e, t, r) {\n if (this.basePTS !== null)\n return gp(e, t, r, this.basePTS, this.frameIndex);\n }\n}\nconst NT = /\\/emsg[-/]ID3/i;\nclass UT {\n constructor(e, t) {\n this.remainderData = null, this.timeOffset = 0, this.config = void 0, this.videoTrack = void 0, this.audioTrack = void 0, this.id3Track = void 0, this.txtTrack = void 0, this.config = t;\n }\n resetTimeStamp() {\n }\n resetInitSegment(e, t, r, n) {\n const i = this.videoTrack = jr(\"video\", 1), o = this.audioTrack = jr(\"audio\", 1), a = this.txtTrack = jr(\"text\", 1);\n if (this.id3Track = jr(\"id3\", 1), this.timeOffset = 0, !(e != null && e.byteLength))\n return;\n const l = Dg(e);\n if (l.video) {\n const {\n id: c,\n timescale: u,\n codec: d,\n supplemental: h\n } = l.video;\n i.id = c, i.timescale = a.timescale = u, i.codec = d, i.supplemental = h;\n }\n if (l.audio) {\n const {\n id: c,\n timescale: u,\n codec: d\n } = l.audio;\n o.id = c, o.timescale = u, o.codec = d;\n }\n a.id = Lg.text, i.sampleDuration = 0, i.duration = o.duration = n;\n }\n resetContiguity() {\n this.remainderData = null;\n }\n static probe(e) {\n return BS(e);\n }\n demux(e, t) {\n this.timeOffset = t;\n let r = e;\n const n = this.videoTrack, i = this.txtTrack;\n if (this.config.progressive) {\n this.remainderData && (r = _r(this.remainderData, e));\n const a = VS(r);\n this.remainderData = a.remainder, n.samples = a.valid || new Uint8Array();\n } else\n n.samples = r;\n const o = this.extractID3Track(n, t);\n return i.samples = rh(t, n), {\n videoTrack: n,\n audioTrack: this.audioTrack,\n id3Track: o,\n textTrack: this.txtTrack\n };\n }\n flush() {\n const e = this.timeOffset, t = this.videoTrack, r = this.txtTrack;\n t.samples = this.remainderData || new Uint8Array(), this.remainderData = null;\n const n = this.extractID3Track(t, this.timeOffset);\n return r.samples = rh(e, t), {\n videoTrack: t,\n audioTrack: jr(),\n id3Track: n,\n textTrack: jr()\n };\n }\n extractID3Track(e, t) {\n const r = this.id3Track;\n if (e.samples.length) {\n const n = Ge(e.samples, [\"emsg\"]);\n n && n.forEach((i) => {\n const o = KS(i);\n if (NT.test(o.schemeIdUri)) {\n const a = Nh(o, t);\n let l = o.eventDuration === 4294967295 ? Number.POSITIVE_INFINITY : o.eventDuration / o.timeScale;\n l <= 1e-3 && (l = Number.POSITIVE_INFINITY);\n const c = o.payload;\n r.samples.push({\n data: c,\n len: c.byteLength,\n dts: a,\n pts: a,\n type: br.emsg,\n duration: l\n });\n } else if (this.config.enableEmsgKLVMetadata && o.schemeIdUri.startsWith(\"urn:misb:KLV:bin:1910.1\")) {\n const a = Nh(o, t);\n r.samples.push({\n data: o.payload,\n len: o.payload.byteLength,\n dts: a,\n pts: a,\n type: br.misbklv,\n duration: Number.POSITIVE_INFINITY\n });\n }\n });\n }\n return r;\n }\n demuxSampleAes(e, t, r) {\n return Promise.reject(new Error(\"The MP4 demuxer does not support SAMPLE-AES decryption\"));\n }\n destroy() {\n this.config = null, this.remainderData = null, this.videoTrack = this.audioTrack = this.id3Track = this.txtTrack = void 0;\n }\n}\nfunction Nh(s, e) {\n return ue(s.presentationTime) ? s.presentationTime / s.timeScale : e + s.presentationTimeDelta / s.timeScale;\n}\nclass $T {\n constructor(e, t, r) {\n this.keyData = void 0, this.decrypter = void 0, this.keyData = r, this.decrypter = new vu(t, {\n removePKCS7Padding: !1\n });\n }\n decryptBuffer(e) {\n return this.decrypter.decrypt(e, this.keyData.key.buffer, this.keyData.iv.buffer, Os.cbc);\n }\n // AAC - encrypt all full 16 bytes blocks starting from offset 16\n decryptAacSample(e, t, r) {\n const n = e[t].unit;\n if (n.length <= 16)\n return;\n const i = n.subarray(16, n.length - n.length % 16), o = i.buffer.slice(i.byteOffset, i.byteOffset + i.length);\n this.decryptBuffer(o).then((a) => {\n const l = new Uint8Array(a);\n n.set(l, 16), this.decrypter.isSync() || this.decryptAacSamples(e, t + 1, r);\n }).catch(r);\n }\n decryptAacSamples(e, t, r) {\n for (; ; t++) {\n if (t >= e.length) {\n r();\n return;\n }\n if (!(e[t].unit.length < 32) && (this.decryptAacSample(e, t, r), !this.decrypter.isSync()))\n return;\n }\n }\n // AVC - encrypt one 16 bytes block out of ten, starting from offset 32\n getAvcEncryptedData(e) {\n const t = Math.floor((e.length - 48) / 160) * 16 + 16, r = new Int8Array(t);\n let n = 0;\n for (let i = 32; i < e.length - 16; i += 160, n += 16)\n r.set(e.subarray(i, i + 16), n);\n return r;\n }\n getAvcDecryptedUnit(e, t) {\n const r = new Uint8Array(t);\n let n = 0;\n for (let i = 32; i < e.length - 16; i += 160, n += 16)\n e.set(r.subarray(n, n + 16), i);\n return e;\n }\n decryptAvcSample(e, t, r, n, i) {\n const o = Mg(i.data), a = this.getAvcEncryptedData(o);\n this.decryptBuffer(a.buffer).then((l) => {\n i.data = this.getAvcDecryptedUnit(o, l), this.decrypter.isSync() || this.decryptAvcSamples(e, t, r + 1, n);\n }).catch(n);\n }\n decryptAvcSamples(e, t, r, n) {\n if (e instanceof Uint8Array)\n throw new Error(\"Cannot decrypt samples of type Uint8Array\");\n for (; ; t++, r = 0) {\n if (t >= e.length) {\n n();\n return;\n }\n const i = e[t].units;\n for (; !(r >= i.length); r++) {\n const o = i[r];\n if (!(o.data.length <= 48 || o.type !== 1 && o.type !== 5) && (this.decryptAvcSample(e, t, r, n, o), !this.decrypter.isSync()))\n return;\n }\n }\n }\n}\nclass xp {\n constructor() {\n this.VideoSample = null;\n }\n createVideoSample(e, t, r) {\n return {\n key: e,\n frame: !1,\n pts: t,\n dts: r,\n units: [],\n length: 0\n };\n }\n getLastNalUnit(e) {\n var t;\n let r = this.VideoSample, n;\n if ((!r || r.units.length === 0) && (r = e[e.length - 1]), (t = r) != null && t.units) {\n const i = r.units;\n n = i[i.length - 1];\n }\n return n;\n }\n pushAccessUnit(e, t) {\n if (e.units.length && e.frame) {\n if (e.pts === void 0) {\n const r = t.samples, n = r.length;\n if (n) {\n const i = r[n - 1];\n e.pts = i.pts, e.dts = i.dts;\n } else {\n t.dropped++;\n return;\n }\n }\n t.samples.push(e);\n }\n }\n parseNALu(e, t, r) {\n const n = t.byteLength;\n let i = e.naluState || 0;\n const o = i, a = [];\n let l = 0, c, u, d, h = -1, f = 0;\n for (i === -1 && (h = 0, f = this.getNALuType(t, 0), i = 0, l = 1); l < n; ) {\n if (c = t[l++], !i) {\n i = c ? 0 : 1;\n continue;\n }\n if (i === 1) {\n i = c ? 0 : 2;\n continue;\n }\n if (!c)\n i = 3;\n else if (c === 1) {\n if (u = l - i - 1, h >= 0) {\n const p = {\n data: t.subarray(h, u),\n type: f\n };\n a.push(p);\n } else {\n const p = this.getLastNalUnit(e.samples);\n p && (o && l <= 4 - o && p.state && (p.data = p.data.subarray(0, p.data.byteLength - o)), u > 0 && (p.data = _r(p.data, t.subarray(0, u)), p.state = 0));\n }\n l < n ? (d = this.getNALuType(t, l), h = l, f = d, i = 0) : i = -1;\n } else\n i = 0;\n }\n if (h >= 0 && i >= 0) {\n const p = {\n data: t.subarray(h, n),\n type: f,\n state: i\n };\n a.push(p);\n }\n if (a.length === 0) {\n const p = this.getLastNalUnit(e.samples);\n p && (p.data = _r(p.data, t));\n }\n return e.naluState = i, a;\n }\n}\nclass Zn {\n constructor(e) {\n this.data = void 0, this.bytesAvailable = void 0, this.word = void 0, this.bitsAvailable = void 0, this.data = e, this.bytesAvailable = e.byteLength, this.word = 0, this.bitsAvailable = 0;\n }\n // ():void\n loadWord() {\n const e = this.data, t = this.bytesAvailable, r = e.byteLength - t, n = new Uint8Array(4), i = Math.min(4, t);\n if (i === 0)\n throw new Error(\"no bytes available\");\n n.set(e.subarray(r, r + i)), this.word = new DataView(n.buffer).getUint32(0), this.bitsAvailable = i * 8, this.bytesAvailable -= i;\n }\n // (count:int):void\n skipBits(e) {\n let t;\n e = Math.min(e, this.bytesAvailable * 8 + this.bitsAvailable), this.bitsAvailable > e ? (this.word <<= e, this.bitsAvailable -= e) : (e -= this.bitsAvailable, t = e >> 3, e -= t << 3, this.bytesAvailable -= t, this.loadWord(), this.word <<= e, this.bitsAvailable -= e);\n }\n // (size:int):uint\n readBits(e) {\n let t = Math.min(this.bitsAvailable, e);\n const r = this.word >>> 32 - t;\n if (e > 32 && rt.error(\"Cannot read more than 32 bits at a time\"), this.bitsAvailable -= t, this.bitsAvailable > 0)\n this.word <<= t;\n else if (this.bytesAvailable > 0)\n this.loadWord();\n else\n throw new Error(\"no bits available\");\n return t = e - t, t > 0 && this.bitsAvailable ? r << t | this.readBits(t) : r;\n }\n // ():uint\n skipLZ() {\n let e;\n for (e = 0; e < this.bitsAvailable; ++e)\n if ((this.word & 2147483648 >>> e) !== 0)\n return this.word <<= e, this.bitsAvailable -= e, e;\n return this.loadWord(), e + this.skipLZ();\n }\n // ():void\n skipUEG() {\n this.skipBits(1 + this.skipLZ());\n }\n // ():void\n skipEG() {\n this.skipBits(1 + this.skipLZ());\n }\n // ():uint\n readUEG() {\n const e = this.skipLZ();\n return this.readBits(e + 1) - 1;\n }\n // ():int\n readEG() {\n const e = this.readUEG();\n return 1 & e ? 1 + e >>> 1 : -1 * (e >>> 1);\n }\n // Some convenience functions\n // :Boolean\n readBoolean() {\n return this.readBits(1) === 1;\n }\n // ():int\n readUByte() {\n return this.readBits(8);\n }\n // ():int\n readUShort() {\n return this.readBits(16);\n }\n // ():int\n readUInt() {\n return this.readBits(32);\n }\n}\nclass GT extends xp {\n parsePES(e, t, r, n) {\n const i = this.parseNALu(e, r.data, n);\n let o = this.VideoSample, a, l = !1;\n r.data = null, o && i.length && !e.audFound && (this.pushAccessUnit(o, e), o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), i.forEach((c) => {\n var u, d;\n switch (c.type) {\n // NDR\n case 1: {\n let y = !1;\n a = !0;\n const E = c.data;\n if (l && E.length > 4) {\n const b = this.readSliceType(E);\n (b === 2 || b === 4 || b === 7 || b === 9) && (y = !0);\n }\n if (y) {\n var h;\n (h = o) != null && h.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null);\n }\n o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.frame = !0, o.key = y;\n break;\n }\n case 5:\n a = !0, (u = o) != null && u.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null), o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0;\n break;\n // SEI\n case 6: {\n a = !0, gu(c.data, 1, r.pts, t.samples);\n break;\n }\n case 7: {\n var f, p;\n a = !0, l = !0;\n const y = c.data, E = this.readSPS(y);\n if (!e.sps || e.width !== E.width || e.height !== E.height || ((f = e.pixelRatio) == null ? void 0 : f[0]) !== E.pixelRatio[0] || ((p = e.pixelRatio) == null ? void 0 : p[1]) !== E.pixelRatio[1]) {\n e.width = E.width, e.height = E.height, e.pixelRatio = E.pixelRatio, e.sps = [y];\n const b = y.subarray(1, 4);\n let R = \"avc1.\";\n for (let A = 0; A < 3; A++) {\n let F = b[A].toString(16);\n F.length < 2 && (F = \"0\" + F), R += F;\n }\n e.codec = R;\n }\n break;\n }\n // PPS\n case 8:\n a = !0, e.pps = [c.data];\n break;\n // AUD\n case 9:\n a = !0, e.audFound = !0, (d = o) != null && d.frame && (this.pushAccessUnit(o, e), o = null), o || (o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts));\n break;\n // Filler Data\n case 12:\n a = !0;\n break;\n default:\n a = !1;\n break;\n }\n o && a && o.units.push(c);\n }), n && o && (this.pushAccessUnit(o, e), this.VideoSample = null);\n }\n getNALuType(e, t) {\n return e[t] & 31;\n }\n readSliceType(e) {\n const t = new Zn(e);\n return t.readUByte(), t.readUEG(), t.readUEG();\n }\n /**\n * The scaling list is optionally transmitted as part of a sequence parameter\n * set and is not relevant to transmuxing.\n * @param count the number of entries in this scaling list\n * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n */\n skipScalingList(e, t) {\n let r = 8, n = 8, i;\n for (let o = 0; o < e; o++)\n n !== 0 && (i = t.readEG(), n = (r + i + 256) % 256), r = n === 0 ? r : n;\n }\n /**\n * Read a sequence parameter set and return some interesting video\n * properties. A sequence parameter set is the H264 metadata that\n * describes the properties of upcoming video frames.\n * @returns an object with configuration parsed from the\n * sequence parameter set, including the dimensions of the\n * associated video frames.\n */\n readSPS(e) {\n const t = new Zn(e);\n let r = 0, n = 0, i = 0, o = 0, a, l, c;\n const u = t.readUByte.bind(t), d = t.readBits.bind(t), h = t.readUEG.bind(t), f = t.readBoolean.bind(t), p = t.skipBits.bind(t), y = t.skipEG.bind(t), E = t.skipUEG.bind(t), b = this.skipScalingList.bind(this);\n u();\n const R = u();\n if (d(5), p(3), u(), E(), R === 100 || R === 110 || R === 122 || R === 244 || R === 44 || R === 83 || R === 86 || R === 118 || R === 128) {\n const j = h();\n if (j === 3 && p(1), E(), E(), p(1), f())\n for (l = j !== 3 ? 8 : 12, c = 0; c < l; c++)\n f() && (c < 6 ? b(16, t) : b(64, t));\n }\n E();\n const A = h();\n if (A === 0)\n h();\n else if (A === 1)\n for (p(1), y(), y(), a = h(), c = 0; c < a; c++)\n y();\n E(), p(1);\n const F = h(), M = h(), H = d(1);\n H === 0 && p(1), p(1), f() && (r = h(), n = h(), i = h(), o = h());\n let K = [1, 1];\n if (f() && f())\n switch (u()) {\n case 1:\n K = [1, 1];\n break;\n case 2:\n K = [12, 11];\n break;\n case 3:\n K = [10, 11];\n break;\n case 4:\n K = [16, 11];\n break;\n case 5:\n K = [40, 33];\n break;\n case 6:\n K = [24, 11];\n break;\n case 7:\n K = [20, 11];\n break;\n case 8:\n K = [32, 11];\n break;\n case 9:\n K = [80, 33];\n break;\n case 10:\n K = [18, 11];\n break;\n case 11:\n K = [15, 11];\n break;\n case 12:\n K = [64, 33];\n break;\n case 13:\n K = [160, 99];\n break;\n case 14:\n K = [4, 3];\n break;\n case 15:\n K = [3, 2];\n break;\n case 16:\n K = [2, 1];\n break;\n case 255: {\n K = [u() << 8 | u(), u() << 8 | u()];\n break;\n }\n }\n return {\n width: Math.ceil((F + 1) * 16 - r * 2 - n * 2),\n height: (2 - H) * (M + 1) * 16 - (H ? 2 : 4) * (i + o),\n pixelRatio: K\n };\n }\n}\nclass VT extends xp {\n constructor(...e) {\n super(...e), this.initVPS = null;\n }\n parsePES(e, t, r, n) {\n const i = this.parseNALu(e, r.data, n);\n let o = this.VideoSample, a, l = !1;\n r.data = null, o && i.length && !e.audFound && (this.pushAccessUnit(o, e), o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), i.forEach((c) => {\n var u, d;\n switch (c.type) {\n // NON-IDR, NON RANDOM ACCESS SLICE\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n case 9:\n o || (o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), o.frame = !0, a = !0;\n break;\n // CRA, BLA (random access picture)\n case 16:\n case 17:\n case 18:\n case 21:\n if (a = !0, l) {\n var h;\n (h = o) != null && h.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null);\n }\n o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0;\n break;\n // IDR\n case 19:\n case 20:\n a = !0, (u = o) != null && u.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null), o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0;\n break;\n // SEI\n case 39:\n a = !0, gu(\n c.data,\n 2,\n // NALu header size\n r.pts,\n t.samples\n );\n break;\n // VPS\n case 32:\n a = !0, e.vps || (typeof e.params != \"object\" && (e.params = {}), e.params = nt(e.params, this.readVPS(c.data)), this.initVPS = c.data), e.vps = [c.data];\n break;\n // SPS\n case 33:\n if (a = !0, l = !0, e.vps !== void 0 && e.vps[0] !== this.initVPS && e.sps !== void 0 && !this.matchSPS(e.sps[0], c.data) && (this.initVPS = e.vps[0], e.sps = e.pps = void 0), !e.sps) {\n const f = this.readSPS(c.data);\n e.width = f.width, e.height = f.height, e.pixelRatio = f.pixelRatio, e.codec = f.codecString, e.sps = [], typeof e.params != \"object\" && (e.params = {});\n for (const p in f.params)\n e.params[p] = f.params[p];\n }\n this.pushParameterSet(e.sps, c.data, e.vps), o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0;\n break;\n // PPS\n case 34:\n if (a = !0, typeof e.params == \"object\") {\n if (!e.pps) {\n e.pps = [];\n const f = this.readPPS(c.data);\n for (const p in f)\n e.params[p] = f[p];\n }\n this.pushParameterSet(e.pps, c.data, e.vps);\n }\n break;\n // ACCESS UNIT DELIMITER\n case 35:\n a = !0, e.audFound = !0, (d = o) != null && d.frame && (this.pushAccessUnit(o, e), o = null), o || (o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts));\n break;\n default:\n a = !1;\n break;\n }\n o && a && o.units.push(c);\n }), n && o && (this.pushAccessUnit(o, e), this.VideoSample = null);\n }\n pushParameterSet(e, t, r) {\n (r && r[0] === this.initVPS || !r && !e.length) && e.push(t);\n }\n getNALuType(e, t) {\n return (e[t] & 126) >>> 1;\n }\n ebsp2rbsp(e) {\n const t = new Uint8Array(e.byteLength);\n let r = 0;\n for (let n = 0; n < e.byteLength; n++)\n n >= 2 && e[n] === 3 && e[n - 1] === 0 && e[n - 2] === 0 || (t[r] = e[n], r++);\n return new Uint8Array(t.buffer, 0, r);\n }\n pushAccessUnit(e, t) {\n super.pushAccessUnit(e, t), this.initVPS && (this.initVPS = null);\n }\n readVPS(e) {\n const t = new Zn(e);\n t.readUByte(), t.readUByte(), t.readBits(4), t.skipBits(2), t.readBits(6);\n const r = t.readBits(3), n = t.readBoolean();\n return {\n numTemporalLayers: r + 1,\n temporalIdNested: n\n };\n }\n readSPS(e) {\n const t = new Zn(this.ebsp2rbsp(e));\n t.readUByte(), t.readUByte(), t.readBits(4);\n const r = t.readBits(3);\n t.readBoolean();\n const n = t.readBits(2), i = t.readBoolean(), o = t.readBits(5), a = t.readUByte(), l = t.readUByte(), c = t.readUByte(), u = t.readUByte(), d = t.readUByte(), h = t.readUByte(), f = t.readUByte(), p = t.readUByte(), y = t.readUByte(), E = t.readUByte(), b = t.readUByte(), R = [], A = [];\n for (let ye = 0; ye < r; ye++)\n R.push(t.readBoolean()), A.push(t.readBoolean());\n if (r > 0)\n for (let ye = r; ye < 8; ye++)\n t.readBits(2);\n for (let ye = 0; ye < r; ye++)\n R[ye] && (t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte()), A[ye] && t.readUByte();\n t.readUEG();\n const F = t.readUEG();\n F == 3 && t.skipBits(1);\n const M = t.readUEG(), H = t.readUEG(), K = t.readBoolean();\n let j = 0, C = 0, k = 0, $ = 0;\n K && (j += t.readUEG(), C += t.readUEG(), k += t.readUEG(), $ += t.readUEG());\n const W = t.readUEG(), _ = t.readUEG(), g = t.readUEG(), x = t.readBoolean();\n for (let ye = x ? 0 : r; ye <= r; ye++)\n t.skipUEG(), t.skipUEG(), t.skipUEG();\n if (t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.readBoolean() && t.readBoolean())\n for (let be = 0; be < 4; be++)\n for (let Fe = 0; Fe < (be === 3 ? 2 : 6); Fe++)\n if (!t.readBoolean())\n t.readUEG();\n else {\n const we = Math.min(64, 1 << 4 + (be << 1));\n be > 1 && t.readEG();\n for (let Ne = 0; Ne < we; Ne++)\n t.readEG();\n }\n t.readBoolean(), t.readBoolean(), t.readBoolean() && (t.readUByte(), t.skipUEG(), t.skipUEG(), t.readBoolean());\n const O = t.readUEG();\n let U = 0;\n for (let ye = 0; ye < O; ye++) {\n let be = !1;\n if (ye !== 0 && (be = t.readBoolean()), be) {\n ye === O && t.readUEG(), t.readBoolean(), t.readUEG();\n let Fe = 0;\n for (let Xe = 0; Xe <= U; Xe++) {\n const we = t.readBoolean();\n let Ne = !1;\n we || (Ne = t.readBoolean()), (we || Ne) && Fe++;\n }\n U = Fe;\n } else {\n const Fe = t.readUEG(), Xe = t.readUEG();\n U = Fe + Xe;\n for (let we = 0; we < Fe; we++)\n t.readUEG(), t.readBoolean();\n for (let we = 0; we < Xe; we++)\n t.readUEG(), t.readBoolean();\n }\n }\n if (t.readBoolean()) {\n const ye = t.readUEG();\n for (let be = 0; be < ye; be++) {\n for (let Fe = 0; Fe < g + 4; Fe++)\n t.readBits(1);\n t.readBits(1);\n }\n }\n let L = 0, m = 1, v = 1, P = !0, N = 1, Y = 0;\n t.readBoolean(), t.readBoolean();\n let ee = !1;\n if (t.readBoolean()) {\n if (t.readBoolean()) {\n const dt = t.readUByte(), Je = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2], Qe = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n dt > 0 && dt < 16 ? (m = Je[dt - 1], v = Qe[dt - 1]) : dt === 255 && (m = t.readBits(16), v = t.readBits(16));\n }\n if (t.readBoolean() && t.readBoolean(), t.readBoolean() && (t.readBits(3), t.readBoolean(), t.readBoolean() && (t.readUByte(), t.readUByte(), t.readUByte())), t.readBoolean() && (t.readUEG(), t.readUEG()), t.readBoolean(), t.readBoolean(), t.readBoolean(), ee = t.readBoolean(), ee && (t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG()), t.readBoolean() && (N = t.readBits(32), Y = t.readBits(32), t.readBoolean() && t.readUEG(), t.readBoolean())) {\n const Qe = t.readBoolean(), it = t.readBoolean();\n let je = !1;\n (Qe || it) && (je = t.readBoolean(), je && (t.readUByte(), t.readBits(5), t.readBoolean(), t.readBits(5)), t.readBits(4), t.readBits(4), je && t.readBits(4), t.readBits(5), t.readBits(5), t.readBits(5));\n for (let B = 0; B <= r; B++) {\n P = t.readBoolean();\n const S = P || t.readBoolean();\n let T = !1;\n S ? t.readEG() : T = t.readBoolean();\n const G = T ? 1 : t.readUEG() + 1;\n if (Qe)\n for (let Z = 0; Z < G; Z++)\n t.readUEG(), t.readUEG(), je && (t.readUEG(), t.readUEG()), t.skipBits(1);\n if (it)\n for (let Z = 0; Z < G; Z++)\n t.readUEG(), t.readUEG(), je && (t.readUEG(), t.readUEG()), t.skipBits(1);\n }\n }\n t.readBoolean() && (t.readBoolean(), t.readBoolean(), t.readBoolean(), L = t.readUEG());\n }\n let le = M, Te = H;\n if (K) {\n let ye = 1, be = 1;\n F === 1 ? ye = be = 2 : F == 2 && (ye = 2), le = M - ye * C - ye * j, Te = H - be * $ - be * k;\n }\n const De = n ? [\"A\", \"B\", \"C\"][n] : \"\", ze = a << 24 | l << 16 | c << 8 | u;\n let _e = 0;\n for (let ye = 0; ye < 32; ye++)\n _e = (_e | (ze >> ye & 1) << 31 - ye) >>> 0;\n let xe = _e.toString(16);\n return o === 1 && xe === \"2\" && (xe = \"6\"), {\n codecString: `hvc1.${De}${o}.${xe}.${i ? \"H\" : \"L\"}${b}.B0`,\n params: {\n general_tier_flag: i,\n general_profile_idc: o,\n general_profile_space: n,\n general_profile_compatibility_flags: [a, l, c, u],\n general_constraint_indicator_flags: [d, h, f, p, y, E],\n general_level_idc: b,\n bit_depth: W + 8,\n bit_depth_luma_minus8: W,\n bit_depth_chroma_minus8: _,\n min_spatial_segmentation_idc: L,\n chroma_format_idc: F,\n frame_rate: {\n fixed: P,\n fps: Y / N\n }\n },\n width: le,\n height: Te,\n pixelRatio: [m, v]\n };\n }\n readPPS(e) {\n const t = new Zn(this.ebsp2rbsp(e));\n t.readUByte(), t.readUByte(), t.skipUEG(), t.skipUEG(), t.skipBits(2), t.skipBits(3), t.skipBits(2), t.skipUEG(), t.skipUEG(), t.skipEG(), t.skipBits(2), t.readBoolean() && t.skipUEG(), t.skipEG(), t.skipEG(), t.skipBits(4);\n const n = t.readBoolean(), i = t.readBoolean();\n let o = 1;\n return i && n ? o = 0 : i ? o = 3 : n && (o = 2), {\n parallelismType: o\n };\n }\n matchSPS(e, t) {\n return String.fromCharCode.apply(null, e).substr(3) === String.fromCharCode.apply(null, t).substr(3);\n }\n}\nconst Wt = 188;\nclass Is {\n constructor(e, t, r, n) {\n this.logger = void 0, this.observer = void 0, this.config = void 0, this.typeSupported = void 0, this.sampleAes = null, this.pmtParsed = !1, this.audioCodec = void 0, this.videoCodec = void 0, this._pmtId = -1, this._videoTrack = void 0, this._audioTrack = void 0, this._id3Track = void 0, this._txtTrack = void 0, this.aacOverFlow = null, this.remainderData = null, this.videoParser = void 0, this.observer = e, this.config = t, this.typeSupported = r, this.logger = n, this.videoParser = null;\n }\n static probe(e, t) {\n const r = Is.syncOffset(e);\n return r > 0 && t.warn(`MPEG2-TS detected but first sync word found @ offset ${r}`), r !== -1;\n }\n static syncOffset(e) {\n const t = e.length;\n let r = Math.min(Wt * 5, t - Wt) + 1, n = 0;\n for (; n < r; ) {\n let i = !1, o = -1, a = 0;\n for (let l = n; l < t; l += Wt)\n if (e[l] === 71 && (t - l === Wt || e[l + Wt] === 71)) {\n if (a++, o === -1 && (o = l, o !== 0 && (r = Math.min(o + Wt * 99, e.length - Wt) + 1)), i || (i = pc(e, l) === 0), i && a > 1 && (o === 0 && a > 2 || l + Wt > r))\n return o;\n } else {\n if (a)\n return -1;\n break;\n }\n n++;\n }\n return -1;\n }\n /**\n * Creates a track model internal to demuxer used to drive remuxing input\n */\n static createTrack(e, t) {\n return {\n container: e === \"video\" || e === \"audio\" ? \"video/mp2t\" : void 0,\n type: e,\n id: Lg[e],\n pid: -1,\n inputTimeScale: 9e4,\n sequenceNumber: 0,\n samples: [],\n dropped: 0,\n duration: e === \"audio\" ? t : void 0\n };\n }\n /**\n * Initializes a new init segment on the demuxer/remuxer interface. Needed for discontinuities/track-switches (or at stream start)\n * Resets all internal track instances of the demuxer.\n */\n resetInitSegment(e, t, r, n) {\n this.pmtParsed = !1, this._pmtId = -1, this._videoTrack = Is.createTrack(\"video\"), this._videoTrack.duration = n, this._audioTrack = Is.createTrack(\"audio\", n), this._id3Track = Is.createTrack(\"id3\"), this._txtTrack = Is.createTrack(\"text\"), this._audioTrack.segmentCodec = \"aac\", this.videoParser = null, this.aacOverFlow = null, this.remainderData = null, this.audioCodec = t, this.videoCodec = r;\n }\n resetTimeStamp() {\n }\n resetContiguity() {\n const {\n _audioTrack: e,\n _videoTrack: t,\n _id3Track: r\n } = this;\n e && (e.pesData = null), t && (t.pesData = null), r && (r.pesData = null), this.aacOverFlow = null, this.remainderData = null;\n }\n demux(e, t, r = !1, n = !1) {\n r || (this.sampleAes = null);\n let i;\n const o = this._videoTrack, a = this._audioTrack, l = this._id3Track, c = this._txtTrack;\n let u = o.pid, d = o.pesData, h = a.pid, f = l.pid, p = a.pesData, y = l.pesData, E = null, b = this.pmtParsed, R = this._pmtId, A = e.length;\n if (this.remainderData && (e = _r(this.remainderData, e), A = e.length, this.remainderData = null), A < Wt && !n)\n return this.remainderData = e, {\n audioTrack: a,\n videoTrack: o,\n id3Track: l,\n textTrack: c\n };\n const F = Math.max(0, Is.syncOffset(e));\n A -= (A - F) % Wt, A < e.byteLength && !n && (this.remainderData = new Uint8Array(e.buffer, A, e.buffer.byteLength - A));\n let M = 0;\n for (let K = F; K < A; K += Wt)\n if (e[K] === 71) {\n const j = !!(e[K + 1] & 64), C = pc(e, K), k = (e[K + 3] & 48) >> 4;\n let $;\n if (k > 1) {\n if ($ = K + 5 + e[K + 4], $ === K + Wt)\n continue;\n } else\n $ = K + 4;\n switch (C) {\n case u:\n j && (d && (i = gn(d, this.logger)) && (this.readyVideoParser(o.segmentCodec), this.videoParser !== null && this.videoParser.parsePES(o, c, i, !1)), d = {\n data: [],\n size: 0\n }), d && (d.data.push(e.subarray($, K + Wt)), d.size += K + Wt - $);\n break;\n case h:\n if (j) {\n if (p && (i = gn(p, this.logger)))\n switch (a.segmentCodec) {\n case \"aac\":\n this.parseAACPES(a, i);\n break;\n case \"mp3\":\n this.parseMPEGPES(a, i);\n break;\n case \"ac3\":\n this.parseAC3PES(a, i);\n break;\n }\n p = {\n data: [],\n size: 0\n };\n }\n p && (p.data.push(e.subarray($, K + Wt)), p.size += K + Wt - $);\n break;\n case f:\n j && (y && (i = gn(y, this.logger)) && this.parseID3PES(l, i), y = {\n data: [],\n size: 0\n }), y && (y.data.push(e.subarray($, K + Wt)), y.size += K + Wt - $);\n break;\n case 0:\n j && ($ += e[$] + 1), R = this._pmtId = jT(e, $);\n break;\n case R: {\n j && ($ += e[$] + 1);\n const W = KT(e, $, this.typeSupported, r, this.observer, this.logger);\n u = W.videoPid, u > 0 && (o.pid = u, o.segmentCodec = W.segmentVideoCodec), h = W.audioPid, h > 0 && (a.pid = h, a.segmentCodec = W.segmentAudioCodec), f = W.id3Pid, f > 0 && (l.pid = f), E !== null && !b && (this.logger.warn(`MPEG-TS PMT found at ${K} after unknown PID '${E}'. Backtracking to sync byte @${F} to parse all TS packets.`), E = null, K = F - 188), b = this.pmtParsed = !0;\n break;\n }\n case 17:\n case 8191:\n break;\n default:\n E = C;\n break;\n }\n } else\n M++;\n M > 0 && mc(this.observer, new Error(`Found ${M} TS packet/s that do not start with 0x47`), void 0, this.logger), o.pesData = d, a.pesData = p, l.pesData = y;\n const H = {\n audioTrack: a,\n videoTrack: o,\n id3Track: l,\n textTrack: c\n };\n return n && this.extractRemainingSamples(H), H;\n }\n flush() {\n const {\n remainderData: e\n } = this;\n this.remainderData = null;\n let t;\n return e ? t = this.demux(e, -1, !1, !0) : t = {\n videoTrack: this._videoTrack,\n audioTrack: this._audioTrack,\n id3Track: this._id3Track,\n textTrack: this._txtTrack\n }, this.extractRemainingSamples(t), this.sampleAes ? this.decrypt(t, this.sampleAes) : t;\n }\n extractRemainingSamples(e) {\n const {\n audioTrack: t,\n videoTrack: r,\n id3Track: n,\n textTrack: i\n } = e, o = r.pesData, a = t.pesData, l = n.pesData;\n let c;\n if (o && (c = gn(o, this.logger)) ? (this.readyVideoParser(r.segmentCodec), this.videoParser !== null && (this.videoParser.parsePES(r, i, c, !0), r.pesData = null)) : r.pesData = o, a && (c = gn(a, this.logger))) {\n switch (t.segmentCodec) {\n case \"aac\":\n this.parseAACPES(t, c);\n break;\n case \"mp3\":\n this.parseMPEGPES(t, c);\n break;\n case \"ac3\":\n this.parseAC3PES(t, c);\n break;\n }\n t.pesData = null;\n } else\n a != null && a.size && this.logger.log(\"last AAC PES packet truncated,might overlap between fragments\"), t.pesData = a;\n l && (c = gn(l, this.logger)) ? (this.parseID3PES(n, c), n.pesData = null) : n.pesData = l;\n }\n demuxSampleAes(e, t, r) {\n const n = this.demux(e, r, !0, !this.config.progressive), i = this.sampleAes = new $T(this.observer, this.config, t);\n return this.decrypt(n, i);\n }\n readyVideoParser(e) {\n this.videoParser === null && (e === \"avc\" ? this.videoParser = new GT() : e === \"hevc\" && (this.videoParser = new VT()));\n }\n decrypt(e, t) {\n return new Promise((r) => {\n const {\n audioTrack: n,\n videoTrack: i\n } = e;\n n.samples && n.segmentCodec === \"aac\" ? t.decryptAacSamples(n.samples, 0, () => {\n i.samples ? t.decryptAvcSamples(i.samples, 0, 0, () => {\n r(e);\n }) : r(e);\n }) : i.samples && t.decryptAvcSamples(i.samples, 0, 0, () => {\n r(e);\n });\n });\n }\n destroy() {\n this.observer && this.observer.removeAllListeners(), this.config = this.logger = this.observer = null, this.aacOverFlow = this.videoParser = this.remainderData = this.sampleAes = null, this._videoTrack = this._audioTrack = this._id3Track = this._txtTrack = void 0;\n }\n parseAACPES(e, t) {\n let r = 0;\n const n = this.aacOverFlow;\n let i = t.data;\n if (n) {\n this.aacOverFlow = null;\n const d = n.missing, h = n.sample.unit.byteLength;\n if (d === -1)\n i = _r(n.sample.unit, i);\n else {\n const f = h - d;\n n.sample.unit.set(i.subarray(0, d), f), e.samples.push(n.sample), r = n.missing;\n }\n }\n let o, a;\n for (o = r, a = i.length; o < a - 1 && !na(i, o); o++)\n ;\n if (o !== r) {\n let d;\n const h = o < a - 1;\n if (h ? d = `AAC PES did not start with ADTS header,offset:${o}` : d = \"No ADTS header found in AAC PES\", mc(this.observer, new Error(d), h, this.logger), !h)\n return;\n }\n cp(e, this.observer, i, o, this.audioCodec);\n let l;\n if (t.pts !== void 0)\n l = t.pts;\n else if (n) {\n const d = up(e.samplerate);\n l = n.sample.pts + d;\n } else {\n this.logger.warn(\"[tsdemuxer]: AAC PES unknown PTS\");\n return;\n }\n let c = 0, u;\n for (; o < a; )\n if (u = dp(e, i, o, l, c), o += u.length, u.missing) {\n this.aacOverFlow = u;\n break;\n } else\n for (c++; o < a - 1 && !na(i, o); o++)\n ;\n }\n parseMPEGPES(e, t) {\n const r = t.data, n = r.length;\n let i = 0, o = 0;\n const a = t.pts;\n if (a === void 0) {\n this.logger.warn(\"[tsdemuxer]: MPEG PES unknown PTS\");\n return;\n }\n for (; o < n; )\n if (mp(r, o)) {\n const l = gp(e, r, o, a, i);\n if (l)\n o += l.length, i++;\n else\n break;\n } else\n o++;\n }\n parseAC3PES(e, t) {\n {\n const r = t.data, n = t.pts;\n if (n === void 0) {\n this.logger.warn(\"[tsdemuxer]: AC3 PES unknown PTS\");\n return;\n }\n const i = r.length;\n let o = 0, a = 0, l;\n for (; a < i && (l = Ep(e, r, a, n, o++)) > 0; )\n a += l;\n }\n }\n parseID3PES(e, t) {\n if (t.pts === void 0) {\n this.logger.warn(\"[tsdemuxer]: ID3 PES unknown PTS\");\n return;\n }\n const r = nt({}, t, {\n type: this._videoTrack ? br.emsg : br.audioId3,\n duration: Number.POSITIVE_INFINITY\n });\n e.samples.push(r);\n }\n}\nfunction pc(s, e) {\n return ((s[e + 1] & 31) << 8) + s[e + 2];\n}\nfunction jT(s, e) {\n return (s[e + 10] & 31) << 8 | s[e + 11];\n}\nfunction KT(s, e, t, r, n, i) {\n const o = {\n audioPid: -1,\n videoPid: -1,\n id3Pid: -1,\n segmentVideoCodec: \"avc\",\n segmentAudioCodec: \"aac\"\n }, a = (s[e + 1] & 15) << 8 | s[e + 2], l = e + 3 + a - 4, c = (s[e + 10] & 15) << 8 | s[e + 11];\n for (e += 12 + c; e < l; ) {\n const u = pc(s, e), d = (s[e + 3] & 15) << 8 | s[e + 4];\n switch (s[e]) {\n case 207:\n if (!r) {\n vl(\"ADTS AAC\", i);\n break;\n }\n /* falls through */\n case 15:\n o.audioPid === -1 && (o.audioPid = u);\n break;\n // Packetized metadata (ID3)\n case 21:\n o.id3Pid === -1 && (o.id3Pid = u);\n break;\n case 219:\n if (!r) {\n vl(\"H.264\", i);\n break;\n }\n /* falls through */\n case 27:\n o.videoPid === -1 && (o.videoPid = u);\n break;\n // ISO/IEC 11172-3 (MPEG-1 audio)\n // or ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)\n case 3:\n case 4:\n !t.mpeg && !t.mp3 ? i.log(\"MPEG audio found, not supported in this browser\") : o.audioPid === -1 && (o.audioPid = u, o.segmentAudioCodec = \"mp3\");\n break;\n case 193:\n if (!r) {\n vl(\"AC-3\", i);\n break;\n }\n /* falls through */\n case 129:\n t.ac3 ? o.audioPid === -1 && (o.audioPid = u, o.segmentAudioCodec = \"ac3\") : i.log(\"AC-3 audio found, not supported in this browser\");\n break;\n case 6:\n if (o.audioPid === -1 && d > 0) {\n let h = e + 5, f = d;\n for (; f > 2; ) {\n switch (s[h]) {\n case 106:\n t.ac3 !== !0 ? i.log(\"AC-3 audio found, not supported in this browser for now\") : (o.audioPid = u, o.segmentAudioCodec = \"ac3\");\n break;\n }\n const y = s[h + 1] + 2;\n h += y, f -= y;\n }\n }\n break;\n case 194:\n // SAMPLE-AES EC3\n /* falls through */\n case 135:\n return mc(n, new Error(\"Unsupported EC-3 in M2TS found\"), void 0, i), o;\n case 36:\n o.videoPid === -1 && (o.videoPid = u, o.segmentVideoCodec = \"hevc\", i.log(\"HEVC in M2TS found\"));\n break;\n }\n e += d + 5;\n }\n return o;\n}\nfunction mc(s, e, t, r) {\n r.warn(`parsing error: ${e.message}`), s.emit(I.ERROR, I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_PARSING_ERROR,\n fatal: !1,\n levelRetry: t,\n error: e,\n reason: e.message\n });\n}\nfunction vl(s, e) {\n e.log(`${s} with AES-128-CBC encryption found in unencrypted stream`);\n}\nfunction gn(s, e) {\n let t = 0, r, n, i, o, a;\n const l = s.data;\n if (!s || s.size === 0)\n return null;\n for (; l[0].length < 19 && l.length > 1; )\n l[0] = _r(l[0], l[1]), l.splice(1, 1);\n if (r = l[0], (r[0] << 16) + (r[1] << 8) + r[2] === 1) {\n if (n = (r[4] << 8) + r[5], n && n > s.size - 6)\n return null;\n const u = r[7];\n u & 192 && (o = (r[9] & 14) * 536870912 + // 1 << 29\n (r[10] & 255) * 4194304 + // 1 << 22\n (r[11] & 254) * 16384 + // 1 << 14\n (r[12] & 255) * 128 + // 1 << 7\n (r[13] & 254) / 2, u & 64 ? (a = (r[14] & 14) * 536870912 + // 1 << 29\n (r[15] & 255) * 4194304 + // 1 << 22\n (r[16] & 254) * 16384 + // 1 << 14\n (r[17] & 255) * 128 + // 1 << 7\n (r[18] & 254) / 2, o - a > 60 * 9e4 && (e.warn(`${Math.round((o - a) / 9e4)}s delta between PTS and DTS, align them`), o = a)) : a = o), i = r[8];\n let d = i + 9;\n if (s.size <= d)\n return null;\n s.size -= d;\n const h = new Uint8Array(s.size);\n for (let f = 0, p = l.length; f < p; f++) {\n r = l[f];\n let y = r.byteLength;\n if (d)\n if (d > y) {\n d -= y;\n continue;\n } else\n r = r.subarray(d), y -= d, d = 0;\n h.set(r, t), t += y;\n }\n return n && (n -= i + 3), {\n data: h,\n pts: o,\n dts: a,\n len: n\n };\n }\n return null;\n}\nclass HT {\n static getSilentFrame(e, t) {\n switch (e) {\n case \"mp4a.40.2\":\n if (t === 1)\n return new Uint8Array([0, 200, 0, 128, 35, 128]);\n if (t === 2)\n return new Uint8Array([33, 0, 73, 144, 2, 25, 0, 35, 128]);\n if (t === 3)\n return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 142]);\n if (t === 4)\n return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 128, 44, 128, 8, 2, 56]);\n if (t === 5)\n return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 56]);\n if (t === 6)\n return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 0, 178, 0, 32, 8, 224]);\n break;\n // handle HE-AAC below (mp4a.40.5 / mp4a.40.29)\n default:\n if (t === 1)\n return new Uint8Array([1, 64, 34, 128, 163, 78, 230, 128, 186, 8, 0, 0, 0, 28, 6, 241, 193, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n if (t === 2)\n return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n if (t === 3)\n return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n break;\n }\n }\n}\nconst Ss = Math.pow(2, 32) - 1;\nclass X {\n static init() {\n X.types = {\n avc1: [],\n // codingname\n avcC: [],\n hvc1: [],\n hvcC: [],\n btrt: [],\n dinf: [],\n dref: [],\n esds: [],\n ftyp: [],\n hdlr: [],\n mdat: [],\n mdhd: [],\n mdia: [],\n mfhd: [],\n minf: [],\n moof: [],\n moov: [],\n mp4a: [],\n \".mp3\": [],\n dac3: [],\n \"ac-3\": [],\n mvex: [],\n mvhd: [],\n pasp: [],\n sdtp: [],\n stbl: [],\n stco: [],\n stsc: [],\n stsd: [],\n stsz: [],\n stts: [],\n tfdt: [],\n tfhd: [],\n traf: [],\n trak: [],\n trun: [],\n trex: [],\n tkhd: [],\n vmhd: [],\n smhd: []\n };\n let e;\n for (e in X.types)\n X.types.hasOwnProperty(e) && (X.types[e] = [e.charCodeAt(0), e.charCodeAt(1), e.charCodeAt(2), e.charCodeAt(3)]);\n const t = new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 0,\n // pre_defined\n 118,\n 105,\n 100,\n 101,\n // handler_type: 'vide'\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n // reserved\n 86,\n 105,\n 100,\n 101,\n 111,\n 72,\n 97,\n 110,\n 100,\n 108,\n 101,\n 114,\n 0\n // name: 'VideoHandler'\n ]), r = new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 0,\n // pre_defined\n 115,\n 111,\n 117,\n 110,\n // handler_type: 'soun'\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n // reserved\n 83,\n 111,\n 117,\n 110,\n 100,\n 72,\n 97,\n 110,\n 100,\n 108,\n 101,\n 114,\n 0\n // name: 'SoundHandler'\n ]);\n X.HDLR_TYPES = {\n video: t,\n audio: r\n };\n const n = new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 1,\n // entry_count\n 0,\n 0,\n 0,\n 12,\n // entry_size\n 117,\n 114,\n 108,\n 32,\n // 'url' type\n 0,\n // version 0\n 0,\n 0,\n 1\n // entry_flags\n ]), i = new Uint8Array([\n 0,\n // version\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 0\n // entry_count\n ]);\n X.STTS = X.STSC = X.STCO = i, X.STSZ = new Uint8Array([\n 0,\n // version\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 0,\n // sample_size\n 0,\n 0,\n 0,\n 0\n // sample_count\n ]), X.VMHD = new Uint8Array([\n 0,\n // version\n 0,\n 0,\n 1,\n // flags\n 0,\n 0,\n // graphicsmode\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n // opcolor\n ]), X.SMHD = new Uint8Array([\n 0,\n // version\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n // balance\n 0,\n 0\n // reserved\n ]), X.STSD = new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 1\n ]);\n const o = new Uint8Array([105, 115, 111, 109]), a = new Uint8Array([97, 118, 99, 49]), l = new Uint8Array([0, 0, 0, 1]);\n X.FTYP = X.box(X.types.ftyp, o, l, o, a), X.DINF = X.box(X.types.dinf, X.box(X.types.dref, n));\n }\n static box(e, ...t) {\n let r = 8, n = t.length;\n const i = n;\n for (; n--; )\n r += t[n].byteLength;\n const o = new Uint8Array(r);\n for (o[0] = r >> 24 & 255, o[1] = r >> 16 & 255, o[2] = r >> 8 & 255, o[3] = r & 255, o.set(e, 4), n = 0, r = 8; n < i; n++)\n o.set(t[n], r), r += t[n].byteLength;\n return o;\n }\n static hdlr(e) {\n return X.box(X.types.hdlr, X.HDLR_TYPES[e]);\n }\n static mdat(e) {\n return X.box(X.types.mdat, e);\n }\n static mdhd(e, t) {\n t *= e;\n const r = Math.floor(t / (Ss + 1)), n = Math.floor(t % (Ss + 1));\n return X.box(X.types.mdhd, new Uint8Array([\n 1,\n // version 1\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 2,\n // creation_time\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 3,\n // modification_time\n e >> 24 & 255,\n e >> 16 & 255,\n e >> 8 & 255,\n e & 255,\n // timescale\n r >> 24,\n r >> 16 & 255,\n r >> 8 & 255,\n r & 255,\n n >> 24,\n n >> 16 & 255,\n n >> 8 & 255,\n n & 255,\n 85,\n 196,\n // 'und' language (undetermined)\n 0,\n 0\n ]));\n }\n static mdia(e) {\n return X.box(X.types.mdia, X.mdhd(e.timescale || 0, e.duration || 0), X.hdlr(e.type), X.minf(e));\n }\n static mfhd(e) {\n return X.box(X.types.mfhd, new Uint8Array([\n 0,\n 0,\n 0,\n 0,\n // flags\n e >> 24,\n e >> 16 & 255,\n e >> 8 & 255,\n e & 255\n // sequence_number\n ]));\n }\n static minf(e) {\n return e.type === \"audio\" ? X.box(X.types.minf, X.box(X.types.smhd, X.SMHD), X.DINF, X.stbl(e)) : X.box(X.types.minf, X.box(X.types.vmhd, X.VMHD), X.DINF, X.stbl(e));\n }\n static moof(e, t, r) {\n return X.box(X.types.moof, X.mfhd(e), X.traf(r, t));\n }\n static moov(e) {\n let t = e.length;\n const r = [];\n for (; t--; )\n r[t] = X.trak(e[t]);\n return X.box.apply(null, [X.types.moov, X.mvhd(e[0].timescale || 0, e[0].duration || 0)].concat(r).concat(X.mvex(e)));\n }\n static mvex(e) {\n let t = e.length;\n const r = [];\n for (; t--; )\n r[t] = X.trex(e[t]);\n return X.box.apply(null, [X.types.mvex, ...r]);\n }\n static mvhd(e, t) {\n t *= e;\n const r = Math.floor(t / (Ss + 1)), n = Math.floor(t % (Ss + 1)), i = new Uint8Array([\n 1,\n // version 1\n 0,\n 0,\n 0,\n // flags\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 2,\n // creation_time\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 3,\n // modification_time\n e >> 24 & 255,\n e >> 16 & 255,\n e >> 8 & 255,\n e & 255,\n // timescale\n r >> 24,\n r >> 16 & 255,\n r >> 8 & 255,\n r & 255,\n n >> 24,\n n >> 16 & 255,\n n >> 8 & 255,\n n & 255,\n 0,\n 1,\n 0,\n 0,\n // 1.0 rate\n 1,\n 0,\n // 1.0 volume\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 64,\n 0,\n 0,\n 0,\n // transformation: unity matrix\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // pre_defined\n 255,\n 255,\n 255,\n 255\n // next_track_ID\n ]);\n return X.box(X.types.mvhd, i);\n }\n static sdtp(e) {\n const t = e.samples || [], r = new Uint8Array(4 + t.length);\n let n, i;\n for (n = 0; n < t.length; n++)\n i = t[n].flags, r[n + 4] = i.dependsOn << 4 | i.isDependedOn << 2 | i.hasRedundancy;\n return X.box(X.types.sdtp, r);\n }\n static stbl(e) {\n return X.box(X.types.stbl, X.stsd(e), X.box(X.types.stts, X.STTS), X.box(X.types.stsc, X.STSC), X.box(X.types.stsz, X.STSZ), X.box(X.types.stco, X.STCO));\n }\n static avc1(e) {\n let t = [], r = [], n, i, o;\n for (n = 0; n < e.sps.length; n++)\n i = e.sps[n], o = i.byteLength, t.push(o >>> 8 & 255), t.push(o & 255), t = t.concat(Array.prototype.slice.call(i));\n for (n = 0; n < e.pps.length; n++)\n i = e.pps[n], o = i.byteLength, r.push(o >>> 8 & 255), r.push(o & 255), r = r.concat(Array.prototype.slice.call(i));\n const a = X.box(X.types.avcC, new Uint8Array([\n 1,\n // version\n t[3],\n // profile\n t[4],\n // profile compat\n t[5],\n // level\n 255,\n // lengthSizeMinusOne, hard-coded to 4 bytes\n 224 | e.sps.length\n // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(t).concat([\n e.pps.length\n // numOfPictureParameterSets\n ]).concat(r))), l = e.width, c = e.height, u = e.pixelRatio[0], d = e.pixelRatio[1];\n return X.box(\n X.types.avc1,\n new Uint8Array([\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n // reserved\n 0,\n 1,\n // data_reference_index\n 0,\n 0,\n // pre_defined\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // pre_defined\n l >> 8 & 255,\n l & 255,\n // width\n c >> 8 & 255,\n c & 255,\n // height\n 0,\n 72,\n 0,\n 0,\n // horizresolution\n 0,\n 72,\n 0,\n 0,\n // vertresolution\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 1,\n // frame_count\n 18,\n 100,\n 97,\n 105,\n 108,\n // dailymotion/hls.js\n 121,\n 109,\n 111,\n 116,\n 105,\n 111,\n 110,\n 47,\n 104,\n 108,\n 115,\n 46,\n 106,\n 115,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // compressorname\n 0,\n 24,\n // depth = 24\n 17,\n 17\n ]),\n // pre_defined = -1\n a,\n X.box(X.types.btrt, new Uint8Array([\n 0,\n 28,\n 156,\n 128,\n // bufferSizeDB\n 0,\n 45,\n 198,\n 192,\n // maxBitrate\n 0,\n 45,\n 198,\n 192\n ])),\n // avgBitrate\n X.box(X.types.pasp, new Uint8Array([\n u >> 24,\n // hSpacing\n u >> 16 & 255,\n u >> 8 & 255,\n u & 255,\n d >> 24,\n // vSpacing\n d >> 16 & 255,\n d >> 8 & 255,\n d & 255\n ]))\n );\n }\n static esds(e) {\n const t = e.config;\n return new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n 3,\n // descriptor_type\n 25,\n // length\n 0,\n 1,\n // es_id\n 0,\n // stream_priority\n 4,\n // descriptor_type\n 17,\n // length\n 64,\n // codec : mpeg4_audio\n 21,\n // stream_type\n 0,\n 0,\n 0,\n // buffer_size\n 0,\n 0,\n 0,\n 0,\n // maxBitrate\n 0,\n 0,\n 0,\n 0,\n // avgBitrate\n 5,\n // descriptor_type\n 2,\n // length\n ...t,\n 6,\n 1,\n 2\n // GASpecificConfig)); // length + audio config descriptor\n ]);\n }\n static audioStsd(e) {\n const t = e.samplerate || 0;\n return new Uint8Array([\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n // reserved\n 0,\n 1,\n // data_reference_index\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n e.channelCount || 0,\n // channelcount\n 0,\n 16,\n // sampleSize:16bits\n 0,\n 0,\n 0,\n 0,\n // reserved2\n t >> 8 & 255,\n t & 255,\n //\n 0,\n 0\n ]);\n }\n static mp4a(e) {\n return X.box(X.types.mp4a, X.audioStsd(e), X.box(X.types.esds, X.esds(e)));\n }\n static mp3(e) {\n return X.box(X.types[\".mp3\"], X.audioStsd(e));\n }\n static ac3(e) {\n return X.box(X.types[\"ac-3\"], X.audioStsd(e), X.box(X.types.dac3, e.config));\n }\n static stsd(e) {\n const {\n segmentCodec: t\n } = e;\n if (e.type === \"audio\") {\n if (t === \"aac\")\n return X.box(X.types.stsd, X.STSD, X.mp4a(e));\n if (t === \"ac3\" && e.config)\n return X.box(X.types.stsd, X.STSD, X.ac3(e));\n if (t === \"mp3\" && e.codec === \"mp3\")\n return X.box(X.types.stsd, X.STSD, X.mp3(e));\n } else if (e.pps && e.sps) {\n if (t === \"avc\")\n return X.box(X.types.stsd, X.STSD, X.avc1(e));\n if (t === \"hevc\" && e.vps)\n return X.box(X.types.stsd, X.STSD, X.hvc1(e));\n } else\n throw new Error(\"video track missing pps or sps\");\n throw new Error(`unsupported ${e.type} segment codec (${t}/${e.codec})`);\n }\n static tkhd(e) {\n const t = e.id, r = (e.duration || 0) * (e.timescale || 0), n = e.width || 0, i = e.height || 0, o = Math.floor(r / (Ss + 1)), a = Math.floor(r % (Ss + 1));\n return X.box(X.types.tkhd, new Uint8Array([\n 1,\n // version 1\n 0,\n 0,\n 7,\n // flags\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 2,\n // creation_time\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 3,\n // modification_time\n t >> 24 & 255,\n t >> 16 & 255,\n t >> 8 & 255,\n t & 255,\n // track_ID\n 0,\n 0,\n 0,\n 0,\n // reserved\n o >> 24,\n o >> 16 & 255,\n o >> 8 & 255,\n o & 255,\n a >> 24,\n a >> 16 & 255,\n a >> 8 & 255,\n a & 255,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n // layer\n 0,\n 0,\n // alternate_group\n 0,\n 0,\n // non-audio track volume\n 0,\n 0,\n // reserved\n 0,\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 64,\n 0,\n 0,\n 0,\n // transformation: unity matrix\n n >> 8 & 255,\n n & 255,\n 0,\n 0,\n // width\n i >> 8 & 255,\n i & 255,\n 0,\n 0\n // height\n ]));\n }\n static traf(e, t) {\n const r = X.sdtp(e), n = e.id, i = Math.floor(t / (Ss + 1)), o = Math.floor(t % (Ss + 1));\n return X.box(\n X.types.traf,\n X.box(X.types.tfhd, new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n n >> 24,\n n >> 16 & 255,\n n >> 8 & 255,\n n & 255\n // track_ID\n ])),\n X.box(X.types.tfdt, new Uint8Array([\n 1,\n // version 1\n 0,\n 0,\n 0,\n // flags\n i >> 24,\n i >> 16 & 255,\n i >> 8 & 255,\n i & 255,\n o >> 24,\n o >> 16 & 255,\n o >> 8 & 255,\n o & 255\n ])),\n X.trun(e, r.length + 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8),\n // mdat header\n r\n );\n }\n /**\n * Generate a track box.\n * @param track a track definition\n */\n static trak(e) {\n return e.duration = e.duration || 4294967295, X.box(X.types.trak, X.tkhd(e), X.mdia(e));\n }\n static trex(e) {\n const t = e.id;\n return X.box(X.types.trex, new Uint8Array([\n 0,\n // version 0\n 0,\n 0,\n 0,\n // flags\n t >> 24,\n t >> 16 & 255,\n t >> 8 & 255,\n t & 255,\n // track_ID\n 0,\n 0,\n 0,\n 1,\n // default_sample_description_index\n 0,\n 0,\n 0,\n 0,\n // default_sample_duration\n 0,\n 0,\n 0,\n 0,\n // default_sample_size\n 0,\n 1,\n 0,\n 1\n // default_sample_flags\n ]));\n }\n static trun(e, t) {\n const r = e.samples || [], n = r.length, i = 12 + 16 * n, o = new Uint8Array(i);\n let a, l, c, u, d, h;\n for (t += 8 + i, o.set([\n e.type === \"video\" ? 1 : 0,\n // version 1 for video with signed-int sample_composition_time_offset\n 0,\n 15,\n 1,\n // flags\n n >>> 24 & 255,\n n >>> 16 & 255,\n n >>> 8 & 255,\n n & 255,\n // sample_count\n t >>> 24 & 255,\n t >>> 16 & 255,\n t >>> 8 & 255,\n t & 255\n // data_offset\n ], 0), a = 0; a < n; a++)\n l = r[a], c = l.duration, u = l.size, d = l.flags, h = l.cts, o.set([\n c >>> 24 & 255,\n c >>> 16 & 255,\n c >>> 8 & 255,\n c & 255,\n // sample_duration\n u >>> 24 & 255,\n u >>> 16 & 255,\n u >>> 8 & 255,\n u & 255,\n // sample_size\n d.isLeading << 2 | d.dependsOn,\n d.isDependedOn << 6 | d.hasRedundancy << 4 | d.paddingValue << 1 | d.isNonSync,\n d.degradPrio & 61440,\n d.degradPrio & 15,\n // sample_flags\n h >>> 24 & 255,\n h >>> 16 & 255,\n h >>> 8 & 255,\n h & 255\n // sample_composition_time_offset\n ], 12 + 16 * a);\n return X.box(X.types.trun, o);\n }\n static initSegment(e) {\n X.types || X.init();\n const t = X.moov(e);\n return _r(X.FTYP, t);\n }\n static hvc1(e) {\n const t = e.params, r = [e.vps, e.sps, e.pps], n = 4, i = new Uint8Array([1, t.general_profile_space << 6 | (t.general_tier_flag ? 32 : 0) | t.general_profile_idc, t.general_profile_compatibility_flags[0], t.general_profile_compatibility_flags[1], t.general_profile_compatibility_flags[2], t.general_profile_compatibility_flags[3], t.general_constraint_indicator_flags[0], t.general_constraint_indicator_flags[1], t.general_constraint_indicator_flags[2], t.general_constraint_indicator_flags[3], t.general_constraint_indicator_flags[4], t.general_constraint_indicator_flags[5], t.general_level_idc, 240 | t.min_spatial_segmentation_idc >> 8, 255 & t.min_spatial_segmentation_idc, 252 | t.parallelismType, 252 | t.chroma_format_idc, 248 | t.bit_depth_luma_minus8, 248 | t.bit_depth_chroma_minus8, 0, parseInt(t.frame_rate.fps), n - 1 | t.temporal_id_nested << 2 | t.num_temporal_layers << 3 | (t.frame_rate.fixed ? 64 : 0), r.length]);\n let o = i.length;\n for (let p = 0; p < r.length; p += 1) {\n o += 3;\n for (let y = 0; y < r[p].length; y += 1)\n o += 2 + r[p][y].length;\n }\n const a = new Uint8Array(o);\n a.set(i, 0), o = i.length;\n const l = r.length - 1;\n for (let p = 0; p < r.length; p += 1) {\n a.set(new Uint8Array([32 + p | (p === l ? 128 : 0), 0, r[p].length]), o), o += 3;\n for (let y = 0; y < r[p].length; y += 1)\n a.set(new Uint8Array([r[p][y].length >> 8, r[p][y].length & 255]), o), o += 2, a.set(r[p][y], o), o += r[p][y].length;\n }\n const c = X.box(X.types.hvcC, a), u = e.width, d = e.height, h = e.pixelRatio[0], f = e.pixelRatio[1];\n return X.box(\n X.types.hvc1,\n new Uint8Array([\n 0,\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n // reserved\n 0,\n 1,\n // data_reference_index\n 0,\n 0,\n // pre_defined\n 0,\n 0,\n // reserved\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // pre_defined\n u >> 8 & 255,\n u & 255,\n // width\n d >> 8 & 255,\n d & 255,\n // height\n 0,\n 72,\n 0,\n 0,\n // horizresolution\n 0,\n 72,\n 0,\n 0,\n // vertresolution\n 0,\n 0,\n 0,\n 0,\n // reserved\n 0,\n 1,\n // frame_count\n 18,\n 100,\n 97,\n 105,\n 108,\n // dailymotion/hls.js\n 121,\n 109,\n 111,\n 116,\n 105,\n 111,\n 110,\n 47,\n 104,\n 108,\n 115,\n 46,\n 106,\n 115,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n // compressorname\n 0,\n 24,\n // depth = 24\n 17,\n 17\n ]),\n // pre_defined = -1\n c,\n X.box(X.types.btrt, new Uint8Array([\n 0,\n 28,\n 156,\n 128,\n // bufferSizeDB\n 0,\n 45,\n 198,\n 192,\n // maxBitrate\n 0,\n 45,\n 198,\n 192\n ])),\n // avgBitrate\n X.box(X.types.pasp, new Uint8Array([\n h >> 24,\n // hSpacing\n h >> 16 & 255,\n h >> 8 & 255,\n h & 255,\n f >> 24,\n // vSpacing\n f >> 16 & 255,\n f >> 8 & 255,\n f & 255\n ]))\n );\n }\n}\nX.types = void 0;\nX.HDLR_TYPES = void 0;\nX.STTS = void 0;\nX.STSC = void 0;\nX.STCO = void 0;\nX.STSZ = void 0;\nX.VMHD = void 0;\nX.SMHD = void 0;\nX.STSD = void 0;\nX.FTYP = void 0;\nX.DINF = void 0;\nconst Sp = 9e4;\nfunction Cu(s, e, t = 1, r = !1) {\n const n = s * e * t;\n return r ? Math.round(n) : n;\n}\nfunction qT(s, e, t = 1, r = !1) {\n return Cu(s, e, 1 / t, r);\n}\nfunction qn(s, e = !1) {\n return Cu(s, 1e3, 1 / Sp, e);\n}\nfunction WT(s, e = 1) {\n return Cu(s, Sp, 1 / e);\n}\nconst zT = 10 * 1e3, YT = 1024, ZT = 1152, XT = 1536;\nlet pn = null, El = null;\nfunction Uh(s, e, t, r) {\n return {\n duration: e,\n size: t,\n cts: r,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: s ? 2 : 1,\n isNonSync: s ? 0 : 1\n }\n };\n}\nclass mo extends Lr {\n constructor(e, t, r, n) {\n if (super(\"mp4-remuxer\", n), this.observer = void 0, this.config = void 0, this.typeSupported = void 0, this.ISGenerated = !1, this._initPTS = null, this._initDTS = null, this.nextVideoTs = null, this.nextAudioTs = null, this.videoSampleDuration = null, this.isAudioContiguous = !1, this.isVideoContiguous = !1, this.videoTrackConfig = void 0, this.observer = e, this.config = t, this.typeSupported = r, this.ISGenerated = !1, pn === null) {\n const o = (navigator.userAgent || \"\").match(/Chrome\\/(\\d+)/i);\n pn = o ? parseInt(o[1]) : 0;\n }\n if (El === null) {\n const i = navigator.userAgent.match(/Safari\\/(\\d+)/i);\n El = i ? parseInt(i[1]) : 0;\n }\n }\n destroy() {\n this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;\n }\n resetTimeStamp(e) {\n this.log(\"initPTS & initDTS reset\"), this._initPTS = this._initDTS = e;\n }\n resetNextTimestamp() {\n this.log(\"reset next timestamp\"), this.isVideoContiguous = !1, this.isAudioContiguous = !1;\n }\n resetInitSegment() {\n this.log(\"ISGenerated flag reset\"), this.ISGenerated = !1, this.videoTrackConfig = void 0;\n }\n getVideoStartPts(e) {\n let t = !1;\n const r = e[0].pts, n = e.reduce((i, o) => {\n let a = o.pts, l = a - i;\n return l < -4294967296 && (t = !0, a = Ar(a, r), l = a - i), l > 0 ? i : a;\n }, r);\n return t && this.debug(\"PTS rollover detected\"), n;\n }\n remux(e, t, r, n, i, o, a, l) {\n let c, u, d, h, f, p, y = i, E = i;\n const b = e.pid > -1, R = t.pid > -1, A = t.samples.length, F = e.samples.length > 0, M = a && A > 0 || A > 1;\n if ((!b || F) && (!R || M) || this.ISGenerated || a) {\n if (this.ISGenerated) {\n var K, j, C, k;\n const g = this.videoTrackConfig;\n (g && (t.width !== g.width || t.height !== g.height || ((K = t.pixelRatio) == null ? void 0 : K[0]) !== ((j = g.pixelRatio) == null ? void 0 : j[0]) || ((C = t.pixelRatio) == null ? void 0 : C[1]) !== ((k = g.pixelRatio) == null ? void 0 : k[1])) || !g && M || this.nextAudioTs === null && F) && this.resetInitSegment();\n }\n this.ISGenerated || (d = this.generateIS(e, t, i, o));\n const $ = this.isVideoContiguous;\n let W = -1, _;\n if (M && (W = JT(t.samples), !$ && this.config.forceKeyFrameOnDiscontinuity))\n if (p = !0, W > 0) {\n this.warn(`Dropped ${W} out of ${A} video samples due to a missing keyframe`);\n const g = this.getVideoStartPts(t.samples);\n t.samples = t.samples.slice(W), t.dropped += W, E += (t.samples[0].pts - g) / t.inputTimeScale, _ = E;\n } else W === -1 && (this.warn(`No keyframe found out of ${A} video samples`), p = !1);\n if (this.ISGenerated) {\n if (F && M) {\n const g = this.getVideoStartPts(t.samples), w = (Ar(e.samples[0].pts, g) - g) / t.inputTimeScale;\n y += Math.max(0, w), E += Math.max(0, -w);\n }\n if (F) {\n if (e.samplerate || (this.warn(\"regenerate InitSegment as audio detected\"), d = this.generateIS(e, t, i, o)), u = this.remuxAudio(e, y, this.isAudioContiguous, o, R || M || l === pe.AUDIO ? E : void 0), M) {\n const g = u ? u.endPTS - u.startPTS : 0;\n t.inputTimeScale || (this.warn(\"regenerate InitSegment as video detected\"), d = this.generateIS(e, t, i, o)), c = this.remuxVideo(t, E, $, g);\n }\n } else M && (c = this.remuxVideo(t, E, $, 0));\n c && (c.firstKeyFrame = W, c.independent = W !== -1, c.firstKeyFramePTS = _);\n }\n }\n return this.ISGenerated && this._initPTS && this._initDTS && (r.samples.length && (f = bp(r, i, this._initPTS, this._initDTS)), n.samples.length && (h = Tp(n, i, this._initPTS))), {\n audio: u,\n video: c,\n initSegment: d,\n independent: p,\n text: h,\n id3: f\n };\n }\n generateIS(e, t, r, n) {\n const i = e.samples, o = t.samples, a = this.typeSupported, l = {}, c = this._initPTS;\n let u = !c || n, d = \"audio/mp4\", h, f, p, y = -1;\n if (u && (h = f = 1 / 0), e.config && i.length) {\n switch (e.timescale = e.samplerate, e.segmentCodec) {\n case \"mp3\":\n a.mpeg ? (d = \"audio/mpeg\", e.codec = \"\") : a.mp3 && (e.codec = \"mp3\");\n break;\n case \"ac3\":\n e.codec = \"ac-3\";\n break;\n }\n l.audio = {\n id: \"audio\",\n container: d,\n codec: e.codec,\n initSegment: e.segmentCodec === \"mp3\" && a.mpeg ? new Uint8Array(0) : X.initSegment([e]),\n metadata: {\n channelCount: e.channelCount\n }\n }, u && (y = e.id, p = e.inputTimeScale, !c || p !== c.timescale ? h = f = i[0].pts - Math.round(p * r) : u = !1);\n }\n if (t.sps && t.pps && o.length) {\n if (t.timescale = t.inputTimeScale, l.video = {\n id: \"main\",\n container: \"video/mp4\",\n codec: t.codec,\n initSegment: X.initSegment([t]),\n metadata: {\n width: t.width,\n height: t.height\n }\n }, u)\n if (y = t.id, p = t.inputTimeScale, !c || p !== c.timescale) {\n const E = this.getVideoStartPts(o), b = Math.round(p * r);\n f = Math.min(f, Ar(o[0].dts, E) - b), h = Math.min(h, E - b);\n } else\n u = !1;\n this.videoTrackConfig = {\n width: t.width,\n height: t.height,\n pixelRatio: t.pixelRatio\n };\n }\n if (Object.keys(l).length)\n return this.ISGenerated = !0, u ? (c && this.warn(`Timestamps at playlist time: ${n ? \"\" : \"~\"}${r} ${h / p} != initPTS: ${c.baseTime / c.timescale} (${c.baseTime}/${c.timescale}) trackId: ${c.trackId}`), this.log(`Found initPTS at playlist time: ${r} offset: ${h / p} (${h}/${p}) trackId: ${y}`), this._initPTS = {\n baseTime: h,\n timescale: p,\n trackId: y\n }, this._initDTS = {\n baseTime: f,\n timescale: p,\n trackId: y\n }) : h = p = void 0, {\n tracks: l,\n initPTS: h,\n timescale: p,\n trackId: y\n };\n }\n remuxVideo(e, t, r, n) {\n const i = e.inputTimeScale, o = e.samples, a = [], l = o.length, c = this._initPTS, u = c.baseTime * i / c.timescale;\n let d = this.nextVideoTs, h = 8, f = this.videoSampleDuration, p, y, E = Number.POSITIVE_INFINITY, b = Number.NEGATIVE_INFINITY, R = !1;\n if (!r || d === null) {\n const L = u + t * i, m = o[0].pts - Ar(o[0].dts, o[0].pts);\n pn && d !== null && Math.abs(L - m - (d + u)) < 15e3 ? r = !0 : d = L - m - u;\n }\n const A = d + u;\n for (let L = 0; L < l; L++) {\n const m = o[L];\n m.pts = Ar(m.pts, A), m.dts = Ar(m.dts, A), m.dts < o[L > 0 ? L - 1 : L].dts && (R = !0);\n }\n R && o.sort(function(L, m) {\n const v = L.dts - m.dts, P = L.pts - m.pts;\n return v || P;\n }), p = o[0].dts, y = o[o.length - 1].dts;\n const F = y - p, M = F ? Math.round(F / (l - 1)) : f || e.inputTimeScale / 30;\n if (r) {\n const L = p - A, m = L > M, v = L < -1;\n if ((m || v) && (m ? this.warn(`${(e.segmentCodec || \"\").toUpperCase()}: ${qn(L, !0)} ms (${L}dts) hole between fragments detected at ${t.toFixed(3)}`) : this.warn(`${(e.segmentCodec || \"\").toUpperCase()}: ${qn(-L, !0)} ms (${L}dts) overlapping between fragments detected at ${t.toFixed(3)}`), !v || A >= o[0].pts || pn)) {\n p = A;\n const P = o[0].pts - L;\n if (m)\n o[0].dts = p, o[0].pts = P;\n else {\n let N = !0;\n for (let Y = 0; Y < o.length && !(o[Y].dts > P && N); Y++) {\n const ee = o[Y].pts;\n if (o[Y].dts -= L, o[Y].pts -= L, Y < o.length - 1) {\n const ie = o[Y + 1].pts, le = o[Y].pts, Te = ie <= le, De = ie <= ee;\n N = Te == De;\n }\n }\n }\n this.log(`Video: Initial PTS/DTS adjusted: ${qn(P, !0)}/${qn(p, !0)}, delta: ${qn(L, !0)} ms`);\n }\n }\n p = Math.max(0, p);\n let H = 0, K = 0, j = p;\n for (let L = 0; L < l; L++) {\n const m = o[L], v = m.units, P = v.length;\n let N = 0;\n for (let Y = 0; Y < P; Y++)\n N += v[Y].data.length;\n K += N, H += P, m.length = N, m.dts < j ? (m.dts = j, j += M / 4 | 0 || 1) : j = m.dts, E = Math.min(m.pts, E), b = Math.max(m.pts, b);\n }\n y = o[l - 1].dts;\n const C = K + 4 * H + 8;\n let k;\n try {\n k = new Uint8Array(C);\n } catch (L) {\n this.observer.emit(I.ERROR, I.ERROR, {\n type: ve.MUX_ERROR,\n details: J.REMUX_ALLOC_ERROR,\n fatal: !1,\n error: L,\n bytes: C,\n reason: `fail allocating video mdat ${C}`\n });\n return;\n }\n const $ = new DataView(k.buffer);\n $.setUint32(0, C), k.set(X.types.mdat, 4);\n let W = !1, _ = Number.POSITIVE_INFINITY, g = Number.POSITIVE_INFINITY, x = Number.NEGATIVE_INFINITY, w = Number.NEGATIVE_INFINITY;\n for (let L = 0; L < l; L++) {\n const m = o[L], v = m.units;\n let P = 0;\n for (let ee = 0, ie = v.length; ee < ie; ee++) {\n const le = v[ee], Te = le.data, De = le.data.byteLength;\n $.setUint32(h, De), h += 4, k.set(Te, h), h += De, P += 4 + De;\n }\n let N;\n if (L < l - 1)\n f = o[L + 1].dts - m.dts, N = o[L + 1].pts - m.pts;\n else {\n const ee = this.config, ie = L > 0 ? m.dts - o[L - 1].dts : M;\n if (N = L > 0 ? m.pts - o[L - 1].pts : M, ee.stretchShortVideoTrack && this.nextAudioTs !== null) {\n const le = Math.floor(ee.maxBufferHole * i), Te = (n ? E + n * i : this.nextAudioTs + u) - m.pts;\n Te > le ? (f = Te - ie, f < 0 ? f = ie : W = !0, this.log(`It is approximately ${Te / 90} ms to the next segment; using duration ${f / 90} ms for the last video frame.`)) : f = ie;\n } else\n f = ie;\n }\n const Y = Math.round(m.pts - m.dts);\n _ = Math.min(_, f), x = Math.max(x, f), g = Math.min(g, N), w = Math.max(w, N), a.push(Uh(m.key, f, P, Y));\n }\n if (a.length) {\n if (pn) {\n if (pn < 70) {\n const L = a[0].flags;\n L.dependsOn = 2, L.isNonSync = 0;\n }\n } else if (El && w - g < x - _ && M / x < 0.025 && a[0].cts === 0) {\n this.warn(\"Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.\");\n let L = p;\n for (let m = 0, v = a.length; m < v; m++) {\n const P = L + a[m].duration, N = L + a[m].cts;\n if (m < v - 1) {\n const Y = P + a[m + 1].cts;\n a[m].duration = Y - N;\n } else\n a[m].duration = m ? a[m - 1].duration : M;\n a[m].cts = 0, L = P;\n }\n }\n }\n f = W || !f ? M : f;\n const D = y + f;\n this.nextVideoTs = d = D - u, this.videoSampleDuration = f, this.isVideoContiguous = !0;\n const V = {\n data1: X.moof(e.sequenceNumber++, p, nt(e, {\n samples: a\n })),\n data2: k,\n startPTS: (E - u) / i,\n endPTS: (b + f - u) / i,\n startDTS: (p - u) / i,\n endDTS: d / i,\n type: \"video\",\n hasAudio: !1,\n hasVideo: !0,\n nb: a.length,\n dropped: e.dropped\n };\n return e.samples = [], e.dropped = 0, V;\n }\n getSamplesPerFrame(e) {\n switch (e.segmentCodec) {\n case \"mp3\":\n return ZT;\n case \"ac3\":\n return XT;\n default:\n return YT;\n }\n }\n remuxAudio(e, t, r, n, i) {\n const o = e.inputTimeScale, a = e.samplerate ? e.samplerate : o, l = o / a, c = this.getSamplesPerFrame(e), u = c * l, d = this._initPTS, h = e.segmentCodec === \"mp3\" && this.typeSupported.mpeg, f = [], p = i !== void 0;\n let y = e.samples, E = h ? 0 : 8, b = this.nextAudioTs || -1;\n const R = d.baseTime * o / d.timescale, A = R + t * o;\n if (this.isAudioContiguous = r = r || y.length && b > 0 && (n && Math.abs(A - (b + R)) < 9e3 || Math.abs(Ar(y[0].pts, A) - (b + R)) < 20 * u), y.forEach(function(w) {\n w.pts = Ar(w.pts, A);\n }), !r || b < 0) {\n if (y = y.filter((w) => w.pts >= 0), !y.length)\n return;\n i === 0 ? b = 0 : n && !p ? b = Math.max(0, A - R) : b = y[0].pts - R;\n }\n if (e.segmentCodec === \"aac\") {\n const w = this.config.maxAudioFramesDrift;\n for (let D = 0, O = b + R; D < y.length; D++) {\n const U = y[D], V = U.pts, L = V - O, m = Math.abs(1e3 * L / o);\n if (L <= -w * u && p)\n D === 0 && (this.warn(`Audio frame @ ${(V / o).toFixed(3)}s overlaps marker by ${Math.round(1e3 * L / o)} ms.`), this.nextAudioTs = b = V - R, O = V);\n else if (L >= w * u && m < zT && p) {\n let v = Math.round(L / u);\n for (O = V - v * u; O < 0 && v && u; )\n v--, O += u;\n D === 0 && (this.nextAudioTs = b = O - R), this.warn(`Injecting ${v} audio frames @ ${((O - R) / o).toFixed(3)}s due to ${Math.round(1e3 * L / o)} ms gap.`);\n for (let P = 0; P < v; P++) {\n let N = HT.getSilentFrame(e.parsedCodec || e.manifestCodec || e.codec, e.channelCount);\n N || (this.log(\"Unable to get silent frame for given audio codec; duplicating last frame instead.\"), N = U.unit.subarray()), y.splice(D, 0, {\n unit: N,\n pts: O\n }), O += u, D++;\n }\n }\n U.pts = O, O += u;\n }\n }\n let F = null, M = null, H, K = 0, j = y.length;\n for (; j--; )\n K += y[j].unit.byteLength;\n for (let w = 0, D = y.length; w < D; w++) {\n const O = y[w], U = O.unit;\n let V = O.pts;\n if (M !== null) {\n const m = f[w - 1];\n m.duration = Math.round((V - M) / l);\n } else if (r && e.segmentCodec === \"aac\" && (V = b + R), F = V, K > 0) {\n K += E;\n try {\n H = new Uint8Array(K);\n } catch (m) {\n this.observer.emit(I.ERROR, I.ERROR, {\n type: ve.MUX_ERROR,\n details: J.REMUX_ALLOC_ERROR,\n fatal: !1,\n error: m,\n bytes: K,\n reason: `fail allocating audio mdat ${K}`\n });\n return;\n }\n h || (new DataView(H.buffer).setUint32(0, K), H.set(X.types.mdat, 4));\n } else\n return;\n H.set(U, E);\n const L = U.byteLength;\n E += L, f.push(Uh(!0, c, L, 0)), M = V;\n }\n const C = f.length;\n if (!C)\n return;\n const k = f[f.length - 1];\n b = M - R, this.nextAudioTs = b + l * k.duration;\n const $ = h ? new Uint8Array(0) : X.moof(e.sequenceNumber++, F / l, nt({}, e, {\n samples: f\n }));\n e.samples = [];\n const W = (F - R) / o, _ = b / o, x = {\n data1: $,\n data2: H,\n startPTS: W,\n endPTS: _,\n startDTS: W,\n endDTS: _,\n type: \"audio\",\n hasAudio: !0,\n hasVideo: !1,\n nb: C\n };\n return this.isAudioContiguous = !0, x;\n }\n}\nfunction Ar(s, e) {\n let t;\n if (e === null)\n return s;\n for (e < s ? t = -8589934592 : t = 8589934592; Math.abs(s - e) > 4294967296; )\n s += t;\n return s;\n}\nfunction JT(s) {\n for (let e = 0; e < s.length; e++)\n if (s[e].key)\n return e;\n return -1;\n}\nfunction bp(s, e, t, r) {\n const n = s.samples.length;\n if (!n)\n return;\n const i = s.inputTimeScale;\n for (let a = 0; a < n; a++) {\n const l = s.samples[a];\n l.pts = Ar(l.pts - t.baseTime * i / t.timescale, e * i) / i, l.dts = Ar(l.dts - r.baseTime * i / r.timescale, e * i) / i;\n }\n const o = s.samples;\n return s.samples = [], {\n samples: o\n };\n}\nfunction Tp(s, e, t) {\n const r = s.samples.length;\n if (!r)\n return;\n const n = s.inputTimeScale;\n for (let o = 0; o < r; o++) {\n const a = s.samples[o];\n a.pts = Ar(a.pts - t.baseTime * n / t.timescale, e * n) / n;\n }\n s.samples.sort((o, a) => o.pts - a.pts);\n const i = s.samples;\n return s.samples = [], {\n samples: i\n };\n}\nclass QT extends Lr {\n constructor(e, t, r, n) {\n super(\"passthrough-remuxer\", n), this.emitInitSegment = !1, this.audioCodec = void 0, this.videoCodec = void 0, this.initData = void 0, this.initPTS = null, this.initTracks = void 0, this.lastEndTime = null, this.isVideoContiguous = !1;\n }\n destroy() {\n }\n resetTimeStamp(e) {\n this.lastEndTime = null;\n const t = this.initPTS;\n t && e && t.baseTime === e.baseTime && t.timescale === e.timescale || (this.initPTS = e);\n }\n resetNextTimestamp() {\n this.isVideoContiguous = !1, this.lastEndTime = null;\n }\n resetInitSegment(e, t, r, n) {\n this.audioCodec = t, this.videoCodec = r, this.generateInitSegment(e, n), this.emitInitSegment = !0;\n }\n generateInitSegment(e, t) {\n let {\n audioCodec: r,\n videoCodec: n\n } = this;\n if (!(e != null && e.byteLength)) {\n this.initTracks = void 0, this.initData = void 0;\n return;\n }\n const {\n audio: i,\n video: o\n } = this.initData = Dg(e);\n if (t)\n $S(e, t);\n else {\n const l = i || o;\n l != null && l.encrypted && this.warn(`Init segment with encrypted track with has no key (\"${l.codec}\")!`);\n }\n i && (r = $h(i, ot.AUDIO, this)), o && (n = $h(o, ot.VIDEO, this));\n const a = {};\n i && o ? a.audiovideo = {\n container: \"video/mp4\",\n codec: r + \",\" + n,\n supplemental: o.supplemental,\n encrypted: o.encrypted,\n initSegment: e,\n id: \"main\"\n } : i ? a.audio = {\n container: \"audio/mp4\",\n codec: r,\n encrypted: i.encrypted,\n initSegment: e,\n id: \"audio\"\n } : o ? a.video = {\n container: \"video/mp4\",\n codec: n,\n supplemental: o.supplemental,\n encrypted: o.encrypted,\n initSegment: e,\n id: \"main\"\n } : this.warn(\"initSegment does not contain moov or trak boxes.\"), this.initTracks = a;\n }\n remux(e, t, r, n, i, o) {\n var a, l;\n let {\n initPTS: c,\n lastEndTime: u\n } = this;\n const d = {\n audio: void 0,\n video: void 0,\n text: n,\n id3: r,\n initSegment: void 0\n };\n ue(u) || (u = this.lastEndTime = i || 0);\n const h = t.samples;\n if (!h.length)\n return d;\n const f = {\n initPTS: void 0,\n timescale: void 0,\n trackId: void 0\n };\n let p = this.initData;\n if ((a = p) != null && a.length || (this.generateInitSegment(h), p = this.initData), !((l = p) != null && l.length))\n return this.warn(\"Failed to generate initSegment.\"), d;\n this.emitInitSegment && (f.tracks = this.initTracks, this.emitInitSegment = !1);\n const y = GS(h, p, this), E = p.audio ? y[p.audio.id] : null, b = p.video ? y[p.video.id] : null, R = Zi(b, 1 / 0), A = Zi(E, 1 / 0), F = Zi(b, 0, !0), M = Zi(E, 0, !0);\n let H = i, K = 0;\n const j = E && (!b || !c && A < R || c && c.trackId === p.audio.id), C = j ? E : b;\n if (C) {\n const O = C.timescale, U = C.start - i * O, V = j ? p.audio.id : p.video.id;\n H = C.start / O, K = j ? M - A : F - R, (o || !c) && (e2(c, H, i, K) || O !== c.timescale) && (c && this.warn(`Timestamps at playlist time: ${o ? \"\" : \"~\"}${i} ${U / O} != initPTS: ${c.baseTime / c.timescale} (${c.baseTime}/${c.timescale}) trackId: ${c.trackId}`), this.log(`Found initPTS at playlist time: ${i} offset: ${H - i} (${U}/${O}) trackId: ${V}`), c = null, f.initPTS = U, f.timescale = O, f.trackId = V);\n } else\n this.warn(`No audio or video samples found for initPTS at playlist time: ${i}`);\n c ? (f.initPTS = c.baseTime, f.timescale = c.timescale, f.trackId = c.trackId) : ((!f.timescale || f.trackId === void 0 || f.initPTS === void 0) && (this.warn(\"Could not set initPTS\"), f.initPTS = H, f.timescale = 1, f.trackId = -1), this.initPTS = c = {\n baseTime: f.initPTS,\n timescale: f.timescale,\n trackId: f.trackId\n });\n const k = H - c.baseTime / c.timescale, $ = k + K;\n K > 0 ? this.lastEndTime = $ : (this.warn(\"Duration parsed from mp4 should be greater than zero\"), this.resetNextTimestamp());\n const W = !!p.audio, _ = !!p.video;\n let g = \"\";\n W && (g += \"audio\"), _ && (g += \"video\");\n const x = (p.audio ? p.audio.encrypted : !1) || (p.video ? p.video.encrypted : !1), w = {\n data1: h,\n startPTS: k,\n startDTS: k,\n endPTS: $,\n endDTS: $,\n type: g,\n hasAudio: W,\n hasVideo: _,\n nb: 1,\n dropped: 0,\n encrypted: x\n };\n d.audio = W && !_ ? w : void 0, d.video = _ ? w : void 0;\n const D = b == null ? void 0 : b.sampleCount;\n if (D) {\n const O = b.keyFrameIndex, U = O !== -1;\n w.nb = D, w.dropped = O === 0 || this.isVideoContiguous ? 0 : U ? O : D, w.independent = U, w.firstKeyFrame = O, U && b.keyFrameStart && (w.firstKeyFramePTS = (b.keyFrameStart - c.baseTime) / c.timescale), this.isVideoContiguous || (d.independent = U), this.isVideoContiguous || (this.isVideoContiguous = U), w.dropped && this.warn(`fmp4 does not start with IDR: firstIDR ${O}/${D} dropped: ${w.dropped} start: ${w.firstKeyFramePTS || \"NA\"}`);\n }\n return d.initSegment = f, d.id3 = bp(r, i, c, c), n.samples.length && (d.text = Tp(n, i, c)), d;\n }\n}\nfunction Zi(s, e, t = !1) {\n return (s == null ? void 0 : s.start) !== void 0 ? (s.start + (t ? s.duration : 0)) / s.timescale : e;\n}\nfunction e2(s, e, t, r) {\n if (s === null)\n return !0;\n const n = Math.max(r, 1), i = e - s.baseTime / s.timescale;\n return Math.abs(i - t) > n;\n}\nfunction $h(s, e, t) {\n const r = s.codec;\n return r && r.length > 4 ? r : e === ot.AUDIO ? r === \"ec-3\" || r === \"ac-3\" || r === \"alac\" ? r : r === \"fLaC\" || r === \"Opus\" ? Xo(r, !1) : (t.warn(`Unhandled audio codec \"${r}\" in mp4 MAP`), r || \"mp4a\") : (t.warn(`Unhandled video codec \"${r}\" in mp4 MAP`), r || \"avc1\");\n}\nlet ls;\ntry {\n ls = self.performance.now.bind(self.performance);\n} catch {\n ls = Date.now;\n}\nconst yo = [{\n demux: UT,\n remux: QT\n}, {\n demux: Is,\n remux: mo\n}, {\n demux: OT,\n remux: mo\n}, {\n demux: FT,\n remux: mo\n}];\nyo.splice(2, 0, {\n demux: BT,\n remux: mo\n});\nclass Gh {\n constructor(e, t, r, n, i, o) {\n this.asyncResult = !1, this.logger = void 0, this.observer = void 0, this.typeSupported = void 0, this.config = void 0, this.id = void 0, this.demuxer = void 0, this.remuxer = void 0, this.decrypter = void 0, this.probe = void 0, this.decryptionPromise = null, this.transmuxConfig = void 0, this.currentTransmuxState = void 0, this.observer = e, this.typeSupported = t, this.config = r, this.id = i, this.logger = o;\n }\n configure(e) {\n this.transmuxConfig = e, this.decrypter && this.decrypter.reset();\n }\n push(e, t, r, n) {\n const i = r.transmuxing;\n i.executeStart = ls();\n let o = new Uint8Array(e);\n const {\n currentTransmuxState: a,\n transmuxConfig: l\n } = this;\n n && (this.currentTransmuxState = n);\n const {\n contiguous: c,\n discontinuity: u,\n trackSwitch: d,\n accurateTimeOffset: h,\n timeOffset: f,\n initSegmentChange: p\n } = n || a, {\n audioCodec: y,\n videoCodec: E,\n defaultInitPts: b,\n duration: R,\n initSegmentData: A\n } = l, F = t2(o, t);\n if (F && In(F.method)) {\n const j = this.getDecrypter(), C = Su(F.method);\n if (j.isSync()) {\n let k = j.softwareDecrypt(o, F.key.buffer, F.iv.buffer, C);\n if (r.part > -1) {\n const W = j.flush();\n k = W && W.buffer;\n }\n if (!k)\n return i.executeEnd = ls(), xl(r);\n o = new Uint8Array(k);\n } else\n return this.asyncResult = !0, this.decryptionPromise = j.webCryptoDecrypt(o, F.key.buffer, F.iv.buffer, C).then((k) => {\n const $ = this.push(k, null, r);\n return this.decryptionPromise = null, $;\n }), this.decryptionPromise;\n }\n const M = this.needsProbing(u, d);\n if (M) {\n const j = this.configureTransmuxer(o);\n if (j)\n return this.logger.warn(`[transmuxer] ${j.message}`), this.observer.emit(I.ERROR, I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_PARSING_ERROR,\n fatal: !1,\n error: j,\n reason: j.message\n }), i.executeEnd = ls(), xl(r);\n }\n (u || d || p || M) && this.resetInitSegment(A, y, E, R, t), (u || p || M) && this.resetInitialTimestamp(b), c || this.resetContiguity();\n const H = this.transmux(o, F, f, h, r);\n this.asyncResult = xi(H);\n const K = this.currentTransmuxState;\n return K.contiguous = !0, K.discontinuity = !1, K.trackSwitch = !1, i.executeEnd = ls(), H;\n }\n // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type)\n flush(e) {\n const t = e.transmuxing;\n t.executeStart = ls();\n const {\n decrypter: r,\n currentTransmuxState: n,\n decryptionPromise: i\n } = this;\n if (i)\n return this.asyncResult = !0, i.then(() => this.flush(e));\n const o = [], {\n timeOffset: a\n } = n;\n if (r) {\n const d = r.flush();\n d && o.push(this.push(d.buffer, null, e));\n }\n const {\n demuxer: l,\n remuxer: c\n } = this;\n if (!l || !c) {\n t.executeEnd = ls();\n const d = [xl(e)];\n return this.asyncResult ? Promise.resolve(d) : d;\n }\n const u = l.flush(a);\n return xi(u) ? (this.asyncResult = !0, u.then((d) => (this.flushRemux(o, d, e), o))) : (this.flushRemux(o, u, e), this.asyncResult ? Promise.resolve(o) : o);\n }\n flushRemux(e, t, r) {\n const {\n audioTrack: n,\n videoTrack: i,\n id3Track: o,\n textTrack: a\n } = t, {\n accurateTimeOffset: l,\n timeOffset: c\n } = this.currentTransmuxState;\n this.logger.log(`[transmuxer.ts]: Flushed ${this.id} sn: ${r.sn}${r.part > -1 ? \" part: \" + r.part : \"\"} of ${this.id === pe.MAIN ? \"level\" : \"track\"} ${r.level}`);\n const u = this.remuxer.remux(n, i, o, a, c, l, !0, this.id);\n e.push({\n remuxResult: u,\n chunkMeta: r\n }), r.transmuxing.executeEnd = ls();\n }\n resetInitialTimestamp(e) {\n const {\n demuxer: t,\n remuxer: r\n } = this;\n !t || !r || (t.resetTimeStamp(e), r.resetTimeStamp(e));\n }\n resetContiguity() {\n const {\n demuxer: e,\n remuxer: t\n } = this;\n !e || !t || (e.resetContiguity(), t.resetNextTimestamp());\n }\n resetInitSegment(e, t, r, n, i) {\n const {\n demuxer: o,\n remuxer: a\n } = this;\n !o || !a || (o.resetInitSegment(e, t, r, n), a.resetInitSegment(e, t, r, i));\n }\n destroy() {\n this.demuxer && (this.demuxer.destroy(), this.demuxer = void 0), this.remuxer && (this.remuxer.destroy(), this.remuxer = void 0);\n }\n transmux(e, t, r, n, i) {\n let o;\n return t && t.method === \"SAMPLE-AES\" ? o = this.transmuxSampleAes(e, t, r, n, i) : o = this.transmuxUnencrypted(e, r, n, i), o;\n }\n transmuxUnencrypted(e, t, r, n) {\n const {\n audioTrack: i,\n videoTrack: o,\n id3Track: a,\n textTrack: l\n } = this.demuxer.demux(e, t, !1, !this.config.progressive);\n return {\n remuxResult: this.remuxer.remux(i, o, a, l, t, r, !1, this.id),\n chunkMeta: n\n };\n }\n transmuxSampleAes(e, t, r, n, i) {\n return this.demuxer.demuxSampleAes(e, t, r).then((o) => ({\n remuxResult: this.remuxer.remux(o.audioTrack, o.videoTrack, o.id3Track, o.textTrack, r, n, !1, this.id),\n chunkMeta: i\n }));\n }\n configureTransmuxer(e) {\n const {\n config: t,\n observer: r,\n typeSupported: n\n } = this;\n let i;\n for (let d = 0, h = yo.length; d < h; d++) {\n var o;\n if ((o = yo[d].demux) != null && o.probe(e, this.logger)) {\n i = yo[d];\n break;\n }\n }\n if (!i)\n return new Error(\"Failed to find demuxer by probing fragment data\");\n const a = this.demuxer, l = this.remuxer, c = i.remux, u = i.demux;\n (!l || !(l instanceof c)) && (this.remuxer = new c(r, t, n, this.logger)), (!a || !(a instanceof u)) && (this.demuxer = new u(r, t, n, this.logger), this.probe = u.probe);\n }\n needsProbing(e, t) {\n return !this.demuxer || !this.remuxer || e || t;\n }\n getDecrypter() {\n let e = this.decrypter;\n return e || (e = this.decrypter = new vu(this.config)), e;\n }\n}\nfunction t2(s, e) {\n let t = null;\n return s.byteLength > 0 && (e == null ? void 0 : e.key) != null && e.iv !== null && e.method != null && (t = e), t;\n}\nconst xl = (s) => ({\n remuxResult: {},\n chunkMeta: s\n});\nfunction xi(s) {\n return \"then\" in s && s.then instanceof Function;\n}\nclass r2 {\n constructor(e, t, r, n, i) {\n this.audioCodec = void 0, this.videoCodec = void 0, this.initSegmentData = void 0, this.duration = void 0, this.defaultInitPts = void 0, this.audioCodec = e, this.videoCodec = t, this.initSegmentData = r, this.duration = n, this.defaultInitPts = i || null;\n }\n}\nclass s2 {\n constructor(e, t, r, n, i, o) {\n this.discontinuity = void 0, this.contiguous = void 0, this.accurateTimeOffset = void 0, this.trackSwitch = void 0, this.timeOffset = void 0, this.initSegmentChange = void 0, this.discontinuity = e, this.contiguous = t, this.accurateTimeOffset = r, this.trackSwitch = n, this.timeOffset = i, this.initSegmentChange = o;\n }\n}\nlet Vh = 0;\nclass wp {\n constructor(e, t, r, n) {\n this.error = null, this.hls = void 0, this.id = void 0, this.instanceNo = Vh++, this.observer = void 0, this.frag = null, this.part = null, this.useWorker = void 0, this.workerContext = null, this.transmuxer = null, this.onTransmuxComplete = void 0, this.onFlush = void 0, this.onWorkerMessage = (l) => {\n const c = l.data, u = this.hls;\n if (!(!u || !(c != null && c.event) || c.instanceNo !== this.instanceNo))\n switch (c.event) {\n case \"init\": {\n var d;\n const h = (d = this.workerContext) == null ? void 0 : d.objectURL;\n h && self.URL.revokeObjectURL(h);\n break;\n }\n case \"transmuxComplete\": {\n this.handleTransmuxComplete(c.data);\n break;\n }\n case \"flush\": {\n this.onFlush(c.data);\n break;\n }\n // pass logs from the worker thread to the main logger\n case \"workerLog\": {\n u.logger[c.data.logType] && u.logger[c.data.logType](c.data.message);\n break;\n }\n default: {\n c.data = c.data || {}, c.data.frag = this.frag, c.data.part = this.part, c.data.id = this.id, u.trigger(c.event, c.data);\n break;\n }\n }\n }, this.onWorkerError = (l) => {\n if (!this.hls)\n return;\n const c = new Error(`${l.message} (${l.filename}:${l.lineno})`);\n this.hls.config.enableWorker = !1, this.hls.logger.warn(`Error in \"${this.id}\" Web Worker, fallback to inline`), this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.INTERNAL_EXCEPTION,\n fatal: !1,\n event: \"demuxerWorker\",\n error: c\n });\n };\n const i = e.config;\n this.hls = e, this.id = t, this.useWorker = !!i.enableWorker, this.onTransmuxComplete = r, this.onFlush = n;\n const o = (l, c) => {\n c = c || {}, c.frag = this.frag || void 0, l === I.ERROR && (c = c, c.parent = this.id, c.part = this.part, this.error = c.error), this.hls.trigger(l, c);\n };\n this.observer = new wu(), this.observer.on(I.FRAG_DECRYPTED, o), this.observer.on(I.ERROR, o);\n const a = ih(i.preferManagedMediaSource);\n if (this.useWorker && typeof Worker < \"u\") {\n const l = this.hls.logger;\n if (i.workerPath || aT()) {\n try {\n i.workerPath ? (l.log(`loading Web Worker ${i.workerPath} for \"${t}\"`), this.workerContext = cT(i.workerPath)) : (l.log(`injecting Web Worker for \"${t}\"`), this.workerContext = lT());\n const {\n worker: u\n } = this.workerContext;\n u.addEventListener(\"message\", this.onWorkerMessage), u.addEventListener(\"error\", this.onWorkerError), u.postMessage({\n instanceNo: this.instanceNo,\n cmd: \"init\",\n typeSupported: a,\n id: t,\n config: at(i)\n });\n } catch (u) {\n l.warn(`Error setting up \"${t}\" Web Worker, fallback to inline`, u), this.terminateWorker(), this.error = null, this.transmuxer = new Gh(this.observer, a, i, \"\", t, e.logger);\n }\n return;\n }\n }\n this.transmuxer = new Gh(this.observer, a, i, \"\", t, e.logger);\n }\n reset() {\n if (this.frag = null, this.part = null, this.workerContext) {\n const e = this.instanceNo;\n this.instanceNo = Vh++;\n const t = this.hls.config, r = ih(t.preferManagedMediaSource);\n this.workerContext.worker.postMessage({\n instanceNo: this.instanceNo,\n cmd: \"reset\",\n resetNo: e,\n typeSupported: r,\n id: this.id,\n config: at(t)\n });\n }\n }\n terminateWorker() {\n if (this.workerContext) {\n const {\n worker: e\n } = this.workerContext;\n this.workerContext = null, e.removeEventListener(\"message\", this.onWorkerMessage), e.removeEventListener(\"error\", this.onWorkerError), uT(this.hls.config.workerPath);\n }\n }\n destroy() {\n if (this.workerContext)\n this.terminateWorker(), this.onWorkerMessage = this.onWorkerError = null;\n else {\n const t = this.transmuxer;\n t && (t.destroy(), this.transmuxer = null);\n }\n const e = this.observer;\n e && e.removeAllListeners(), this.frag = null, this.part = null, this.observer = null, this.hls = null;\n }\n push(e, t, r, n, i, o, a, l, c, u) {\n var d, h;\n c.transmuxing.start = self.performance.now();\n const {\n instanceNo: f,\n transmuxer: p\n } = this, y = o ? o.start : i.start, E = i.decryptdata, b = this.frag, R = !(b && i.cc === b.cc), A = !(b && c.level === b.level), F = b ? c.sn - b.sn : -1, M = this.part ? c.part - this.part.index : -1, H = F === 0 && c.id > 1 && c.id === (b == null ? void 0 : b.stats.chunkCount), K = !A && (F === 1 || F === 0 && (M === 1 || H && M <= 0)), j = self.performance.now();\n (A || F || i.stats.parsing.start === 0) && (i.stats.parsing.start = j), o && (M || !K) && (o.stats.parsing.start = j);\n const C = !(b && ((d = i.initSegment) == null ? void 0 : d.url) === ((h = b.initSegment) == null ? void 0 : h.url)), k = new s2(R, K, l, A, y, C);\n if (!K || R || C) {\n this.hls.logger.log(`[transmuxer-interface]: Starting new transmux session for ${i.type} sn: ${c.sn}${c.part > -1 ? \" part: \" + c.part : \"\"} ${this.id === pe.MAIN ? \"level\" : \"track\"}: ${c.level} id: ${c.id}\n discontinuity: ${R}\n trackSwitch: ${A}\n contiguous: ${K}\n accurateTimeOffset: ${l}\n timeOffset: ${y}\n initSegmentChange: ${C}`);\n const $ = new r2(r, n, t, a, u);\n this.configureTransmuxer($);\n }\n if (this.frag = i, this.part = o, this.workerContext)\n this.workerContext.worker.postMessage({\n instanceNo: f,\n cmd: \"demux\",\n data: e,\n decryptdata: E,\n chunkMeta: c,\n state: k\n }, e instanceof ArrayBuffer ? [e] : []);\n else if (p) {\n const $ = p.push(e, E, c, k);\n xi($) ? $.then((W) => {\n this.handleTransmuxComplete(W);\n }).catch((W) => {\n this.transmuxerError(W, c, \"transmuxer-interface push error\");\n }) : this.handleTransmuxComplete($);\n }\n }\n flush(e) {\n e.transmuxing.start = self.performance.now();\n const {\n instanceNo: t,\n transmuxer: r\n } = this;\n if (this.workerContext)\n this.workerContext.worker.postMessage({\n instanceNo: t,\n cmd: \"flush\",\n chunkMeta: e\n });\n else if (r) {\n const n = r.flush(e);\n xi(n) ? n.then((i) => {\n this.handleFlushResult(i, e);\n }).catch((i) => {\n this.transmuxerError(i, e, \"transmuxer-interface flush error\");\n }) : this.handleFlushResult(n, e);\n }\n }\n transmuxerError(e, t, r) {\n this.hls && (this.error = e, this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_PARSING_ERROR,\n chunkMeta: t,\n frag: this.frag || void 0,\n part: this.part || void 0,\n fatal: !1,\n error: e,\n err: e,\n reason: r\n }));\n }\n handleFlushResult(e, t) {\n e.forEach((r) => {\n this.handleTransmuxComplete(r);\n }), this.onFlush(t);\n }\n configureTransmuxer(e) {\n const {\n instanceNo: t,\n transmuxer: r\n } = this;\n this.workerContext ? this.workerContext.worker.postMessage({\n instanceNo: t,\n cmd: \"configure\",\n config: e\n }) : r && r.configure(e);\n }\n handleTransmuxComplete(e) {\n e.chunkMeta.transmuxing.end = self.performance.now(), this.onTransmuxComplete(e);\n }\n}\nconst jh = 100;\nclass n2 extends Tu {\n constructor(e, t, r) {\n super(e, t, r, \"audio-stream-controller\", pe.AUDIO), this.mainAnchor = null, this.mainFragLoading = null, this.audioOnly = !1, this.bufferedTrack = null, this.switchingTrack = null, this.trackId = -1, this.waitingData = null, this.mainDetails = null, this.flushing = !1, this.bufferFlushed = !1, this.cachedTrackLoadedData = null, this.registerListeners();\n }\n onHandlerDestroying() {\n this.unregisterListeners(), super.onHandlerDestroying(), this.resetItem();\n }\n resetItem() {\n this.mainDetails = this.mainAnchor = this.mainFragLoading = this.bufferedTrack = this.switchingTrack = this.waitingData = this.cachedTrackLoadedData = null;\n }\n registerListeners() {\n super.registerListeners();\n const {\n hls: e\n } = this;\n e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this), e.on(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.on(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.on(I.BUFFER_RESET, this.onBufferReset, this), e.on(I.BUFFER_CREATED, this.onBufferCreated, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.on(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.on(I.FRAG_LOADING, this.onFragLoading, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e && (super.unregisterListeners(), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this), e.off(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.off(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.off(I.BUFFER_RESET, this.onBufferReset, this), e.off(I.BUFFER_CREATED, this.onBufferCreated, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.off(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.off(I.FRAG_LOADING, this.onFragLoading, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this));\n }\n // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value\n onInitPtsFound(e, {\n frag: t,\n id: r,\n initPTS: n,\n timescale: i,\n trackId: o\n }) {\n if (r === pe.MAIN) {\n const a = t.cc, l = this.fragCurrent;\n if (this.initPTS[a] = {\n baseTime: n,\n timescale: i,\n trackId: o\n }, this.log(`InitPTS for cc: ${a} found from main: ${n / i} (${n}/${i}) trackId: ${o}`), this.mainAnchor = t, this.state === ne.WAITING_INIT_PTS) {\n const c = this.waitingData;\n (!c && !this.loadingParts || c && c.frag.cc !== a) && this.syncWithAnchor(t, c == null ? void 0 : c.frag);\n } else !this.hls.hasEnoughToStart && l && l.cc !== a ? (l.abortRequests(), this.syncWithAnchor(t, l)) : this.state === ne.IDLE && this.tick();\n }\n }\n getLoadPosition() {\n return !this.startFragRequested && this.nextLoadPosition >= 0 ? this.nextLoadPosition : super.getLoadPosition();\n }\n syncWithAnchor(e, t) {\n var r;\n const n = ((r = this.mainFragLoading) == null ? void 0 : r.frag) || null;\n if (t && (n == null ? void 0 : n.cc) === t.cc)\n return;\n const i = (n || e).cc, o = this.getLevelDetails(), a = this.getLoadPosition(), l = Vg(o, i, a);\n l && (this.log(`Syncing with main frag at ${l.start} cc ${l.cc}`), this.startFragRequested = !1, this.nextLoadPosition = l.start, this.resetLoadingState(), this.state === ne.IDLE && this.doTickIdle());\n }\n startLoad(e, t) {\n if (!this.levels) {\n this.startPosition = e, this.state = ne.STOPPED;\n return;\n }\n const r = this.lastCurrentTime;\n this.stopLoad(), this.setInterval(jh), r > 0 && e === -1 ? (this.log(`Override startPosition with lastCurrentTime @${r.toFixed(3)}`), e = r, this.state = ne.IDLE) : this.state = ne.WAITING_TRACK, this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick();\n }\n doTick() {\n switch (this.state) {\n case ne.IDLE:\n this.doTickIdle();\n break;\n case ne.WAITING_TRACK: {\n const {\n levels: e,\n trackId: t\n } = this, r = e == null ? void 0 : e[t], n = r == null ? void 0 : r.details;\n if (n && !this.waitForLive(r)) {\n if (this.waitForCdnTuneIn(n))\n break;\n this.state = ne.WAITING_INIT_PTS;\n }\n break;\n }\n case ne.FRAG_LOADING_WAITING_RETRY: {\n this.checkRetryDate();\n break;\n }\n case ne.WAITING_INIT_PTS: {\n const e = this.waitingData;\n if (e) {\n const {\n frag: t,\n part: r,\n cache: n,\n complete: i\n } = e, o = this.mainAnchor;\n if (this.initPTS[t.cc] !== void 0) {\n this.waitingData = null, this.state = ne.FRAG_LOADING;\n const a = n.flush().buffer, l = {\n frag: t,\n part: r,\n payload: a,\n networkDetails: null\n };\n this._handleFragmentLoadProgress(l), i && super._handleFragmentLoadComplete(l);\n } else o && o.cc !== e.frag.cc && this.syncWithAnchor(o, e.frag);\n } else\n this.state = ne.IDLE;\n }\n }\n this.onTickEnd();\n }\n resetLoadingState() {\n const e = this.waitingData;\n e && (this.fragmentTracker.removeFragment(e.frag), this.waitingData = null), super.resetLoadingState();\n }\n onTickEnd() {\n const {\n media: e\n } = this;\n e != null && e.readyState && (this.lastCurrentTime = e.currentTime);\n }\n doTickIdle() {\n var e;\n const {\n hls: t,\n levels: r,\n media: n,\n trackId: i\n } = this, o = t.config;\n if (!this.buffering || !n && !this.primaryPrefetch && (this.startFragRequested || !o.startFragPrefetch) || !(r != null && r[i]))\n return;\n const a = r[i], l = a.details;\n if (!l || this.waitForLive(a) || this.waitForCdnTuneIn(l)) {\n this.state = ne.WAITING_TRACK, this.startFragRequested = !1;\n return;\n }\n const c = this.mediaBuffer ? this.mediaBuffer : this.media;\n this.bufferFlushed && c && (this.bufferFlushed = !1, this.afterBufferFlushed(c, ot.AUDIO, pe.AUDIO));\n const u = this.getFwdBufferInfo(c, pe.AUDIO);\n if (u === null)\n return;\n if (!this.switchingTrack && this._streamEnded(u, l)) {\n t.trigger(I.BUFFER_EOS, {\n type: \"audio\"\n }), this.state = ne.ENDED;\n return;\n }\n const d = u.len, h = t.maxBufferLength, f = l.fragments, p = f[0].start, y = this.getLoadPosition(), E = this.flushing ? y : u.end;\n if (this.switchingTrack && n) {\n const A = y;\n l.PTSKnown && A < p && (u.end > p || u.nextStart) && (this.log(\"Alt audio track ahead of main track, seek to start of alt audio track\"), n.currentTime = p + 0.05);\n }\n if (d >= h && !this.switchingTrack && E < f[f.length - 1].start)\n return;\n let b = this.getNextFragment(E, l);\n if (b && this.isLoopLoading(b, E) && (b = this.getNextFragmentLoopLoading(b, l, u, pe.MAIN, h)), !b) {\n this.bufferFlushed = !0;\n return;\n }\n let R = ((e = this.mainFragLoading) == null ? void 0 : e.frag) || null;\n if (!this.audioOnly && this.startFragRequested && R && Vt(b) && !b.endList && (!l.live || !this.loadingParts && E < this.hls.liveSyncPosition) && (this.fragmentTracker.getState(R) === Ht.OK && (this.mainFragLoading = R = null), R && Vt(R))) {\n if (b.start > R.end) {\n const F = this.fragmentTracker.getFragAtPos(E, pe.MAIN);\n F && F.end > R.end && (R = F, this.mainFragLoading = {\n frag: F,\n targetBufferTime: null\n });\n }\n if (b.start > R.end)\n return;\n }\n this.loadFragment(b, a, E);\n }\n onMediaDetaching(e, t) {\n this.bufferFlushed = this.flushing = !1, super.onMediaDetaching(e, t);\n }\n onAudioTracksUpdated(e, {\n audioTracks: t\n }) {\n this.resetTransmuxer(), this.levels = t.map((r) => new mi(r));\n }\n onAudioTrackSwitching(e, t) {\n const r = !!t.url;\n this.trackId = t.id;\n const {\n fragCurrent: n\n } = this;\n n && (n.abortRequests(), this.removeUnbufferedFrags(n.start)), this.resetLoadingState(), r ? (this.switchingTrack = t, this.flushAudioIfNeeded(t), this.state !== ne.STOPPED && (this.setInterval(jh), this.state = ne.IDLE, this.tick())) : (this.resetTransmuxer(), this.switchingTrack = null, this.bufferedTrack = t, this.clearInterval());\n }\n onManifestLoading() {\n super.onManifestLoading(), this.bufferFlushed = this.flushing = this.audioOnly = !1, this.resetItem(), this.trackId = -1;\n }\n onLevelLoaded(e, t) {\n this.mainDetails = t.details;\n const r = this.cachedTrackLoadedData;\n r && (this.cachedTrackLoadedData = null, this.onAudioTrackLoaded(I.AUDIO_TRACK_LOADED, r));\n }\n onAudioTrackLoaded(e, t) {\n var r;\n const {\n levels: n\n } = this, {\n details: i,\n id: o,\n groupId: a,\n track: l\n } = t;\n if (!n) {\n this.warn(`Audio tracks reset while loading track ${o} \"${l.name}\" of \"${a}\"`);\n return;\n }\n const c = this.mainDetails;\n if (!c || i.endCC > c.endCC || c.expired) {\n this.cachedTrackLoadedData = t, this.state !== ne.STOPPED && (this.state = ne.WAITING_TRACK);\n return;\n }\n this.cachedTrackLoadedData = null, this.log(`Audio track ${o} \"${l.name}\" of \"${a}\" loaded [${i.startSN},${i.endSN}]${i.lastPartSn ? `[part-${i.lastPartSn}-${i.lastPartIndex}]` : \"\"},duration:${i.totalduration}`);\n const u = n[o];\n let d = 0;\n if (i.live || (r = u.details) != null && r.live) {\n if (this.checkLiveUpdate(i), i.deltaUpdateFailed)\n return;\n if (u.details) {\n var h;\n d = this.alignPlaylists(i, u.details, (h = this.levelLastLoaded) == null ? void 0 : h.details);\n }\n i.alignedSliding || (np(i, c), i.alignedSliding || sa(i, c), d = i.fragmentStart);\n }\n u.details = i, this.levelLastLoaded = u, this.startFragRequested || this.setStartPosition(c, d), this.hls.trigger(I.AUDIO_TRACK_UPDATED, {\n details: i,\n id: o,\n groupId: t.groupId\n }), this.state === ne.WAITING_TRACK && !this.waitForCdnTuneIn(i) && (this.state = ne.IDLE), this.tick();\n }\n _handleFragmentLoadProgress(e) {\n var t;\n const r = e.frag, {\n part: n,\n payload: i\n } = e, {\n config: o,\n trackId: a,\n levels: l\n } = this;\n if (!l) {\n this.warn(`Audio tracks were reset while fragment load was in progress. Fragment ${r.sn} of level ${r.level} will not be buffered`);\n return;\n }\n const c = l[a];\n if (!c) {\n this.warn(\"Audio track is undefined on fragment load progress\");\n return;\n }\n const u = c.details;\n if (!u) {\n this.warn(\"Audio track details undefined on fragment load progress\"), this.removeUnbufferedFrags(r.start);\n return;\n }\n const d = o.defaultAudioCodec || c.audioCodec || \"mp4a.40.2\";\n let h = this.transmuxer;\n h || (h = this.transmuxer = new wp(this.hls, pe.AUDIO, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this)));\n const f = this.initPTS[r.cc], p = (t = r.initSegment) == null ? void 0 : t.data;\n if (f !== void 0) {\n const E = n ? n.index : -1, b = E !== -1, R = new Eu(r.level, r.sn, r.stats.chunkCount, i.byteLength, E, b);\n h.push(i, p, d, \"\", r, n, u.totalduration, !1, R, f);\n } else {\n this.log(`Unknown video PTS for cc ${r.cc}, waiting for video PTS before demuxing audio frag ${r.sn} of [${u.startSN} ,${u.endSN}],track ${a}`);\n const {\n cache: y\n } = this.waitingData = this.waitingData || {\n frag: r,\n part: n,\n cache: new ip(),\n complete: !1\n };\n y.push(new Uint8Array(i)), this.state !== ne.STOPPED && (this.state = ne.WAITING_INIT_PTS);\n }\n }\n _handleFragmentLoadComplete(e) {\n if (this.waitingData) {\n this.waitingData.complete = !0;\n return;\n }\n super._handleFragmentLoadComplete(e);\n }\n onBufferReset() {\n this.mediaBuffer = null;\n }\n onBufferCreated(e, t) {\n this.bufferFlushed = this.flushing = !1;\n const r = t.tracks.audio;\n r && (this.mediaBuffer = r.buffer || null);\n }\n onFragLoading(e, t) {\n !this.audioOnly && t.frag.type === pe.MAIN && Vt(t.frag) && (this.mainFragLoading = t, this.state === ne.IDLE && this.tick());\n }\n onFragBuffered(e, t) {\n const {\n frag: r,\n part: n\n } = t;\n if (r.type !== pe.AUDIO) {\n !this.audioOnly && r.type === pe.MAIN && !r.elementaryStreams.video && !r.elementaryStreams.audiovideo && (this.audioOnly = !0, this.mainFragLoading = null);\n return;\n }\n if (this.fragContextChanged(r)) {\n this.warn(`Fragment ${r.sn}${n ? \" p: \" + n.index : \"\"} of level ${r.level} finished buffering, but was aborted. state: ${this.state}, audioSwitch: ${this.switchingTrack ? this.switchingTrack.name : \"false\"}`);\n return;\n }\n if (Vt(r)) {\n this.fragPrevious = r;\n const i = this.switchingTrack;\n i && (this.bufferedTrack = i, this.switchingTrack = null, this.hls.trigger(I.AUDIO_TRACK_SWITCHED, tt({}, i)));\n }\n this.fragBufferedComplete(r, n), this.media && this.tick();\n }\n onError(e, t) {\n var r;\n if (t.fatal) {\n this.state = ne.ERROR;\n return;\n }\n switch (t.details) {\n case J.FRAG_GAP:\n case J.FRAG_PARSING_ERROR:\n case J.FRAG_DECRYPT_ERROR:\n case J.FRAG_LOAD_ERROR:\n case J.FRAG_LOAD_TIMEOUT:\n case J.KEY_LOAD_ERROR:\n case J.KEY_LOAD_TIMEOUT:\n this.onFragmentOrKeyLoadError(pe.AUDIO, t);\n break;\n case J.AUDIO_TRACK_LOAD_ERROR:\n case J.AUDIO_TRACK_LOAD_TIMEOUT:\n case J.LEVEL_PARSING_ERROR:\n !t.levelRetry && this.state === ne.WAITING_TRACK && ((r = t.context) == null ? void 0 : r.type) === Ke.AUDIO_TRACK && (this.state = ne.IDLE);\n break;\n case J.BUFFER_ADD_CODEC_ERROR:\n case J.BUFFER_APPEND_ERROR:\n if (t.parent !== \"audio\")\n return;\n this.reduceLengthAndFlushBuffer(t) || this.resetLoadingState();\n break;\n case J.BUFFER_FULL_ERROR:\n if (t.parent !== \"audio\")\n return;\n this.reduceLengthAndFlushBuffer(t) && (this.bufferedTrack = null, super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\"));\n break;\n case J.INTERNAL_EXCEPTION:\n this.recoverWorkerError(t);\n break;\n }\n }\n onBufferFlushing(e, {\n type: t\n }) {\n t !== ot.VIDEO && (this.flushing = !0);\n }\n onBufferFlushed(e, {\n type: t\n }) {\n if (t !== ot.VIDEO) {\n this.flushing = !1, this.bufferFlushed = !0, this.state === ne.ENDED && (this.state = ne.IDLE);\n const r = this.mediaBuffer || this.media;\n r && (this.afterBufferFlushed(r, t, pe.AUDIO), this.tick());\n }\n }\n _handleTransmuxComplete(e) {\n var t;\n const r = \"audio\", {\n hls: n\n } = this, {\n remuxResult: i,\n chunkMeta: o\n } = e, a = this.getCurrentContext(o);\n if (!a) {\n this.resetWhenMissingContext(o);\n return;\n }\n const {\n frag: l,\n part: c,\n level: u\n } = a, {\n details: d\n } = u, {\n audio: h,\n text: f,\n id3: p,\n initSegment: y\n } = i;\n if (this.fragContextChanged(l) || !d) {\n this.fragmentTracker.removeFragment(l);\n return;\n }\n if (this.state = ne.PARSING, this.switchingTrack && h && this.completeAudioSwitch(this.switchingTrack), y != null && y.tracks) {\n const E = l.initSegment || l;\n if (this.unhandledEncryptionError(y, l))\n return;\n this._bufferInitSegment(u, y.tracks, E, o), n.trigger(I.FRAG_PARSING_INIT_SEGMENT, {\n frag: E,\n id: r,\n tracks: y.tracks\n });\n }\n if (h) {\n const {\n startPTS: E,\n endPTS: b,\n startDTS: R,\n endDTS: A\n } = h;\n c && (c.elementaryStreams[ot.AUDIO] = {\n startPTS: E,\n endPTS: b,\n startDTS: R,\n endDTS: A\n }), l.setElementaryStreamInfo(ot.AUDIO, E, b, R, A), this.bufferFragmentData(h, l, c, o);\n }\n if (p != null && (t = p.samples) != null && t.length) {\n const E = nt({\n id: r,\n frag: l,\n details: d\n }, p);\n n.trigger(I.FRAG_PARSING_METADATA, E);\n }\n if (f) {\n const E = nt({\n id: r,\n frag: l,\n details: d\n }, f);\n n.trigger(I.FRAG_PARSING_USERDATA, E);\n }\n }\n _bufferInitSegment(e, t, r, n) {\n if (this.state !== ne.PARSING || (t.video && delete t.video, t.audiovideo && delete t.audiovideo, !t.audio))\n return;\n const i = t.audio;\n i.id = pe.AUDIO;\n const o = e.audioCodec;\n this.log(`Init audio buffer, container:${i.container}, codecs[level/parsed]=[${o}/${i.codec}]`), o && o.split(\",\").length === 1 && (i.levelCodec = o), this.hls.trigger(I.BUFFER_CODECS, t);\n const a = i.initSegment;\n if (a != null && a.byteLength) {\n const l = {\n type: \"audio\",\n frag: r,\n part: null,\n chunkMeta: n,\n parent: r.type,\n data: a\n };\n this.hls.trigger(I.BUFFER_APPENDING, l);\n }\n this.tickImmediate();\n }\n loadFragment(e, t, r) {\n const n = this.fragmentTracker.getState(e);\n if (this.switchingTrack || n === Ht.NOT_LOADED || n === Ht.PARTIAL) {\n var i;\n if (!Vt(e))\n this._loadInitSegment(e, t);\n else if ((i = t.details) != null && i.live && !this.initPTS[e.cc]) {\n this.log(`Waiting for video PTS in continuity counter ${e.cc} of live stream before loading audio fragment ${e.sn} of level ${this.trackId}`), this.state = ne.WAITING_INIT_PTS;\n const o = this.mainDetails;\n o && o.fragmentStart !== t.details.fragmentStart && sa(t.details, o);\n } else\n super.loadFragment(e, t, r);\n } else\n this.clearTrackerIfNeeded(e);\n }\n flushAudioIfNeeded(e) {\n if (this.media && this.bufferedTrack) {\n const {\n name: t,\n lang: r,\n assocLang: n,\n characteristics: i,\n audioCodec: o,\n channels: a\n } = this.bufferedTrack;\n qs({\n name: t,\n lang: r,\n assocLang: n,\n characteristics: i,\n audioCodec: o,\n channels: a\n }, e, Us) || (Qo(e.url, this.hls) ? (this.log(\"Switching audio track : flushing all audio\"), super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\"), this.bufferedTrack = null) : this.bufferedTrack = e);\n }\n }\n completeAudioSwitch(e) {\n const {\n hls: t\n } = this;\n this.flushAudioIfNeeded(e), this.bufferedTrack = e, this.switchingTrack = null, t.trigger(I.AUDIO_TRACK_SWITCHED, tt({}, e));\n }\n}\nclass ku extends Lr {\n constructor(e, t) {\n super(t, e.logger), this.hls = void 0, this.canLoad = !1, this.timer = -1, this.hls = e;\n }\n destroy() {\n this.clearTimer(), this.hls = this.log = this.warn = null;\n }\n clearTimer() {\n this.timer !== -1 && (self.clearTimeout(this.timer), this.timer = -1);\n }\n startLoad() {\n this.canLoad = !0, this.loadPlaylist();\n }\n stopLoad() {\n this.canLoad = !1, this.clearTimer();\n }\n switchParams(e, t, r) {\n const n = t == null ? void 0 : t.renditionReports;\n if (n) {\n let i = -1;\n for (let o = 0; o < n.length; o++) {\n const a = n[o];\n let l;\n try {\n l = new self.URL(a.URI, t.url).href;\n } catch (c) {\n this.warn(`Could not construct new URL for Rendition Report: ${c}`), l = a.URI || \"\";\n }\n if (l === e) {\n i = o;\n break;\n } else l === e.substring(0, l.length) && (i = o);\n }\n if (i !== -1) {\n const o = n[i], a = parseInt(o[\"LAST-MSN\"]) || t.lastPartSn;\n let l = parseInt(o[\"LAST-PART\"]) || t.lastPartIndex;\n if (this.hls.config.lowLatencyMode) {\n const u = Math.min(t.age - t.partTarget, t.targetduration);\n l >= 0 && u > t.partTarget && (l += 1);\n }\n const c = r && oh(r);\n return new ah(a, l >= 0 ? l : void 0, c);\n }\n }\n }\n loadPlaylist(e) {\n this.clearTimer();\n }\n loadingPlaylist(e, t) {\n this.clearTimer();\n }\n shouldLoadPlaylist(e) {\n return this.canLoad && !!e && !!e.url && (!e.details || e.details.live);\n }\n getUrlWithDirectives(e, t) {\n if (t)\n try {\n return t.addDirectives(e);\n } catch (r) {\n this.warn(`Could not construct new URL with HLS Delivery Directives: ${r}`);\n }\n return e;\n }\n playlistLoaded(e, t, r) {\n const {\n details: n,\n stats: i\n } = t, o = self.performance.now(), a = i.loading.first ? Math.max(0, o - i.loading.first) : 0;\n n.advancedDateTime = Date.now() - a;\n const l = this.hls.config.timelineOffset;\n if (l !== n.appliedTimelineOffset) {\n const u = Math.max(l || 0, 0);\n n.appliedTimelineOffset = u, n.fragments.forEach((d) => {\n d.setStart(d.playlistOffset + u);\n });\n }\n if (n.live || r != null && r.live) {\n const u = \"levelInfo\" in t ? t.levelInfo : t.track;\n if (n.reloaded(r), r && n.fragments.length > 0) {\n Zb(r, n, this);\n const R = n.playlistParsingError;\n if (R) {\n this.warn(R);\n const A = this.hls;\n if (!A.config.ignorePlaylistParsingErrors) {\n var c;\n const {\n networkDetails: F\n } = t;\n A.trigger(I.ERROR, {\n type: ve.NETWORK_ERROR,\n details: J.LEVEL_PARSING_ERROR,\n fatal: !1,\n url: n.url,\n error: R,\n reason: R.message,\n level: t.level || void 0,\n parent: (c = n.fragments[0]) == null ? void 0 : c.type,\n networkDetails: F,\n stats: i\n });\n return;\n }\n n.playlistParsingError = null;\n }\n }\n n.requestScheduled === -1 && (n.requestScheduled = i.loading.start);\n const d = this.hls.mainForwardBufferInfo, h = d ? d.end - d.len : 0, f = (n.edge - h) * 1e3, p = Qg(n, f);\n if (n.requestScheduled + p < o ? n.requestScheduled = o : n.requestScheduled += p, this.log(`live playlist ${e} ${n.advanced ? \"REFRESHED \" + n.lastPartSn + \"-\" + n.lastPartIndex : n.updated ? \"UPDATED\" : \"MISSED\"}`), !this.canLoad || !n.live)\n return;\n let y, E, b;\n if (n.canBlockReload && n.endSN && n.advanced) {\n const R = this.hls.config.lowLatencyMode, A = n.lastPartSn, F = n.endSN, M = n.lastPartIndex, H = M !== -1, K = A === F;\n H ? K ? (E = F + 1, b = R ? 0 : M) : (E = A, b = R ? M + 1 : n.maxPartIndex) : E = F + 1;\n const j = n.age, C = j + n.ageHeader;\n let k = Math.min(C - n.partTarget, n.targetduration * 1.5);\n if (k > 0) {\n if (C > n.targetduration * 3)\n this.log(`Playlist last advanced ${j.toFixed(2)}s ago. Omitting segment and part directives.`), E = void 0, b = void 0;\n else if (r != null && r.tuneInGoal && C - n.partTarget > r.tuneInGoal)\n this.warn(`CDN Tune-in goal increased from: ${r.tuneInGoal} to: ${k} with playlist age: ${n.age}`), k = 0;\n else {\n const $ = Math.floor(k / n.targetduration);\n if (E += $, b !== void 0) {\n const W = Math.round(k % n.targetduration / n.partTarget);\n b += W;\n }\n this.log(`CDN Tune-in age: ${n.ageHeader}s last advanced ${j.toFixed(2)}s goal: ${k} skip sn ${$} to part ${b}`);\n }\n n.tuneInGoal = k;\n }\n if (y = this.getDeliveryDirectives(n, t.deliveryDirectives, E, b), R || !K) {\n n.requestScheduled = o, this.loadingPlaylist(u, y);\n return;\n }\n } else (n.canBlockReload || n.canSkipUntil) && (y = this.getDeliveryDirectives(n, t.deliveryDirectives, E, b));\n y && E !== void 0 && n.canBlockReload && (n.requestScheduled = i.loading.first + Math.max(p - a * 2, p / 2)), this.scheduleLoading(u, y, n);\n } else\n this.clearTimer();\n }\n scheduleLoading(e, t, r) {\n const n = r || e.details;\n if (!n) {\n this.loadingPlaylist(e, t);\n return;\n }\n const i = self.performance.now(), o = n.requestScheduled;\n if (i >= o) {\n this.loadingPlaylist(e, t);\n return;\n }\n const a = o - i;\n this.log(`reload live playlist ${e.name || e.bitrate + \"bps\"} in ${Math.round(a)} ms`), this.clearTimer(), this.timer = self.setTimeout(() => this.loadingPlaylist(e, t), a);\n }\n getDeliveryDirectives(e, t, r, n) {\n let i = oh(e);\n return t != null && t.skip && e.deltaUpdateFailed && (r = t.msn, n = t.part, i = go.No), new ah(r, n, i);\n }\n checkRetry(e) {\n const t = e.details, r = ea(e), n = e.errorAction, {\n action: i,\n retryCount: o = 0,\n retryConfig: a\n } = n || {}, l = !!n && !!a && (i === Zt.RetryRequest || !n.resolved && i === Zt.SendAlternateToPenaltyBox);\n if (l) {\n var c;\n if (o >= a.maxNumRetry)\n return !1;\n if (r && (c = e.context) != null && c.deliveryDirectives)\n this.warn(`Retrying playlist loading ${o + 1}/${a.maxNumRetry} after \"${t}\" without delivery-directives`), this.loadPlaylist();\n else {\n const u = yu(a, o);\n this.clearTimer(), this.timer = self.setTimeout(() => this.loadPlaylist(), u), this.warn(`Retrying playlist loading ${o + 1}/${a.maxNumRetry} after \"${t}\" in ${u}ms`);\n }\n e.levelRetry = !0, n.resolved = !0;\n }\n return l;\n }\n}\nfunction Ap(s, e) {\n if (s.length !== e.length)\n return !1;\n for (let t = 0; t < s.length; t++)\n if (!Si(s[t].attrs, e[t].attrs))\n return !1;\n return !0;\n}\nfunction Si(s, e, t) {\n const r = s[\"STABLE-RENDITION-ID\"];\n return r && !t ? r === e[\"STABLE-RENDITION-ID\"] : !(t || [\"LANGUAGE\", \"NAME\", \"CHARACTERISTICS\", \"AUTOSELECT\", \"DEFAULT\", \"FORCED\", \"ASSOC-LANGUAGE\"]).some((n) => s[n] !== e[n]);\n}\nfunction yc(s, e) {\n return e.label.toLowerCase() === s.name.toLowerCase() && (!e.language || e.language.toLowerCase() === (s.lang || \"\").toLowerCase());\n}\nclass i2 extends ku {\n constructor(e) {\n super(e, \"audio-track-controller\"), this.tracks = [], this.groupIds = null, this.tracksInGroup = [], this.trackId = -1, this.currentTrack = null, this.selectDefaultTrack = !0, this.registerListeners();\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.on(I.ERROR, this.onError, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVEL_LOADING, this.onLevelLoading, this), e.off(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.off(I.ERROR, this.onError, this);\n }\n destroy() {\n this.unregisterListeners(), this.tracks.length = 0, this.tracksInGroup.length = 0, this.currentTrack = null, super.destroy();\n }\n onManifestLoading() {\n this.tracks = [], this.tracksInGroup = [], this.groupIds = null, this.currentTrack = null, this.trackId = -1, this.selectDefaultTrack = !0;\n }\n onManifestParsed(e, t) {\n this.tracks = t.audioTracks || [];\n }\n onAudioTrackLoaded(e, t) {\n const {\n id: r,\n groupId: n,\n details: i\n } = t, o = this.tracksInGroup[r];\n if (!o || o.groupId !== n) {\n this.warn(`Audio track with id:${r} and group:${n} not found in active group ${o == null ? void 0 : o.groupId}`);\n return;\n }\n const a = o.details;\n o.details = t.details, this.log(`Audio track ${r} \"${o.name}\" lang:${o.lang} group:${n} loaded [${i.startSN}-${i.endSN}]`), r === this.trackId && this.playlistLoaded(r, t, a);\n }\n onLevelLoading(e, t) {\n this.switchLevel(t.level);\n }\n onLevelSwitching(e, t) {\n this.switchLevel(t.level);\n }\n switchLevel(e) {\n const t = this.hls.levels[e];\n if (!t)\n return;\n const r = t.audioGroups || null, n = this.groupIds;\n let i = this.currentTrack;\n if (!r || (n == null ? void 0 : n.length) !== (r == null ? void 0 : r.length) || r != null && r.some((a) => (n == null ? void 0 : n.indexOf(a)) === -1)) {\n this.groupIds = r, this.trackId = -1, this.currentTrack = null;\n const a = this.tracks.filter((h) => !r || r.indexOf(h.groupId) !== -1);\n if (a.length)\n this.selectDefaultTrack && !a.some((h) => h.default) && (this.selectDefaultTrack = !1), a.forEach((h, f) => {\n h.id = f;\n });\n else if (!i && !this.tracksInGroup.length)\n return;\n this.tracksInGroup = a;\n const l = this.hls.config.audioPreference;\n if (!i && l) {\n const h = Wr(l, a, Us);\n if (h > -1)\n i = a[h];\n else {\n const f = Wr(l, this.tracks);\n i = this.tracks[f];\n }\n }\n let c = this.findTrackId(i);\n c === -1 && i && (c = this.findTrackId(null));\n const u = {\n audioTracks: a\n };\n this.log(`Updating audio tracks, ${a.length} track(s) found in group(s): ${r == null ? void 0 : r.join(\",\")}`), this.hls.trigger(I.AUDIO_TRACKS_UPDATED, u);\n const d = this.trackId;\n if (c !== -1 && d === -1)\n this.setAudioTrack(c);\n else if (a.length && d === -1) {\n var o;\n const h = new Error(`No audio track selected for current audio group-ID(s): ${(o = this.groupIds) == null ? void 0 : o.join(\",\")} track count: ${a.length}`);\n this.warn(h.message), this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.AUDIO_TRACK_LOAD_ERROR,\n fatal: !0,\n error: h\n });\n }\n }\n }\n onError(e, t) {\n t.fatal || !t.context || t.context.type === Ke.AUDIO_TRACK && t.context.id === this.trackId && (!this.groupIds || this.groupIds.indexOf(t.context.groupId) !== -1) && this.checkRetry(t);\n }\n get allAudioTracks() {\n return this.tracks;\n }\n get audioTracks() {\n return this.tracksInGroup;\n }\n get audioTrack() {\n return this.trackId;\n }\n set audioTrack(e) {\n this.selectDefaultTrack = !1, this.setAudioTrack(e);\n }\n setAudioOption(e) {\n const t = this.hls;\n if (t.config.audioPreference = e, e) {\n const r = this.allAudioTracks;\n if (this.selectDefaultTrack = !1, r.length) {\n const n = this.currentTrack;\n if (n && qs(e, n, Us))\n return n;\n const i = Wr(e, this.tracksInGroup, Us);\n if (i > -1) {\n const o = this.tracksInGroup[i];\n return this.setAudioTrack(i), o;\n } else if (n) {\n let o = t.loadLevel;\n o === -1 && (o = t.firstAutoLevel);\n const a = mb(e, t.levels, r, o, Us);\n if (a === -1)\n return null;\n t.nextLoadLevel = a;\n }\n if (e.channels || e.audioCodec) {\n const o = Wr(e, r);\n if (o > -1)\n return r[o];\n }\n }\n }\n return null;\n }\n setAudioTrack(e) {\n const t = this.tracksInGroup;\n if (e < 0 || e >= t.length) {\n this.warn(`Invalid audio track id: ${e}`);\n return;\n }\n this.selectDefaultTrack = !1;\n const r = this.currentTrack, n = t[e], i = n.details && !n.details.live;\n if (e === this.trackId && n === r && i || (this.log(`Switching to audio-track ${e} \"${n.name}\" lang:${n.lang} group:${n.groupId} channels:${n.channels}`), this.trackId = e, this.currentTrack = n, this.hls.trigger(I.AUDIO_TRACK_SWITCHING, tt({}, n)), i))\n return;\n const o = this.switchParams(n.url, r == null ? void 0 : r.details, n.details);\n this.loadPlaylist(o);\n }\n findTrackId(e) {\n const t = this.tracksInGroup;\n for (let r = 0; r < t.length; r++) {\n const n = t[r];\n if (!(this.selectDefaultTrack && !n.default) && (!e || qs(e, n, Us)))\n return r;\n }\n if (e) {\n const {\n name: r,\n lang: n,\n assocLang: i,\n characteristics: o,\n audioCodec: a,\n channels: l\n } = e;\n for (let c = 0; c < t.length; c++) {\n const u = t[c];\n if (qs({\n name: r,\n lang: n,\n assocLang: i,\n characteristics: o,\n audioCodec: a,\n channels: l\n }, u, Us))\n return c;\n }\n for (let c = 0; c < t.length; c++) {\n const u = t[c];\n if (Si(e.attrs, u.attrs, [\"LANGUAGE\", \"ASSOC-LANGUAGE\", \"CHARACTERISTICS\"]))\n return c;\n }\n for (let c = 0; c < t.length; c++) {\n const u = t[c];\n if (Si(e.attrs, u.attrs, [\"LANGUAGE\"]))\n return c;\n }\n }\n return -1;\n }\n loadPlaylist(e) {\n super.loadPlaylist();\n const t = this.currentTrack;\n this.shouldLoadPlaylist(t) && Qo(t.url, this.hls) && this.scheduleLoading(t, e);\n }\n loadingPlaylist(e, t) {\n super.loadingPlaylist(e, t);\n const r = e.id, n = e.groupId, i = this.getUrlWithDirectives(e.url, t), o = e.details, a = o == null ? void 0 : o.age;\n this.log(`Loading audio-track ${r} \"${e.name}\" lang:${e.lang} group:${n}${(t == null ? void 0 : t.msn) !== void 0 ? \" at sn \" + t.msn + \" part \" + t.part : \"\"}${a && o.live ? \" age \" + a.toFixed(1) + (o.type && \" \" + o.type || \"\") : \"\"} ${i}`), this.hls.trigger(I.AUDIO_TRACK_LOADING, {\n url: i,\n id: r,\n groupId: n,\n deliveryDirectives: t || null,\n track: e\n });\n }\n}\nclass o2 {\n constructor(e) {\n this.tracks = void 0, this.queues = {\n video: [],\n audio: [],\n audiovideo: []\n }, this.tracks = e;\n }\n destroy() {\n this.tracks = this.queues = null;\n }\n append(e, t, r) {\n if (this.queues === null || this.tracks === null)\n return;\n const n = this.queues[t];\n n.push(e), n.length === 1 && !r && this.executeNext(t);\n }\n appendBlocker(e) {\n return new Promise((t) => {\n const r = {\n label: \"async-blocker\",\n execute: t,\n onStart: () => {\n },\n onComplete: () => {\n },\n onError: () => {\n }\n };\n this.append(r, e);\n });\n }\n prependBlocker(e) {\n return new Promise((t) => {\n if (this.queues) {\n const r = {\n label: \"async-blocker-prepend\",\n execute: t,\n onStart: () => {\n },\n onComplete: () => {\n },\n onError: () => {\n }\n };\n this.queues[e].unshift(r);\n }\n });\n }\n removeBlockers() {\n this.queues !== null && [this.queues.video, this.queues.audio, this.queues.audiovideo].forEach((e) => {\n var t;\n const r = (t = e[0]) == null ? void 0 : t.label;\n (r === \"async-blocker\" || r === \"async-blocker-prepend\") && (e[0].execute(), e.splice(0, 1));\n });\n }\n unblockAudio(e) {\n if (this.queues === null)\n return;\n this.queues.audio[0] === e && this.shiftAndExecuteNext(\"audio\");\n }\n executeNext(e) {\n if (this.queues === null || this.tracks === null)\n return;\n const t = this.queues[e];\n if (t.length) {\n const n = t[0];\n try {\n n.execute();\n } catch (i) {\n var r;\n if (n.onError(i), this.queues === null || this.tracks === null)\n return;\n const o = (r = this.tracks[e]) == null ? void 0 : r.buffer;\n o != null && o.updating || this.shiftAndExecuteNext(e);\n }\n }\n }\n shiftAndExecuteNext(e) {\n this.queues !== null && (this.queues[e].shift(), this.executeNext(e));\n }\n current(e) {\n var t;\n return ((t = this.queues) == null ? void 0 : t[e][0]) || null;\n }\n toString() {\n const {\n queues: e,\n tracks: t\n } = this;\n return e === null || t === null ? \"<destroyed>\" : `\n${this.list(\"video\")}\n${this.list(\"audio\")}\n${this.list(\"audiovideo\")}}`;\n }\n list(e) {\n var t, r;\n return (t = this.queues) != null && t[e] || (r = this.tracks) != null && r[e] ? `${e}: (${this.listSbInfo(e)}) ${this.listOps(e)}` : \"\";\n }\n listSbInfo(e) {\n var t;\n const r = (t = this.tracks) == null ? void 0 : t[e], n = r == null ? void 0 : r.buffer;\n return n ? `SourceBuffer${n.updating ? \" updating\" : \"\"}${r.ended ? \" ended\" : \"\"}${r.ending ? \" ending\" : \"\"}` : \"none\";\n }\n listOps(e) {\n var t;\n return ((t = this.queues) == null ? void 0 : t[e].map((r) => r.label).join(\", \")) || \"\";\n }\n}\nconst Kh = /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\\.[^.,]+)+/, Ip = \"HlsJsTrackRemovedError\";\nclass a2 extends Error {\n constructor(e) {\n super(e), this.name = Ip;\n }\n}\nclass l2 extends Lr {\n constructor(e, t) {\n super(\"buffer-controller\", e.logger), this.hls = void 0, this.fragmentTracker = void 0, this.details = null, this._objectUrl = null, this.operationQueue = null, this.bufferCodecEventsTotal = 0, this.media = null, this.mediaSource = null, this.lastMpegAudioChunk = null, this.blockedAudioAppend = null, this.lastVideoAppendEnd = 0, this.appendSource = void 0, this.transferData = void 0, this.overrides = void 0, this.appendErrors = {\n audio: 0,\n video: 0,\n audiovideo: 0\n }, this.tracks = {}, this.sourceBuffers = [[null, null], [null, null]], this._onEndStreaming = (r) => {\n var n;\n this.hls && ((n = this.mediaSource) == null ? void 0 : n.readyState) === \"open\" && this.hls.pauseBuffering();\n }, this._onStartStreaming = (r) => {\n this.hls && this.hls.resumeBuffering();\n }, this._onMediaSourceOpen = (r) => {\n const {\n media: n,\n mediaSource: i\n } = this;\n r && this.log(\"Media source opened\"), !(!n || !i) && (i.removeEventListener(\"sourceopen\", this._onMediaSourceOpen), n.removeEventListener(\"emptied\", this._onMediaEmptied), this.updateDuration(), this.hls.trigger(I.MEDIA_ATTACHED, {\n media: n,\n mediaSource: i\n }), this.mediaSource !== null && this.checkPendingTracks());\n }, this._onMediaSourceClose = () => {\n this.log(\"Media source closed\");\n }, this._onMediaSourceEnded = () => {\n this.log(\"Media source ended\");\n }, this._onMediaEmptied = () => {\n const {\n mediaSrc: r,\n _objectUrl: n\n } = this;\n r !== n && this.error(`Media element src was set while attaching MediaSource (${n} > ${r})`);\n }, this.hls = e, this.fragmentTracker = t, this.appendSource = CS(Ms(e.config.preferManagedMediaSource)), this.initTracks(), this.registerListeners();\n }\n hasSourceTypes() {\n return Object.keys(this.tracks).length > 0;\n }\n destroy() {\n this.unregisterListeners(), this.details = null, this.lastMpegAudioChunk = this.blockedAudioAppend = null, this.transferData = this.overrides = void 0, this.operationQueue && (this.operationQueue.destroy(), this.operationQueue = null), this.hls = this.fragmentTracker = null, this._onMediaSourceOpen = this._onMediaSourceClose = null, this._onMediaSourceEnded = null, this._onStartStreaming = this._onEndStreaming = null;\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.BUFFER_RESET, this.onBufferReset, this), e.on(I.BUFFER_APPENDING, this.onBufferAppending, this), e.on(I.BUFFER_CODECS, this.onBufferCodecs, this), e.on(I.BUFFER_EOS, this.onBufferEos, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.FRAG_PARSED, this.onFragParsed, this), e.on(I.FRAG_CHANGED, this.onFragChanged, this), e.on(I.ERROR, this.onError, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.BUFFER_RESET, this.onBufferReset, this), e.off(I.BUFFER_APPENDING, this.onBufferAppending, this), e.off(I.BUFFER_CODECS, this.onBufferCodecs, this), e.off(I.BUFFER_EOS, this.onBufferEos, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.FRAG_PARSED, this.onFragParsed, this), e.off(I.FRAG_CHANGED, this.onFragChanged, this), e.off(I.ERROR, this.onError, this);\n }\n transferMedia() {\n const {\n media: e,\n mediaSource: t\n } = this;\n if (!e)\n return null;\n const r = {};\n if (this.operationQueue) {\n const i = this.isUpdating();\n i || this.operationQueue.removeBlockers();\n const o = this.isQueued();\n (i || o) && this.warn(`Transfering MediaSource with${o ? \" operations in queue\" : \"\"}${i ? \" updating SourceBuffer(s)\" : \"\"} ${this.operationQueue}`), this.operationQueue.destroy();\n }\n const n = this.transferData;\n return !this.sourceBufferCount && n && n.mediaSource === t ? nt(r, n.tracks) : this.sourceBuffers.forEach((i) => {\n const [o] = i;\n o && (r[o] = nt({}, this.tracks[o]), this.removeBuffer(o)), i[0] = i[1] = null;\n }), {\n media: e,\n mediaSource: t,\n tracks: r\n };\n }\n initTracks() {\n const e = {};\n this.sourceBuffers = [[null, null], [null, null]], this.tracks = e, this.resetQueue(), this.resetAppendErrors(), this.lastMpegAudioChunk = this.blockedAudioAppend = null, this.lastVideoAppendEnd = 0;\n }\n onManifestLoading() {\n this.bufferCodecEventsTotal = 0, this.details = null;\n }\n onManifestParsed(e, t) {\n var r;\n let n = 2;\n (t.audio && !t.video || !t.altAudio) && (n = 1), this.bufferCodecEventsTotal = n, this.log(`${n} bufferCodec event(s) expected.`), (r = this.transferData) != null && r.mediaSource && this.sourceBufferCount && n && this.bufferCreated();\n }\n onMediaAttaching(e, t) {\n const r = this.media = t.media;\n this.transferData = this.overrides = void 0;\n const n = Ms(this.appendSource);\n if (n) {\n const i = !!t.mediaSource;\n (i || t.overrides) && (this.transferData = t, this.overrides = t.overrides);\n const o = this.mediaSource = t.mediaSource || new n();\n if (this.assignMediaSource(o), i)\n this._objectUrl = r.src, this.attachTransferred();\n else {\n const a = this._objectUrl = self.URL.createObjectURL(o);\n if (this.appendSource)\n try {\n r.removeAttribute(\"src\");\n const l = self.ManagedMediaSource;\n r.disableRemotePlayback = r.disableRemotePlayback || l && o instanceof l, Hh(r), c2(r, a), r.load();\n } catch {\n r.src = a;\n }\n else\n r.src = a;\n }\n r.addEventListener(\"emptied\", this._onMediaEmptied);\n }\n }\n assignMediaSource(e) {\n var t, r;\n this.log(`${((t = this.transferData) == null ? void 0 : t.mediaSource) === e ? \"transferred\" : \"created\"} media source: ${(r = e.constructor) == null ? void 0 : r.name}`), e.addEventListener(\"sourceopen\", this._onMediaSourceOpen), e.addEventListener(\"sourceended\", this._onMediaSourceEnded), e.addEventListener(\"sourceclose\", this._onMediaSourceClose), this.appendSource && (e.addEventListener(\"startstreaming\", this._onStartStreaming), e.addEventListener(\"endstreaming\", this._onEndStreaming));\n }\n attachTransferred() {\n const e = this.media, t = this.transferData;\n if (!t || !e)\n return;\n const r = this.tracks, n = t.tracks, i = n ? Object.keys(n) : null, o = i ? i.length : 0, a = () => {\n Promise.resolve().then(() => {\n this.media && this.mediaSourceOpenOrEnded && this._onMediaSourceOpen();\n });\n };\n if (n && i && o) {\n if (!this.tracksReady) {\n this.hls.config.startFragPrefetch = !0, this.log(\"attachTransferred: waiting for SourceBuffer track info\");\n return;\n }\n if (this.log(`attachTransferred: (bufferCodecEventsTotal ${this.bufferCodecEventsTotal})\nrequired tracks: ${at(r, (l, c) => l === \"initSegment\" ? void 0 : c)};\ntransfer tracks: ${at(n, (l, c) => l === \"initSegment\" ? void 0 : c)}}`), !Ag(n, r)) {\n t.mediaSource = null, t.tracks = void 0;\n const l = e.currentTime, c = this.details, u = Math.max(l, (c == null ? void 0 : c.fragments[0].start) || 0);\n if (u - l > 1) {\n this.log(`attachTransferred: waiting for playback to reach new tracks start time ${l} -> ${u}`);\n return;\n }\n this.warn(`attachTransferred: resetting MediaSource for incompatible tracks (\"${Object.keys(n)}\"->\"${Object.keys(r)}\") start time: ${u} currentTime: ${l}`), this.onMediaDetaching(I.MEDIA_DETACHING, {}), this.onMediaAttaching(I.MEDIA_ATTACHING, t), e.currentTime = u;\n return;\n }\n this.transferData = void 0, i.forEach((l) => {\n const c = l, u = n[c];\n if (u) {\n const d = u.buffer;\n if (d) {\n const h = this.fragmentTracker, f = u.id;\n if (h.hasFragments(f) || h.hasParts(f)) {\n const E = Ce.getBuffered(d);\n h.detectEvictedFragments(c, E, f, null, !0);\n }\n const p = Sl(c), y = [c, d];\n this.sourceBuffers[p] = y, d.updating && this.operationQueue && this.operationQueue.prependBlocker(c), this.trackSourceBuffer(c, u);\n }\n }\n }), a(), this.bufferCreated();\n } else\n this.log(\"attachTransferred: MediaSource w/o SourceBuffers\"), a();\n }\n get mediaSourceOpenOrEnded() {\n var e;\n const t = (e = this.mediaSource) == null ? void 0 : e.readyState;\n return t === \"open\" || t === \"ended\";\n }\n onMediaDetaching(e, t) {\n const r = !!t.transferMedia;\n this.transferData = this.overrides = void 0;\n const {\n media: n,\n mediaSource: i,\n _objectUrl: o\n } = this;\n if (i) {\n if (this.log(`media source ${r ? \"transferring\" : \"detaching\"}`), r)\n this.sourceBuffers.forEach(([a]) => {\n a && this.removeBuffer(a);\n }), this.resetQueue();\n else {\n if (this.mediaSourceOpenOrEnded) {\n const a = i.readyState === \"open\";\n try {\n const l = i.sourceBuffers;\n for (let c = l.length; c--; )\n a && l[c].abort(), i.removeSourceBuffer(l[c]);\n a && i.endOfStream();\n } catch (l) {\n this.warn(`onMediaDetaching: ${l.message} while calling endOfStream`);\n }\n }\n this.sourceBufferCount && this.onBufferReset();\n }\n i.removeEventListener(\"sourceopen\", this._onMediaSourceOpen), i.removeEventListener(\"sourceended\", this._onMediaSourceEnded), i.removeEventListener(\"sourceclose\", this._onMediaSourceClose), this.appendSource && (i.removeEventListener(\"startstreaming\", this._onStartStreaming), i.removeEventListener(\"endstreaming\", this._onEndStreaming)), this.mediaSource = null, this._objectUrl = null;\n }\n n && (n.removeEventListener(\"emptied\", this._onMediaEmptied), r || (o && self.URL.revokeObjectURL(o), this.mediaSrc === o ? (n.removeAttribute(\"src\"), this.appendSource && Hh(n), n.load()) : this.warn(\"media|source.src was changed by a third party - skip cleanup\")), this.media = null), this.hls.trigger(I.MEDIA_DETACHED, t);\n }\n onBufferReset() {\n this.sourceBuffers.forEach(([e]) => {\n e && this.resetBuffer(e);\n }), this.initTracks();\n }\n resetBuffer(e) {\n var t;\n const r = (t = this.tracks[e]) == null ? void 0 : t.buffer;\n if (this.removeBuffer(e), r)\n try {\n var n;\n (n = this.mediaSource) != null && n.sourceBuffers.length && this.mediaSource.removeSourceBuffer(r);\n } catch (i) {\n this.warn(`onBufferReset ${e}`, i);\n }\n delete this.tracks[e];\n }\n removeBuffer(e) {\n this.removeBufferListeners(e), this.sourceBuffers[Sl(e)] = [null, null];\n const t = this.tracks[e];\n t && (t.buffer = void 0);\n }\n resetQueue() {\n this.operationQueue && this.operationQueue.destroy(), this.operationQueue = new o2(this.tracks);\n }\n onBufferCodecs(e, t) {\n var r;\n const n = this.tracks, i = Object.keys(t);\n this.log(`BUFFER_CODECS: \"${i}\" (current SB count ${this.sourceBufferCount})`);\n const o = \"audiovideo\" in t && (n.audio || n.video) || n.audiovideo && (\"audio\" in t || \"video\" in t), a = !o && this.sourceBufferCount && this.media && i.some((l) => !n[l]);\n if (o || a) {\n this.warn(`Unsupported transition between \"${Object.keys(n)}\" and \"${i}\" SourceBuffers`);\n return;\n }\n i.forEach((l) => {\n var c, u;\n const d = t[l], {\n id: h,\n codec: f,\n levelCodec: p,\n container: y,\n metadata: E,\n supplemental: b\n } = d;\n let R = n[l];\n const A = (c = this.transferData) == null || (c = c.tracks) == null ? void 0 : c[l], F = A != null && A.buffer ? A : R, M = (F == null ? void 0 : F.pendingCodec) || (F == null ? void 0 : F.codec), H = F == null ? void 0 : F.levelCodec;\n R || (R = n[l] = {\n buffer: void 0,\n listeners: [],\n codec: f,\n supplemental: b,\n container: y,\n levelCodec: p,\n metadata: E,\n id: h\n });\n const K = fo(M, H), j = K == null ? void 0 : K.replace(Kh, \"$1\");\n let C = fo(f, p);\n const k = (u = C) == null ? void 0 : u.replace(Kh, \"$1\");\n C && K && j !== k && (l.slice(0, 5) === \"audio\" && (C = Xo(C, this.appendSource)), this.log(`switching codec ${M} to ${C}`), C !== (R.pendingCodec || R.codec) && (R.pendingCodec = C), R.container = y, this.appendChangeType(l, y, C));\n }), (this.tracksReady || this.sourceBufferCount) && (t.tracks = this.sourceBufferTracks), !this.sourceBufferCount && (this.bufferCodecEventsTotal > 1 && !this.tracks.video && !t.video && ((r = t.audio) == null ? void 0 : r.id) === \"main\" && (this.log(\"Main audio-only\"), this.bufferCodecEventsTotal = 1), this.mediaSourceOpenOrEnded && this.checkPendingTracks());\n }\n get sourceBufferTracks() {\n return Object.keys(this.tracks).reduce((e, t) => {\n const r = this.tracks[t];\n return e[t] = {\n id: r.id,\n container: r.container,\n codec: r.codec,\n levelCodec: r.levelCodec\n }, e;\n }, {});\n }\n appendChangeType(e, t, r) {\n const n = `${t};codecs=${r}`, i = {\n label: `change-type=${n}`,\n execute: () => {\n const o = this.tracks[e];\n if (o) {\n const a = o.buffer;\n a != null && a.changeType && (this.log(`changing ${e} sourceBuffer type to ${n}`), a.changeType(n), o.codec = r, o.container = t);\n }\n this.shiftAndExecuteNext(e);\n },\n onStart: () => {\n },\n onComplete: () => {\n },\n onError: (o) => {\n this.warn(`Failed to change ${e} SourceBuffer type`, o);\n }\n };\n this.append(i, e, this.isPending(this.tracks[e]));\n }\n blockAudio(e) {\n var t;\n const r = e.start, n = r + e.duration * 0.05;\n if (((t = this.fragmentTracker.getAppendedFrag(r, pe.MAIN)) == null ? void 0 : t.gap) === !0)\n return;\n const o = {\n label: \"block-audio\",\n execute: () => {\n var a;\n const l = this.tracks.video;\n (this.lastVideoAppendEnd > n || l != null && l.buffer && Ce.isBuffered(l.buffer, n) || ((a = this.fragmentTracker.getAppendedFrag(n, pe.MAIN)) == null ? void 0 : a.gap) === !0) && (this.blockedAudioAppend = null, this.shiftAndExecuteNext(\"audio\"));\n },\n onStart: () => {\n },\n onComplete: () => {\n },\n onError: (a) => {\n this.warn(\"Error executing block-audio operation\", a);\n }\n };\n this.blockedAudioAppend = {\n op: o,\n frag: e\n }, this.append(o, \"audio\", !0);\n }\n unblockAudio() {\n const {\n blockedAudioAppend: e,\n operationQueue: t\n } = this;\n e && t && (this.blockedAudioAppend = null, t.unblockAudio(e.op));\n }\n onBufferAppending(e, t) {\n const {\n tracks: r\n } = this, {\n data: n,\n type: i,\n parent: o,\n frag: a,\n part: l,\n chunkMeta: c,\n offset: u\n } = t, d = c.buffering[i], {\n sn: h,\n cc: f\n } = a, p = self.performance.now();\n d.start = p;\n const y = a.stats.buffering, E = l ? l.stats.buffering : null;\n y.start === 0 && (y.start = p), E && E.start === 0 && (E.start = p);\n const b = r.audio;\n let R = !1;\n i === \"audio\" && (b == null ? void 0 : b.container) === \"audio/mpeg\" && (R = !this.lastMpegAudioChunk || c.id === 1 || this.lastMpegAudioChunk.sn !== c.sn, this.lastMpegAudioChunk = c);\n const A = r.video, F = A == null ? void 0 : A.buffer;\n if (F && h !== \"initSegment\") {\n const K = l || a, j = this.blockedAudioAppend;\n if (i === \"audio\" && o !== \"main\" && !this.blockedAudioAppend && !(A.ending || A.ended)) {\n const k = K.start + K.duration * 0.05, $ = F.buffered, W = this.currentOp(\"video\");\n !$.length && !W ? this.blockAudio(K) : !W && !Ce.isBuffered(F, k) && this.lastVideoAppendEnd < k && this.blockAudio(K);\n } else if (i === \"video\") {\n const C = K.end;\n if (j) {\n const k = j.frag.start;\n (C > k || C < this.lastVideoAppendEnd || Ce.isBuffered(F, k)) && this.unblockAudio();\n }\n this.lastVideoAppendEnd = C;\n }\n }\n const M = (l || a).start, H = {\n label: `append-${i}`,\n execute: () => {\n var K;\n d.executeStart = self.performance.now();\n const j = (K = this.tracks[i]) == null ? void 0 : K.buffer;\n j && (R ? this.updateTimestampOffset(j, M, 0.1, i, h, f) : u !== void 0 && ue(u) && this.updateTimestampOffset(j, u, 1e-6, i, h, f)), this.appendExecutor(n, i);\n },\n onStart: () => {\n },\n onComplete: () => {\n const K = self.performance.now();\n d.executeEnd = d.end = K, y.first === 0 && (y.first = K), E && E.first === 0 && (E.first = K);\n const j = {};\n this.sourceBuffers.forEach(([C, k]) => {\n C && (j[C] = Ce.getBuffered(k));\n }), this.appendErrors[i] = 0, i === \"audio\" || i === \"video\" ? this.appendErrors.audiovideo = 0 : (this.appendErrors.audio = 0, this.appendErrors.video = 0), this.hls.trigger(I.BUFFER_APPENDED, {\n type: i,\n frag: a,\n part: l,\n chunkMeta: c,\n parent: a.type,\n timeRanges: j\n });\n },\n onError: (K) => {\n var j;\n const C = {\n type: ve.MEDIA_ERROR,\n parent: a.type,\n details: J.BUFFER_APPEND_ERROR,\n sourceBufferName: i,\n frag: a,\n part: l,\n chunkMeta: c,\n error: K,\n err: K,\n fatal: !1\n }, k = (j = this.media) == null ? void 0 : j.error;\n if (K.code === DOMException.QUOTA_EXCEEDED_ERR || K.name == \"QuotaExceededError\" || \"quota\" in K)\n C.details = J.BUFFER_FULL_ERROR;\n else if (K.code === DOMException.INVALID_STATE_ERR && this.mediaSourceOpenOrEnded && !k)\n C.errorAction = An(!0);\n else if (K.name === Ip && this.sourceBufferCount === 0)\n C.errorAction = An(!0);\n else {\n const $ = ++this.appendErrors[i];\n this.warn(`Failed ${$}/${this.hls.config.appendErrorMaxRetry} times to append segment in \"${i}\" sourceBuffer (${k || \"no media error\"})`), ($ >= this.hls.config.appendErrorMaxRetry || k) && (C.fatal = !0);\n }\n this.hls.trigger(I.ERROR, C);\n }\n };\n this.log(`queuing \"${i}\" append sn: ${h}${l ? \" p: \" + l.index : \"\"} of ${a.type === pe.MAIN ? \"level\" : \"track\"} ${a.level} cc: ${f}`), this.append(H, i, this.isPending(this.tracks[i]));\n }\n getFlushOp(e, t, r) {\n return this.log(`queuing \"${e}\" remove ${t}-${r}`), {\n label: \"remove\",\n execute: () => {\n this.removeExecutor(e, t, r);\n },\n onStart: () => {\n },\n onComplete: () => {\n this.hls.trigger(I.BUFFER_FLUSHED, {\n type: e\n });\n },\n onError: (n) => {\n this.warn(`Failed to remove ${t}-${r} from \"${e}\" SourceBuffer`, n);\n }\n };\n }\n onBufferFlushing(e, t) {\n const {\n type: r,\n startOffset: n,\n endOffset: i\n } = t;\n r ? this.append(this.getFlushOp(r, n, i), r) : this.sourceBuffers.forEach(([o]) => {\n o && this.append(this.getFlushOp(o, n, i), o);\n });\n }\n onFragParsed(e, t) {\n const {\n frag: r,\n part: n\n } = t, i = [], o = n ? n.elementaryStreams : r.elementaryStreams;\n o[ot.AUDIOVIDEO] ? i.push(\"audiovideo\") : (o[ot.AUDIO] && i.push(\"audio\"), o[ot.VIDEO] && i.push(\"video\"));\n const a = () => {\n const l = self.performance.now();\n r.stats.buffering.end = l, n && (n.stats.buffering.end = l);\n const c = n ? n.stats : r.stats;\n this.hls.trigger(I.FRAG_BUFFERED, {\n frag: r,\n part: n,\n stats: c,\n id: r.type\n });\n };\n i.length === 0 && this.warn(`Fragments must have at least one ElementaryStreamType set. type: ${r.type} level: ${r.level} sn: ${r.sn}`), this.blockBuffers(a, i).catch((l) => {\n this.warn(`Fragment buffered callback ${l}`), this.stepOperationQueue(this.sourceBufferTypes);\n });\n }\n onFragChanged(e, t) {\n this.trimBuffers();\n }\n get bufferedToEnd() {\n return this.sourceBufferCount > 0 && !this.sourceBuffers.some(([e]) => {\n if (e) {\n const t = this.tracks[e];\n if (t)\n return !t.ended || t.ending;\n }\n return !1;\n });\n }\n // on BUFFER_EOS mark matching sourcebuffer(s) as \"ending\" and \"ended\" and queue endOfStream after remaining operations(s)\n // an undefined data.type will mark all buffers as EOS.\n onBufferEos(e, t) {\n var r;\n this.sourceBuffers.forEach(([o]) => {\n if (o) {\n const a = this.tracks[o];\n (!t.type || t.type === o) && (a.ending = !0, a.ended || (a.ended = !0, this.log(`${o} buffer reached EOS`)));\n }\n });\n const n = ((r = this.overrides) == null ? void 0 : r.endOfStream) !== !1;\n this.sourceBufferCount > 0 && !this.sourceBuffers.some(([o]) => {\n var a;\n return o && !((a = this.tracks[o]) != null && a.ended);\n }) ? n ? (this.log(\"Queueing EOS\"), this.blockUntilOpen(() => {\n this.tracksEnded();\n const {\n mediaSource: o\n } = this;\n if (!o || o.readyState !== \"open\") {\n o && this.log(`Could not call mediaSource.endOfStream(). mediaSource.readyState: ${o.readyState}`);\n return;\n }\n this.log(\"Calling mediaSource.endOfStream()\"), o.endOfStream(), this.hls.trigger(I.BUFFERED_TO_END, void 0);\n })) : (this.tracksEnded(), this.hls.trigger(I.BUFFERED_TO_END, void 0)) : t.type === \"video\" && this.unblockAudio();\n }\n tracksEnded() {\n this.sourceBuffers.forEach(([e]) => {\n if (e !== null) {\n const t = this.tracks[e];\n t && (t.ending = !1);\n }\n });\n }\n onLevelUpdated(e, {\n details: t\n }) {\n t.fragments.length && (this.details = t, this.updateDuration());\n }\n updateDuration() {\n this.blockUntilOpen(() => {\n const e = this.getDurationAndRange();\n e && this.updateMediaSource(e);\n });\n }\n onError(e, t) {\n if (t.details === J.BUFFER_APPEND_ERROR && t.frag) {\n var r;\n const n = (r = t.errorAction) == null ? void 0 : r.nextAutoLevel;\n ue(n) && n !== t.frag.level && this.resetAppendErrors();\n }\n }\n resetAppendErrors() {\n this.appendErrors = {\n audio: 0,\n video: 0,\n audiovideo: 0\n };\n }\n trimBuffers() {\n const {\n hls: e,\n details: t,\n media: r\n } = this;\n if (!r || t === null || !this.sourceBufferCount)\n return;\n const n = e.config, i = r.currentTime, o = t.levelTargetDuration, a = t.live && n.liveBackBufferLength !== null ? n.liveBackBufferLength : n.backBufferLength;\n if (ue(a) && a >= 0) {\n const c = Math.max(a, o), u = Math.floor(i / o) * o - c;\n this.flushBackBuffer(i, o, u);\n }\n const l = n.frontBufferFlushThreshold;\n if (ue(l) && l > 0) {\n const c = Math.max(n.maxBufferLength, l), u = Math.max(c, o), d = Math.floor(i / o) * o + u;\n this.flushFrontBuffer(i, o, d);\n }\n }\n flushBackBuffer(e, t, r) {\n this.sourceBuffers.forEach(([n, i]) => {\n if (i) {\n const a = Ce.getBuffered(i);\n if (a.length > 0 && r > a.start(0)) {\n var o;\n this.hls.trigger(I.BACK_BUFFER_REACHED, {\n bufferEnd: r\n });\n const l = this.tracks[n];\n if ((o = this.details) != null && o.live)\n this.hls.trigger(I.LIVE_BACK_BUFFER_REACHED, {\n bufferEnd: r\n });\n else if (l != null && l.ended) {\n this.log(`Cannot flush ${n} back buffer while SourceBuffer is in ended state`);\n return;\n }\n this.hls.trigger(I.BUFFER_FLUSHING, {\n startOffset: 0,\n endOffset: r,\n type: n\n });\n }\n }\n });\n }\n flushFrontBuffer(e, t, r) {\n this.sourceBuffers.forEach(([n, i]) => {\n if (i) {\n const o = Ce.getBuffered(i), a = o.length;\n if (a < 2)\n return;\n const l = o.start(a - 1), c = o.end(a - 1);\n if (r > l || e >= l && e <= c)\n return;\n this.hls.trigger(I.BUFFER_FLUSHING, {\n startOffset: l,\n endOffset: 1 / 0,\n type: n\n });\n }\n });\n }\n /**\n * Update Media Source duration to current level duration or override to Infinity if configuration parameter\n * 'liveDurationInfinity` is set to `true`\n * More details: https://github.com/video-dev/hls.js/issues/355\n */\n getDurationAndRange() {\n var e;\n const {\n details: t,\n mediaSource: r\n } = this;\n if (!t || !this.media || (r == null ? void 0 : r.readyState) !== \"open\")\n return null;\n const n = t.edge;\n if (t.live && this.hls.config.liveDurationInfinity) {\n if (t.fragments.length && r.setLiveSeekableRange) {\n const c = Math.max(0, t.fragmentStart), u = Math.max(c, n);\n return {\n duration: 1 / 0,\n start: c,\n end: u\n };\n }\n return {\n duration: 1 / 0\n };\n }\n const i = (e = this.overrides) == null ? void 0 : e.duration;\n if (i)\n return ue(i) ? {\n duration: i\n } : null;\n const o = this.media.duration, a = ue(r.duration) ? r.duration : 0;\n return n > a && n > o || !ue(o) ? {\n duration: n\n } : null;\n }\n updateMediaSource({\n duration: e,\n start: t,\n end: r\n }) {\n const n = this.mediaSource;\n !this.media || !n || n.readyState !== \"open\" || (n.duration !== e && (ue(e) && this.log(`Updating MediaSource duration to ${e.toFixed(3)}`), n.duration = e), t !== void 0 && r !== void 0 && (this.log(`MediaSource duration is set to ${n.duration}. Setting seekable range to ${t}-${r}.`), n.setLiveSeekableRange(t, r)));\n }\n get tracksReady() {\n const e = this.pendingTrackCount;\n return e > 0 && (e >= this.bufferCodecEventsTotal || this.isPending(this.tracks.audiovideo));\n }\n checkPendingTracks() {\n const {\n bufferCodecEventsTotal: e,\n pendingTrackCount: t,\n tracks: r\n } = this;\n if (this.log(`checkPendingTracks (pending: ${t} codec events expected: ${e}) ${at(r)}`), this.tracksReady) {\n var n;\n const i = (n = this.transferData) == null ? void 0 : n.tracks;\n i && Object.keys(i).length ? this.attachTransferred() : this.createSourceBuffers();\n }\n }\n bufferCreated() {\n if (this.sourceBufferCount) {\n const e = {};\n this.sourceBuffers.forEach(([t, r]) => {\n if (t) {\n const n = this.tracks[t];\n e[t] = {\n buffer: r,\n container: n.container,\n codec: n.codec,\n supplemental: n.supplemental,\n levelCodec: n.levelCodec,\n id: n.id,\n metadata: n.metadata\n };\n }\n }), this.hls.trigger(I.BUFFER_CREATED, {\n tracks: e\n }), this.log(`SourceBuffers created. Running queue: ${this.operationQueue}`), this.sourceBuffers.forEach(([t]) => {\n this.executeNext(t);\n });\n } else {\n const e = new Error(\"could not create source buffer for media codec(s)\");\n this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n fatal: !0,\n error: e,\n reason: e.message\n });\n }\n }\n createSourceBuffers() {\n const {\n tracks: e,\n sourceBuffers: t,\n mediaSource: r\n } = this;\n if (!r)\n throw new Error(\"createSourceBuffers called when mediaSource was null\");\n for (const i in e) {\n const o = i, a = e[o];\n if (this.isPending(a)) {\n const l = this.getTrackCodec(a, o), c = `${a.container};codecs=${l}`;\n a.codec = l, this.log(`creating sourceBuffer(${c})${this.currentOp(o) ? \" Queued\" : \"\"} ${at(a)}`);\n try {\n const u = r.addSourceBuffer(c), d = Sl(o), h = [o, u];\n t[d] = h, a.buffer = u;\n } catch (u) {\n var n;\n this.error(`error while trying to add sourceBuffer: ${u.message}`), this.shiftAndExecuteNext(o), (n = this.operationQueue) == null || n.removeBlockers(), delete this.tracks[o], this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_ADD_CODEC_ERROR,\n fatal: !1,\n error: u,\n sourceBufferName: o,\n mimeType: c,\n parent: a.id\n });\n return;\n }\n this.trackSourceBuffer(o, a);\n }\n }\n this.bufferCreated();\n }\n getTrackCodec(e, t) {\n const r = e.supplemental;\n let n = e.codec;\n r && (t === \"video\" || t === \"audiovideo\") && gi(r, \"video\") && (n = XS(n, r));\n const i = fo(n, e.levelCodec);\n return i ? t.slice(0, 5) === \"audio\" ? Xo(i, this.appendSource) : i : \"\";\n }\n trackSourceBuffer(e, t) {\n const r = t.buffer;\n if (!r)\n return;\n const n = this.getTrackCodec(t, e);\n this.tracks[e] = {\n buffer: r,\n codec: n,\n container: t.container,\n levelCodec: t.levelCodec,\n supplemental: t.supplemental,\n metadata: t.metadata,\n id: t.id,\n listeners: []\n }, this.removeBufferListeners(e), this.addBufferListener(e, \"updatestart\", this.onSBUpdateStart), this.addBufferListener(e, \"updateend\", this.onSBUpdateEnd), this.addBufferListener(e, \"error\", this.onSBUpdateError), this.appendSource && this.addBufferListener(e, \"bufferedchange\", (i, o) => {\n const a = o.removedRanges;\n a != null && a.length && this.hls.trigger(I.BUFFER_FLUSHED, {\n type: i\n });\n });\n }\n get mediaSrc() {\n var e, t;\n const r = ((e = this.media) == null || (t = e.querySelector) == null ? void 0 : t.call(e, \"source\")) || this.media;\n return r == null ? void 0 : r.src;\n }\n onSBUpdateStart(e) {\n const t = this.currentOp(e);\n t && t.onStart();\n }\n onSBUpdateEnd(e) {\n var t;\n if (((t = this.mediaSource) == null ? void 0 : t.readyState) === \"closed\") {\n this.resetBuffer(e);\n return;\n }\n const r = this.currentOp(e);\n r && (r.onComplete(), this.shiftAndExecuteNext(e));\n }\n onSBUpdateError(e, t) {\n var r;\n const n = new Error(`${e} SourceBuffer error. MediaSource readyState: ${(r = this.mediaSource) == null ? void 0 : r.readyState}`);\n this.error(`${n}`, t), this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_APPENDING_ERROR,\n sourceBufferName: e,\n error: n,\n fatal: !1\n });\n const i = this.currentOp(e);\n i && i.onError(n);\n }\n updateTimestampOffset(e, t, r, n, i, o) {\n const a = t - e.timestampOffset;\n Math.abs(a) >= r && (this.log(`Updating ${n} SourceBuffer timestampOffset to ${t} (sn: ${i} cc: ${o})`), e.timestampOffset = t);\n }\n // This method must result in an updateend event; if remove is not called, onSBUpdateEnd must be called manually\n removeExecutor(e, t, r) {\n const {\n media: n,\n mediaSource: i\n } = this, o = this.tracks[e], a = o == null ? void 0 : o.buffer;\n if (!n || !i || !a) {\n this.warn(`Attempting to remove from the ${e} SourceBuffer, but it does not exist`), this.shiftAndExecuteNext(e);\n return;\n }\n const l = ue(n.duration) ? n.duration : 1 / 0, c = ue(i.duration) ? i.duration : 1 / 0, u = Math.max(0, t), d = Math.min(r, l, c);\n d > u && (!o.ending || o.ended) ? (o.ended = !1, this.log(`Removing [${u},${d}] from the ${e} SourceBuffer`), a.remove(u, d)) : this.shiftAndExecuteNext(e);\n }\n // This method must result in an updateend event; if append is not called, onSBUpdateEnd must be called manually\n appendExecutor(e, t) {\n const r = this.tracks[t], n = r == null ? void 0 : r.buffer;\n if (!n)\n throw new a2(`Attempting to append to the ${t} SourceBuffer, but it does not exist`);\n r.ending = !1, r.ended = !1, n.appendBuffer(e);\n }\n blockUntilOpen(e) {\n if (this.isUpdating() || this.isQueued())\n this.blockBuffers(e).catch((t) => {\n this.warn(`SourceBuffer blocked callback ${t}`), this.stepOperationQueue(this.sourceBufferTypes);\n });\n else\n try {\n e();\n } catch (t) {\n this.warn(`Callback run without blocking ${this.operationQueue} ${t}`);\n }\n }\n isUpdating() {\n return this.sourceBuffers.some(([e, t]) => e && t.updating);\n }\n isQueued() {\n return this.sourceBuffers.some(([e]) => e && !!this.currentOp(e));\n }\n isPending(e) {\n return !!e && !e.buffer;\n }\n // Enqueues an operation to each SourceBuffer queue which, upon execution, resolves a promise. When all promises\n // resolve, the onUnblocked function is executed. Functions calling this method do not need to unblock the queue\n // upon completion, since we already do it here\n blockBuffers(e, t = this.sourceBufferTypes) {\n if (!t.length)\n return this.log(\"Blocking operation requested, but no SourceBuffers exist\"), Promise.resolve().then(e);\n const {\n operationQueue: r\n } = this, n = t.map((o) => this.appendBlocker(o));\n return t.length > 1 && !!this.blockedAudioAppend && this.unblockAudio(), Promise.all(n).then((o) => {\n r === this.operationQueue && (e(), this.stepOperationQueue(this.sourceBufferTypes));\n });\n }\n stepOperationQueue(e) {\n e.forEach((t) => {\n var r;\n const n = (r = this.tracks[t]) == null ? void 0 : r.buffer;\n !n || n.updating || this.shiftAndExecuteNext(t);\n });\n }\n append(e, t, r) {\n this.operationQueue && this.operationQueue.append(e, t, r);\n }\n appendBlocker(e) {\n if (this.operationQueue)\n return this.operationQueue.appendBlocker(e);\n }\n currentOp(e) {\n return this.operationQueue ? this.operationQueue.current(e) : null;\n }\n executeNext(e) {\n e && this.operationQueue && this.operationQueue.executeNext(e);\n }\n shiftAndExecuteNext(e) {\n this.operationQueue && this.operationQueue.shiftAndExecuteNext(e);\n }\n get pendingTrackCount() {\n return Object.keys(this.tracks).reduce((e, t) => e + (this.isPending(this.tracks[t]) ? 1 : 0), 0);\n }\n get sourceBufferCount() {\n return this.sourceBuffers.reduce((e, [t]) => e + (t ? 1 : 0), 0);\n }\n get sourceBufferTypes() {\n return this.sourceBuffers.map(([e]) => e).filter((e) => !!e);\n }\n addBufferListener(e, t, r) {\n const n = this.tracks[e];\n if (!n)\n return;\n const i = n.buffer;\n if (!i)\n return;\n const o = r.bind(this, e);\n n.listeners.push({\n event: t,\n listener: o\n }), i.addEventListener(t, o);\n }\n removeBufferListeners(e) {\n const t = this.tracks[e];\n if (!t)\n return;\n const r = t.buffer;\n r && (t.listeners.forEach((n) => {\n r.removeEventListener(n.event, n.listener);\n }), t.listeners.length = 0);\n }\n}\nfunction Hh(s) {\n const e = s.querySelectorAll(\"source\");\n [].slice.call(e).forEach((t) => {\n s.removeChild(t);\n });\n}\nfunction c2(s, e) {\n const t = self.document.createElement(\"source\");\n t.type = \"video/mp4\", t.src = e, s.appendChild(t);\n}\nfunction Sl(s) {\n return s === \"audio\" ? 1 : 0;\n}\nclass Du {\n constructor(e) {\n this.hls = void 0, this.autoLevelCapping = void 0, this.firstLevel = void 0, this.media = void 0, this.restrictedLevels = void 0, this.timer = void 0, this.clientRect = void 0, this.streamController = void 0, this.hls = e, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.firstLevel = -1, this.media = null, this.restrictedLevels = [], this.timer = void 0, this.clientRect = null, this.registerListeners();\n }\n setStreamController(e) {\n this.streamController = e;\n }\n destroy() {\n this.hls && this.unregisterListener(), this.timer && this.stopCapping(), this.media = null, this.clientRect = null, this.hls = this.streamController = null;\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this), e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.BUFFER_CODECS, this.onBufferCodecs, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n }\n unregisterListener() {\n const {\n hls: e\n } = this;\n e.off(I.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this), e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.BUFFER_CODECS, this.onBufferCodecs, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n }\n onFpsDropLevelCapping(e, t) {\n const r = this.hls.levels[t.droppedLevel];\n this.isLevelAllowed(r) && this.restrictedLevels.push({\n bitrate: r.bitrate,\n height: r.height,\n width: r.width\n });\n }\n onMediaAttaching(e, t) {\n this.media = t.media instanceof HTMLVideoElement ? t.media : null, this.clientRect = null, this.timer && this.hls.levels.length && this.detectPlayerSize();\n }\n onManifestParsed(e, t) {\n const r = this.hls;\n this.restrictedLevels = [], this.firstLevel = t.firstLevel, r.config.capLevelToPlayerSize && t.video && this.startCapping();\n }\n onLevelsUpdated(e, t) {\n this.timer && ue(this.autoLevelCapping) && this.detectPlayerSize();\n }\n // Only activate capping when playing a video stream; otherwise, multi-bitrate audio-only streams will be restricted\n // to the first level\n onBufferCodecs(e, t) {\n this.hls.config.capLevelToPlayerSize && t.video && this.startCapping();\n }\n onMediaDetaching() {\n this.stopCapping(), this.media = null;\n }\n detectPlayerSize() {\n if (this.media) {\n if (this.mediaHeight <= 0 || this.mediaWidth <= 0) {\n this.clientRect = null;\n return;\n }\n const e = this.hls.levels;\n if (e.length) {\n const t = this.hls, r = this.getMaxLevel(e.length - 1);\n r !== this.autoLevelCapping && t.logger.log(`Setting autoLevelCapping to ${r}: ${e[r].height}p@${e[r].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}`), t.autoLevelCapping = r, t.autoLevelEnabled && t.autoLevelCapping > this.autoLevelCapping && this.streamController && this.streamController.nextLevelSwitch(), this.autoLevelCapping = t.autoLevelCapping;\n }\n }\n }\n /*\n * returns level should be the one with the dimensions equal or greater than the media (player) dimensions (so the video will be downscaled)\n */\n getMaxLevel(e) {\n const t = this.hls.levels;\n if (!t.length)\n return -1;\n const r = t.filter((n, i) => this.isLevelAllowed(n) && i <= e);\n return this.clientRect = null, Du.getMaxLevelByMediaSize(r, this.mediaWidth, this.mediaHeight);\n }\n startCapping() {\n this.timer || (this.autoLevelCapping = Number.POSITIVE_INFINITY, self.clearInterval(this.timer), this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1e3), this.detectPlayerSize());\n }\n stopCapping() {\n this.restrictedLevels = [], this.firstLevel = -1, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.timer && (self.clearInterval(this.timer), this.timer = void 0);\n }\n getDimensions() {\n if (this.clientRect)\n return this.clientRect;\n const e = this.media, t = {\n width: 0,\n height: 0\n };\n if (e) {\n const r = e.getBoundingClientRect();\n t.width = r.width, t.height = r.height, !t.width && !t.height && (t.width = r.right - r.left || e.width || 0, t.height = r.bottom - r.top || e.height || 0);\n }\n return this.clientRect = t, t;\n }\n get mediaWidth() {\n return this.getDimensions().width * this.contentScaleFactor;\n }\n get mediaHeight() {\n return this.getDimensions().height * this.contentScaleFactor;\n }\n get contentScaleFactor() {\n let e = 1;\n if (!this.hls.config.ignoreDevicePixelRatio)\n try {\n e = self.devicePixelRatio;\n } catch {\n }\n return Math.min(e, this.hls.config.maxDevicePixelRatio);\n }\n isLevelAllowed(e) {\n return !this.restrictedLevels.some((r) => e.bitrate === r.bitrate && e.width === r.width && e.height === r.height);\n }\n static getMaxLevelByMediaSize(e, t, r) {\n if (!(e != null && e.length))\n return -1;\n const n = (a, l) => l ? a.width !== l.width || a.height !== l.height : !0;\n let i = e.length - 1;\n const o = Math.max(t, r);\n for (let a = 0; a < e.length; a += 1) {\n const l = e[a];\n if ((l.width >= o || l.height >= o) && n(l, e[a + 1])) {\n i = a;\n break;\n }\n }\n return i;\n }\n}\nconst u2 = {\n /**\n * text file, such as a manifest or playlist\n */\n MANIFEST: \"m\",\n /**\n * audio only\n */\n AUDIO: \"a\",\n /**\n * video only\n */\n VIDEO: \"v\",\n /**\n * muxed audio and video\n */\n MUXED: \"av\",\n /**\n * init segment\n */\n INIT: \"i\",\n /**\n * caption or subtitle\n */\n CAPTION: \"c\",\n /**\n * ISOBMFF timed text track\n */\n TIMED_TEXT: \"tt\",\n /**\n * cryptographic key, license or certificate.\n */\n KEY: \"k\",\n /**\n * other\n */\n OTHER: \"o\"\n}, hr = u2, d2 = {\n /**\n * HTTP Live Streaming (HLS)\n */\n HLS: \"h\"\n}, h2 = d2;\nclass Jr {\n constructor(e, t) {\n Array.isArray(e) && (e = e.map((r) => r instanceof Jr ? r : new Jr(r))), this.value = e, this.params = t;\n }\n}\nconst f2 = \"Dict\";\nfunction g2(s) {\n return Array.isArray(s) ? JSON.stringify(s) : s instanceof Map ? \"Map{}\" : s instanceof Set ? \"Set{}\" : typeof s == \"object\" ? JSON.stringify(s) : String(s);\n}\nfunction p2(s, e, t, r) {\n return new Error(`failed to ${s} \"${g2(e)}\" as ${t}`, {\n cause: r\n });\n}\nfunction Qr(s, e, t) {\n return p2(\"serialize\", s, e, t);\n}\nclass _p {\n constructor(e) {\n this.description = e;\n }\n}\nconst qh = \"Bare Item\", m2 = \"Boolean\";\nfunction y2(s) {\n if (typeof s != \"boolean\")\n throw Qr(s, m2);\n return s ? \"?1\" : \"?0\";\n}\nfunction v2(s) {\n return btoa(String.fromCharCode(...s));\n}\nconst E2 = \"Byte Sequence\";\nfunction x2(s) {\n if (ArrayBuffer.isView(s) === !1)\n throw Qr(s, E2);\n return `:${v2(s)}:`;\n}\nconst S2 = \"Integer\";\nfunction b2(s) {\n return s < -999999999999999 || 999999999999999 < s;\n}\nfunction Rp(s) {\n if (b2(s))\n throw Qr(s, S2);\n return s.toString();\n}\nfunction T2(s) {\n return `@${Rp(s.getTime() / 1e3)}`;\n}\nfunction Lp(s, e) {\n if (s < 0)\n return -Lp(-s, e);\n const t = Math.pow(10, e);\n if (Math.abs(s * t % 1 - 0.5) < Number.EPSILON) {\n const n = Math.floor(s * t);\n return (n % 2 === 0 ? n : n + 1) / t;\n } else\n return Math.round(s * t) / t;\n}\nconst w2 = \"Decimal\";\nfunction A2(s) {\n const e = Lp(s, 3);\n if (Math.floor(Math.abs(e)).toString().length > 12)\n throw Qr(s, w2);\n const t = e.toString();\n return t.includes(\".\") ? t : `${t}.0`;\n}\nconst I2 = \"String\", _2 = /[\\x00-\\x1f\\x7f]+/;\nfunction R2(s) {\n if (_2.test(s))\n throw Qr(s, I2);\n return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\nfunction L2(s) {\n return s.description || s.toString().slice(7, -1);\n}\nconst C2 = \"Token\";\nfunction Wh(s) {\n const e = L2(s);\n if (/^([a-zA-Z*])([!#$%&'*+\\-.^_`|~\\w:/]*)$/.test(e) === !1)\n throw Qr(e, C2);\n return e;\n}\nfunction vc(s) {\n switch (typeof s) {\n case \"number\":\n if (!ue(s))\n throw Qr(s, qh);\n return Number.isInteger(s) ? Rp(s) : A2(s);\n case \"string\":\n return R2(s);\n case \"symbol\":\n return Wh(s);\n case \"boolean\":\n return y2(s);\n case \"object\":\n if (s instanceof Date)\n return T2(s);\n if (s instanceof Uint8Array)\n return x2(s);\n if (s instanceof _p)\n return Wh(s);\n default:\n throw Qr(s, qh);\n }\n}\nconst k2 = \"Key\";\nfunction Ec(s) {\n if (/^[a-z*][a-z0-9\\-_.*]*$/.test(s) === !1)\n throw Qr(s, k2);\n return s;\n}\nfunction Pu(s) {\n return s == null ? \"\" : Object.entries(s).map(([e, t]) => t === !0 ? `;${Ec(e)}` : `;${Ec(e)}=${vc(t)}`).join(\"\");\n}\nfunction Cp(s) {\n return s instanceof Jr ? `${vc(s.value)}${Pu(s.params)}` : vc(s);\n}\nfunction D2(s) {\n return `(${s.value.map(Cp).join(\" \")})${Pu(s.params)}`;\n}\nfunction P2(s, e = {\n whitespace: !0\n}) {\n if (typeof s != \"object\" || s == null)\n throw Qr(s, f2);\n const t = s instanceof Map ? s.entries() : Object.entries(s), r = e != null && e.whitespace ? \" \" : \"\";\n return Array.from(t).map(([n, i]) => {\n i instanceof Jr || (i = new Jr(i));\n let o = Ec(n);\n return i.value === !0 ? o += Pu(i.params) : (o += \"=\", Array.isArray(i.value) ? o += D2(i) : o += Cp(i)), o;\n }).join(`,${r}`);\n}\nfunction kp(s, e) {\n return P2(s, e);\n}\nconst $r = \"CMCD-Object\", yt = \"CMCD-Request\", Fs = \"CMCD-Session\", bs = \"CMCD-Status\", M2 = {\n // Object\n br: $r,\n ab: $r,\n d: $r,\n ot: $r,\n tb: $r,\n tpb: $r,\n lb: $r,\n tab: $r,\n lab: $r,\n url: $r,\n // Request\n pb: yt,\n bl: yt,\n tbl: yt,\n dl: yt,\n ltc: yt,\n mtp: yt,\n nor: yt,\n nrr: yt,\n rc: yt,\n sn: yt,\n sta: yt,\n su: yt,\n ttfb: yt,\n ttfbb: yt,\n ttlb: yt,\n cmsdd: yt,\n cmsds: yt,\n smrt: yt,\n df: yt,\n cs: yt,\n // TODO: Which header to put the `ts` field is not defined yet.\n ts: yt,\n // Session\n cid: Fs,\n pr: Fs,\n sf: Fs,\n sid: Fs,\n st: Fs,\n v: Fs,\n msd: Fs,\n // Status\n bs,\n bsd: bs,\n cdn: bs,\n rtp: bs,\n bg: bs,\n pt: bs,\n ec: bs,\n e: bs\n}, O2 = {\n /**\n * keys whose values vary with each request.\n */\n REQUEST: yt\n};\nfunction B2(s) {\n return Object.keys(s).reduce((e, t) => {\n var r;\n return (r = s[t]) === null || r === void 0 || r.forEach((n) => e[n] = t), e;\n }, {});\n}\nfunction F2(s, e) {\n const t = {};\n if (!s)\n return t;\n const r = Object.keys(s), n = e ? B2(e) : {};\n return r.reduce((i, o) => {\n var a;\n const l = M2[o] || n[o] || O2.REQUEST, c = (a = i[l]) !== null && a !== void 0 ? a : i[l] = {};\n return c[o] = s[o], i;\n }, t);\n}\nfunction N2(s) {\n return [\"ot\", \"sf\", \"st\", \"e\", \"sta\"].includes(s);\n}\nfunction U2(s) {\n return typeof s == \"number\" ? ue(s) : s != null && s !== \"\" && s !== !1;\n}\nconst Dp = \"event\";\nfunction $2(s, e) {\n const t = new URL(s), r = new URL(e);\n if (t.origin !== r.origin)\n return s;\n const n = t.pathname.split(\"/\").slice(1), i = r.pathname.split(\"/\").slice(1, -1);\n for (; n[0] === i[0]; )\n n.shift(), i.shift();\n for (; i.length; )\n i.shift(), n.unshift(\"..\");\n return n.join(\"/\") + t.search + t.hash;\n}\nconst vo = (s) => Math.round(s), xc = (s, e) => Array.isArray(s) ? s.map((t) => xc(t, e)) : s instanceof Jr && typeof s.value == \"string\" ? new Jr(xc(s.value, e), s.params) : (e.baseUrl && (s = $2(s, e.baseUrl)), e.version === 1 ? encodeURIComponent(s) : s), Xi = (s) => vo(s / 100) * 100, G2 = (s, e) => {\n let t = s;\n return e.version >= 2 && (s instanceof Jr && typeof s.value == \"string\" ? t = new Jr([s]) : typeof s == \"string\" && (t = [s])), xc(t, e);\n}, V2 = {\n /**\n * Bitrate (kbps) rounded integer\n */\n br: vo,\n /**\n * Duration (milliseconds) rounded integer\n */\n d: vo,\n /**\n * Buffer Length (milliseconds) rounded nearest 100ms\n */\n bl: Xi,\n /**\n * Deadline (milliseconds) rounded nearest 100ms\n */\n dl: Xi,\n /**\n * Measured Throughput (kbps) rounded nearest 100kbps\n */\n mtp: Xi,\n /**\n * Next Object Request URL encoded\n */\n nor: G2,\n /**\n * Requested maximum throughput (kbps) rounded nearest 100kbps\n */\n rtp: Xi,\n /**\n * Top Bitrate (kbps) rounded integer\n */\n tb: vo\n}, Pp = \"request\", Mp = \"response\", Mu = [\"ab\", \"bg\", \"bl\", \"br\", \"bs\", \"bsd\", \"cdn\", \"cid\", \"cs\", \"df\", \"ec\", \"lab\", \"lb\", \"ltc\", \"msd\", \"mtp\", \"pb\", \"pr\", \"pt\", \"sf\", \"sid\", \"sn\", \"st\", \"sta\", \"tab\", \"tb\", \"tbl\", \"tpb\", \"ts\", \"v\"], j2 = [\"e\"], K2 = /^[a-zA-Z0-9-.]+-[a-zA-Z0-9-.]+$/;\nfunction Ea(s) {\n return K2.test(s);\n}\nfunction H2(s) {\n return Mu.includes(s) || j2.includes(s) || Ea(s);\n}\nconst Op = [\"d\", \"dl\", \"nor\", \"ot\", \"rtp\", \"su\"];\nfunction q2(s) {\n return Mu.includes(s) || Op.includes(s) || Ea(s);\n}\nconst W2 = [\"cmsdd\", \"cmsds\", \"rc\", \"smrt\", \"ttfb\", \"ttfbb\", \"ttlb\", \"url\"];\nfunction z2(s) {\n return Mu.includes(s) || Op.includes(s) || W2.includes(s) || Ea(s);\n}\nconst Y2 = [\"bl\", \"br\", \"bs\", \"cid\", \"d\", \"dl\", \"mtp\", \"nor\", \"nrr\", \"ot\", \"pr\", \"rtp\", \"sf\", \"sid\", \"st\", \"su\", \"tb\", \"v\"];\nfunction Z2(s) {\n return Y2.includes(s) || Ea(s);\n}\nconst X2 = {\n [Mp]: z2,\n [Dp]: H2,\n [Pp]: q2\n};\nfunction Bp(s, e = {}) {\n const t = {};\n if (s == null || typeof s != \"object\")\n return t;\n const r = e.version || s.v || 1, n = e.reportingMode || Pp, i = r === 1 ? Z2 : X2[n];\n let o = Object.keys(s).filter(i);\n const a = e.filter;\n typeof a == \"function\" && (o = o.filter(a));\n const l = n === Mp || n === Dp;\n l && !o.includes(\"ts\") && o.push(\"ts\"), r > 1 && !o.includes(\"v\") && o.push(\"v\");\n const c = nt({}, V2, e.formatters), u = {\n version: r,\n reportingMode: n,\n baseUrl: e.baseUrl\n };\n return o.sort().forEach((d) => {\n let h = s[d];\n const f = c[d];\n if (typeof f == \"function\" && (h = f(h, u)), d === \"v\") {\n if (r === 1)\n return;\n h = r;\n }\n d == \"pr\" && h === 1 || (l && d === \"ts\" && !ue(h) && (h = Date.now()), U2(h) && (N2(d) && typeof h == \"string\" && (h = new _p(h)), t[d] = h));\n }), t;\n}\nfunction J2(s, e = {}) {\n const t = {};\n if (!s)\n return t;\n const r = Bp(s, e), n = F2(r, e == null ? void 0 : e.customHeaderMap);\n return Object.entries(n).reduce((i, [o, a]) => {\n const l = kp(a, {\n whitespace: !1\n });\n return l && (i[o] = l), i;\n }, t);\n}\nfunction Q2(s, e, t) {\n return nt(s, J2(e, t));\n}\nconst ew = \"CMCD\";\nfunction tw(s, e = {}) {\n return s ? kp(Bp(s, e), {\n whitespace: !1\n }) : \"\";\n}\nfunction rw(s, e = {}) {\n if (!s)\n return \"\";\n const t = tw(s, e);\n return encodeURIComponent(t);\n}\nfunction sw(s, e = {}) {\n if (!s)\n return \"\";\n const t = rw(s, e);\n return `${ew}=${t}`;\n}\nconst zh = /CMCD=[^&#]+/;\nfunction nw(s, e, t) {\n const r = sw(e, t);\n if (!r)\n return s;\n if (zh.test(s))\n return s.replace(zh, r);\n const n = s.includes(\"?\") ? \"&\" : \"?\";\n return `${s}${n}${r}`;\n}\nclass iw {\n constructor(e) {\n this.hls = void 0, this.config = void 0, this.media = void 0, this.sid = void 0, this.cid = void 0, this.useHeaders = !1, this.includeKeys = void 0, this.initialized = !1, this.starved = !1, this.buffering = !0, this.audioBuffer = void 0, this.videoBuffer = void 0, this.onWaiting = () => {\n this.initialized && (this.starved = !0), this.buffering = !0;\n }, this.onPlaying = () => {\n this.initialized || (this.initialized = !0), this.buffering = !1;\n }, this.applyPlaylistData = (n) => {\n try {\n this.apply(n, {\n ot: hr.MANIFEST,\n su: !this.initialized\n });\n } catch (i) {\n this.hls.logger.warn(\"Could not generate manifest CMCD data.\", i);\n }\n }, this.applyFragmentData = (n) => {\n try {\n const {\n frag: i,\n part: o\n } = n, a = this.hls.levels[i.level], l = this.getObjectType(i), c = {\n d: (o || i).duration * 1e3,\n ot: l\n };\n (l === hr.VIDEO || l === hr.AUDIO || l == hr.MUXED) && (c.br = a.bitrate / 1e3, c.tb = this.getTopBandwidth(l) / 1e3, c.bl = this.getBufferLength(l));\n const u = o ? this.getNextPart(o) : this.getNextFrag(i);\n u != null && u.url && u.url !== i.url && (c.nor = u.url), this.apply(n, c);\n } catch (i) {\n this.hls.logger.warn(\"Could not generate segment CMCD data.\", i);\n }\n }, this.hls = e;\n const t = this.config = e.config, {\n cmcd: r\n } = t;\n r != null && (t.pLoader = this.createPlaylistLoader(), t.fLoader = this.createFragmentLoader(), this.sid = r.sessionId || e.sessionId, this.cid = r.contentId, this.useHeaders = r.useHeaders === !0, this.includeKeys = r.includeKeys, this.registerListeners());\n }\n registerListeners() {\n const e = this.hls;\n e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHED, this.onMediaDetached, this), e.on(I.BUFFER_CREATED, this.onBufferCreated, this);\n }\n unregisterListeners() {\n const e = this.hls;\n e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHED, this.onMediaDetached, this), e.off(I.BUFFER_CREATED, this.onBufferCreated, this);\n }\n destroy() {\n this.unregisterListeners(), this.onMediaDetached(), this.hls = this.config = this.audioBuffer = this.videoBuffer = null, this.onWaiting = this.onPlaying = this.media = null;\n }\n onMediaAttached(e, t) {\n this.media = t.media, this.media.addEventListener(\"waiting\", this.onWaiting), this.media.addEventListener(\"playing\", this.onPlaying);\n }\n onMediaDetached() {\n this.media && (this.media.removeEventListener(\"waiting\", this.onWaiting), this.media.removeEventListener(\"playing\", this.onPlaying), this.media = null);\n }\n onBufferCreated(e, t) {\n var r, n;\n this.audioBuffer = (r = t.tracks.audio) == null ? void 0 : r.buffer, this.videoBuffer = (n = t.tracks.video) == null ? void 0 : n.buffer;\n }\n /**\n * Create baseline CMCD data\n */\n createData() {\n var e;\n return {\n v: 1,\n sf: h2.HLS,\n sid: this.sid,\n cid: this.cid,\n pr: (e = this.media) == null ? void 0 : e.playbackRate,\n mtp: this.hls.bandwidthEstimate / 1e3\n };\n }\n /**\n * Apply CMCD data to a request.\n */\n apply(e, t = {}) {\n nt(t, this.createData());\n const r = t.ot === hr.INIT || t.ot === hr.VIDEO || t.ot === hr.MUXED;\n this.starved && r && (t.bs = !0, t.su = !0, this.starved = !1), t.su == null && (t.su = this.buffering);\n const {\n includeKeys: n\n } = this;\n n && (t = Object.keys(t).reduce((o, a) => (n.includes(a) && (o[a] = t[a]), o), {}));\n const i = {\n baseUrl: e.url\n };\n this.useHeaders ? (e.headers || (e.headers = {}), Q2(e.headers, t, i)) : e.url = nw(e.url, t, i);\n }\n getNextFrag(e) {\n var t;\n const r = (t = this.hls.levels[e.level]) == null ? void 0 : t.details;\n if (r) {\n const n = e.sn - r.startSN;\n return r.fragments[n + 1];\n }\n }\n getNextPart(e) {\n var t;\n const {\n index: r,\n fragment: n\n } = e, i = (t = this.hls.levels[n.level]) == null || (t = t.details) == null ? void 0 : t.partList;\n if (i) {\n const {\n sn: o\n } = n;\n for (let a = i.length - 1; a >= 0; a--) {\n const l = i[a];\n if (l.index === r && l.fragment.sn === o)\n return i[a + 1];\n }\n }\n }\n /**\n * The CMCD object type.\n */\n getObjectType(e) {\n const {\n type: t\n } = e;\n if (t === \"subtitle\")\n return hr.TIMED_TEXT;\n if (e.sn === \"initSegment\")\n return hr.INIT;\n if (t === \"audio\")\n return hr.AUDIO;\n if (t === \"main\")\n return this.hls.audioTracks.length ? hr.VIDEO : hr.MUXED;\n }\n /**\n * Get the highest bitrate.\n */\n getTopBandwidth(e) {\n let t = 0, r;\n const n = this.hls;\n if (e === hr.AUDIO)\n r = n.audioTracks;\n else {\n const i = n.maxAutoLevel, o = i > -1 ? i + 1 : n.levels.length;\n r = n.levels.slice(0, o);\n }\n return r.forEach((i) => {\n i.bitrate > t && (t = i.bitrate);\n }), t > 0 ? t : NaN;\n }\n /**\n * Get the buffer length for a media type in milliseconds\n */\n getBufferLength(e) {\n const t = this.media, r = e === hr.AUDIO ? this.audioBuffer : this.videoBuffer;\n return !r || !t ? NaN : Ce.bufferInfo(r, t.currentTime, this.config.maxBufferHole).len * 1e3;\n }\n /**\n * Create a playlist loader\n */\n createPlaylistLoader() {\n const {\n pLoader: e\n } = this.config, t = this.applyPlaylistData, r = e || this.config.loader;\n return class {\n constructor(i) {\n this.loader = void 0, this.loader = new r(i);\n }\n get stats() {\n return this.loader.stats;\n }\n get context() {\n return this.loader.context;\n }\n destroy() {\n this.loader.destroy();\n }\n abort() {\n this.loader.abort();\n }\n load(i, o, a) {\n t(i), this.loader.load(i, o, a);\n }\n };\n }\n /**\n * Create a playlist loader\n */\n createFragmentLoader() {\n const {\n fLoader: e\n } = this.config, t = this.applyFragmentData, r = e || this.config.loader;\n return class {\n constructor(i) {\n this.loader = void 0, this.loader = new r(i);\n }\n get stats() {\n return this.loader.stats;\n }\n get context() {\n return this.loader.context;\n }\n destroy() {\n this.loader.destroy();\n }\n abort() {\n this.loader.abort();\n }\n load(i, o, a) {\n t(i), this.loader.load(i, o, a);\n }\n };\n }\n}\nconst ow = 3e5;\nclass aw extends Lr {\n constructor(e) {\n super(\"content-steering\", e.logger), this.hls = void 0, this.loader = null, this.uri = null, this.pathwayId = \".\", this._pathwayPriority = null, this.timeToLoad = 300, this.reloadTimer = -1, this.updated = 0, this.started = !1, this.enabled = !0, this.levels = null, this.audioTracks = null, this.subtitleTracks = null, this.penalizedPathways = {}, this.hls = e, this.registerListeners();\n }\n registerListeners() {\n const e = this.hls;\n e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.ERROR, this.onError, this);\n }\n unregisterListeners() {\n const e = this.hls;\n e && (e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.ERROR, this.onError, this));\n }\n pathways() {\n return (this.levels || []).reduce((e, t) => (e.indexOf(t.pathwayId) === -1 && e.push(t.pathwayId), e), []);\n }\n get pathwayPriority() {\n return this._pathwayPriority;\n }\n set pathwayPriority(e) {\n this.updatePathwayPriority(e);\n }\n startLoad() {\n if (this.started = !0, this.clearTimeout(), this.enabled && this.uri) {\n if (this.updated) {\n const e = this.timeToLoad * 1e3 - (performance.now() - this.updated);\n if (e > 0) {\n this.scheduleRefresh(this.uri, e);\n return;\n }\n }\n this.loadSteeringManifest(this.uri);\n }\n }\n stopLoad() {\n this.started = !1, this.loader && (this.loader.destroy(), this.loader = null), this.clearTimeout();\n }\n clearTimeout() {\n this.reloadTimer !== -1 && (self.clearTimeout(this.reloadTimer), this.reloadTimer = -1);\n }\n destroy() {\n this.unregisterListeners(), this.stopLoad(), this.hls = null, this.levels = this.audioTracks = this.subtitleTracks = null;\n }\n removeLevel(e) {\n const t = this.levels;\n t && (this.levels = t.filter((r) => r !== e));\n }\n onManifestLoading() {\n this.stopLoad(), this.enabled = !0, this.timeToLoad = 300, this.updated = 0, this.uri = null, this.pathwayId = \".\", this.levels = this.audioTracks = this.subtitleTracks = null;\n }\n onManifestLoaded(e, t) {\n const {\n contentSteering: r\n } = t;\n r !== null && (this.pathwayId = r.pathwayId, this.uri = r.uri, this.started && this.startLoad());\n }\n onManifestParsed(e, t) {\n this.audioTracks = t.audioTracks, this.subtitleTracks = t.subtitleTracks;\n }\n onError(e, t) {\n const {\n errorAction: r\n } = t;\n if ((r == null ? void 0 : r.action) === Zt.SendAlternateToPenaltyBox && r.flags === vr.MoveAllAlternatesMatchingHost) {\n const n = this.levels;\n let i = this._pathwayPriority, o = this.pathwayId;\n if (t.context) {\n const {\n groupId: a,\n pathwayId: l,\n type: c\n } = t.context;\n a && n ? o = this.getPathwayForGroupId(a, c, o) : l && (o = l);\n }\n o in this.penalizedPathways || (this.penalizedPathways[o] = performance.now()), !i && n && (i = this.pathways()), i && i.length > 1 && (this.updatePathwayPriority(i), r.resolved = this.pathwayId !== o), t.details === J.BUFFER_APPEND_ERROR && !t.fatal ? r.resolved = !0 : r.resolved || this.warn(`Could not resolve ${t.details} (\"${t.error.message}\") with content-steering for Pathway: ${o} levels: ${n && n.length} priorities: ${at(i)} penalized: ${at(this.penalizedPathways)}`);\n }\n }\n filterParsedLevels(e) {\n this.levels = e;\n let t = this.getLevelsForPathway(this.pathwayId);\n if (t.length === 0) {\n const r = e[0].pathwayId;\n this.log(`No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to \"${r}\"`), t = this.getLevelsForPathway(r), this.pathwayId = r;\n }\n return t.length !== e.length && this.log(`Found ${t.length}/${e.length} levels in Pathway \"${this.pathwayId}\"`), t;\n }\n getLevelsForPathway(e) {\n return this.levels === null ? [] : this.levels.filter((t) => e === t.pathwayId);\n }\n updatePathwayPriority(e) {\n this._pathwayPriority = e;\n let t;\n const r = this.penalizedPathways, n = performance.now();\n Object.keys(r).forEach((i) => {\n n - r[i] > ow && delete r[i];\n });\n for (let i = 0; i < e.length; i++) {\n const o = e[i];\n if (o in r)\n continue;\n if (o === this.pathwayId)\n return;\n const a = this.hls.nextLoadLevel, l = this.hls.levels[a];\n if (t = this.getLevelsForPathway(o), t.length > 0) {\n this.log(`Setting Pathway to \"${o}\"`), this.pathwayId = o, rp(t), this.hls.trigger(I.LEVELS_UPDATED, {\n levels: t\n });\n const c = this.hls.levels[a];\n l && c && this.levels && (c.attrs[\"STABLE-VARIANT-ID\"] !== l.attrs[\"STABLE-VARIANT-ID\"] && c.bitrate !== l.bitrate && this.log(`Unstable Pathways change from bitrate ${l.bitrate} to ${c.bitrate}`), this.hls.nextLoadLevel = a);\n break;\n }\n }\n }\n getPathwayForGroupId(e, t, r) {\n const n = this.getLevelsForPathway(r).concat(this.levels || []);\n for (let i = 0; i < n.length; i++)\n if (t === Ke.AUDIO_TRACK && n[i].hasAudioGroup(e) || t === Ke.SUBTITLE_TRACK && n[i].hasSubtitleGroup(e))\n return n[i].pathwayId;\n return r;\n }\n clonePathways(e) {\n const t = this.levels;\n if (!t)\n return;\n const r = {}, n = {};\n e.forEach((i) => {\n const {\n ID: o,\n \"BASE-ID\": a,\n \"URI-REPLACEMENT\": l\n } = i;\n if (t.some((u) => u.pathwayId === o))\n return;\n const c = this.getLevelsForPathway(a).map((u) => {\n const d = new gt(u.attrs);\n d[\"PATHWAY-ID\"] = o;\n const h = d.AUDIO && `${d.AUDIO}_clone_${o}`, f = d.SUBTITLES && `${d.SUBTITLES}_clone_${o}`;\n h && (r[d.AUDIO] = h, d.AUDIO = h), f && (n[d.SUBTITLES] = f, d.SUBTITLES = f);\n const p = Fp(u.uri, d[\"STABLE-VARIANT-ID\"], \"PER-VARIANT-URIS\", l), y = new mi({\n attrs: d,\n audioCodec: u.audioCodec,\n bitrate: u.bitrate,\n height: u.height,\n name: u.name,\n url: p,\n videoCodec: u.videoCodec,\n width: u.width\n });\n if (u.audioGroups)\n for (let E = 1; E < u.audioGroups.length; E++)\n y.addGroupId(\"audio\", `${u.audioGroups[E]}_clone_${o}`);\n if (u.subtitleGroups)\n for (let E = 1; E < u.subtitleGroups.length; E++)\n y.addGroupId(\"text\", `${u.subtitleGroups[E]}_clone_${o}`);\n return y;\n });\n t.push(...c), Yh(this.audioTracks, r, l, o), Yh(this.subtitleTracks, n, l, o);\n });\n }\n loadSteeringManifest(e) {\n const t = this.hls.config, r = t.loader;\n this.loader && this.loader.destroy(), this.loader = new r(t);\n let n;\n try {\n n = new self.URL(e);\n } catch {\n this.enabled = !1, this.log(`Failed to parse Steering Manifest URI: ${e}`);\n return;\n }\n if (n.protocol !== \"data:\") {\n const u = (this.hls.bandwidthEstimate || t.abrEwmaDefaultEstimate) | 0;\n n.searchParams.set(\"_HLS_pathway\", this.pathwayId), n.searchParams.set(\"_HLS_throughput\", \"\" + u);\n }\n const i = {\n responseType: \"json\",\n url: n.href\n }, o = t.steeringManifestLoadPolicy.default, a = o.errorRetry || o.timeoutRetry || {}, l = {\n loadPolicy: o,\n timeout: o.maxLoadTimeMs,\n maxRetry: a.maxNumRetry || 0,\n retryDelay: a.retryDelayMs || 0,\n maxRetryDelay: a.maxRetryDelayMs || 0\n }, c = {\n onSuccess: (u, d, h, f) => {\n this.log(`Loaded steering manifest: \"${n}\"`);\n const p = u.data;\n if ((p == null ? void 0 : p.VERSION) !== 1) {\n this.log(`Steering VERSION ${p.VERSION} not supported!`);\n return;\n }\n this.updated = performance.now(), this.timeToLoad = p.TTL;\n const {\n \"RELOAD-URI\": y,\n \"PATHWAY-CLONES\": E,\n \"PATHWAY-PRIORITY\": b\n } = p;\n if (y)\n try {\n this.uri = new self.URL(y, n).href;\n } catch {\n this.enabled = !1, this.log(`Failed to parse Steering Manifest RELOAD-URI: ${y}`);\n return;\n }\n this.scheduleRefresh(this.uri || h.url), E && this.clonePathways(E);\n const R = {\n steeringManifest: p,\n url: n.toString()\n };\n this.hls.trigger(I.STEERING_MANIFEST_LOADED, R), b && this.updatePathwayPriority(b);\n },\n onError: (u, d, h, f) => {\n if (this.log(`Error loading steering manifest: ${u.code} ${u.text} (${d.url})`), this.stopLoad(), u.code === 410) {\n this.enabled = !1, this.log(`Steering manifest ${d.url} no longer available`);\n return;\n }\n let p = this.timeToLoad * 1e3;\n if (u.code === 429) {\n const y = this.loader;\n if (typeof (y == null ? void 0 : y.getResponseHeader) == \"function\") {\n const E = y.getResponseHeader(\"Retry-After\");\n E && (p = parseFloat(E) * 1e3);\n }\n this.log(`Steering manifest ${d.url} rate limited`);\n return;\n }\n this.scheduleRefresh(this.uri || d.url, p);\n },\n onTimeout: (u, d, h) => {\n this.log(`Timeout loading steering manifest (${d.url})`), this.scheduleRefresh(this.uri || d.url);\n }\n };\n this.log(`Requesting steering manifest: ${n}`), this.loader.load(i, l, c);\n }\n scheduleRefresh(e, t = this.timeToLoad * 1e3) {\n this.clearTimeout(), this.reloadTimer = self.setTimeout(() => {\n var r;\n const n = (r = this.hls) == null ? void 0 : r.media;\n if (n && !n.ended) {\n this.loadSteeringManifest(e);\n return;\n }\n this.scheduleRefresh(e, this.timeToLoad * 1e3);\n }, t);\n }\n}\nfunction Yh(s, e, t, r) {\n s && Object.keys(e).forEach((n) => {\n const i = s.filter((o) => o.groupId === n).map((o) => {\n const a = nt({}, o);\n return a.details = void 0, a.attrs = new gt(a.attrs), a.url = a.attrs.URI = Fp(o.url, o.attrs[\"STABLE-RENDITION-ID\"], \"PER-RENDITION-URIS\", t), a.groupId = a.attrs[\"GROUP-ID\"] = e[n], a.attrs[\"PATHWAY-ID\"] = r, a;\n });\n s.push(...i);\n });\n}\nfunction Fp(s, e, t, r) {\n const {\n HOST: n,\n PARAMS: i,\n [t]: o\n } = r;\n let a;\n e && (a = o == null ? void 0 : o[e], a && (s = a));\n const l = new self.URL(s);\n return n && !a && (l.host = n), i && Object.keys(i).sort().forEach((c) => {\n c && l.searchParams.set(c, i[c]);\n }), l.href;\n}\nclass _n extends Lr {\n constructor(e) {\n super(\"eme\", e.logger), this.hls = void 0, this.config = void 0, this.media = null, this.keyFormatPromise = null, this.keySystemAccessPromises = {}, this._requestLicenseFailureCount = 0, this.mediaKeySessions = [], this.keyIdToKeySessionPromise = {}, this.mediaKeys = null, this.setMediaKeysQueue = _n.CDMCleanupPromise ? [_n.CDMCleanupPromise] : [], this.bannedKeyIds = {}, this.onMediaEncrypted = (t) => {\n const {\n initDataType: r,\n initData: n\n } = t, i = `\"${t.type}\" event: init data type: \"${r}\"`;\n if (this.debug(i), n !== null) {\n if (!this.keyFormatPromise) {\n let o = Object.keys(this.keySystemAccessPromises);\n o.length || (o = zn(this.config));\n const a = o.map(fl).filter((l) => !!l);\n this.keyFormatPromise = this.getKeyFormatPromise(a);\n }\n this.keyFormatPromise.then((o) => {\n const a = po(o);\n if (r !== \"sinf\" || a !== mt.FAIRPLAY) {\n this.log(`Ignoring \"${t.type}\" event with init data type: \"${r}\" for selected key-system ${a}`);\n return;\n }\n let l;\n try {\n const f = jt(new Uint8Array(n)), p = bu(JSON.parse(f).sinf), y = Pg(p);\n if (!y)\n throw new Error(\"'schm' box missing or not cbcs/cenc with schi > tenc\");\n l = new Uint8Array(y.subarray(8, 24));\n } catch (f) {\n this.warn(`${i} Failed to parse sinf: ${f}`);\n return;\n }\n const c = fr(l), {\n keyIdToKeySessionPromise: u,\n mediaKeySessions: d\n } = this;\n let h = u[c];\n for (let f = 0; f < d.length; f++) {\n const p = d[f], y = p.decryptdata;\n if (!y.keyId)\n continue;\n const E = fr(y.keyId);\n if (xu(l, y.keyId) || y.uri.replace(/-/g, \"\").indexOf(c) !== -1) {\n if (h = u[E], !h)\n continue;\n if (y.pssh)\n break;\n delete u[E], y.pssh = new Uint8Array(n), y.keyId = l, h = u[c] = h.then(() => this.generateRequestWithPreferredKeySession(p, r, n, \"encrypted-event-key-match\")), h.catch((b) => this.handleError(b));\n break;\n }\n }\n h || this.handleError(new Error(`Key ID ${c} not encountered in playlist. Key-system sessions ${d.length}.`));\n }).catch((o) => this.handleError(o));\n }\n }, this.onWaitingForKey = (t) => {\n this.log(`\"${t.type}\" event`);\n }, this.hls = e, this.config = e.config, this.registerListeners();\n }\n destroy() {\n this.onDestroying(), this.onMediaDetached();\n const e = this.config;\n e.requestMediaKeySystemAccessFunc = null, e.licenseXhrSetup = e.licenseResponseCallback = void 0, e.drmSystems = e.drmSystemOptions = {}, this.hls = this.config = this.keyIdToKeySessionPromise = null, this.onMediaEncrypted = this.onWaitingForKey = null;\n }\n registerListeners() {\n this.hls.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), this.hls.on(I.MEDIA_DETACHED, this.onMediaDetached, this), this.hls.on(I.MANIFEST_LOADING, this.onManifestLoading, this), this.hls.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), this.hls.on(I.DESTROYING, this.onDestroying, this);\n }\n unregisterListeners() {\n this.hls.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), this.hls.off(I.MEDIA_DETACHED, this.onMediaDetached, this), this.hls.off(I.MANIFEST_LOADING, this.onManifestLoading, this), this.hls.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), this.hls.off(I.DESTROYING, this.onDestroying, this);\n }\n getLicenseServerUrl(e) {\n const {\n drmSystems: t,\n widevineLicenseUrl: r\n } = this.config, n = t == null ? void 0 : t[e];\n if (n)\n return n.licenseUrl;\n if (e === mt.WIDEVINE && r)\n return r;\n }\n getLicenseServerUrlOrThrow(e) {\n const t = this.getLicenseServerUrl(e);\n if (t === void 0)\n throw new Error(`no license server URL configured for key-system \"${e}\"`);\n return t;\n }\n getServerCertificateUrl(e) {\n const {\n drmSystems: t\n } = this.config, r = t == null ? void 0 : t[e];\n if (r)\n return r.serverCertificateUrl;\n this.log(`No Server Certificate in config.drmSystems[\"${e}\"]`);\n }\n attemptKeySystemAccess(e) {\n const t = this.hls.levels, r = (o, a, l) => !!o && l.indexOf(o) === a, n = t.map((o) => o.audioCodec).filter(r), i = t.map((o) => o.videoCodec).filter(r);\n return n.length + i.length === 0 && i.push(\"avc1.42e01e\"), new Promise((o, a) => {\n const l = (c) => {\n const u = c.shift();\n this.getMediaKeysPromise(u, n, i).then((d) => o({\n keySystem: u,\n mediaKeys: d\n })).catch((d) => {\n c.length ? l(c) : d instanceof yr ? a(d) : a(new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_NO_ACCESS,\n error: d,\n fatal: !0\n }, d.message));\n });\n };\n l(e);\n });\n }\n requestMediaKeySystemAccess(e, t) {\n const {\n requestMediaKeySystemAccessFunc: r\n } = this.config;\n if (typeof r != \"function\") {\n let n = `Configured requestMediaKeySystemAccess is not a function ${r}`;\n return Yg === null && self.location.protocol === \"http:\" && (n = `navigator.requestMediaKeySystemAccess is not available over insecure protocol ${location.protocol}`), Promise.reject(new Error(n));\n }\n return r(e, t);\n }\n getMediaKeysPromise(e, t, r) {\n var n;\n const i = Gb(e, t, r, this.config.drmSystemOptions || {});\n let o = this.keySystemAccessPromises[e], a = (n = o) == null ? void 0 : n.keySystemAccess;\n if (!a) {\n this.log(`Requesting encrypted media \"${e}\" key-system access with config: ${at(i)}`), a = this.requestMediaKeySystemAccess(e, i);\n const l = o = this.keySystemAccessPromises[e] = {\n keySystemAccess: a\n };\n return a.catch((c) => {\n this.log(`Failed to obtain access to key-system \"${e}\": ${c}`);\n }), a.then((c) => {\n this.log(`Access for key-system \"${c.keySystem}\" obtained`);\n const u = this.fetchServerCertificate(e);\n this.log(`Create media-keys for \"${e}\"`);\n const d = l.mediaKeys = c.createMediaKeys().then((h) => (this.log(`Media-keys created for \"${e}\"`), l.hasMediaKeys = !0, u.then((f) => f ? this.setMediaKeysServerCertificate(h, e, f) : h)));\n return d.catch((h) => {\n this.error(`Failed to create media-keys for \"${e}\"}: ${h}`);\n }), d;\n });\n }\n return a.then(() => o.mediaKeys);\n }\n createMediaKeySessionContext({\n decryptdata: e,\n keySystem: t,\n mediaKeys: r\n }) {\n this.log(`Creating key-system session \"${t}\" keyId: ${fr(e.keyId || [])} keyUri: ${e.uri}`);\n const n = r.createSession(), i = {\n decryptdata: e,\n keySystem: t,\n mediaKeys: r,\n mediaKeysSession: n,\n keyStatus: \"status-pending\"\n };\n return this.mediaKeySessions.push(i), i;\n }\n renewKeySession(e) {\n const t = e.decryptdata;\n if (t.pssh) {\n const r = this.createMediaKeySessionContext(e), n = Ji(t), i = \"cenc\";\n this.keyIdToKeySessionPromise[n] = this.generateRequestWithPreferredKeySession(r, i, t.pssh.buffer, \"expired\");\n } else\n this.warn(\"Could not renew expired session. Missing pssh initData.\");\n this.removeSession(e);\n }\n updateKeySession(e, t) {\n const r = e.mediaKeysSession;\n return this.log(`Updating key-session \"${r.sessionId}\" for keyId ${fr(e.decryptdata.keyId || [])}\n } (data length: ${t.byteLength})`), r.update(t);\n }\n getSelectedKeySystemFormats() {\n return Object.keys(this.keySystemAccessPromises).map((e) => ({\n keySystem: e,\n hasMediaKeys: this.keySystemAccessPromises[e].hasMediaKeys\n })).filter(({\n hasMediaKeys: e\n }) => !!e).map(({\n keySystem: e\n }) => fl(e)).filter((e) => !!e);\n }\n getKeySystemAccess(e) {\n return this.getKeySystemSelectionPromise(e).then(({\n keySystem: t,\n mediaKeys: r\n }) => this.attemptSetMediaKeys(t, r));\n }\n selectKeySystem(e) {\n return new Promise((t, r) => {\n this.getKeySystemSelectionPromise(e).then(({\n keySystem: n\n }) => {\n const i = fl(n);\n i ? t(i) : r(new Error(`Unable to find format for key-system \"${n}\"`));\n }).catch(r);\n });\n }\n selectKeySystemFormat(e) {\n const t = Object.keys(e.levelkeys || {});\n return this.keyFormatPromise || (this.log(`Selecting key-system from fragment (sn: ${e.sn} ${e.type}: ${e.level}) key formats ${t.join(\", \")}`), this.keyFormatPromise = this.getKeyFormatPromise(t)), this.keyFormatPromise;\n }\n getKeyFormatPromise(e) {\n const t = zn(this.config), r = e.map(po).filter((n) => !!n && t.indexOf(n) !== -1);\n return this.selectKeySystem(r);\n }\n getKeyStatus(e) {\n const {\n mediaKeySessions: t\n } = this;\n for (let r = 0; r < t.length; r++) {\n const n = lw(e, t[r]);\n if (n)\n return n;\n }\n }\n loadKey(e) {\n const t = e.keyInfo.decryptdata, r = Ji(t), n = this.bannedKeyIds[r];\n if (n || this.getKeyStatus(t) === \"internal-error\") {\n const a = Zh(n || \"internal-error\", t);\n return this.handleError(a, e.frag), Promise.reject(a);\n }\n const i = `(keyId: ${r} format: \"${t.keyFormat}\" method: ${t.method} uri: ${t.uri})`;\n this.log(`Starting session for key ${i}`);\n const o = this.keyIdToKeySessionPromise[r];\n if (!o) {\n const a = this.getKeySystemForKeyPromise(t).then(({\n keySystem: l,\n mediaKeys: c\n }) => (this.throwIfDestroyed(), this.log(`Handle encrypted media sn: ${e.frag.sn} ${e.frag.type}: ${e.frag.level} using key ${i}`), this.attemptSetMediaKeys(l, c).then(() => (this.throwIfDestroyed(), this.createMediaKeySessionContext({\n keySystem: l,\n mediaKeys: c,\n decryptdata: t\n }))))).then((l) => {\n const c = \"cenc\", u = t.pssh ? t.pssh.buffer : null;\n return this.generateRequestWithPreferredKeySession(l, c, u, \"playlist-key\");\n });\n return a.catch((l) => this.handleError(l, e.frag)), this.keyIdToKeySessionPromise[r] = a, a;\n }\n return o.catch((a) => {\n if (a instanceof yr) {\n const l = tt({}, a.data);\n this.getKeyStatus(t) === \"internal-error\" && (l.decryptdata = t);\n const c = new yr(l, a.message);\n this.handleError(c, e.frag);\n }\n }), o;\n }\n throwIfDestroyed(e = \"Invalid state\") {\n if (!this.hls)\n throw new Error(\"invalid state\");\n }\n handleError(e, t) {\n if (this.hls)\n if (e instanceof yr) {\n t && (e.data.frag = t);\n const r = e.data.decryptdata;\n this.error(`${e.message}${r ? ` (${fr(r.keyId || [])})` : \"\"}`), this.hls.trigger(I.ERROR, e.data);\n } else\n this.error(e.message), this.hls.trigger(I.ERROR, {\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_NO_KEYS,\n error: e,\n fatal: !0\n });\n }\n getKeySystemForKeyPromise(e) {\n const t = Ji(e), r = this.keyIdToKeySessionPromise[t];\n if (!r) {\n const n = po(e.keyFormat), i = n ? [n] : zn(this.config);\n return this.attemptKeySystemAccess(i);\n }\n return r;\n }\n getKeySystemSelectionPromise(e) {\n if (e.length || (e = zn(this.config)), e.length === 0)\n throw new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_NO_CONFIGURED_LICENSE,\n fatal: !0\n }, `Missing key-system license configuration options ${at({\n drmSystems: this.config.drmSystems\n })}`);\n return this.attemptKeySystemAccess(e);\n }\n attemptSetMediaKeys(e, t) {\n if (this.mediaKeys === t)\n return Promise.resolve();\n const r = this.setMediaKeysQueue.slice();\n this.log(`Setting media-keys for \"${e}\"`);\n const n = Promise.all(r).then(() => {\n if (!this.media)\n throw this.mediaKeys = null, new Error(\"Attempted to set mediaKeys without media element attached\");\n return this.media.setMediaKeys(t);\n });\n return this.mediaKeys = t, this.setMediaKeysQueue.push(n), n.then(() => {\n this.log(`Media-keys set for \"${e}\"`), r.push(n), this.setMediaKeysQueue = this.setMediaKeysQueue.filter((i) => r.indexOf(i) === -1);\n });\n }\n generateRequestWithPreferredKeySession(e, t, r, n) {\n var i;\n const o = (i = this.config.drmSystems) == null || (i = i[e.keySystem]) == null ? void 0 : i.generateRequest;\n if (o)\n try {\n const p = o.call(this.hls, t, r, e);\n if (!p)\n throw new Error(\"Invalid response from configured generateRequest filter\");\n t = p.initDataType, r = p.initData ? p.initData : null, e.decryptdata.pssh = r ? new Uint8Array(r) : null;\n } catch (p) {\n if (this.warn(p.message), this.hls && this.hls.config.debug)\n throw p;\n }\n if (r === null)\n return this.log(`Skipping key-session request for \"${n}\" (no initData)`), Promise.resolve(e);\n const a = Ji(e.decryptdata), l = e.decryptdata.uri;\n this.log(`Generating key-session request for \"${n}\" keyId: ${a} URI: ${l} (init data type: ${t} length: ${r.byteLength})`);\n const c = new wu(), u = e._onmessage = (p) => {\n const y = e.mediaKeysSession;\n if (!y) {\n c.emit(\"error\", new Error(\"invalid state\"));\n return;\n }\n const {\n messageType: E,\n message: b\n } = p;\n this.log(`\"${E}\" message event for session \"${y.sessionId}\" message size: ${b.byteLength}`), E === \"license-request\" || E === \"license-renewal\" ? this.renewLicense(e, b).catch((R) => {\n c.eventNames().length ? c.emit(\"error\", R) : this.handleError(R);\n }) : E === \"license-release\" ? e.keySystem === mt.FAIRPLAY && this.updateKeySession(e, hc(\"acknowledged\")).then(() => this.removeSession(e)).catch((R) => this.handleError(R)) : this.warn(`unhandled media key message type \"${E}\"`);\n }, d = (p, y) => {\n y.keyStatus = p;\n let E;\n p.startsWith(\"usable\") ? c.emit(\"resolved\") : p === \"internal-error\" || p === \"output-restricted\" || p === \"output-downscaled\" ? E = Zh(p, y.decryptdata) : p === \"expired\" ? E = new Error(`key expired (keyId: ${a})`) : p === \"released\" ? E = new Error(\"key released\") : p === \"status-pending\" || this.warn(`unhandled key status change \"${p}\" (keyId: ${a})`), E && (c.eventNames().length ? c.emit(\"error\", E) : this.handleError(E));\n }, h = e._onkeystatuseschange = (p) => {\n if (!e.mediaKeysSession) {\n c.emit(\"error\", new Error(\"invalid state\"));\n return;\n }\n const E = this.getKeyStatuses(e);\n if (!Object.keys(E).some((F) => E[F] !== \"status-pending\"))\n return;\n if (E[a] === \"expired\") {\n this.log(`Expired key ${at(E)} in key-session \"${e.mediaKeysSession.sessionId}\"`), this.renewKeySession(e);\n return;\n }\n let R = E[a];\n if (R)\n d(R, e);\n else {\n var A;\n e.keyStatusTimeouts || (e.keyStatusTimeouts = {}), (A = e.keyStatusTimeouts)[a] || (A[a] = self.setTimeout(() => {\n if (!e.mediaKeysSession || !this.mediaKeys)\n return;\n const M = this.getKeyStatus(e.decryptdata);\n if (M && M !== \"status-pending\")\n return this.log(`No status for keyId ${a} in key-session \"${e.mediaKeysSession.sessionId}\". Using session key-status ${M} from other session.`), d(M, e);\n this.log(`key status for ${a} in key-session \"${e.mediaKeysSession.sessionId}\" timed out after 0ms`), R = \"internal-error\", d(R, e);\n }, 0)), this.log(`No status for keyId ${a} (${at(E)}).`);\n }\n };\n cr(e.mediaKeysSession, \"message\", u), cr(e.mediaKeysSession, \"keystatuseschange\", h);\n const f = new Promise((p, y) => {\n c.on(\"error\", y), c.on(\"resolved\", p);\n });\n return e.mediaKeysSession.generateRequest(t, r).then(() => {\n this.log(`Request generated for key-session \"${e.mediaKeysSession.sessionId}\" keyId: ${a} URI: ${l}`);\n }).catch((p) => {\n throw new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_NO_SESSION,\n error: p,\n decryptdata: e.decryptdata,\n fatal: !1\n }, `Error generating key-session request: ${p}`);\n }).then(() => f).catch((p) => (c.removeAllListeners(), this.removeSession(e).then(() => {\n throw p;\n }))).then(() => (c.removeAllListeners(), e));\n }\n getKeyStatuses(e) {\n const t = {};\n return e.mediaKeysSession.keyStatuses.forEach((r, n) => {\n if (typeof n == \"string\" && typeof r == \"object\") {\n const a = n;\n n = r, r = a;\n }\n const i = \"buffer\" in n ? new Uint8Array(n.buffer, n.byteOffset, n.byteLength) : new Uint8Array(n);\n e.keySystem === mt.PLAYREADY && i.length === 16 && zg(i);\n const o = fr(i);\n r === \"internal-error\" && (this.bannedKeyIds[o] = r), this.log(`key status change \"${r}\" for keyStatuses keyId: ${o} key-session \"${e.mediaKeysSession.sessionId}\"`), t[o] = r;\n }), t;\n }\n fetchServerCertificate(e) {\n const t = this.config, r = t.loader, n = new r(t), i = this.getServerCertificateUrl(e);\n return i ? (this.log(`Fetching server certificate for \"${e}\"`), new Promise((o, a) => {\n const l = {\n responseType: \"arraybuffer\",\n url: i\n }, c = t.certLoadPolicy.default, u = {\n loadPolicy: c,\n timeout: c.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0\n }, d = {\n onSuccess: (h, f, p, y) => {\n o(h.data);\n },\n onError: (h, f, p, y) => {\n a(new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n fatal: !0,\n networkDetails: p,\n response: tt({\n url: l.url,\n data: void 0\n }, h)\n }, `\"${e}\" certificate request failed (${i}). Status: ${h.code} (${h.text})`));\n },\n onTimeout: (h, f, p) => {\n a(new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n fatal: !0,\n networkDetails: p,\n response: {\n url: l.url,\n data: void 0\n }\n }, `\"${e}\" certificate request timed out (${i})`));\n },\n onAbort: (h, f, p) => {\n a(new Error(\"aborted\"));\n }\n };\n n.load(l, u, d);\n })) : Promise.resolve();\n }\n setMediaKeysServerCertificate(e, t, r) {\n return new Promise((n, i) => {\n e.setServerCertificate(r).then((o) => {\n this.log(`setServerCertificate ${o ? \"success\" : \"not supported by CDM\"} (${r.byteLength}) on \"${t}\"`), n(e);\n }).catch((o) => {\n i(new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED,\n error: o,\n fatal: !0\n }, o.message));\n });\n });\n }\n renewLicense(e, t) {\n return this.requestLicense(e, new Uint8Array(t)).then((r) => this.updateKeySession(e, new Uint8Array(r)).catch((n) => {\n throw new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_SESSION_UPDATE_FAILED,\n decryptdata: e.decryptdata,\n error: n,\n fatal: !1\n }, n.message);\n }));\n }\n unpackPlayReadyKeyMessage(e, t) {\n const r = String.fromCharCode.apply(null, new Uint16Array(t.buffer));\n if (!r.includes(\"PlayReadyKeyMessage\"))\n return e.setRequestHeader(\"Content-Type\", \"text/xml; charset=utf-8\"), t;\n const n = new DOMParser().parseFromString(r, \"application/xml\"), i = n.querySelectorAll(\"HttpHeader\");\n if (i.length > 0) {\n let u;\n for (let d = 0, h = i.length; d < h; d++) {\n var o, a;\n u = i[d];\n const f = (o = u.querySelector(\"name\")) == null ? void 0 : o.textContent, p = (a = u.querySelector(\"value\")) == null ? void 0 : a.textContent;\n f && p && e.setRequestHeader(f, p);\n }\n }\n const l = n.querySelector(\"Challenge\"), c = l == null ? void 0 : l.textContent;\n if (!c)\n throw new Error(\"Cannot find <Challenge> in key message\");\n return hc(atob(c));\n }\n setupLicenseXHR(e, t, r, n) {\n const i = this.config.licenseXhrSetup;\n return i ? Promise.resolve().then(() => {\n if (!r.decryptdata)\n throw new Error(\"Key removed\");\n return i.call(this.hls, e, t, r, n);\n }).catch((o) => {\n if (!r.decryptdata)\n throw o;\n return e.open(\"POST\", t, !0), i.call(this.hls, e, t, r, n);\n }).then((o) => (e.readyState || e.open(\"POST\", t, !0), {\n xhr: e,\n licenseChallenge: o || n\n })) : (e.open(\"POST\", t, !0), Promise.resolve({\n xhr: e,\n licenseChallenge: n\n }));\n }\n requestLicense(e, t) {\n const r = this.config.keyLoadPolicy.default;\n return new Promise((n, i) => {\n const o = this.getLicenseServerUrlOrThrow(e.keySystem);\n this.log(`Sending license request to URL: ${o}`);\n const a = new XMLHttpRequest();\n a.responseType = \"arraybuffer\", a.onreadystatechange = () => {\n if (!this.hls || !e.mediaKeysSession)\n return i(new Error(\"invalid state\"));\n if (a.readyState === 4)\n if (a.status === 200) {\n this._requestLicenseFailureCount = 0;\n let l = a.response;\n this.log(`License received ${l instanceof ArrayBuffer ? l.byteLength : l}`);\n const c = this.config.licenseResponseCallback;\n if (c)\n try {\n l = c.call(this.hls, a, o, e);\n } catch (u) {\n this.error(u);\n }\n n(l);\n } else {\n const l = r.errorRetry, c = l ? l.maxNumRetry : 0;\n if (this._requestLicenseFailureCount++, this._requestLicenseFailureCount > c || a.status >= 400 && a.status < 500)\n i(new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: J.KEY_SYSTEM_LICENSE_REQUEST_FAILED,\n decryptdata: e.decryptdata,\n fatal: !0,\n networkDetails: a,\n response: {\n url: o,\n data: void 0,\n code: a.status,\n text: a.statusText\n }\n }, `License Request XHR failed (${o}). Status: ${a.status} (${a.statusText})`));\n else {\n const u = c - this._requestLicenseFailureCount + 1;\n this.warn(`Retrying license request, ${u} attempts left`), this.requestLicense(e, t).then(n, i);\n }\n }\n }, e.licenseXhr && e.licenseXhr.readyState !== XMLHttpRequest.DONE && e.licenseXhr.abort(), e.licenseXhr = a, this.setupLicenseXHR(a, o, e, t).then(({\n xhr: l,\n licenseChallenge: c\n }) => {\n e.keySystem == mt.PLAYREADY && (c = this.unpackPlayReadyKeyMessage(l, c)), l.send(c);\n }).catch(i);\n });\n }\n onDestroying() {\n this.unregisterListeners(), this._clear();\n }\n onMediaAttached(e, t) {\n if (!this.config.emeEnabled)\n return;\n const r = t.media;\n this.media = r, cr(r, \"encrypted\", this.onMediaEncrypted), cr(r, \"waitingforkey\", this.onWaitingForKey);\n }\n onMediaDetached() {\n const e = this.media;\n e && (pr(e, \"encrypted\", this.onMediaEncrypted), pr(e, \"waitingforkey\", this.onWaitingForKey), this.media = null, this.mediaKeys = null);\n }\n _clear() {\n var e;\n if (this._requestLicenseFailureCount = 0, this.keyIdToKeySessionPromise = {}, this.bannedKeyIds = {}, !this.mediaKeys && !this.mediaKeySessions.length)\n return;\n const t = this.media, r = this.mediaKeySessions.slice();\n this.mediaKeySessions = [], this.mediaKeys = null, yi.clearKeyUriToKeyIdMap();\n const n = r.length;\n _n.CDMCleanupPromise = Promise.all(r.map((i) => this.removeSession(i)).concat((t == null || (e = t.setMediaKeys(null)) == null ? void 0 : e.catch((i) => {\n this.log(`Could not clear media keys: ${i}`), this.hls && this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR,\n fatal: !1,\n error: new Error(`Could not clear media keys: ${i}`)\n });\n })) || Promise.resolve())).catch((i) => {\n this.log(`Could not close sessions and clear media keys: ${i}`), this.hls && this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n fatal: !1,\n error: new Error(`Could not close sessions and clear media keys: ${i}`)\n });\n }).then(() => {\n n && this.log(\"finished closing key sessions and clearing media keys\");\n });\n }\n onManifestLoading() {\n this.keyFormatPromise = null, this.bannedKeyIds = {};\n }\n onManifestLoaded(e, {\n sessionKeys: t\n }) {\n if (!(!t || !this.config.emeEnabled) && !this.keyFormatPromise) {\n const r = t.reduce((n, i) => (n.indexOf(i.keyFormat) === -1 && n.push(i.keyFormat), n), []);\n this.log(`Selecting key-system from session-keys ${r.join(\", \")}`), this.keyFormatPromise = this.getKeyFormatPromise(r);\n }\n }\n removeSession(e) {\n const {\n mediaKeysSession: t,\n licenseXhr: r,\n decryptdata: n\n } = e;\n if (t) {\n this.log(`Remove licenses and keys and close session \"${t.sessionId}\" keyId: ${fr((n == null ? void 0 : n.keyId) || [])}`), e._onmessage && (t.removeEventListener(\"message\", e._onmessage), e._onmessage = void 0), e._onkeystatuseschange && (t.removeEventListener(\"keystatuseschange\", e._onkeystatuseschange), e._onkeystatuseschange = void 0), r && r.readyState !== XMLHttpRequest.DONE && r.abort(), e.mediaKeysSession = e.decryptdata = e.licenseXhr = void 0;\n const i = this.mediaKeySessions.indexOf(e);\n i > -1 && this.mediaKeySessions.splice(i, 1);\n const {\n keyStatusTimeouts: o\n } = e;\n o && Object.keys(o).forEach((c) => self.clearTimeout(o[c]));\n const {\n drmSystemOptions: a\n } = this.config;\n return (jb(a) ? new Promise((c, u) => {\n self.setTimeout(() => u(new Error(\"MediaKeySession.remove() timeout\")), 8e3), t.remove().then(c).catch(u);\n }) : Promise.resolve()).catch((c) => {\n this.log(`Could not remove session: ${c}`), this.hls && this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR,\n fatal: !1,\n error: new Error(`Could not remove session: ${c}`)\n });\n }).then(() => t.close()).catch((c) => {\n this.log(`Could not close session: ${c}`), this.hls && this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n fatal: !1,\n error: new Error(`Could not close session: ${c}`)\n });\n });\n }\n return Promise.resolve();\n }\n}\n_n.CDMCleanupPromise = void 0;\nfunction Ji(s) {\n if (!s)\n throw new Error(\"Could not read keyId of undefined decryptdata\");\n if (s.keyId === null)\n throw new Error(\"keyId is null\");\n return fr(s.keyId);\n}\nfunction lw(s, e) {\n if (s.keyId && e.mediaKeysSession.keyStatuses.has(s.keyId))\n return e.mediaKeysSession.keyStatuses.get(s.keyId);\n if (s.matches(e.decryptdata))\n return e.keyStatus;\n}\nclass yr extends Error {\n constructor(e, t) {\n super(t), this.data = void 0, e.error || (e.error = new Error(t)), this.data = e, e.err = e.error;\n }\n}\nfunction Zh(s, e) {\n const t = s === \"output-restricted\", r = t ? J.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED : J.KEY_SYSTEM_STATUS_INTERNAL_ERROR;\n return new yr({\n type: ve.KEY_SYSTEM_ERROR,\n details: r,\n fatal: !1,\n decryptdata: e\n }, t ? \"HDCP level output restricted\" : `key status changed to \"${s}\"`);\n}\nclass cw {\n constructor(e) {\n this.hls = void 0, this.isVideoPlaybackQualityAvailable = !1, this.timer = void 0, this.media = null, this.lastTime = void 0, this.lastDroppedFrames = 0, this.lastDecodedFrames = 0, this.streamController = void 0, this.hls = e, this.registerListeners();\n }\n setStreamController(e) {\n this.streamController = e;\n }\n registerListeners() {\n this.hls.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), this.hls.on(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n }\n unregisterListeners() {\n this.hls.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), this.hls.off(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n }\n destroy() {\n this.timer && clearInterval(this.timer), this.unregisterListeners(), this.isVideoPlaybackQualityAvailable = !1, this.media = null;\n }\n onMediaAttaching(e, t) {\n const r = this.hls.config;\n if (r.capLevelOnFPSDrop) {\n const n = t.media instanceof self.HTMLVideoElement ? t.media : null;\n this.media = n, n && typeof n.getVideoPlaybackQuality == \"function\" && (this.isVideoPlaybackQualityAvailable = !0), self.clearInterval(this.timer), this.timer = self.setInterval(this.checkFPSInterval.bind(this), r.fpsDroppedMonitoringPeriod);\n }\n }\n onMediaDetaching() {\n this.media = null;\n }\n checkFPS(e, t, r) {\n const n = performance.now();\n if (t) {\n if (this.lastTime) {\n const i = n - this.lastTime, o = r - this.lastDroppedFrames, a = t - this.lastDecodedFrames, l = 1e3 * o / i, c = this.hls;\n if (c.trigger(I.FPS_DROP, {\n currentDropped: o,\n currentDecoded: a,\n totalDroppedFrames: r\n }), l > 0 && o > c.config.fpsDroppedMonitoringThreshold * a) {\n let u = c.currentLevel;\n c.logger.warn(\"drop FPS ratio greater than max allowed value for currentLevel: \" + u), u > 0 && (c.autoLevelCapping === -1 || c.autoLevelCapping >= u) && (u = u - 1, c.trigger(I.FPS_DROP_LEVEL_CAPPING, {\n level: u,\n droppedLevel: c.currentLevel\n }), c.autoLevelCapping = u, this.streamController.nextLevelSwitch());\n }\n }\n this.lastTime = n, this.lastDroppedFrames = r, this.lastDecodedFrames = t;\n }\n }\n checkFPSInterval() {\n const e = this.media;\n if (e)\n if (this.isVideoPlaybackQualityAvailable) {\n const t = e.getVideoPlaybackQuality();\n this.checkFPS(e, t.totalVideoFrames, t.droppedVideoFrames);\n } else\n this.checkFPS(e, e.webkitDecodedFrameCount, e.webkitDroppedFrameCount);\n }\n}\nfunction Np(s, e) {\n let t;\n try {\n t = new Event(\"addtrack\");\n } catch {\n t = document.createEvent(\"Event\"), t.initEvent(\"addtrack\", !1, !1);\n }\n t.track = s, e.dispatchEvent(t);\n}\nfunction Up(s, e) {\n const t = s.mode;\n if (t === \"disabled\" && (s.mode = \"hidden\"), s.cues && !s.cues.getCueById(e.id))\n try {\n if (s.addCue(e), !s.cues.getCueById(e.id))\n throw new Error(`addCue is failed for: ${e}`);\n } catch (r) {\n rt.debug(`[texttrack-utils]: ${r}`);\n try {\n const n = new self.TextTrackCue(e.startTime, e.endTime, e.text);\n n.id = e.id, s.addCue(n);\n } catch (n) {\n rt.debug(`[texttrack-utils]: Legacy TextTrackCue fallback failed: ${n}`);\n }\n }\n t === \"disabled\" && (s.mode = t);\n}\nfunction Sn(s, e) {\n const t = s.mode;\n if (t === \"disabled\" && (s.mode = \"hidden\"), s.cues)\n for (let r = s.cues.length; r--; )\n e && s.cues[r].removeEventListener(\"enter\", e), s.removeCue(s.cues[r]);\n t === \"disabled\" && (s.mode = t);\n}\nfunction Sc(s, e, t, r) {\n const n = s.mode;\n if (n === \"disabled\" && (s.mode = \"hidden\"), s.cues && s.cues.length > 0) {\n const i = dw(s.cues, e, t);\n for (let o = 0; o < i.length; o++)\n (!r || r(i[o])) && s.removeCue(i[o]);\n }\n n === \"disabled\" && (s.mode = n);\n}\nfunction uw(s, e) {\n if (e <= s[0].startTime)\n return 0;\n const t = s.length - 1;\n if (e > s[t].endTime)\n return -1;\n let r = 0, n = t, i;\n for (; r <= n; )\n if (i = Math.floor((n + r) / 2), e < s[i].startTime)\n n = i - 1;\n else if (e > s[i].startTime && r < t)\n r = i + 1;\n else\n return i;\n return s[r].startTime - e < e - s[n].startTime ? r : n;\n}\nfunction dw(s, e, t) {\n const r = [], n = uw(s, e);\n if (n > -1)\n for (let i = n, o = s.length; i < o; i++) {\n const a = s[i];\n if (a.startTime >= e && a.endTime <= t)\n r.push(a);\n else if (a.startTime > t)\n return r;\n }\n return r;\n}\nfunction Eo(s) {\n const e = [];\n for (let t = 0; t < s.length; t++) {\n const r = s[t];\n (r.kind === \"subtitles\" || r.kind === \"captions\") && r.label && e.push(s[t]);\n }\n return e;\n}\nclass hw extends ku {\n constructor(e) {\n super(e, \"subtitle-track-controller\"), this.media = null, this.tracks = [], this.groupIds = null, this.tracksInGroup = [], this.trackId = -1, this.currentTrack = null, this.selectDefaultTrack = !0, this.queuedDefaultTrack = -1, this.useTextTrackPolling = !1, this.subtitlePollingInterval = -1, this._subtitleDisplay = !0, this.asyncPollTrackChange = () => this.pollTrackChange(0), this.onTextTracksChanged = () => {\n if (this.useTextTrackPolling || self.clearInterval(this.subtitlePollingInterval), !this.media || !this.hls.config.renderTextTracksNatively)\n return;\n let t = null;\n const r = Eo(this.media.textTracks);\n for (let i = 0; i < r.length; i++)\n if (r[i].mode === \"hidden\")\n t = r[i];\n else if (r[i].mode === \"showing\") {\n t = r[i];\n break;\n }\n const n = this.findTrackForTextTrack(t);\n this.subtitleTrack !== n && this.setSubtitleTrack(n);\n }, this.registerListeners();\n }\n destroy() {\n this.unregisterListeners(), this.tracks.length = 0, this.tracksInGroup.length = 0, this.currentTrack = null, this.onTextTracksChanged = this.asyncPollTrackChange = null, super.destroy();\n }\n get subtitleDisplay() {\n return this._subtitleDisplay;\n }\n set subtitleDisplay(e) {\n this._subtitleDisplay = e, this.trackId > -1 && this.toggleTrackModes();\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.on(I.ERROR, this.onError, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVEL_LOADING, this.onLevelLoading, this), e.off(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.off(I.ERROR, this.onError, this);\n }\n // Listen for subtitle track change, then extract the current track ID.\n onMediaAttached(e, t) {\n this.media = t.media, this.media && (this.queuedDefaultTrack > -1 && (this.subtitleTrack = this.queuedDefaultTrack, this.queuedDefaultTrack = -1), this.useTextTrackPolling = !(this.media.textTracks && \"onchange\" in this.media.textTracks), this.useTextTrackPolling ? this.pollTrackChange(500) : this.media.textTracks.addEventListener(\"change\", this.asyncPollTrackChange));\n }\n pollTrackChange(e) {\n self.clearInterval(this.subtitlePollingInterval), this.subtitlePollingInterval = self.setInterval(this.onTextTracksChanged, e);\n }\n onMediaDetaching(e, t) {\n const r = this.media;\n if (!r)\n return;\n const n = !!t.transferMedia;\n if (self.clearInterval(this.subtitlePollingInterval), this.useTextTrackPolling || r.textTracks.removeEventListener(\"change\", this.asyncPollTrackChange), this.trackId > -1 && (this.queuedDefaultTrack = this.trackId), this.subtitleTrack = -1, this.media = null, n)\n return;\n Eo(r.textTracks).forEach((o) => {\n Sn(o);\n });\n }\n onManifestLoading() {\n this.tracks = [], this.groupIds = null, this.tracksInGroup = [], this.trackId = -1, this.currentTrack = null, this.selectDefaultTrack = !0;\n }\n // Fired whenever a new manifest is loaded.\n onManifestParsed(e, t) {\n this.tracks = t.subtitleTracks;\n }\n onSubtitleTrackLoaded(e, t) {\n const {\n id: r,\n groupId: n,\n details: i\n } = t, o = this.tracksInGroup[r];\n if (!o || o.groupId !== n) {\n this.warn(`Subtitle track with id:${r} and group:${n} not found in active group ${o == null ? void 0 : o.groupId}`);\n return;\n }\n const a = o.details;\n o.details = t.details, this.log(`Subtitle track ${r} \"${o.name}\" lang:${o.lang} group:${n} loaded [${i.startSN}-${i.endSN}]`), r === this.trackId && this.playlistLoaded(r, t, a);\n }\n onLevelLoading(e, t) {\n this.switchLevel(t.level);\n }\n onLevelSwitching(e, t) {\n this.switchLevel(t.level);\n }\n switchLevel(e) {\n const t = this.hls.levels[e];\n if (!t)\n return;\n const r = t.subtitleGroups || null, n = this.groupIds;\n let i = this.currentTrack;\n if (!r || (n == null ? void 0 : n.length) !== (r == null ? void 0 : r.length) || r != null && r.some((o) => (n == null ? void 0 : n.indexOf(o)) === -1)) {\n this.groupIds = r, this.trackId = -1, this.currentTrack = null;\n const o = this.tracks.filter((u) => !r || r.indexOf(u.groupId) !== -1);\n if (o.length)\n this.selectDefaultTrack && !o.some((u) => u.default) && (this.selectDefaultTrack = !1), o.forEach((u, d) => {\n u.id = d;\n });\n else if (!i && !this.tracksInGroup.length)\n return;\n this.tracksInGroup = o;\n const a = this.hls.config.subtitlePreference;\n if (!i && a) {\n this.selectDefaultTrack = !1;\n const u = Wr(a, o);\n if (u > -1)\n i = o[u];\n else {\n const d = Wr(a, this.tracks);\n i = this.tracks[d];\n }\n }\n let l = this.findTrackId(i);\n l === -1 && i && (l = this.findTrackId(null));\n const c = {\n subtitleTracks: o\n };\n this.log(`Updating subtitle tracks, ${o.length} track(s) found in \"${r == null ? void 0 : r.join(\",\")}\" group-id`), this.hls.trigger(I.SUBTITLE_TRACKS_UPDATED, c), l !== -1 && this.trackId === -1 && this.setSubtitleTrack(l);\n }\n }\n findTrackId(e) {\n const t = this.tracksInGroup, r = this.selectDefaultTrack;\n for (let n = 0; n < t.length; n++) {\n const i = t[n];\n if (!(r && !i.default || !r && !e) && (!e || qs(i, e)))\n return n;\n }\n if (e) {\n for (let n = 0; n < t.length; n++) {\n const i = t[n];\n if (Si(e.attrs, i.attrs, [\"LANGUAGE\", \"ASSOC-LANGUAGE\", \"CHARACTERISTICS\"]))\n return n;\n }\n for (let n = 0; n < t.length; n++) {\n const i = t[n];\n if (Si(e.attrs, i.attrs, [\"LANGUAGE\"]))\n return n;\n }\n }\n return -1;\n }\n findTrackForTextTrack(e) {\n if (e) {\n const t = this.tracksInGroup;\n for (let r = 0; r < t.length; r++) {\n const n = t[r];\n if (yc(n, e))\n return r;\n }\n }\n return -1;\n }\n onError(e, t) {\n t.fatal || !t.context || t.context.type === Ke.SUBTITLE_TRACK && t.context.id === this.trackId && (!this.groupIds || this.groupIds.indexOf(t.context.groupId) !== -1) && this.checkRetry(t);\n }\n get allSubtitleTracks() {\n return this.tracks;\n }\n /** get alternate subtitle tracks list from playlist **/\n get subtitleTracks() {\n return this.tracksInGroup;\n }\n /** get/set index of the selected subtitle track (based on index in subtitle track lists) **/\n get subtitleTrack() {\n return this.trackId;\n }\n set subtitleTrack(e) {\n this.selectDefaultTrack = !1, this.setSubtitleTrack(e);\n }\n setSubtitleOption(e) {\n if (this.hls.config.subtitlePreference = e, e) {\n if (e.id === -1)\n return this.setSubtitleTrack(-1), null;\n const t = this.allSubtitleTracks;\n if (this.selectDefaultTrack = !1, t.length) {\n const r = this.currentTrack;\n if (r && qs(e, r))\n return r;\n const n = Wr(e, this.tracksInGroup);\n if (n > -1) {\n const i = this.tracksInGroup[n];\n return this.setSubtitleTrack(n), i;\n } else {\n if (r)\n return null;\n {\n const i = Wr(e, t);\n if (i > -1)\n return t[i];\n }\n }\n }\n }\n return null;\n }\n loadPlaylist(e) {\n super.loadPlaylist(), this.shouldLoadPlaylist(this.currentTrack) && this.scheduleLoading(this.currentTrack, e);\n }\n loadingPlaylist(e, t) {\n super.loadingPlaylist(e, t);\n const r = e.id, n = e.groupId, i = this.getUrlWithDirectives(e.url, t), o = e.details, a = o == null ? void 0 : o.age;\n this.log(`Loading subtitle ${r} \"${e.name}\" lang:${e.lang} group:${n}${(t == null ? void 0 : t.msn) !== void 0 ? \" at sn \" + t.msn + \" part \" + t.part : \"\"}${a && o.live ? \" age \" + a.toFixed(1) + (o.type && \" \" + o.type || \"\") : \"\"} ${i}`), this.hls.trigger(I.SUBTITLE_TRACK_LOADING, {\n url: i,\n id: r,\n groupId: n,\n deliveryDirectives: t || null,\n track: e\n });\n }\n /**\n * Disables the old subtitleTrack and sets current mode on the next subtitleTrack.\n * This operates on the DOM textTracks.\n * A value of -1 will disable all subtitle tracks.\n */\n toggleTrackModes() {\n const {\n media: e\n } = this;\n if (!e)\n return;\n const t = Eo(e.textTracks), r = this.currentTrack;\n let n;\n if (r && (n = t.filter((i) => yc(r, i))[0], n || this.warn(`Unable to find subtitle TextTrack with name \"${r.name}\" and language \"${r.lang}\"`)), [].slice.call(t).forEach((i) => {\n i.mode !== \"disabled\" && i !== n && (i.mode = \"disabled\");\n }), n) {\n const i = this.subtitleDisplay ? \"showing\" : \"hidden\";\n n.mode !== i && (n.mode = i);\n }\n }\n /**\n * This method is responsible for validating the subtitle index and periodically reloading if live.\n * Dispatches the SUBTITLE_TRACK_SWITCH event, which instructs the subtitle-stream-controller to load the selected track.\n */\n setSubtitleTrack(e) {\n const t = this.tracksInGroup;\n if (!this.media) {\n this.queuedDefaultTrack = e;\n return;\n }\n if (e < -1 || e >= t.length || !ue(e)) {\n this.warn(`Invalid subtitle track id: ${e}`);\n return;\n }\n this.selectDefaultTrack = !1;\n const r = this.currentTrack, n = t[e] || null;\n if (this.trackId = e, this.currentTrack = n, this.toggleTrackModes(), !n) {\n this.hls.trigger(I.SUBTITLE_TRACK_SWITCH, {\n id: e\n });\n return;\n }\n const i = !!n.details && !n.details.live;\n if (e === this.trackId && n === r && i)\n return;\n this.log(`Switching to subtitle-track ${e}` + (n ? ` \"${n.name}\" lang:${n.lang} group:${n.groupId}` : \"\"));\n const {\n id: o,\n groupId: a = \"\",\n name: l,\n type: c,\n url: u\n } = n;\n this.hls.trigger(I.SUBTITLE_TRACK_SWITCH, {\n id: o,\n groupId: a,\n name: l,\n type: c,\n url: u\n });\n const d = this.switchParams(n.url, r == null ? void 0 : r.details, n.details);\n this.loadPlaylist(d);\n }\n}\nfunction fw() {\n try {\n return crypto.randomUUID();\n } catch {\n try {\n const e = URL.createObjectURL(new Blob()), t = e.toString();\n return URL.revokeObjectURL(e), t.slice(t.lastIndexOf(\"/\") + 1);\n } catch {\n let t = (/* @__PURE__ */ new Date()).getTime();\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (n) => {\n const i = (t + Math.random() * 16) % 16 | 0;\n return t = Math.floor(t / 16), (n == \"x\" ? i : i & 3 | 8).toString(16);\n });\n }\n }\n}\nfunction Xn(s) {\n let e = 5381, t = s.length;\n for (; t; )\n e = e * 33 ^ s.charCodeAt(--t);\n return (e >>> 0).toString();\n}\nconst Rn = 0.025;\nlet ia = /* @__PURE__ */ (function(s) {\n return s[s.Point = 0] = \"Point\", s[s.Range = 1] = \"Range\", s;\n})({});\nfunction gw(s, e, t) {\n return `${s.identifier}-${t + 1}-${Xn(e)}`;\n}\nclass pw {\n constructor(e, t) {\n this.base = void 0, this._duration = null, this._timelineStart = null, this.appendInPlaceDisabled = void 0, this.appendInPlaceStarted = void 0, this.dateRange = void 0, this.hasPlayed = !1, this.cumulativeDuration = 0, this.resumeOffset = NaN, this.playoutLimit = NaN, this.restrictions = {\n skip: !1,\n jump: !1\n }, this.snapOptions = {\n out: !1,\n in: !1\n }, this.assetList = [], this.assetListLoader = void 0, this.assetListResponse = null, this.resumeAnchor = void 0, this.error = void 0, this.resetOnResume = void 0, this.base = t, this.dateRange = e, this.setDateRange(e);\n }\n setDateRange(e) {\n this.dateRange = e, this.resumeOffset = e.attr.optionalFloat(\"X-RESUME-OFFSET\", this.resumeOffset), this.playoutLimit = e.attr.optionalFloat(\"X-PLAYOUT-LIMIT\", this.playoutLimit), this.restrictions = e.attr.enumeratedStringList(\"X-RESTRICT\", this.restrictions), this.snapOptions = e.attr.enumeratedStringList(\"X-SNAP\", this.snapOptions);\n }\n reset() {\n var e;\n this.appendInPlaceStarted = !1, (e = this.assetListLoader) == null || e.destroy(), this.assetListLoader = void 0, this.supplementsPrimary || (this.assetListResponse = null, this.assetList = [], this._duration = null);\n }\n isAssetPastPlayoutLimit(e) {\n var t;\n if (e > 0 && e >= this.assetList.length)\n return !0;\n const r = this.playoutLimit;\n return e <= 0 || isNaN(r) ? !1 : r === 0 ? !0 : (((t = this.assetList[e]) == null ? void 0 : t.startOffset) || 0) > r;\n }\n findAssetIndex(e) {\n return this.assetList.indexOf(e);\n }\n get identifier() {\n return this.dateRange.id;\n }\n get startDate() {\n return this.dateRange.startDate;\n }\n get startTime() {\n const e = this.dateRange.startTime;\n if (this.snapOptions.out) {\n const t = this.dateRange.tagAnchor;\n if (t)\n return bl(e, t);\n }\n return e;\n }\n get startOffset() {\n return this.cue.pre ? 0 : this.startTime;\n }\n get startIsAligned() {\n if (this.startTime === 0 || this.snapOptions.out)\n return !0;\n const e = this.dateRange.tagAnchor;\n if (e) {\n const t = this.dateRange.startTime, r = bl(t, e);\n return t - r < 0.1;\n }\n return !1;\n }\n get resumptionOffset() {\n const e = this.resumeOffset, t = ue(e) ? e : this.duration;\n return this.cumulativeDuration + t;\n }\n get resumeTime() {\n const e = this.startOffset + this.resumptionOffset;\n if (this.snapOptions.in) {\n const t = this.resumeAnchor;\n if (t)\n return bl(e, t);\n }\n return e;\n }\n get appendInPlace() {\n return this.appendInPlaceStarted ? !0 : this.appendInPlaceDisabled ? !1 : !!(!this.cue.once && !this.cue.pre && // preroll starts at startPosition before startPosition is known (live)\n this.startIsAligned && (isNaN(this.playoutLimit) && isNaN(this.resumeOffset) || this.resumeOffset && this.duration && Math.abs(this.resumeOffset - this.duration) < Rn));\n }\n set appendInPlace(e) {\n if (this.appendInPlaceStarted) {\n this.resetOnResume = !e;\n return;\n }\n this.appendInPlaceDisabled = !e;\n }\n // Extended timeline start time\n get timelineStart() {\n return this._timelineStart !== null ? this._timelineStart : this.startTime;\n }\n set timelineStart(e) {\n this._timelineStart = e;\n }\n get duration() {\n const e = this.playoutLimit;\n let t;\n return this._duration !== null ? t = this._duration : this.dateRange.duration ? t = this.dateRange.duration : t = this.dateRange.plannedDuration || 0, !isNaN(e) && e < t && (t = e), t;\n }\n set duration(e) {\n this._duration = e;\n }\n get cue() {\n return this.dateRange.cue;\n }\n get timelineOccupancy() {\n return this.dateRange.attr[\"X-TIMELINE-OCCUPIES\"] === \"RANGE\" ? ia.Range : ia.Point;\n }\n get supplementsPrimary() {\n return this.dateRange.attr[\"X-TIMELINE-STYLE\"] === \"PRIMARY\";\n }\n get contentMayVary() {\n return this.dateRange.attr[\"X-CONTENT-MAY-VARY\"] !== \"NO\";\n }\n get assetUrl() {\n return this.dateRange.attr[\"X-ASSET-URI\"];\n }\n get assetListUrl() {\n return this.dateRange.attr[\"X-ASSET-LIST\"];\n }\n get baseUrl() {\n return this.base.url;\n }\n get assetListLoaded() {\n return this.assetList.length > 0 || this.assetListResponse !== null;\n }\n toString() {\n return mw(this);\n }\n}\nfunction bl(s, e) {\n return s - e.start < e.duration / 2 && !(Math.abs(s - (e.start + e.duration)) < Rn) ? e.start : e.start + e.duration;\n}\nfunction $p(s, e, t) {\n const r = new self.URL(s, t);\n return r.protocol !== \"data:\" && r.searchParams.set(\"_HLS_primary_id\", e), r;\n}\nfunction Tl(s, e) {\n for (; (t = s.assetList[++e]) != null && t.error; )\n var t;\n return e;\n}\nfunction mw(s) {\n return `[\"${s.identifier}\" ${s.cue.pre ? \"<pre>\" : s.cue.post ? \"<post>\" : \"\"}${s.timelineStart.toFixed(2)}-${s.resumeTime.toFixed(2)}]`;\n}\nfunction vn(s) {\n const e = s.timelineStart, t = s.duration || 0;\n return `[\"${s.identifier}\" ${e.toFixed(2)}-${(e + t).toFixed(2)}]`;\n}\nclass yw {\n constructor(e, t, r, n) {\n this.hls = void 0, this.interstitial = void 0, this.assetItem = void 0, this.tracks = null, this.hasDetails = !1, this.mediaAttached = null, this._currentTime = void 0, this._bufferedEosTime = void 0, this.checkPlayout = () => {\n this.reachedPlayout(this.currentTime) && this.hls && this.hls.trigger(I.PLAYOUT_LIMIT_REACHED, {});\n };\n const i = this.hls = new e(t);\n this.interstitial = r, this.assetItem = n;\n const o = () => {\n this.hasDetails = !0;\n };\n i.once(I.LEVEL_LOADED, o), i.once(I.AUDIO_TRACK_LOADED, o), i.once(I.SUBTITLE_TRACK_LOADED, o), i.on(I.MEDIA_ATTACHING, (a, {\n media: l\n }) => {\n this.removeMediaListeners(), this.mediaAttached = l, this.interstitial.playoutLimit && (l.addEventListener(\"timeupdate\", this.checkPlayout), this.appendInPlace && i.on(I.BUFFER_APPENDED, () => {\n const u = this.bufferedEnd;\n this.reachedPlayout(u) && (this._bufferedEosTime = u, i.trigger(I.BUFFERED_TO_END, void 0));\n }));\n });\n }\n get appendInPlace() {\n return this.interstitial.appendInPlace;\n }\n loadSource() {\n const e = this.hls;\n if (e)\n if (e.url)\n e.levels.length && !e.started && e.startLoad(-1, !0);\n else {\n let t = this.assetItem.uri;\n try {\n t = $p(t, e.config.primarySessionId || \"\").href;\n } catch {\n }\n e.loadSource(t);\n }\n }\n bufferedInPlaceToEnd(e) {\n var t;\n if (!this.appendInPlace)\n return !1;\n if ((t = this.hls) != null && t.bufferedToEnd)\n return !0;\n if (!e)\n return !1;\n const r = Math.min(this._bufferedEosTime || 1 / 0, this.duration), n = this.timelineOffset, i = Ce.bufferInfo(e, n, 0);\n return this.getAssetTime(i.end) >= r - 0.02;\n }\n reachedPlayout(e) {\n const r = this.interstitial.playoutLimit;\n return this.startOffset + e >= r;\n }\n get destroyed() {\n var e;\n return !((e = this.hls) != null && e.userConfig);\n }\n get assetId() {\n return this.assetItem.identifier;\n }\n get interstitialId() {\n return this.assetItem.parentIdentifier;\n }\n get media() {\n var e;\n return ((e = this.hls) == null ? void 0 : e.media) || null;\n }\n get bufferedEnd() {\n const e = this.media || this.mediaAttached;\n if (!e)\n return this._bufferedEosTime ? this._bufferedEosTime : this.currentTime;\n const t = Ce.bufferInfo(e, e.currentTime, 1e-3);\n return this.getAssetTime(t.end);\n }\n get currentTime() {\n const e = this.media || this.mediaAttached;\n return e ? this.getAssetTime(e.currentTime) : this._currentTime || 0;\n }\n get duration() {\n const e = this.assetItem.duration;\n if (!e)\n return 0;\n const t = this.interstitial.playoutLimit;\n if (t) {\n const r = t - this.startOffset;\n if (r > 0 && r < e)\n return r;\n }\n return e;\n }\n get remaining() {\n const e = this.duration;\n return e ? Math.max(0, e - this.currentTime) : 0;\n }\n get startOffset() {\n return this.assetItem.startOffset;\n }\n get timelineOffset() {\n var e;\n return ((e = this.hls) == null ? void 0 : e.config.timelineOffset) || 0;\n }\n set timelineOffset(e) {\n const t = this.timelineOffset;\n if (e !== t) {\n const r = e - t;\n if (Math.abs(r) > 1 / 9e4 && this.hls) {\n if (this.hasDetails)\n throw new Error(\"Cannot set timelineOffset after playlists are loaded\");\n this.hls.config.timelineOffset = e;\n }\n }\n }\n getAssetTime(e) {\n const t = this.timelineOffset, r = this.duration;\n return Math.min(Math.max(0, e - t), r);\n }\n removeMediaListeners() {\n const e = this.mediaAttached;\n e && (this._currentTime = e.currentTime, this.bufferSnapShot(), e.removeEventListener(\"timeupdate\", this.checkPlayout));\n }\n bufferSnapShot() {\n if (this.mediaAttached) {\n var e;\n (e = this.hls) != null && e.bufferedToEnd && (this._bufferedEosTime = this.bufferedEnd);\n }\n }\n destroy() {\n this.removeMediaListeners(), this.hls && this.hls.destroy(), this.hls = null, this.tracks = this.mediaAttached = this.checkPlayout = null;\n }\n attachMedia(e) {\n var t;\n this.loadSource(), (t = this.hls) == null || t.attachMedia(e);\n }\n detachMedia() {\n var e;\n this.removeMediaListeners(), this.mediaAttached = null, (e = this.hls) == null || e.detachMedia();\n }\n resumeBuffering() {\n var e;\n (e = this.hls) == null || e.resumeBuffering();\n }\n pauseBuffering() {\n var e;\n (e = this.hls) == null || e.pauseBuffering();\n }\n transferMedia() {\n var e;\n return this.bufferSnapShot(), ((e = this.hls) == null ? void 0 : e.transferMedia()) || null;\n }\n resetDetails() {\n const e = this.hls;\n if (e && this.hasDetails) {\n e.stopLoad();\n const t = (r) => delete r.details;\n e.levels.forEach(t), e.allAudioTracks.forEach(t), e.allSubtitleTracks.forEach(t), this.hasDetails = !1;\n }\n }\n on(e, t, r) {\n var n;\n (n = this.hls) == null || n.on(e, t);\n }\n once(e, t, r) {\n var n;\n (n = this.hls) == null || n.once(e, t);\n }\n off(e, t, r) {\n var n;\n (n = this.hls) == null || n.off(e, t);\n }\n toString() {\n var e;\n return `HlsAssetPlayer: ${vn(this.assetItem)} ${(e = this.hls) == null ? void 0 : e.sessionId} ${this.appendInPlace ? \"append-in-place\" : \"\"}`;\n }\n}\nconst Xh = 0.033;\nclass vw extends Lr {\n constructor(e, t) {\n super(\"interstitials-sched\", t), this.onScheduleUpdate = void 0, this.eventMap = {}, this.events = null, this.items = null, this.durations = {\n primary: 0,\n playout: 0,\n integrated: 0\n }, this.onScheduleUpdate = e;\n }\n destroy() {\n this.reset(), this.onScheduleUpdate = null;\n }\n reset() {\n this.eventMap = {}, this.setDurations(0, 0, 0), this.events && this.events.forEach((e) => e.reset()), this.events = this.items = null;\n }\n resetErrorsInRange(e, t) {\n return this.events ? this.events.reduce((r, n) => e <= n.startOffset && t > n.startOffset ? (delete n.error, r + 1) : r, 0) : 0;\n }\n get duration() {\n const e = this.items;\n return e ? e[e.length - 1].end : 0;\n }\n get length() {\n return this.items ? this.items.length : 0;\n }\n getEvent(e) {\n return e && this.eventMap[e] || null;\n }\n hasEvent(e) {\n return e in this.eventMap;\n }\n findItemIndex(e, t) {\n if (e.event)\n return this.findEventIndex(e.event.identifier);\n let r = -1;\n e.nextEvent ? r = this.findEventIndex(e.nextEvent.identifier) - 1 : e.previousEvent && (r = this.findEventIndex(e.previousEvent.identifier) + 1);\n const n = this.items;\n if (n)\n for (n[r] || (t === void 0 && (t = e.start), r = this.findItemIndexAtTime(t)); r >= 0 && (i = n[r]) != null && i.event; ) {\n var i;\n r--;\n }\n return r;\n }\n findItemIndexAtTime(e, t) {\n const r = this.items;\n if (r)\n for (let n = 0; n < r.length; n++) {\n let i = r[n];\n if (t && t !== \"primary\" && (i = i[t]), e === i.start || e > i.start && e < i.end)\n return n;\n }\n return -1;\n }\n findJumpRestrictedIndex(e, t) {\n const r = this.items;\n if (r)\n for (let n = e; n <= t && r[n]; n++) {\n const i = r[n].event;\n if (i != null && i.restrictions.jump && !i.appendInPlace)\n return n;\n }\n return -1;\n }\n findEventIndex(e) {\n const t = this.items;\n if (t)\n for (let n = t.length; n--; ) {\n var r;\n if (((r = t[n].event) == null ? void 0 : r.identifier) === e)\n return n;\n }\n return -1;\n }\n findAssetIndex(e, t) {\n const r = e.assetList, n = r.length;\n if (n > 1)\n for (let i = 0; i < n; i++) {\n const o = r[i];\n if (!o.error) {\n const a = o.timelineStart;\n if (t === a || t > a && (t < a + (o.duration || 0) || i === n - 1))\n return i;\n }\n }\n return 0;\n }\n get assetIdAtEnd() {\n var e;\n const t = (e = this.items) == null || (e = e[this.length - 1]) == null ? void 0 : e.event;\n if (t) {\n const r = t.assetList, n = r[r.length - 1];\n if (n)\n return n.identifier;\n }\n return null;\n }\n parseInterstitialDateRanges(e, t) {\n const r = e.main.details, {\n dateRanges: n\n } = r, i = this.events, o = this.parseDateRanges(n, {\n url: r.url\n }, t), a = Object.keys(n), l = i ? i.filter((c) => !a.includes(c.identifier)) : [];\n o.length && o.sort((c, u) => {\n const d = c.cue.pre, h = c.cue.post, f = u.cue.pre, p = u.cue.post;\n if (d && !f)\n return -1;\n if (f && !d || h && !p)\n return 1;\n if (p && !h)\n return -1;\n if (!d && !f && !h && !p) {\n const y = c.startTime, E = u.startTime;\n if (y !== E)\n return y - E;\n }\n return c.dateRange.tagOrder - u.dateRange.tagOrder;\n }), this.events = o, l.forEach((c) => {\n this.removeEvent(c);\n }), this.updateSchedule(e, l);\n }\n updateSchedule(e, t = [], r = !1) {\n const n = this.events || [];\n if (n.length || t.length || this.length < 2) {\n const i = this.items, o = this.parseSchedule(n, e);\n (r || t.length || (i == null ? void 0 : i.length) !== o.length || o.some((l, c) => Math.abs(l.playout.start - i[c].playout.start) > 5e-3 || Math.abs(l.playout.end - i[c].playout.end) > 5e-3)) && (this.items = o, this.onScheduleUpdate(t, i));\n }\n }\n parseDateRanges(e, t, r) {\n const n = [], i = Object.keys(e);\n for (let o = 0; o < i.length; o++) {\n const a = i[o], l = e[a];\n if (l.isInterstitial) {\n let c = this.eventMap[a];\n c ? c.setDateRange(l) : (c = new pw(l, t), this.eventMap[a] = c, r === !1 && (c.appendInPlace = r)), n.push(c);\n }\n }\n return n;\n }\n parseSchedule(e, t) {\n const r = [], n = t.main.details, i = n.live ? 1 / 0 : n.edge;\n let o = 0;\n if (e = e.filter((l) => !l.error && !(l.cue.once && l.hasPlayed)), e.length) {\n this.resolveOffsets(e, t);\n let l = 0, c = 0;\n if (e.forEach((u, d) => {\n const h = u.cue.pre, f = u.cue.post, p = e[d - 1] || null, y = u.appendInPlace, E = f ? i : u.startOffset, b = u.duration, R = u.timelineOccupancy === ia.Range ? b : 0, A = u.resumptionOffset, F = (p == null ? void 0 : p.startTime) === E, M = E + u.cumulativeDuration;\n let H = y ? M + b : E + A;\n if (h || !f && E <= 0) {\n const j = c;\n c += R, u.timelineStart = M;\n const C = o;\n o += b, r.push({\n event: u,\n start: M,\n end: H,\n playout: {\n start: C,\n end: o\n },\n integrated: {\n start: j,\n end: c\n }\n });\n } else if (E <= i) {\n if (!F) {\n const k = E - l;\n if (k > Xh) {\n const $ = l, W = c;\n c += k;\n const _ = o;\n o += k;\n const g = {\n previousEvent: e[d - 1] || null,\n nextEvent: u,\n start: $,\n end: $ + k,\n playout: {\n start: _,\n end: o\n },\n integrated: {\n start: W,\n end: c\n }\n };\n r.push(g);\n } else k > 0 && p && (p.cumulativeDuration += k, r[r.length - 1].end = E);\n }\n f && (H = M), u.timelineStart = M;\n const j = c;\n c += R;\n const C = o;\n o += b, r.push({\n event: u,\n start: M,\n end: H,\n playout: {\n start: C,\n end: o\n },\n integrated: {\n start: j,\n end: c\n }\n });\n } else\n return;\n const K = u.resumeTime;\n f || K > i ? l = i : l = K;\n }), l < i) {\n var a;\n const u = l, d = c, h = i - l;\n c += h;\n const f = o;\n o += h, r.push({\n previousEvent: ((a = r[r.length - 1]) == null ? void 0 : a.event) || null,\n nextEvent: null,\n start: l,\n end: u + h,\n playout: {\n start: f,\n end: o\n },\n integrated: {\n start: d,\n end: c\n }\n });\n }\n this.setDurations(i, o, c);\n } else\n r.push({\n previousEvent: null,\n nextEvent: null,\n start: 0,\n end: i,\n playout: {\n start: 0,\n end: i\n },\n integrated: {\n start: 0,\n end: i\n }\n }), this.setDurations(i, i, i);\n return r;\n }\n setDurations(e, t, r) {\n this.durations = {\n primary: e,\n playout: t,\n integrated: r\n };\n }\n resolveOffsets(e, t) {\n const r = t.main.details, n = r.live ? 1 / 0 : r.edge;\n let i = 0, o = -1;\n e.forEach((a, l) => {\n const c = a.cue.pre, u = a.cue.post, d = c ? 0 : u ? n : a.startTime;\n this.updateAssetDurations(a), o === d ? a.cumulativeDuration = i : (i = 0, o = d), !u && a.snapOptions.in && (a.resumeAnchor = Js(null, r.fragments, a.startOffset + a.resumptionOffset, 0, 0) || void 0), a.appendInPlace && !a.appendInPlaceStarted && (this.primaryCanResumeInPlaceAt(a, t) || (a.appendInPlace = !1)), !a.appendInPlace && l + 1 < e.length && e[l + 1].startTime - e[l].resumeTime < Xh && (e[l + 1].appendInPlace = !1, e[l + 1].appendInPlace && this.warn(`Could not change append strategy for abutting event ${a}`));\n const f = ue(a.resumeOffset) ? a.resumeOffset : a.duration;\n i += f;\n });\n }\n primaryCanResumeInPlaceAt(e, t) {\n const r = e.resumeTime, n = e.startTime + e.resumptionOffset;\n return Math.abs(r - n) > Rn ? (this.log(`\"${e.identifier}\" resumption ${r} not aligned with estimated timeline end ${n}`), !1) : !Object.keys(t).some((o) => {\n const a = t[o].details, l = a.edge;\n if (r >= l)\n return this.log(`\"${e.identifier}\" resumption ${r} past ${o} playlist end ${l}`), !1;\n const c = Js(null, a.fragments, r);\n if (!c)\n return this.log(`\"${e.identifier}\" resumption ${r} does not align with any fragments in ${o} playlist (${a.fragStart}-${a.fragmentEnd})`), !0;\n const u = o === \"audio\" ? 0.175 : 0;\n return Math.abs(c.start - r) < Rn + u || Math.abs(c.end - r) < Rn + u ? !1 : (this.log(`\"${e.identifier}\" resumption ${r} not aligned with ${o} fragment bounds (${c.start}-${c.end} sn: ${c.sn} cc: ${c.cc})`), !0);\n });\n }\n updateAssetDurations(e) {\n if (!e.assetListLoaded)\n return;\n const t = e.timelineStart;\n let r = 0, n = !1, i = !1;\n for (let o = 0; o < e.assetList.length; o++) {\n const a = e.assetList[o], l = t + r;\n a.startOffset = r, a.timelineStart = l, n || (n = a.duration === null), i || (i = !!a.error);\n const c = a.error ? 0 : a.duration || 0;\n r += c;\n }\n n && !i ? e.duration = Math.max(r, e.duration) : e.duration = r;\n }\n removeEvent(e) {\n e.reset(), delete this.eventMap[e.identifier];\n }\n}\nfunction kr(s) {\n return `[${s.event ? '\"' + s.event.identifier + '\"' : \"primary\"}: ${s.start.toFixed(2)}-${s.end.toFixed(2)}]`;\n}\nclass Ew {\n constructor(e) {\n this.hls = void 0, this.hls = e;\n }\n destroy() {\n this.hls = null;\n }\n loadAssetList(e, t) {\n const r = e.assetListUrl;\n let n;\n try {\n n = $p(r, this.hls.sessionId, e.baseUrl);\n } catch (h) {\n const f = this.assignAssetListError(e, J.ASSET_LIST_LOAD_ERROR, h, r);\n this.hls.trigger(I.ERROR, f);\n return;\n }\n t && n.protocol !== \"data:\" && n.searchParams.set(\"_HLS_start_offset\", \"\" + t);\n const i = this.hls.config, o = i.loader, a = new o(i), l = {\n responseType: \"json\",\n url: n.href\n }, c = i.interstitialAssetListLoadPolicy.default, u = {\n loadPolicy: c,\n timeout: c.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0\n }, d = {\n onSuccess: (h, f, p, y) => {\n const E = h.data, b = E == null ? void 0 : E.ASSETS;\n if (!Array.isArray(b)) {\n const R = this.assignAssetListError(e, J.ASSET_LIST_PARSING_ERROR, new Error(\"Invalid interstitial asset list\"), p.url, f, y);\n this.hls.trigger(I.ERROR, R);\n return;\n }\n e.assetListResponse = E, this.hls.trigger(I.ASSET_LIST_LOADED, {\n event: e,\n assetListResponse: E,\n networkDetails: y\n });\n },\n onError: (h, f, p, y) => {\n const E = this.assignAssetListError(e, J.ASSET_LIST_LOAD_ERROR, new Error(`Error loading X-ASSET-LIST: HTTP status ${h.code} ${h.text} (${f.url})`), f.url, y, p);\n this.hls.trigger(I.ERROR, E);\n },\n onTimeout: (h, f, p) => {\n const y = this.assignAssetListError(e, J.ASSET_LIST_LOAD_TIMEOUT, new Error(`Timeout loading X-ASSET-LIST (${f.url})`), f.url, h, p);\n this.hls.trigger(I.ERROR, y);\n }\n };\n return a.load(l, u, d), this.hls.trigger(I.ASSET_LIST_LOADING, {\n event: e\n }), a;\n }\n assignAssetListError(e, t, r, n, i, o) {\n return e.error = r, {\n type: ve.NETWORK_ERROR,\n details: t,\n fatal: !1,\n interstitial: e,\n url: n,\n error: r,\n networkDetails: o,\n stats: i\n };\n }\n}\nfunction Jh(s) {\n s == null || s.play().catch(() => {\n });\n}\nfunction Qi(s, e) {\n return `[${s}] Advancing timeline position to ${e}`;\n}\nclass xw extends Lr {\n constructor(e, t) {\n super(\"interstitials\", e.logger), this.HlsPlayerClass = void 0, this.hls = void 0, this.assetListLoader = void 0, this.mediaSelection = null, this.altSelection = null, this.media = null, this.detachedData = null, this.requiredTracks = null, this.manager = null, this.playerQueue = [], this.bufferedPos = -1, this.timelinePos = -1, this.schedule = void 0, this.playingItem = null, this.bufferingItem = null, this.waitingItem = null, this.endedItem = null, this.playingAsset = null, this.endedAsset = null, this.bufferingAsset = null, this.shouldPlay = !1, this.onPlay = () => {\n this.shouldPlay = !0;\n }, this.onPause = () => {\n this.shouldPlay = !1;\n }, this.onSeeking = () => {\n const r = this.currentTime;\n if (r === void 0 || this.playbackDisabled || !this.schedule)\n return;\n const n = r - this.timelinePos;\n if (Math.abs(n) < 1 / 7056e5)\n return;\n const o = n <= -0.01;\n this.timelinePos = r, this.bufferedPos = r;\n const a = this.playingItem;\n if (!a) {\n this.checkBuffer();\n return;\n }\n if (o && this.schedule.resetErrorsInRange(r, r - n) && this.updateSchedule(!0), this.checkBuffer(), o && r < a.start || r >= a.end) {\n var l;\n const f = this.findItemIndex(a);\n let p = this.schedule.findItemIndexAtTime(r);\n if (p === -1 && (p = f + (o ? -1 : 1), this.log(`seeked ${o ? \"back \" : \"\"}to position not covered by schedule ${r} (resolving from ${f} to ${p})`)), !this.isInterstitial(a) && (l = this.media) != null && l.paused && (this.shouldPlay = !1), !o && p > f) {\n const y = this.schedule.findJumpRestrictedIndex(f + 1, p);\n if (y > f) {\n this.setSchedulePosition(y);\n return;\n }\n }\n this.setSchedulePosition(p);\n return;\n }\n const c = this.playingAsset;\n if (!c) {\n if (this.playingLastItem && this.isInterstitial(a)) {\n const f = a.event.assetList[0];\n f && (this.endedItem = this.playingItem, this.playingItem = null, this.setScheduleToAssetAtTime(r, f));\n }\n return;\n }\n const u = c.timelineStart, d = c.duration || 0;\n if (o && r < u || r >= u + d) {\n var h;\n (h = a.event) != null && h.appendInPlace && (this.clearInterstitial(a.event, a), this.flushFrontBuffer(r)), this.setScheduleToAssetAtTime(r, c);\n }\n }, this.onTimeupdate = () => {\n const r = this.currentTime;\n if (r === void 0 || this.playbackDisabled)\n return;\n if (r > this.timelinePos)\n this.timelinePos = r, r > this.bufferedPos && this.checkBuffer();\n else\n return;\n const n = this.playingItem;\n if (!n || this.playingLastItem)\n return;\n if (r >= n.end) {\n this.timelinePos = n.end;\n const a = this.findItemIndex(n);\n this.setSchedulePosition(a + 1);\n }\n const i = this.playingAsset;\n if (!i)\n return;\n const o = i.timelineStart + (i.duration || 0);\n r >= o && this.setScheduleToAssetAtTime(r, i);\n }, this.onScheduleUpdate = (r, n) => {\n const i = this.schedule;\n if (!i)\n return;\n const o = this.playingItem, a = i.events || [], l = i.items || [], c = i.durations, u = r.map((y) => y.identifier), d = !!(a.length || u.length);\n (d || n) && this.log(`INTERSTITIALS_UPDATED (${a.length}): ${a}\nSchedule: ${l.map((y) => kr(y))} pos: ${this.timelinePos}`), u.length && this.log(`Removed events ${u}`);\n let h = null, f = null;\n o && (h = this.updateItem(o, this.timelinePos), this.itemsMatch(o, h) ? this.playingItem = h : this.waitingItem = this.endedItem = null), this.waitingItem = this.updateItem(this.waitingItem), this.endedItem = this.updateItem(this.endedItem);\n const p = this.bufferingItem;\n if (p && (f = this.updateItem(p, this.bufferedPos), this.itemsMatch(p, f) ? this.bufferingItem = f : p.event && (this.bufferingItem = this.playingItem, this.clearInterstitial(p.event, null))), r.forEach((y) => {\n y.assetList.forEach((E) => {\n this.clearAssetPlayer(E.identifier, null);\n });\n }), this.playerQueue.forEach((y) => {\n if (y.interstitial.appendInPlace) {\n const E = y.assetItem.timelineStart, b = y.timelineOffset - E;\n if (b)\n try {\n y.timelineOffset = E;\n } catch (R) {\n Math.abs(b) > Rn && this.warn(`${R} (\"${y.assetId}\" ${y.timelineOffset}->${E})`);\n }\n }\n }), d || n) {\n if (this.hls.trigger(I.INTERSTITIALS_UPDATED, {\n events: a.slice(0),\n schedule: l.slice(0),\n durations: c,\n removedIds: u\n }), this.isInterstitial(o) && u.includes(o.event.identifier)) {\n this.warn(`Interstitial \"${o.event.identifier}\" removed while playing`), this.primaryFallback(o.event);\n return;\n }\n o && this.trimInPlace(h, o), p && f !== h && this.trimInPlace(f, p), this.checkBuffer();\n }\n }, this.hls = e, this.HlsPlayerClass = t, this.assetListLoader = new Ew(e), this.schedule = new vw(this.onScheduleUpdate, e.logger), this.registerListeners();\n }\n registerListeners() {\n const e = this.hls;\n e && (e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.on(I.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this), e.on(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.on(I.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this), e.on(I.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this), e.on(I.ASSET_LIST_LOADED, this.onAssetListLoaded, this), e.on(I.BUFFER_APPENDED, this.onBufferAppended, this), e.on(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.on(I.BUFFERED_TO_END, this.onBufferedToEnd, this), e.on(I.MEDIA_ENDED, this.onMediaEnded, this), e.on(I.ERROR, this.onError, this), e.on(I.DESTROYING, this.onDestroying, this));\n }\n unregisterListeners() {\n const e = this.hls;\n e && (e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.off(I.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this), e.off(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.off(I.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this), e.off(I.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this), e.off(I.ASSET_LIST_LOADED, this.onAssetListLoaded, this), e.off(I.BUFFER_CODECS, this.onBufferCodecs, this), e.off(I.BUFFER_APPENDED, this.onBufferAppended, this), e.off(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.off(I.BUFFERED_TO_END, this.onBufferedToEnd, this), e.off(I.MEDIA_ENDED, this.onMediaEnded, this), e.off(I.ERROR, this.onError, this), e.off(I.DESTROYING, this.onDestroying, this));\n }\n startLoad() {\n this.resumeBuffering();\n }\n stopLoad() {\n this.pauseBuffering();\n }\n resumeBuffering() {\n var e;\n (e = this.getBufferingPlayer()) == null || e.resumeBuffering();\n }\n pauseBuffering() {\n var e;\n (e = this.getBufferingPlayer()) == null || e.pauseBuffering();\n }\n destroy() {\n this.unregisterListeners(), this.stopLoad(), this.assetListLoader && this.assetListLoader.destroy(), this.emptyPlayerQueue(), this.clearScheduleState(), this.schedule && this.schedule.destroy(), this.media = this.detachedData = this.mediaSelection = this.requiredTracks = this.altSelection = this.schedule = this.manager = null, this.hls = this.HlsPlayerClass = this.log = null, this.assetListLoader = null, this.onPlay = this.onPause = this.onSeeking = this.onTimeupdate = null, this.onScheduleUpdate = null;\n }\n onDestroying() {\n const e = this.primaryMedia || this.media;\n e && this.removeMediaListeners(e);\n }\n removeMediaListeners(e) {\n pr(e, \"play\", this.onPlay), pr(e, \"pause\", this.onPause), pr(e, \"seeking\", this.onSeeking), pr(e, \"timeupdate\", this.onTimeupdate);\n }\n onMediaAttaching(e, t) {\n const r = this.media = t.media;\n cr(r, \"seeking\", this.onSeeking), cr(r, \"timeupdate\", this.onTimeupdate), cr(r, \"play\", this.onPlay), cr(r, \"pause\", this.onPause);\n }\n onMediaAttached(e, t) {\n const r = this.effectivePlayingItem, n = this.detachedData;\n if (this.detachedData = null, r === null)\n this.checkStart();\n else if (!n) {\n this.clearScheduleState();\n const i = this.findItemIndex(r);\n this.setSchedulePosition(i);\n }\n }\n clearScheduleState() {\n this.log(\"clear schedule state\"), this.playingItem = this.bufferingItem = this.waitingItem = this.endedItem = this.playingAsset = this.endedAsset = this.bufferingAsset = null;\n }\n onMediaDetaching(e, t) {\n const r = !!t.transferMedia, n = this.media;\n if (this.media = null, !r && (n && this.removeMediaListeners(n), this.detachedData)) {\n const i = this.getBufferingPlayer();\n i && (this.log(`Removing schedule state for detachedData and ${i}`), this.playingAsset = this.endedAsset = this.bufferingAsset = this.bufferingItem = this.waitingItem = this.detachedData = null, i.detachMedia()), this.shouldPlay = !1;\n }\n }\n get interstitialsManager() {\n if (!this.hls)\n return null;\n if (this.manager)\n return this.manager;\n const e = this, t = () => e.bufferingItem || e.waitingItem, r = (d) => d && e.getAssetPlayer(d.identifier), n = (d, h, f, p, y) => {\n if (d) {\n let E = d[h].start;\n const b = d.event;\n if (b) {\n if (h === \"playout\" || b.timelineOccupancy !== ia.Point) {\n const R = r(f);\n (R == null ? void 0 : R.interstitial) === b && (E += R.assetItem.startOffset + R[y]);\n }\n } else {\n const R = p === \"bufferedPos\" ? o() : e[p];\n E += R - d.start;\n }\n return E;\n }\n return 0;\n }, i = (d, h) => {\n var f;\n if (d !== 0 && h !== \"primary\" && (f = e.schedule) != null && f.length) {\n var p;\n const y = e.schedule.findItemIndexAtTime(d), E = (p = e.schedule.items) == null ? void 0 : p[y];\n if (E) {\n const b = E[h].start - E.start;\n return d + b;\n }\n }\n return d;\n }, o = () => {\n const d = e.bufferedPos;\n return d === Number.MAX_VALUE ? a(\"primary\") : Math.max(d, 0);\n }, a = (d) => {\n var h, f;\n return (h = e.primaryDetails) != null && h.live ? e.primaryDetails.edge : ((f = e.schedule) == null ? void 0 : f.durations[d]) || 0;\n }, l = (d, h) => {\n var f, p;\n const y = e.effectivePlayingItem;\n if (y != null && (f = y.event) != null && f.restrictions.skip || !e.schedule)\n return;\n e.log(`seek to ${d} \"${h}\"`);\n const E = e.effectivePlayingItem, b = e.schedule.findItemIndexAtTime(d, h), R = (p = e.schedule.items) == null ? void 0 : p[b], A = e.getBufferingPlayer(), F = A == null ? void 0 : A.interstitial, M = F == null ? void 0 : F.appendInPlace, H = E && e.itemsMatch(E, R);\n if (E && (M || H)) {\n const K = r(e.playingAsset), j = (K == null ? void 0 : K.media) || e.primaryMedia;\n if (j) {\n const C = h === \"primary\" ? j.currentTime : n(E, h, e.playingAsset, \"timelinePos\", \"currentTime\"), k = d - C, $ = (M ? C : j.currentTime) + k;\n if ($ >= 0 && (!K || M || $ <= K.duration)) {\n j.currentTime = $;\n return;\n }\n }\n }\n if (R) {\n let K = d;\n if (h !== \"primary\") {\n const C = R[h].start, k = d - C;\n K = R.start + k;\n }\n const j = !e.isInterstitial(R);\n if ((!e.isInterstitial(E) || E.event.appendInPlace) && (j || R.event.appendInPlace)) {\n const C = e.media || (M ? A == null ? void 0 : A.media : null);\n C && (C.currentTime = K);\n } else if (E) {\n const C = e.findItemIndex(E);\n if (b > C) {\n const $ = e.schedule.findJumpRestrictedIndex(C + 1, b);\n if ($ > C) {\n e.setSchedulePosition($);\n return;\n }\n }\n let k = 0;\n if (j)\n e.timelinePos = K, e.checkBuffer();\n else {\n const $ = R.event.assetList, W = d - (R[h] || R).start;\n for (let _ = $.length; _--; ) {\n const g = $[_];\n if (g.duration && W >= g.startOffset && W < g.startOffset + g.duration) {\n k = _;\n break;\n }\n }\n }\n e.setSchedulePosition(b, k);\n }\n }\n }, c = () => {\n const d = e.effectivePlayingItem;\n if (e.isInterstitial(d))\n return d;\n const h = t();\n return e.isInterstitial(h) ? h : null;\n }, u = {\n get bufferedEnd() {\n const d = t(), h = e.bufferingItem;\n if (h && h === d) {\n var f;\n return n(h, \"playout\", e.bufferingAsset, \"bufferedPos\", \"bufferedEnd\") - h.playout.start || ((f = e.bufferingAsset) == null ? void 0 : f.startOffset) || 0;\n }\n return 0;\n },\n get currentTime() {\n const d = c(), h = e.effectivePlayingItem;\n return h && h === d ? n(h, \"playout\", e.effectivePlayingAsset, \"timelinePos\", \"currentTime\") - h.playout.start : 0;\n },\n set currentTime(d) {\n const h = c(), f = e.effectivePlayingItem;\n f && f === h && l(d + f.playout.start, \"playout\");\n },\n get duration() {\n const d = c();\n return d ? d.playout.end - d.playout.start : 0;\n },\n get assetPlayers() {\n var d;\n const h = (d = c()) == null ? void 0 : d.event.assetList;\n return h ? h.map((f) => e.getAssetPlayer(f.identifier)) : [];\n },\n get playingIndex() {\n var d;\n const h = (d = c()) == null ? void 0 : d.event;\n return h && e.effectivePlayingAsset ? h.findAssetIndex(e.effectivePlayingAsset) : -1;\n },\n get scheduleItem() {\n return c();\n }\n };\n return this.manager = {\n get events() {\n var d;\n return ((d = e.schedule) == null || (d = d.events) == null ? void 0 : d.slice(0)) || [];\n },\n get schedule() {\n var d;\n return ((d = e.schedule) == null || (d = d.items) == null ? void 0 : d.slice(0)) || [];\n },\n get interstitialPlayer() {\n return c() ? u : null;\n },\n get playerQueue() {\n return e.playerQueue.slice(0);\n },\n get bufferingAsset() {\n return e.bufferingAsset;\n },\n get bufferingItem() {\n return t();\n },\n get bufferingIndex() {\n const d = t();\n return e.findItemIndex(d);\n },\n get playingAsset() {\n return e.effectivePlayingAsset;\n },\n get playingItem() {\n return e.effectivePlayingItem;\n },\n get playingIndex() {\n const d = e.effectivePlayingItem;\n return e.findItemIndex(d);\n },\n primary: {\n get bufferedEnd() {\n return o();\n },\n get currentTime() {\n const d = e.timelinePos;\n return d > 0 ? d : 0;\n },\n set currentTime(d) {\n l(d, \"primary\");\n },\n get duration() {\n return a(\"primary\");\n },\n get seekableStart() {\n var d;\n return ((d = e.primaryDetails) == null ? void 0 : d.fragmentStart) || 0;\n }\n },\n integrated: {\n get bufferedEnd() {\n return n(t(), \"integrated\", e.bufferingAsset, \"bufferedPos\", \"bufferedEnd\");\n },\n get currentTime() {\n return n(e.effectivePlayingItem, \"integrated\", e.effectivePlayingAsset, \"timelinePos\", \"currentTime\");\n },\n set currentTime(d) {\n l(d, \"integrated\");\n },\n get duration() {\n return a(\"integrated\");\n },\n get seekableStart() {\n var d;\n return i(((d = e.primaryDetails) == null ? void 0 : d.fragmentStart) || 0, \"integrated\");\n }\n },\n skip: () => {\n const d = e.effectivePlayingItem, h = d == null ? void 0 : d.event;\n if (h && !h.restrictions.skip) {\n const f = e.findItemIndex(d);\n if (h.appendInPlace) {\n const p = d.playout.start + d.event.duration;\n l(p + 1e-3, \"playout\");\n } else\n e.advanceAfterAssetEnded(h, f, 1 / 0);\n }\n }\n };\n }\n // Schedule getters\n get effectivePlayingItem() {\n return this.waitingItem || this.playingItem || this.endedItem;\n }\n get effectivePlayingAsset() {\n return this.playingAsset || this.endedAsset;\n }\n get playingLastItem() {\n var e;\n const t = this.playingItem, r = (e = this.schedule) == null ? void 0 : e.items;\n return !this.playbackStarted || !t || !r ? !1 : this.findItemIndex(t) === r.length - 1;\n }\n get playbackStarted() {\n return this.effectivePlayingItem !== null;\n }\n // Media getters and event callbacks\n get currentTime() {\n var e, t;\n if (this.mediaSelection === null)\n return;\n const r = this.waitingItem || this.playingItem;\n if (this.isInterstitial(r) && !r.event.appendInPlace)\n return;\n let n = this.media;\n !n && (e = this.bufferingItem) != null && (e = e.event) != null && e.appendInPlace && (n = this.primaryMedia);\n const i = (t = n) == null ? void 0 : t.currentTime;\n if (!(i === void 0 || !ue(i)))\n return i;\n }\n get primaryMedia() {\n var e;\n return this.media || ((e = this.detachedData) == null ? void 0 : e.media) || null;\n }\n isInterstitial(e) {\n return !!(e != null && e.event);\n }\n retreiveMediaSource(e, t) {\n const r = this.getAssetPlayer(e);\n r && this.transferMediaFromPlayer(r, t);\n }\n transferMediaFromPlayer(e, t) {\n const r = e.interstitial.appendInPlace, n = e.media;\n if (r && n === this.primaryMedia) {\n if (this.bufferingAsset = null, (!t || this.isInterstitial(t) && !t.event.appendInPlace) && t && n) {\n this.detachedData = {\n media: n\n };\n return;\n }\n const i = e.transferMedia();\n this.log(`transfer MediaSource from ${e} ${at(i)}`), this.detachedData = i;\n } else t && n && (this.shouldPlay || (this.shouldPlay = !n.paused));\n }\n transferMediaTo(e, t) {\n var r, n;\n if (e.media === t)\n return;\n let i = null;\n const o = this.hls, a = e !== o, l = a && e.interstitial.appendInPlace, c = (r = this.detachedData) == null ? void 0 : r.mediaSource;\n let u;\n if (o.media)\n l && (i = o.transferMedia(), this.detachedData = i), u = \"Primary\";\n else if (c) {\n const p = this.getBufferingPlayer();\n p ? (i = p.transferMedia(), u = `${p}`) : u = \"detached MediaSource\";\n } else\n u = \"detached media\";\n if (!i) {\n if (c)\n i = this.detachedData, this.log(`using detachedData: MediaSource ${at(i)}`);\n else if (!this.detachedData || o.media === t) {\n const p = this.playerQueue;\n p.length > 1 && p.forEach((y) => {\n if (a && y.interstitial.appendInPlace !== l) {\n const E = y.interstitial;\n this.clearInterstitial(y.interstitial, null), E.appendInPlace = !1, E.appendInPlace && this.warn(`Could not change append strategy for queued assets ${E}`);\n }\n }), this.hls.detachMedia(), this.detachedData = {\n media: t\n };\n }\n }\n const d = i && \"mediaSource\" in i && ((n = i.mediaSource) == null ? void 0 : n.readyState) !== \"closed\", h = d && i ? i : t;\n this.log(`${d ? \"transfering MediaSource\" : \"attaching media\"} to ${a ? e : \"Primary\"} from ${u} (media.currentTime: ${t.currentTime})`);\n const f = this.schedule;\n if (h === i && f) {\n const p = a && e.assetId === f.assetIdAtEnd;\n h.overrides = {\n duration: f.duration,\n endOfStream: !a || p,\n cueRemoval: !a\n };\n }\n e.attachMedia(h);\n }\n onInterstitialCueEnter() {\n this.onTimeupdate();\n }\n // Scheduling methods\n checkStart() {\n const e = this.schedule, t = e == null ? void 0 : e.events;\n if (!t || this.playbackDisabled || !this.media)\n return;\n this.bufferedPos === -1 && (this.bufferedPos = 0);\n const r = this.timelinePos, n = this.effectivePlayingItem;\n if (r === -1) {\n const i = this.hls.startPosition;\n if (this.log(Qi(\"checkStart\", i)), this.timelinePos = i, t.length && t[0].cue.pre) {\n const o = e.findEventIndex(t[0].identifier);\n this.setSchedulePosition(o);\n } else if (i >= 0 || !this.primaryLive) {\n const o = this.timelinePos = i > 0 ? i : 0, a = e.findItemIndexAtTime(o);\n this.setSchedulePosition(a);\n }\n } else if (n && !this.playingItem) {\n const i = e.findItemIndex(n);\n this.setSchedulePosition(i);\n }\n }\n advanceAssetBuffering(e, t) {\n const r = e.event, n = r.findAssetIndex(t), i = Tl(r, n);\n if (!r.isAssetPastPlayoutLimit(i))\n this.bufferedToEvent(e, i);\n else if (this.schedule) {\n var o;\n const a = (o = this.schedule.items) == null ? void 0 : o[this.findItemIndex(e) + 1];\n a && this.bufferedToItem(a);\n }\n }\n advanceAfterAssetEnded(e, t, r) {\n const n = Tl(e, r);\n if (e.isAssetPastPlayoutLimit(n)) {\n if (this.schedule) {\n const i = this.schedule.items;\n if (i) {\n const o = t + 1, a = i.length;\n if (o >= a) {\n this.setSchedulePosition(-1);\n return;\n }\n const l = e.resumeTime;\n this.timelinePos < l && (this.log(Qi(\"advanceAfterAssetEnded\", l)), this.timelinePos = l, e.appendInPlace && this.advanceInPlace(l), this.checkBuffer(this.bufferedPos < l)), this.setSchedulePosition(o);\n }\n }\n } else {\n if (e.appendInPlace) {\n const i = e.assetList[n];\n i && this.advanceInPlace(i.timelineStart);\n }\n this.setSchedulePosition(t, n);\n }\n }\n setScheduleToAssetAtTime(e, t) {\n const r = this.schedule;\n if (!r)\n return;\n const n = t.parentIdentifier, i = r.getEvent(n);\n if (i) {\n const o = r.findEventIndex(n), a = r.findAssetIndex(i, e);\n this.advanceAfterAssetEnded(i, o, a - 1);\n }\n }\n setSchedulePosition(e, t) {\n var r;\n const n = (r = this.schedule) == null ? void 0 : r.items;\n if (!n || this.playbackDisabled)\n return;\n const i = e >= 0 ? n[e] : null;\n this.log(`setSchedulePosition ${e}, ${t} (${i && kr(i)}) pos: ${this.timelinePos}`);\n const o = this.waitingItem || this.playingItem, a = this.playingLastItem;\n if (this.isInterstitial(o)) {\n const u = o.event, d = this.playingAsset, h = d == null ? void 0 : d.identifier, f = h ? this.getAssetPlayer(h) : null;\n if (f && h && (!this.eventItemsMatch(o, i) || t !== void 0 && h !== u.assetList[t].identifier)) {\n var l;\n const p = u.findAssetIndex(d);\n if (this.log(`INTERSTITIAL_ASSET_ENDED ${p + 1}/${u.assetList.length} ${vn(d)}`), this.endedAsset = d, this.playingAsset = null, this.hls.trigger(I.INTERSTITIAL_ASSET_ENDED, {\n asset: d,\n assetListIndex: p,\n event: u,\n schedule: n.slice(0),\n scheduleIndex: e,\n player: f\n }), o !== this.playingItem) {\n this.itemsMatch(o, this.playingItem) && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n !this.playingAsset && this.advanceAfterAssetEnded(u, this.findItemIndex(this.playingItem), p);\n return;\n }\n this.retreiveMediaSource(h, i), f.media && !((l = this.detachedData) != null && l.mediaSource) && f.detachMedia();\n }\n if (!this.eventItemsMatch(o, i) && (this.endedItem = o, this.playingItem = null, this.log(`INTERSTITIAL_ENDED ${u} ${kr(o)}`), u.hasPlayed = !0, this.hls.trigger(I.INTERSTITIAL_ENDED, {\n event: u,\n schedule: n.slice(0),\n scheduleIndex: e\n }), u.cue.once)) {\n var c;\n this.updateSchedule();\n const p = (c = this.schedule) == null ? void 0 : c.items;\n if (i && p) {\n const y = this.findItemIndex(i);\n this.advanceSchedule(y, p, t, o, a);\n }\n return;\n }\n }\n this.advanceSchedule(e, n, t, o, a);\n }\n advanceSchedule(e, t, r, n, i) {\n const o = this.schedule;\n if (!o)\n return;\n const a = t[e] || null, l = this.primaryMedia, c = this.playerQueue;\n if (c.length && c.forEach((u) => {\n const d = u.interstitial, h = o.findEventIndex(d.identifier);\n (h < e || h > e + 1) && this.clearInterstitial(d, a);\n }), this.isInterstitial(a)) {\n this.timelinePos = Math.min(Math.max(this.timelinePos, a.start), a.end);\n const u = a.event;\n if (r === void 0) {\n r = o.findAssetIndex(u, this.timelinePos);\n const p = Tl(u, r - 1);\n if (u.isAssetPastPlayoutLimit(p) || u.appendInPlace && this.timelinePos === a.end) {\n this.advanceAfterAssetEnded(u, e, r);\n return;\n }\n r = p;\n }\n const d = this.waitingItem;\n this.assetsBuffered(a, l) || this.setBufferingItem(a);\n let h = this.preloadAssets(u, r);\n if (this.eventItemsMatch(a, d || n) || (this.waitingItem = a, this.log(`INTERSTITIAL_STARTED ${kr(a)} ${u.appendInPlace ? \"append in place\" : \"\"}`), this.hls.trigger(I.INTERSTITIAL_STARTED, {\n event: u,\n schedule: t.slice(0),\n scheduleIndex: e\n })), !u.assetListLoaded) {\n this.log(`Waiting for ASSET-LIST to complete loading ${u}`);\n return;\n }\n if (u.assetListLoader && (u.assetListLoader.destroy(), u.assetListLoader = void 0), !l) {\n this.log(`Waiting for attachMedia to start Interstitial ${u}`);\n return;\n }\n this.waitingItem = this.endedItem = null, this.playingItem = a;\n const f = u.assetList[r];\n if (!f) {\n this.advanceAfterAssetEnded(u, e, r || 0);\n return;\n }\n if (h || (h = this.getAssetPlayer(f.identifier)), h === null || h.destroyed) {\n const p = u.assetList.length;\n this.warn(`asset ${r + 1}/${p} player destroyed ${u}`), h = this.createAssetPlayer(u, f, r), h.loadSource();\n }\n if (!this.eventItemsMatch(a, this.bufferingItem) && u.appendInPlace && this.isAssetBuffered(f))\n return;\n this.startAssetPlayer(h, r, t, e, l), this.shouldPlay && Jh(h.media);\n } else a ? (this.resumePrimary(a, e, n), this.shouldPlay && Jh(this.hls.media)) : i && this.isInterstitial(n) && (this.endedItem = null, this.playingItem = n, n.event.appendInPlace || this.attachPrimary(o.durations.primary, null));\n }\n get playbackDisabled() {\n return this.hls.config.enableInterstitialPlayback === !1;\n }\n get primaryDetails() {\n var e;\n return (e = this.mediaSelection) == null ? void 0 : e.main.details;\n }\n get primaryLive() {\n var e;\n return !!((e = this.primaryDetails) != null && e.live);\n }\n resumePrimary(e, t, r) {\n var n, i;\n if (this.playingItem = e, this.playingAsset = this.endedAsset = null, this.waitingItem = this.endedItem = null, this.bufferedToItem(e), this.log(`resuming ${kr(e)}`), !((n = this.detachedData) != null && n.mediaSource)) {\n let a = this.timelinePos;\n (a < e.start || a >= e.end) && (a = this.getPrimaryResumption(e, t), this.log(Qi(\"resumePrimary\", a)), this.timelinePos = a), this.attachPrimary(a, e);\n }\n if (!r)\n return;\n const o = (i = this.schedule) == null ? void 0 : i.items;\n o && (this.log(`INTERSTITIALS_PRIMARY_RESUMED ${kr(e)}`), this.hls.trigger(I.INTERSTITIALS_PRIMARY_RESUMED, {\n schedule: o.slice(0),\n scheduleIndex: t\n }), this.checkBuffer());\n }\n getPrimaryResumption(e, t) {\n const r = e.start;\n if (this.primaryLive) {\n const n = this.primaryDetails;\n if (t === 0)\n return this.hls.startPosition;\n if (n && (r < n.fragmentStart || r > n.edge))\n return this.hls.liveSyncPosition || -1;\n }\n return r;\n }\n isAssetBuffered(e) {\n const t = this.getAssetPlayer(e.identifier);\n return t != null && t.hls ? t.hls.bufferedToEnd : Ce.bufferInfo(this.primaryMedia, this.timelinePos, 0).end + 1 >= e.timelineStart + (e.duration || 0);\n }\n attachPrimary(e, t, r) {\n t ? this.setBufferingItem(t) : this.bufferingItem = this.playingItem, this.bufferingAsset = null;\n const n = this.primaryMedia;\n if (!n)\n return;\n const i = this.hls;\n i.media ? this.checkBuffer() : (this.transferMediaTo(i, n), r && this.startLoadingPrimaryAt(e, r)), r || (this.log(Qi(\"attachPrimary\", e)), this.timelinePos = e, this.startLoadingPrimaryAt(e, r));\n }\n startLoadingPrimaryAt(e, t) {\n var r;\n const n = this.hls;\n !n.loadingEnabled || !n.media || Math.abs((((r = n.mainForwardBufferInfo) == null ? void 0 : r.start) || n.media.currentTime) - e) > 0.5 ? n.startLoad(e, t) : n.bufferingEnabled || n.resumeBuffering();\n }\n // HLS.js event callbacks\n onManifestLoading() {\n var e;\n this.stopLoad(), (e = this.schedule) == null || e.reset(), this.emptyPlayerQueue(), this.clearScheduleState(), this.shouldPlay = !1, this.bufferedPos = this.timelinePos = -1, this.mediaSelection = this.altSelection = this.manager = this.requiredTracks = null, this.hls.off(I.BUFFER_CODECS, this.onBufferCodecs, this), this.hls.on(I.BUFFER_CODECS, this.onBufferCodecs, this);\n }\n onLevelUpdated(e, t) {\n if (t.level === -1 || !this.schedule)\n return;\n const r = this.hls.levels[t.level];\n if (!r.details)\n return;\n const n = tt(tt({}, this.mediaSelection || this.altSelection), {}, {\n main: r\n });\n this.mediaSelection = n, this.schedule.parseInterstitialDateRanges(n, this.hls.config.interstitialAppendInPlace), !this.effectivePlayingItem && this.schedule.items && this.checkStart();\n }\n onAudioTrackUpdated(e, t) {\n const r = this.hls.audioTracks[t.id], n = this.mediaSelection;\n if (!n) {\n this.altSelection = tt(tt({}, this.altSelection), {}, {\n audio: r\n });\n return;\n }\n const i = tt(tt({}, n), {}, {\n audio: r\n });\n this.mediaSelection = i;\n }\n onSubtitleTrackUpdated(e, t) {\n const r = this.hls.subtitleTracks[t.id], n = this.mediaSelection;\n if (!n) {\n this.altSelection = tt(tt({}, this.altSelection), {}, {\n subtitles: r\n });\n return;\n }\n const i = tt(tt({}, n), {}, {\n subtitles: r\n });\n this.mediaSelection = i;\n }\n onAudioTrackSwitching(e, t) {\n const r = ch(t);\n this.playerQueue.forEach(({\n hls: n\n }) => n && (n.setAudioOption(t) || n.setAudioOption(r)));\n }\n onSubtitleTrackSwitch(e, t) {\n const r = ch(t);\n this.playerQueue.forEach(({\n hls: n\n }) => n && (n.setSubtitleOption(t) || t.id !== -1 && n.setSubtitleOption(r)));\n }\n onBufferCodecs(e, t) {\n const r = t.tracks;\n r && (this.requiredTracks = r);\n }\n onBufferAppended(e, t) {\n this.checkBuffer();\n }\n onBufferFlushed(e, t) {\n const r = this.playingItem;\n if (r && !this.itemsMatch(r, this.bufferingItem) && !this.isInterstitial(r)) {\n const n = this.timelinePos;\n this.bufferedPos = n, this.checkBuffer();\n }\n }\n onBufferedToEnd(e) {\n if (!this.schedule)\n return;\n const t = this.schedule.events;\n if (this.bufferedPos < Number.MAX_VALUE && t) {\n for (let n = 0; n < t.length; n++) {\n const i = t[n];\n if (i.cue.post) {\n var r;\n const o = this.schedule.findEventIndex(i.identifier), a = (r = this.schedule.items) == null ? void 0 : r[o];\n this.isInterstitial(a) && this.eventItemsMatch(a, this.bufferingItem) && this.bufferedToItem(a, 0);\n break;\n }\n }\n this.bufferedPos = Number.MAX_VALUE;\n }\n }\n onMediaEnded(e) {\n const t = this.playingItem;\n if (!this.playingLastItem && t) {\n const r = this.findItemIndex(t);\n this.setSchedulePosition(r + 1);\n } else\n this.shouldPlay = !1;\n }\n updateItem(e, t) {\n var r;\n const n = (r = this.schedule) == null ? void 0 : r.items;\n if (e && n) {\n const i = this.findItemIndex(e, t);\n return n[i] || null;\n }\n return null;\n }\n trimInPlace(e, t) {\n if (this.isInterstitial(e) && e.event.appendInPlace && t.end - e.end > 0.25) {\n e.event.assetList.forEach((i, o) => {\n e.event.isAssetPastPlayoutLimit(o) && this.clearAssetPlayer(i.identifier, null);\n });\n const r = e.end + 0.25, n = Ce.bufferInfo(this.primaryMedia, r, 0);\n (n.end > r || (n.nextStart || 0) > r) && (this.log(`trim buffered interstitial ${kr(e)} (was ${kr(t)})`), this.attachPrimary(r, null, !0), this.flushFrontBuffer(r));\n }\n }\n itemsMatch(e, t) {\n return !!t && (e === t || e.event && t.event && this.eventItemsMatch(e, t) || !e.event && !t.event && this.findItemIndex(e) === this.findItemIndex(t));\n }\n eventItemsMatch(e, t) {\n var r;\n return !!t && (e === t || e.event.identifier === ((r = t.event) == null ? void 0 : r.identifier));\n }\n findItemIndex(e, t) {\n return e && this.schedule ? this.schedule.findItemIndex(e, t) : -1;\n }\n updateSchedule(e = !1) {\n var t;\n const r = this.mediaSelection;\n r && ((t = this.schedule) == null || t.updateSchedule(r, [], e));\n }\n // Schedule buffer control\n checkBuffer(e) {\n var t;\n const r = (t = this.schedule) == null ? void 0 : t.items;\n if (!r)\n return;\n const n = Ce.bufferInfo(this.primaryMedia, this.timelinePos, 0);\n e && (this.bufferedPos = this.timelinePos), e || (e = n.len < 1), this.updateBufferedPos(n.end, r, e);\n }\n updateBufferedPos(e, t, r) {\n const n = this.schedule, i = this.bufferingItem;\n if (this.bufferedPos > e || !n)\n return;\n if (t.length === 1 && this.itemsMatch(t[0], i)) {\n this.bufferedPos = e;\n return;\n }\n const o = this.playingItem, a = this.findItemIndex(o);\n let l = n.findItemIndexAtTime(e);\n if (this.bufferedPos < e) {\n var c;\n const u = this.findItemIndex(i), d = Math.min(u + 1, t.length - 1), h = t[d];\n if ((l === -1 && i && e >= i.end || (c = h.event) != null && c.appendInPlace && e + 0.01 >= h.start) && (l = d), this.isInterstitial(i)) {\n const f = i.event;\n if (d - a > 1 && f.appendInPlace === !1 || f.assetList.length === 0 && f.assetListLoader)\n return;\n }\n if (this.bufferedPos = e, l > u && l > a)\n this.bufferedToItem(h);\n else {\n const f = this.primaryDetails;\n this.primaryLive && f && e > f.edge - f.targetduration && h.start < f.edge + this.hls.config.interstitialLiveLookAhead && this.isInterstitial(h) && this.preloadAssets(h.event, 0);\n }\n } else r && o && !this.itemsMatch(o, i) && (l === a ? this.bufferedToItem(o) : l === a + 1 && this.bufferedToItem(t[l]));\n }\n assetsBuffered(e, t) {\n return e.event.assetList.length === 0 ? !1 : !e.event.assetList.some((n) => {\n const i = this.getAssetPlayer(n.identifier);\n return !(i != null && i.bufferedInPlaceToEnd(t));\n });\n }\n setBufferingItem(e) {\n const t = this.bufferingItem, r = this.schedule;\n if (!this.itemsMatch(e, t) && r) {\n const {\n items: n,\n events: i\n } = r;\n if (!n || !i)\n return t;\n const o = this.isInterstitial(e), a = this.getBufferingPlayer();\n this.bufferingItem = e, this.bufferedPos = Math.max(e.start, Math.min(e.end, this.timelinePos));\n const l = a ? a.remaining : t ? t.end - this.timelinePos : 0;\n if (this.log(`INTERSTITIALS_BUFFERED_TO_BOUNDARY ${kr(e)}` + (t ? ` (${l.toFixed(2)} remaining)` : \"\")), !this.playbackDisabled)\n if (o) {\n const c = r.findAssetIndex(e.event, this.bufferedPos);\n e.event.assetList.forEach((u, d) => {\n const h = this.getAssetPlayer(u.identifier);\n h && (d === c && h.loadSource(), h.resumeBuffering());\n });\n } else\n this.hls.resumeBuffering(), this.playerQueue.forEach((c) => c.pauseBuffering());\n this.hls.trigger(I.INTERSTITIALS_BUFFERED_TO_BOUNDARY, {\n events: i.slice(0),\n schedule: n.slice(0),\n bufferingIndex: this.findItemIndex(e),\n playingIndex: this.findItemIndex(this.playingItem)\n });\n } else this.bufferingItem !== e && (this.bufferingItem = e);\n return t;\n }\n bufferedToItem(e, t = 0) {\n const r = this.setBufferingItem(e);\n if (!this.playbackDisabled) {\n if (this.isInterstitial(e))\n this.bufferedToEvent(e, t);\n else if (r !== null) {\n this.bufferingAsset = null;\n const n = this.detachedData;\n n ? n.mediaSource ? this.attachPrimary(e.start, e, !0) : this.preloadPrimary(e) : this.preloadPrimary(e);\n }\n }\n }\n preloadPrimary(e) {\n const t = this.findItemIndex(e), r = this.getPrimaryResumption(e, t);\n this.startLoadingPrimaryAt(r);\n }\n bufferedToEvent(e, t) {\n const r = e.event, n = r.assetList.length === 0 && !r.assetListLoader, i = r.cue.once;\n if (n || !i) {\n const o = this.preloadAssets(r, t);\n if (o != null && o.interstitial.appendInPlace) {\n const a = this.primaryMedia;\n a && this.bufferAssetPlayer(o, a);\n }\n }\n }\n preloadAssets(e, t) {\n const r = e.assetUrl, n = e.assetList.length, i = n === 0 && !e.assetListLoader, o = e.cue.once;\n if (i) {\n const l = e.timelineStart;\n if (e.appendInPlace) {\n var a;\n const h = this.playingItem;\n !this.isInterstitial(h) && (h == null || (a = h.nextEvent) == null ? void 0 : a.identifier) === e.identifier && this.flushFrontBuffer(l + 0.25);\n }\n let c, u = 0;\n if (!this.playingItem && this.primaryLive && (u = this.hls.startPosition, u === -1 && (u = this.hls.liveSyncPosition || 0)), u && !(e.cue.pre || e.cue.post)) {\n const h = u - l;\n h > 0 && (c = Math.round(h * 1e3) / 1e3);\n }\n if (this.log(`Load interstitial asset ${t + 1}/${r ? 1 : n} ${e}${c ? ` live-start: ${u} start-offset: ${c}` : \"\"}`), r)\n return this.createAsset(e, 0, 0, l, e.duration, r);\n const d = this.assetListLoader.loadAssetList(e, c);\n d && (e.assetListLoader = d);\n } else if (!o && n) {\n for (let c = t; c < n; c++) {\n const u = e.assetList[c], d = this.getAssetPlayerQueueIndex(u.identifier);\n (d === -1 || this.playerQueue[d].destroyed) && !u.error && this.createAssetPlayer(e, u, c);\n }\n const l = e.assetList[t];\n if (l) {\n const c = this.getAssetPlayer(l.identifier);\n return c && c.loadSource(), c;\n }\n }\n return null;\n }\n flushFrontBuffer(e) {\n const t = this.requiredTracks;\n if (!t)\n return;\n this.log(`Removing front buffer starting at ${e}`), Object.keys(t).forEach((n) => {\n this.hls.trigger(I.BUFFER_FLUSHING, {\n startOffset: e,\n endOffset: 1 / 0,\n type: n\n });\n });\n }\n // Interstitial Asset Player control\n getAssetPlayerQueueIndex(e) {\n const t = this.playerQueue;\n for (let r = 0; r < t.length; r++)\n if (e === t[r].assetId)\n return r;\n return -1;\n }\n getAssetPlayer(e) {\n const t = this.getAssetPlayerQueueIndex(e);\n return this.playerQueue[t] || null;\n }\n getBufferingPlayer() {\n const {\n playerQueue: e,\n primaryMedia: t\n } = this;\n if (t) {\n for (let r = 0; r < e.length; r++)\n if (e[r].media === t)\n return e[r];\n }\n return null;\n }\n createAsset(e, t, r, n, i, o) {\n const a = {\n parentIdentifier: e.identifier,\n identifier: gw(e, o, t),\n duration: i,\n startOffset: r,\n timelineStart: n,\n uri: o\n };\n return this.createAssetPlayer(e, a, t);\n }\n createAssetPlayer(e, t, r) {\n const n = this.hls, i = n.userConfig;\n let o = i.videoPreference;\n const a = n.loadLevelObj || n.levels[n.currentLevel];\n (o || a) && (o = nt({}, o), a.videoCodec && (o.videoCodec = a.videoCodec), a.videoRange && (o.allowedVideoRanges = [a.videoRange]));\n const l = n.audioTracks[n.audioTrack], c = n.subtitleTracks[n.subtitleTrack];\n let u = 0;\n if (this.primaryLive || e.appendInPlace) {\n const F = this.timelinePos - t.timelineStart;\n if (F > 1) {\n const M = t.duration;\n M && F < M && (u = F);\n }\n }\n const d = t.identifier, h = tt(tt({}, i), {}, {\n maxMaxBufferLength: Math.min(180, n.config.maxMaxBufferLength),\n autoStartLoad: !0,\n startFragPrefetch: !0,\n primarySessionId: n.sessionId,\n assetPlayerId: d,\n abrEwmaDefaultEstimate: n.bandwidthEstimate,\n interstitialsController: void 0,\n startPosition: u,\n liveDurationInfinity: !1,\n testBandwidth: !1,\n videoPreference: o,\n audioPreference: l || i.audioPreference,\n subtitlePreference: c || i.subtitlePreference\n });\n e.appendInPlace && (e.appendInPlaceStarted = !0, t.timelineStart && (h.timelineOffset = t.timelineStart));\n const f = h.cmcd;\n f != null && f.sessionId && f.contentId && (h.cmcd = nt({}, f, {\n contentId: Xn(t.uri)\n })), this.getAssetPlayer(d) && this.warn(`Duplicate date range identifier ${e} and asset ${d}`);\n const p = new yw(this.HlsPlayerClass, h, e, t);\n this.playerQueue.push(p), e.assetList[r] = t;\n let y = !0;\n const E = (F) => {\n if (F.live) {\n var M;\n const j = new Error(`Interstitials MUST be VOD assets ${e}`), C = {\n fatal: !0,\n type: ve.OTHER_ERROR,\n details: J.INTERSTITIAL_ASSET_ITEM_ERROR,\n error: j\n }, k = ((M = this.schedule) == null ? void 0 : M.findEventIndex(e.identifier)) || -1;\n this.handleAssetItemError(C, e, k, r, j.message);\n return;\n }\n const H = F.edge - F.fragmentStart, K = t.duration;\n (y || K === null || H > K) && (y = !1, this.log(`Interstitial asset \"${d}\" duration change ${K} > ${H}`), t.duration = H, this.updateSchedule());\n };\n p.on(I.LEVEL_UPDATED, (F, {\n details: M\n }) => E(M)), p.on(I.LEVEL_PTS_UPDATED, (F, {\n details: M\n }) => E(M)), p.on(I.EVENT_CUE_ENTER, () => this.onInterstitialCueEnter());\n const b = (F, M) => {\n const H = this.getAssetPlayer(d);\n if (H && M.tracks) {\n H.off(I.BUFFER_CODECS, b), H.tracks = M.tracks;\n const K = this.primaryMedia;\n this.bufferingAsset === H.assetItem && K && !H.media && this.bufferAssetPlayer(H, K);\n }\n };\n p.on(I.BUFFER_CODECS, b);\n const R = () => {\n var F;\n const M = this.getAssetPlayer(d);\n if (this.log(`buffered to end of asset ${M}`), !M || !this.schedule)\n return;\n const H = this.schedule.findEventIndex(e.identifier), K = (F = this.schedule.items) == null ? void 0 : F[H];\n this.isInterstitial(K) && this.advanceAssetBuffering(K, t);\n };\n p.on(I.BUFFERED_TO_END, R);\n const A = (F) => () => {\n if (!this.getAssetPlayer(d) || !this.schedule)\n return;\n this.shouldPlay = !0;\n const H = this.schedule.findEventIndex(e.identifier);\n this.advanceAfterAssetEnded(e, H, F);\n };\n return p.once(I.MEDIA_ENDED, A(r)), p.once(I.PLAYOUT_LIMIT_REACHED, A(1 / 0)), p.on(I.ERROR, (F, M) => {\n if (!this.schedule)\n return;\n const H = this.getAssetPlayer(d);\n if (M.details === J.BUFFER_STALLED_ERROR) {\n if (H != null && H.appendInPlace) {\n this.handleInPlaceStall(e);\n return;\n }\n this.onTimeupdate(), this.checkBuffer(!0);\n return;\n }\n this.handleAssetItemError(M, e, this.schedule.findEventIndex(e.identifier), r, `Asset player error ${M.error} ${e}`);\n }), p.on(I.DESTROYING, () => {\n if (!this.getAssetPlayer(d) || !this.schedule)\n return;\n const M = new Error(`Asset player destroyed unexpectedly ${d}`), H = {\n fatal: !0,\n type: ve.OTHER_ERROR,\n details: J.INTERSTITIAL_ASSET_ITEM_ERROR,\n error: M\n };\n this.handleAssetItemError(H, e, this.schedule.findEventIndex(e.identifier), r, M.message);\n }), this.log(`INTERSTITIAL_ASSET_PLAYER_CREATED ${vn(t)}`), this.hls.trigger(I.INTERSTITIAL_ASSET_PLAYER_CREATED, {\n asset: t,\n assetListIndex: r,\n event: e,\n player: p\n }), p;\n }\n clearInterstitial(e, t) {\n e.assetList.forEach((r) => {\n this.clearAssetPlayer(r.identifier, t);\n }), e.reset();\n }\n resetAssetPlayer(e) {\n const t = this.getAssetPlayerQueueIndex(e);\n if (t !== -1) {\n this.log(`reset asset player \"${e}\" after error`);\n const r = this.playerQueue[t];\n this.transferMediaFromPlayer(r, null), r.resetDetails();\n }\n }\n clearAssetPlayer(e, t) {\n const r = this.getAssetPlayerQueueIndex(e);\n if (r !== -1) {\n const n = this.playerQueue[r];\n this.log(`clear ${n} toSegment: ${t && kr(t)}`), this.transferMediaFromPlayer(n, t), this.playerQueue.splice(r, 1), n.destroy();\n }\n }\n emptyPlayerQueue() {\n let e;\n for (; e = this.playerQueue.pop(); )\n e.destroy();\n this.playerQueue = [];\n }\n startAssetPlayer(e, t, r, n, i) {\n const {\n interstitial: o,\n assetItem: a,\n assetId: l\n } = e, c = o.assetList.length, u = this.playingAsset;\n this.endedAsset = null, this.playingAsset = a, (!u || u.identifier !== l) && (u && (this.clearAssetPlayer(u.identifier, r[n]), delete u.error), this.log(`INTERSTITIAL_ASSET_STARTED ${t + 1}/${c} ${vn(a)}`), this.hls.trigger(I.INTERSTITIAL_ASSET_STARTED, {\n asset: a,\n assetListIndex: t,\n event: o,\n schedule: r.slice(0),\n scheduleIndex: n,\n player: e\n })), this.bufferAssetPlayer(e, i);\n }\n bufferAssetPlayer(e, t) {\n var r, n;\n if (!this.schedule)\n return;\n const {\n interstitial: i,\n assetItem: o\n } = e, a = this.schedule.findEventIndex(i.identifier), l = (r = this.schedule.items) == null ? void 0 : r[a];\n if (!l)\n return;\n e.loadSource(), this.setBufferingItem(l), this.bufferingAsset = o;\n const c = this.getBufferingPlayer();\n if (c === e)\n return;\n const u = i.appendInPlace;\n if (u && (c == null ? void 0 : c.interstitial.appendInPlace) === !1)\n return;\n const d = (c == null ? void 0 : c.tracks) || ((n = this.detachedData) == null ? void 0 : n.tracks) || this.requiredTracks;\n if (u && o !== this.playingAsset) {\n if (!e.tracks) {\n this.log(`Waiting for track info before buffering ${e}`);\n return;\n }\n if (d && !Ag(d, e.tracks)) {\n const h = new Error(`Asset ${vn(o)} SourceBuffer tracks ('${Object.keys(e.tracks)}') are not compatible with primary content tracks ('${Object.keys(d)}')`), f = {\n fatal: !0,\n type: ve.OTHER_ERROR,\n details: J.INTERSTITIAL_ASSET_ITEM_ERROR,\n error: h\n }, p = i.findAssetIndex(o);\n this.handleAssetItemError(f, i, a, p, h.message);\n return;\n }\n }\n this.transferMediaTo(e, t);\n }\n handleInPlaceStall(e) {\n const t = this.schedule, r = this.primaryMedia;\n if (!t || !r)\n return;\n const n = r.currentTime, i = t.findAssetIndex(e, n), o = e.assetList[i];\n if (o) {\n const a = this.getAssetPlayer(o.identifier);\n if (a) {\n const l = a.currentTime || n - o.timelineStart, c = a.duration - l;\n if (this.warn(`Stalled at ${l} of ${l + c} in ${a} ${e} (media.currentTime: ${n})`), l && (c / r.playbackRate < 0.5 || a.bufferedInPlaceToEnd(r)) && a.hls) {\n const u = t.findEventIndex(e.identifier);\n this.advanceAfterAssetEnded(e, u, i);\n }\n }\n }\n }\n advanceInPlace(e) {\n const t = this.primaryMedia;\n t && t.currentTime < e && (t.currentTime = e);\n }\n handleAssetItemError(e, t, r, n, i) {\n if (e.details === J.BUFFER_STALLED_ERROR)\n return;\n const o = t.assetList[n] || null;\n if (this.warn(`INTERSTITIAL_ASSET_ERROR ${o && vn(o)} ${e.error}`), !this.schedule)\n return;\n const a = (o == null ? void 0 : o.identifier) || \"\", l = this.getAssetPlayerQueueIndex(a), c = this.playerQueue[l] || null, u = this.schedule.items, d = nt({}, e, {\n fatal: !1,\n errorAction: An(!0),\n asset: o,\n assetListIndex: n,\n event: t,\n schedule: u,\n scheduleIndex: r,\n player: c\n });\n if (this.hls.trigger(I.INTERSTITIAL_ASSET_ERROR, d), !e.fatal)\n return;\n const h = this.playingAsset, f = this.bufferingAsset, p = new Error(i);\n if (o && (this.clearAssetPlayer(a, null), o.error = p), !t.assetList.some((y) => !y.error))\n t.error = p;\n else\n for (let y = n; y < t.assetList.length; y++)\n this.resetAssetPlayer(t.assetList[y].identifier);\n this.updateSchedule(!0), t.error ? this.primaryFallback(t) : h && h.identifier === a ? this.advanceAfterAssetEnded(t, r, n) : f && f.identifier === a && this.isInterstitial(this.bufferingItem) && this.advanceAssetBuffering(this.bufferingItem, f);\n }\n primaryFallback(e) {\n const t = e.timelineStart, r = this.effectivePlayingItem;\n if (r) {\n this.log(`Fallback to primary from event \"${e.identifier}\" start: ${t} pos: ${this.timelinePos} playing: ${kr(r)} error: ${e.error}`);\n let n = this.timelinePos;\n n === -1 && (n = this.hls.startPosition);\n const i = this.updateItem(r, n);\n if (this.itemsMatch(r, i) && this.clearInterstitial(e, null), e.appendInPlace && (this.attachPrimary(t, null), this.flushFrontBuffer(t)), !this.schedule)\n return;\n const o = this.schedule.findItemIndexAtTime(n);\n this.setSchedulePosition(o);\n } else\n this.checkStart();\n }\n // Asset List loading\n onAssetListLoaded(e, t) {\n var r, n;\n const i = t.event, o = i.identifier, a = t.assetListResponse.ASSETS;\n if (!((r = this.schedule) != null && r.hasEvent(o)))\n return;\n const l = i.timelineStart, c = i.duration;\n let u = 0;\n a.forEach((y, E) => {\n const b = parseFloat(y.DURATION);\n this.createAsset(i, E, u, l + u, b, y.URI), u += b;\n }), i.duration = u, this.log(`Loaded asset-list with duration: ${u} (was: ${c}) ${i}`);\n const d = this.waitingItem, h = (d == null ? void 0 : d.event.identifier) === o;\n this.updateSchedule();\n const f = (n = this.bufferingItem) == null ? void 0 : n.event;\n if (h) {\n var p;\n const y = this.schedule.findEventIndex(o), E = (p = this.schedule.items) == null ? void 0 : p[y];\n if (E) {\n if (!this.playingItem && this.timelinePos > E.end && this.schedule.findItemIndexAtTime(this.timelinePos) !== y) {\n i.error = new Error(`Interstitial no longer within playback range ${this.timelinePos} ${i}`), this.updateSchedule(!0), this.primaryFallback(i);\n return;\n }\n this.setBufferingItem(E);\n }\n this.setSchedulePosition(y);\n } else if ((f == null ? void 0 : f.identifier) === o) {\n const y = i.assetList[0];\n if (y) {\n const E = this.getAssetPlayer(y.identifier);\n if (f.appendInPlace) {\n const b = this.primaryMedia;\n E && b && this.bufferAssetPlayer(E, b);\n } else E && E.loadSource();\n }\n }\n }\n onError(e, t) {\n if (this.schedule)\n switch (t.details) {\n case J.ASSET_LIST_PARSING_ERROR:\n case J.ASSET_LIST_LOAD_ERROR:\n case J.ASSET_LIST_LOAD_TIMEOUT: {\n const r = t.interstitial;\n r && (this.updateSchedule(!0), this.primaryFallback(r));\n break;\n }\n case J.BUFFER_STALLED_ERROR: {\n const r = this.endedItem || this.waitingItem || this.playingItem;\n if (this.isInterstitial(r) && r.event.appendInPlace) {\n this.handleInPlaceStall(r.event);\n return;\n }\n this.log(`Primary player stall @${this.timelinePos} bufferedPos: ${this.bufferedPos}`), this.onTimeupdate(), this.checkBuffer(!0);\n break;\n }\n }\n }\n}\nconst Qh = 500;\nclass Sw extends Tu {\n constructor(e, t, r) {\n super(e, t, r, \"subtitle-stream-controller\", pe.SUBTITLE), this.currentTrackId = -1, this.tracksBuffered = [], this.mainDetails = null, this.registerListeners();\n }\n onHandlerDestroying() {\n this.unregisterListeners(), super.onHandlerDestroying(), this.mainDetails = null;\n }\n registerListeners() {\n super.registerListeners();\n const {\n hls: e\n } = this;\n e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.on(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.on(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.on(I.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this);\n }\n unregisterListeners() {\n super.unregisterListeners();\n const {\n hls: e\n } = this;\n e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.off(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.off(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.off(I.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this);\n }\n startLoad(e, t) {\n this.stopLoad(), this.state = ne.IDLE, this.setInterval(Qh), this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick();\n }\n onManifestLoading() {\n super.onManifestLoading(), this.mainDetails = null;\n }\n onMediaDetaching(e, t) {\n this.tracksBuffered = [], super.onMediaDetaching(e, t);\n }\n onLevelLoaded(e, t) {\n this.mainDetails = t.details;\n }\n onSubtitleFragProcessed(e, t) {\n const {\n frag: r,\n success: n\n } = t;\n if (this.fragContextChanged(r) || (Vt(r) && (this.fragPrevious = r), this.state = ne.IDLE), !n)\n return;\n const i = this.tracksBuffered[this.currentTrackId];\n if (!i)\n return;\n let o;\n const a = r.start;\n for (let c = 0; c < i.length; c++)\n if (a >= i[c].start && a <= i[c].end) {\n o = i[c];\n break;\n }\n const l = r.start + r.duration;\n o ? o.end = l : (o = {\n start: a,\n end: l\n }, i.push(o)), this.fragmentTracker.fragBuffered(r), this.fragBufferedComplete(r, null), this.media && this.tick();\n }\n onBufferFlushing(e, t) {\n const {\n startOffset: r,\n endOffset: n\n } = t;\n if (r === 0 && n !== Number.POSITIVE_INFINITY) {\n const i = n - 1;\n if (i <= 0)\n return;\n t.endOffsetSubtitles = Math.max(0, i), this.tracksBuffered.forEach((o) => {\n for (let a = 0; a < o.length; ) {\n if (o[a].end <= i) {\n o.shift();\n continue;\n } else if (o[a].start < i)\n o[a].start = i;\n else\n break;\n a++;\n }\n }), this.fragmentTracker.removeFragmentsInRange(r, i, pe.SUBTITLE);\n }\n }\n // If something goes wrong, proceed to next frag, if we were processing one.\n onError(e, t) {\n const r = t.frag;\n (r == null ? void 0 : r.type) === pe.SUBTITLE && (t.details === J.FRAG_GAP && this.fragmentTracker.fragBuffered(r, !0), this.fragCurrent && this.fragCurrent.abortRequests(), this.state !== ne.STOPPED && (this.state = ne.IDLE));\n }\n // Got all new subtitle levels.\n onSubtitleTracksUpdated(e, {\n subtitleTracks: t\n }) {\n if (this.levels && Ap(this.levels, t)) {\n this.levels = t.map((r) => new mi(r));\n return;\n }\n this.tracksBuffered = [], this.levels = t.map((r) => {\n const n = new mi(r);\n return this.tracksBuffered[n.id] = [], n;\n }), this.fragmentTracker.removeFragmentsInRange(0, Number.POSITIVE_INFINITY, pe.SUBTITLE), this.fragPrevious = null, this.mediaBuffer = null;\n }\n onSubtitleTrackSwitch(e, t) {\n var r;\n if (this.currentTrackId = t.id, !((r = this.levels) != null && r.length) || this.currentTrackId === -1) {\n this.clearInterval();\n return;\n }\n const n = this.levels[this.currentTrackId];\n n != null && n.details ? this.mediaBuffer = this.mediaBufferTimeRanges : this.mediaBuffer = null, n && this.state !== ne.STOPPED && this.setInterval(Qh);\n }\n // Got a new set of subtitle fragments.\n onSubtitleTrackLoaded(e, t) {\n var r;\n const {\n currentTrackId: n,\n levels: i\n } = this, {\n details: o,\n id: a\n } = t;\n if (!i) {\n this.warn(`Subtitle tracks were reset while loading level ${a}`);\n return;\n }\n const l = i[a];\n if (a >= i.length || !l)\n return;\n this.log(`Subtitle track ${a} loaded [${o.startSN},${o.endSN}]${o.lastPartSn ? `[part-${o.lastPartSn}-${o.lastPartIndex}]` : \"\"},duration:${o.totalduration}`), this.mediaBuffer = this.mediaBufferTimeRanges;\n let c = 0;\n if (o.live || (r = l.details) != null && r.live) {\n if (o.deltaUpdateFailed)\n return;\n const d = this.mainDetails;\n if (!d) {\n this.startFragRequested = !1;\n return;\n }\n const h = d.fragments[0];\n if (!l.details)\n o.hasProgramDateTime && d.hasProgramDateTime ? (sa(o, d), c = o.fragmentStart) : h && (c = h.start, gc(o, c));\n else {\n var u;\n c = this.alignPlaylists(o, l.details, (u = this.levelLastLoaded) == null ? void 0 : u.details), c === 0 && h && (c = h.start, gc(o, c));\n }\n d && !this.startFragRequested && this.setStartPosition(d, c);\n }\n l.details = o, this.levelLastLoaded = l, a === n && (this.hls.trigger(I.SUBTITLE_TRACK_UPDATED, {\n details: o,\n id: a,\n groupId: t.groupId\n }), this.tick(), o.live && !this.fragCurrent && this.media && this.state === ne.IDLE && (Js(null, o.fragments, this.media.currentTime, 0) || (this.warn(\"Subtitle playlist not aligned with playback\"), l.details = void 0)));\n }\n _handleFragmentLoadComplete(e) {\n const {\n frag: t,\n payload: r\n } = e, n = t.decryptdata, i = this.hls;\n if (!this.fragContextChanged(t) && r && r.byteLength > 0 && n != null && n.key && n.iv && In(n.method)) {\n const o = performance.now();\n this.decrypter.decrypt(new Uint8Array(r), n.key.buffer, n.iv.buffer, Su(n.method)).catch((a) => {\n throw i.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.FRAG_DECRYPT_ERROR,\n fatal: !1,\n error: a,\n reason: a.message,\n frag: t\n }), a;\n }).then((a) => {\n const l = performance.now();\n i.trigger(I.FRAG_DECRYPTED, {\n frag: t,\n payload: a,\n stats: {\n tstart: o,\n tdecrypt: l\n }\n });\n }).catch((a) => {\n this.warn(`${a.name}: ${a.message}`), this.state = ne.IDLE;\n });\n }\n }\n doTick() {\n if (!this.media) {\n this.state = ne.IDLE;\n return;\n }\n if (this.state === ne.IDLE) {\n const {\n currentTrackId: e,\n levels: t\n } = this, r = t == null ? void 0 : t[e];\n if (!r || !t.length || !r.details || this.waitForLive(r))\n return;\n const {\n config: n\n } = this, i = this.getLoadPosition(), o = Ce.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], i, n.maxBufferHole), {\n end: a,\n len: l\n } = o, c = r.details, u = this.hls.maxBufferLength + c.levelTargetDuration;\n if (l > u)\n return;\n const d = c.fragments, h = d.length, f = c.edge;\n let p = null;\n const y = this.fragPrevious;\n if (a < f) {\n const R = n.maxFragLookUpTolerance, A = a > f - R ? 0 : R;\n p = Js(y, d, Math.max(d[0].start, a), A), !p && y && y.start < d[0].start && (p = d[0]);\n } else\n p = d[h - 1];\n if (p = this.filterReplacedPrimary(p, r.details), !p)\n return;\n const E = p.sn - c.startSN, b = d[E - 1];\n if (b && b.cc === p.cc && this.fragmentTracker.getState(b) === Ht.NOT_LOADED && (p = b), this.fragmentTracker.getState(p) === Ht.NOT_LOADED) {\n const R = this.mapToInitFragWhenRequired(p);\n R && this.loadFragment(R, r, a);\n }\n }\n }\n loadFragment(e, t, r) {\n Vt(e) ? super.loadFragment(e, t, r) : this._loadInitSegment(e, t);\n }\n get mediaBufferTimeRanges() {\n return new bw(this.tracksBuffered[this.currentTrackId] || []);\n }\n}\nclass bw {\n constructor(e) {\n this.buffered = void 0;\n const t = (r, n, i) => {\n if (n = n >>> 0, n > i - 1)\n throw new DOMException(`Failed to execute '${r}' on 'TimeRanges': The index provided (${n}) is greater than the maximum bound (${i})`);\n return e[n][r];\n };\n this.buffered = {\n get length() {\n return e.length;\n },\n end(r) {\n return t(\"end\", r, e.length);\n },\n start(r) {\n return t(\"start\", r, e.length);\n }\n };\n }\n}\nconst Tw = {\n 42: 225,\n // lowercase a, acute accent\n 92: 233,\n // lowercase e, acute accent\n 94: 237,\n // lowercase i, acute accent\n 95: 243,\n // lowercase o, acute accent\n 96: 250,\n // lowercase u, acute accent\n 123: 231,\n // lowercase c with cedilla\n 124: 247,\n // division symbol\n 125: 209,\n // uppercase N tilde\n 126: 241,\n // lowercase n tilde\n 127: 9608,\n // Full block\n // THIS BLOCK INCLUDES THE 16 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x11 AND LOW BETWEEN 0x30 AND 0x3F\n // THIS MEANS THAT \\x50 MUST BE ADDED TO THE VALUES\n 128: 174,\n // Registered symbol (R)\n 129: 176,\n // degree sign\n 130: 189,\n // 1/2 symbol\n 131: 191,\n // Inverted (open) question mark\n 132: 8482,\n // Trademark symbol (TM)\n 133: 162,\n // Cents symbol\n 134: 163,\n // Pounds sterling\n 135: 9834,\n // Music 8'th note\n 136: 224,\n // lowercase a, grave accent\n 137: 32,\n // transparent space (regular)\n 138: 232,\n // lowercase e, grave accent\n 139: 226,\n // lowercase a, circumflex accent\n 140: 234,\n // lowercase e, circumflex accent\n 141: 238,\n // lowercase i, circumflex accent\n 142: 244,\n // lowercase o, circumflex accent\n 143: 251,\n // lowercase u, circumflex accent\n // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x12 AND LOW BETWEEN 0x20 AND 0x3F\n 144: 193,\n // capital letter A with acute\n 145: 201,\n // capital letter E with acute\n 146: 211,\n // capital letter O with acute\n 147: 218,\n // capital letter U with acute\n 148: 220,\n // capital letter U with diaresis\n 149: 252,\n // lowercase letter U with diaeresis\n 150: 8216,\n // opening single quote\n 151: 161,\n // inverted exclamation mark\n 152: 42,\n // asterisk\n 153: 8217,\n // closing single quote\n 154: 9473,\n // box drawings heavy horizontal\n 155: 169,\n // copyright sign\n 156: 8480,\n // Service mark\n 157: 8226,\n // (round) bullet\n 158: 8220,\n // Left double quotation mark\n 159: 8221,\n // Right double quotation mark\n 160: 192,\n // uppercase A, grave accent\n 161: 194,\n // uppercase A, circumflex\n 162: 199,\n // uppercase C with cedilla\n 163: 200,\n // uppercase E, grave accent\n 164: 202,\n // uppercase E, circumflex\n 165: 203,\n // capital letter E with diaresis\n 166: 235,\n // lowercase letter e with diaresis\n 167: 206,\n // uppercase I, circumflex\n 168: 207,\n // uppercase I, with diaresis\n 169: 239,\n // lowercase i, with diaresis\n 170: 212,\n // uppercase O, circumflex\n 171: 217,\n // uppercase U, grave accent\n 172: 249,\n // lowercase u, grave accent\n 173: 219,\n // uppercase U, circumflex\n 174: 171,\n // left-pointing double angle quotation mark\n 175: 187,\n // right-pointing double angle quotation mark\n // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x13 AND LOW BETWEEN 0x20 AND 0x3F\n 176: 195,\n // Uppercase A, tilde\n 177: 227,\n // Lowercase a, tilde\n 178: 205,\n // Uppercase I, acute accent\n 179: 204,\n // Uppercase I, grave accent\n 180: 236,\n // Lowercase i, grave accent\n 181: 210,\n // Uppercase O, grave accent\n 182: 242,\n // Lowercase o, grave accent\n 183: 213,\n // Uppercase O, tilde\n 184: 245,\n // Lowercase o, tilde\n 185: 123,\n // Open curly brace\n 186: 125,\n // Closing curly brace\n 187: 92,\n // Backslash\n 188: 94,\n // Caret\n 189: 95,\n // Underscore\n 190: 124,\n // Pipe (vertical line)\n 191: 8764,\n // Tilde operator\n 192: 196,\n // Uppercase A, umlaut\n 193: 228,\n // Lowercase A, umlaut\n 194: 214,\n // Uppercase O, umlaut\n 195: 246,\n // Lowercase o, umlaut\n 196: 223,\n // Esszett (sharp S)\n 197: 165,\n // Yen symbol\n 198: 164,\n // Generic currency sign\n 199: 9475,\n // Box drawings heavy vertical\n 200: 197,\n // Uppercase A, ring\n 201: 229,\n // Lowercase A, ring\n 202: 216,\n // Uppercase O, stroke\n 203: 248,\n // Lowercase o, strok\n 204: 9487,\n // Box drawings heavy down and right\n 205: 9491,\n // Box drawings heavy down and left\n 206: 9495,\n // Box drawings heavy up and right\n 207: 9499\n // Box drawings heavy up and left\n}, Gp = (s) => String.fromCharCode(Tw[s] || s), Dr = 15, is = 100, ww = {\n 17: 1,\n 18: 3,\n 21: 5,\n 22: 7,\n 23: 9,\n 16: 11,\n 19: 12,\n 20: 14\n}, Aw = {\n 17: 2,\n 18: 4,\n 21: 6,\n 22: 8,\n 23: 10,\n 19: 13,\n 20: 15\n}, Iw = {\n 25: 1,\n 26: 3,\n 29: 5,\n 30: 7,\n 31: 9,\n 24: 11,\n 27: 12,\n 28: 14\n}, _w = {\n 25: 2,\n 26: 4,\n 29: 6,\n 30: 8,\n 31: 10,\n 27: 13,\n 28: 15\n}, Rw = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\", \"black\", \"transparent\"];\nclass Lw {\n constructor() {\n this.time = null, this.verboseLevel = 0;\n }\n log(e, t) {\n if (this.verboseLevel >= e) {\n const r = typeof t == \"function\" ? t() : t;\n rt.log(`${this.time} [${e}] ${r}`);\n }\n }\n}\nconst Ns = function(e) {\n const t = [];\n for (let r = 0; r < e.length; r++)\n t.push(e[r].toString(16));\n return t;\n};\nclass Vp {\n constructor() {\n this.foreground = \"white\", this.underline = !1, this.italics = !1, this.background = \"black\", this.flash = !1;\n }\n reset() {\n this.foreground = \"white\", this.underline = !1, this.italics = !1, this.background = \"black\", this.flash = !1;\n }\n setStyles(e) {\n const t = [\"foreground\", \"underline\", \"italics\", \"background\", \"flash\"];\n for (let r = 0; r < t.length; r++) {\n const n = t[r];\n e.hasOwnProperty(n) && (this[n] = e[n]);\n }\n }\n isDefault() {\n return this.foreground === \"white\" && !this.underline && !this.italics && this.background === \"black\" && !this.flash;\n }\n equals(e) {\n return this.foreground === e.foreground && this.underline === e.underline && this.italics === e.italics && this.background === e.background && this.flash === e.flash;\n }\n copy(e) {\n this.foreground = e.foreground, this.underline = e.underline, this.italics = e.italics, this.background = e.background, this.flash = e.flash;\n }\n toString() {\n return \"color=\" + this.foreground + \", underline=\" + this.underline + \", italics=\" + this.italics + \", background=\" + this.background + \", flash=\" + this.flash;\n }\n}\nclass Cw {\n constructor() {\n this.uchar = \" \", this.penState = new Vp();\n }\n reset() {\n this.uchar = \" \", this.penState.reset();\n }\n setChar(e, t) {\n this.uchar = e, this.penState.copy(t);\n }\n setPenState(e) {\n this.penState.copy(e);\n }\n equals(e) {\n return this.uchar === e.uchar && this.penState.equals(e.penState);\n }\n copy(e) {\n this.uchar = e.uchar, this.penState.copy(e.penState);\n }\n isEmpty() {\n return this.uchar === \" \" && this.penState.isDefault();\n }\n}\nclass kw {\n constructor(e) {\n this.chars = [], this.pos = 0, this.currPenState = new Vp(), this.cueStartTime = null, this.logger = void 0;\n for (let t = 0; t < is; t++)\n this.chars.push(new Cw());\n this.logger = e;\n }\n equals(e) {\n for (let t = 0; t < is; t++)\n if (!this.chars[t].equals(e.chars[t]))\n return !1;\n return !0;\n }\n copy(e) {\n for (let t = 0; t < is; t++)\n this.chars[t].copy(e.chars[t]);\n }\n isEmpty() {\n let e = !0;\n for (let t = 0; t < is; t++)\n if (!this.chars[t].isEmpty()) {\n e = !1;\n break;\n }\n return e;\n }\n /**\n * Set the cursor to a valid column.\n */\n setCursor(e) {\n this.pos !== e && (this.pos = e), this.pos < 0 ? (this.logger.log(3, \"Negative cursor position \" + this.pos), this.pos = 0) : this.pos > is && (this.logger.log(3, \"Too large cursor position \" + this.pos), this.pos = is);\n }\n /**\n * Move the cursor relative to current position.\n */\n moveCursor(e) {\n const t = this.pos + e;\n if (e > 1)\n for (let r = this.pos + 1; r < t + 1; r++)\n this.chars[r].setPenState(this.currPenState);\n this.setCursor(t);\n }\n /**\n * Backspace, move one step back and clear character.\n */\n backSpace() {\n this.moveCursor(-1), this.chars[this.pos].setChar(\" \", this.currPenState);\n }\n insertChar(e) {\n e >= 144 && this.backSpace();\n const t = Gp(e);\n if (this.pos >= is) {\n this.logger.log(0, () => \"Cannot insert \" + e.toString(16) + \" (\" + t + \") at position \" + this.pos + \". Skipping it!\");\n return;\n }\n this.chars[this.pos].setChar(t, this.currPenState), this.moveCursor(1);\n }\n clearFromPos(e) {\n let t;\n for (t = e; t < is; t++)\n this.chars[t].reset();\n }\n clear() {\n this.clearFromPos(0), this.pos = 0, this.currPenState.reset();\n }\n clearToEndOfRow() {\n this.clearFromPos(this.pos);\n }\n getTextString() {\n const e = [];\n let t = !0;\n for (let r = 0; r < is; r++) {\n const n = this.chars[r].uchar;\n n !== \" \" && (t = !1), e.push(n);\n }\n return t ? \"\" : e.join(\"\");\n }\n setPenStyles(e) {\n this.currPenState.setStyles(e), this.chars[this.pos].setPenState(this.currPenState);\n }\n}\nclass wl {\n constructor(e) {\n this.rows = [], this.currRow = Dr - 1, this.nrRollUpRows = null, this.lastOutputScreen = null, this.logger = void 0;\n for (let t = 0; t < Dr; t++)\n this.rows.push(new kw(e));\n this.logger = e;\n }\n reset() {\n for (let e = 0; e < Dr; e++)\n this.rows[e].clear();\n this.currRow = Dr - 1;\n }\n equals(e) {\n let t = !0;\n for (let r = 0; r < Dr; r++)\n if (!this.rows[r].equals(e.rows[r])) {\n t = !1;\n break;\n }\n return t;\n }\n copy(e) {\n for (let t = 0; t < Dr; t++)\n this.rows[t].copy(e.rows[t]);\n }\n isEmpty() {\n let e = !0;\n for (let t = 0; t < Dr; t++)\n if (!this.rows[t].isEmpty()) {\n e = !1;\n break;\n }\n return e;\n }\n backSpace() {\n this.rows[this.currRow].backSpace();\n }\n clearToEndOfRow() {\n this.rows[this.currRow].clearToEndOfRow();\n }\n /**\n * Insert a character (without styling) in the current row.\n */\n insertChar(e) {\n this.rows[this.currRow].insertChar(e);\n }\n setPen(e) {\n this.rows[this.currRow].setPenStyles(e);\n }\n moveCursor(e) {\n this.rows[this.currRow].moveCursor(e);\n }\n setCursor(e) {\n this.logger.log(2, \"setCursor: \" + e), this.rows[this.currRow].setCursor(e);\n }\n setPAC(e) {\n this.logger.log(2, () => \"pacData = \" + at(e));\n let t = e.row - 1;\n if (this.nrRollUpRows && t < this.nrRollUpRows - 1 && (t = this.nrRollUpRows - 1), this.nrRollUpRows && this.currRow !== t) {\n for (let a = 0; a < Dr; a++)\n this.rows[a].clear();\n const i = this.currRow + 1 - this.nrRollUpRows, o = this.lastOutputScreen;\n if (o) {\n const a = o.rows[i].cueStartTime, l = this.logger.time;\n if (a !== null && l !== null && a < l)\n for (let c = 0; c < this.nrRollUpRows; c++)\n this.rows[t - this.nrRollUpRows + c + 1].copy(o.rows[i + c]);\n }\n }\n this.currRow = t;\n const r = this.rows[this.currRow];\n if (e.indent !== null) {\n const i = e.indent, o = Math.max(i - 1, 0);\n r.setCursor(e.indent), e.color = r.chars[o].penState.foreground;\n }\n const n = {\n foreground: e.color,\n underline: e.underline,\n italics: e.italics,\n background: \"black\",\n flash: !1\n };\n this.setPen(n);\n }\n /**\n * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility).\n */\n setBkgData(e) {\n this.logger.log(2, () => \"bkgData = \" + at(e)), this.backSpace(), this.setPen(e), this.insertChar(32);\n }\n setRollUpRows(e) {\n this.nrRollUpRows = e;\n }\n rollUp() {\n if (this.nrRollUpRows === null) {\n this.logger.log(3, \"roll_up but nrRollUpRows not set yet\");\n return;\n }\n this.logger.log(1, () => this.getDisplayText());\n const e = this.currRow + 1 - this.nrRollUpRows, t = this.rows.splice(e, 1)[0];\n t.clear(), this.rows.splice(this.currRow, 0, t), this.logger.log(2, \"Rolling up\");\n }\n /**\n * Get all non-empty rows with as unicode text.\n */\n getDisplayText(e) {\n e = e || !1;\n const t = [];\n let r = \"\", n = -1;\n for (let i = 0; i < Dr; i++) {\n const o = this.rows[i].getTextString();\n o && (n = i + 1, e ? t.push(\"Row \" + n + \": '\" + o + \"'\") : t.push(o.trim()));\n }\n return t.length > 0 && (e ? r = \"[\" + t.join(\" | \") + \"]\" : r = t.join(`\n`)), r;\n }\n getTextAndFormat() {\n return this.rows;\n }\n}\nclass ef {\n constructor(e, t, r) {\n this.chNr = void 0, this.outputFilter = void 0, this.mode = void 0, this.verbose = void 0, this.displayedMemory = void 0, this.nonDisplayedMemory = void 0, this.lastOutputScreen = void 0, this.currRollUpRow = void 0, this.writeScreen = void 0, this.cueStartTime = void 0, this.logger = void 0, this.chNr = e, this.outputFilter = t, this.mode = null, this.verbose = 0, this.displayedMemory = new wl(r), this.nonDisplayedMemory = new wl(r), this.lastOutputScreen = new wl(r), this.currRollUpRow = this.displayedMemory.rows[Dr - 1], this.writeScreen = this.displayedMemory, this.mode = null, this.cueStartTime = null, this.logger = r;\n }\n reset() {\n this.mode = null, this.displayedMemory.reset(), this.nonDisplayedMemory.reset(), this.lastOutputScreen.reset(), this.outputFilter.reset(), this.currRollUpRow = this.displayedMemory.rows[Dr - 1], this.writeScreen = this.displayedMemory, this.mode = null, this.cueStartTime = null;\n }\n getHandler() {\n return this.outputFilter;\n }\n setHandler(e) {\n this.outputFilter = e;\n }\n setPAC(e) {\n this.writeScreen.setPAC(e);\n }\n setBkgData(e) {\n this.writeScreen.setBkgData(e);\n }\n setMode(e) {\n e !== this.mode && (this.mode = e, this.logger.log(2, () => \"MODE=\" + e), this.mode === \"MODE_POP-ON\" ? this.writeScreen = this.nonDisplayedMemory : (this.writeScreen = this.displayedMemory, this.writeScreen.reset()), this.mode !== \"MODE_ROLL-UP\" && (this.displayedMemory.nrRollUpRows = null, this.nonDisplayedMemory.nrRollUpRows = null), this.mode = e);\n }\n insertChars(e) {\n for (let r = 0; r < e.length; r++)\n this.writeScreen.insertChar(e[r]);\n const t = this.writeScreen === this.displayedMemory ? \"DISP\" : \"NON_DISP\";\n this.logger.log(2, () => t + \": \" + this.writeScreen.getDisplayText(!0)), (this.mode === \"MODE_PAINT-ON\" || this.mode === \"MODE_ROLL-UP\") && (this.logger.log(1, () => \"DISPLAYED: \" + this.displayedMemory.getDisplayText(!0)), this.outputDataUpdate());\n }\n ccRCL() {\n this.logger.log(2, \"RCL - Resume Caption Loading\"), this.setMode(\"MODE_POP-ON\");\n }\n ccBS() {\n this.logger.log(2, \"BS - BackSpace\"), this.mode !== \"MODE_TEXT\" && (this.writeScreen.backSpace(), this.writeScreen === this.displayedMemory && this.outputDataUpdate());\n }\n ccAOF() {\n }\n ccAON() {\n }\n ccDER() {\n this.logger.log(2, \"DER- Delete to End of Row\"), this.writeScreen.clearToEndOfRow(), this.outputDataUpdate();\n }\n ccRU(e) {\n this.logger.log(2, \"RU(\" + e + \") - Roll Up\"), this.writeScreen = this.displayedMemory, this.setMode(\"MODE_ROLL-UP\"), this.writeScreen.setRollUpRows(e);\n }\n ccFON() {\n this.logger.log(2, \"FON - Flash On\"), this.writeScreen.setPen({\n flash: !0\n });\n }\n ccRDC() {\n this.logger.log(2, \"RDC - Resume Direct Captioning\"), this.setMode(\"MODE_PAINT-ON\");\n }\n ccTR() {\n this.logger.log(2, \"TR\"), this.setMode(\"MODE_TEXT\");\n }\n ccRTD() {\n this.logger.log(2, \"RTD\"), this.setMode(\"MODE_TEXT\");\n }\n ccEDM() {\n this.logger.log(2, \"EDM - Erase Displayed Memory\"), this.displayedMemory.reset(), this.outputDataUpdate(!0);\n }\n ccCR() {\n this.logger.log(2, \"CR - Carriage Return\"), this.writeScreen.rollUp(), this.outputDataUpdate(!0);\n }\n ccENM() {\n this.logger.log(2, \"ENM - Erase Non-displayed Memory\"), this.nonDisplayedMemory.reset();\n }\n ccEOC() {\n if (this.logger.log(2, \"EOC - End Of Caption\"), this.mode === \"MODE_POP-ON\") {\n const e = this.displayedMemory;\n this.displayedMemory = this.nonDisplayedMemory, this.nonDisplayedMemory = e, this.writeScreen = this.nonDisplayedMemory, this.logger.log(1, () => \"DISP: \" + this.displayedMemory.getDisplayText());\n }\n this.outputDataUpdate(!0);\n }\n ccTO(e) {\n this.logger.log(2, \"TO(\" + e + \") - Tab Offset\"), this.writeScreen.moveCursor(e);\n }\n ccMIDROW(e) {\n const t = {\n flash: !1\n };\n if (t.underline = e % 2 === 1, t.italics = e >= 46, t.italics)\n t.foreground = \"white\";\n else {\n const r = Math.floor(e / 2) - 16, n = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\"];\n t.foreground = n[r];\n }\n this.logger.log(2, \"MIDROW: \" + at(t)), this.writeScreen.setPen(t);\n }\n outputDataUpdate(e = !1) {\n const t = this.logger.time;\n t !== null && this.outputFilter && (this.cueStartTime === null && !this.displayedMemory.isEmpty() ? this.cueStartTime = t : this.displayedMemory.equals(this.lastOutputScreen) || (this.outputFilter.newCue(this.cueStartTime, t, this.lastOutputScreen), e && this.outputFilter.dispatchCue && this.outputFilter.dispatchCue(), this.cueStartTime = this.displayedMemory.isEmpty() ? null : t), this.lastOutputScreen.copy(this.displayedMemory));\n }\n cueSplitAtTime(e) {\n this.outputFilter && (this.displayedMemory.isEmpty() || (this.outputFilter.newCue && this.outputFilter.newCue(this.cueStartTime, e, this.displayedMemory), this.cueStartTime = e));\n }\n}\nclass tf {\n constructor(e, t, r) {\n this.channels = void 0, this.currentChannel = 0, this.cmdHistory = Pw(), this.logger = void 0;\n const n = this.logger = new Lw();\n this.channels = [null, new ef(e, t, n), new ef(e + 1, r, n)];\n }\n getHandler(e) {\n return this.channels[e].getHandler();\n }\n setHandler(e, t) {\n this.channels[e].setHandler(t);\n }\n /**\n * Add data for time t in forms of list of bytes (unsigned ints). The bytes are treated as pairs.\n */\n addData(e, t) {\n this.logger.time = e;\n for (let r = 0; r < t.length; r += 2) {\n const n = t[r] & 127, i = t[r + 1] & 127;\n let o = !1, a = null;\n if (n === 0 && i === 0)\n continue;\n this.logger.log(3, () => \"[\" + Ns([t[r], t[r + 1]]) + \"] -> (\" + Ns([n, i]) + \")\");\n const l = this.cmdHistory;\n if (n >= 16 && n <= 31) {\n if (Dw(n, i, l)) {\n eo(null, null, l), this.logger.log(3, () => \"Repeated command (\" + Ns([n, i]) + \") is dropped\");\n continue;\n }\n eo(n, i, this.cmdHistory), o = this.parseCmd(n, i), o || (o = this.parseMidrow(n, i)), o || (o = this.parsePAC(n, i)), o || (o = this.parseBackgroundAttributes(n, i));\n } else\n eo(null, null, l);\n if (!o && (a = this.parseChars(n, i), a)) {\n const u = this.currentChannel;\n u && u > 0 ? this.channels[u].insertChars(a) : this.logger.log(2, \"No channel found yet. TEXT-MODE?\");\n }\n !o && !a && this.logger.log(2, () => \"Couldn't parse cleaned data \" + Ns([n, i]) + \" orig: \" + Ns([t[r], t[r + 1]]));\n }\n }\n /**\n * Parse Command.\n * @returns True if a command was found\n */\n parseCmd(e, t) {\n const r = (e === 20 || e === 28 || e === 21 || e === 29) && t >= 32 && t <= 47, n = (e === 23 || e === 31) && t >= 33 && t <= 35;\n if (!(r || n))\n return !1;\n const i = e === 20 || e === 21 || e === 23 ? 1 : 2, o = this.channels[i];\n return e === 20 || e === 21 || e === 28 || e === 29 ? t === 32 ? o.ccRCL() : t === 33 ? o.ccBS() : t === 34 ? o.ccAOF() : t === 35 ? o.ccAON() : t === 36 ? o.ccDER() : t === 37 ? o.ccRU(2) : t === 38 ? o.ccRU(3) : t === 39 ? o.ccRU(4) : t === 40 ? o.ccFON() : t === 41 ? o.ccRDC() : t === 42 ? o.ccTR() : t === 43 ? o.ccRTD() : t === 44 ? o.ccEDM() : t === 45 ? o.ccCR() : t === 46 ? o.ccENM() : t === 47 && o.ccEOC() : o.ccTO(t - 32), this.currentChannel = i, !0;\n }\n /**\n * Parse midrow styling command\n */\n parseMidrow(e, t) {\n let r = 0;\n if ((e === 17 || e === 25) && t >= 32 && t <= 47) {\n if (e === 17 ? r = 1 : r = 2, r !== this.currentChannel)\n return this.logger.log(0, \"Mismatch channel in midrow parsing\"), !1;\n const n = this.channels[r];\n return n ? (n.ccMIDROW(t), this.logger.log(3, () => \"MIDROW (\" + Ns([e, t]) + \")\"), !0) : !1;\n }\n return !1;\n }\n /**\n * Parse Preable Access Codes (Table 53).\n * @returns {Boolean} Tells if PAC found\n */\n parsePAC(e, t) {\n let r;\n const n = (e >= 17 && e <= 23 || e >= 25 && e <= 31) && t >= 64 && t <= 127, i = (e === 16 || e === 24) && t >= 64 && t <= 95;\n if (!(n || i))\n return !1;\n const o = e <= 23 ? 1 : 2;\n t >= 64 && t <= 95 ? r = o === 1 ? ww[e] : Iw[e] : r = o === 1 ? Aw[e] : _w[e];\n const a = this.channels[o];\n return a ? (a.setPAC(this.interpretPAC(r, t)), this.currentChannel = o, !0) : !1;\n }\n /**\n * Interpret the second byte of the pac, and return the information.\n * @returns pacData with style parameters\n */\n interpretPAC(e, t) {\n let r;\n const n = {\n color: null,\n italics: !1,\n indent: null,\n underline: !1,\n row: e\n };\n return t > 95 ? r = t - 96 : r = t - 64, n.underline = (r & 1) === 1, r <= 13 ? n.color = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\", \"white\"][Math.floor(r / 2)] : r <= 15 ? (n.italics = !0, n.color = \"white\") : n.indent = Math.floor((r - 16) / 2) * 4, n;\n }\n /**\n * Parse characters.\n * @returns An array with 1 to 2 codes corresponding to chars, if found. null otherwise.\n */\n parseChars(e, t) {\n let r, n = null, i = null;\n if (e >= 25 ? (r = 2, i = e - 8) : (r = 1, i = e), i >= 17 && i <= 19) {\n let o;\n i === 17 ? o = t + 80 : i === 18 ? o = t + 112 : o = t + 144, this.logger.log(2, () => \"Special char '\" + Gp(o) + \"' in channel \" + r), n = [o];\n } else e >= 32 && e <= 127 && (n = t === 0 ? [e] : [e, t]);\n return n && this.logger.log(3, () => \"Char codes = \" + Ns(n).join(\",\")), n;\n }\n /**\n * Parse extended background attributes as well as new foreground color black.\n * @returns True if background attributes are found\n */\n parseBackgroundAttributes(e, t) {\n const r = (e === 16 || e === 24) && t >= 32 && t <= 47, n = (e === 23 || e === 31) && t >= 45 && t <= 47;\n if (!(r || n))\n return !1;\n let i;\n const o = {};\n e === 16 || e === 24 ? (i = Math.floor((t - 32) / 2), o.background = Rw[i], t % 2 === 1 && (o.background = o.background + \"_semi\")) : t === 45 ? o.background = \"transparent\" : (o.foreground = \"black\", t === 47 && (o.underline = !0));\n const a = e <= 23 ? 1 : 2;\n return this.channels[a].setBkgData(o), !0;\n }\n /**\n * Reset state of parser and its channels.\n */\n reset() {\n for (let e = 0; e < Object.keys(this.channels).length; e++) {\n const t = this.channels[e];\n t && t.reset();\n }\n eo(null, null, this.cmdHistory);\n }\n /**\n * Trigger the generation of a cue, and the start of a new one if displayScreens are not empty.\n */\n cueSplitAtTime(e) {\n for (let t = 0; t < this.channels.length; t++) {\n const r = this.channels[t];\n r && r.cueSplitAtTime(e);\n }\n }\n}\nfunction eo(s, e, t) {\n t.a = s, t.b = e;\n}\nfunction Dw(s, e, t) {\n return t.a === s && t.b === e;\n}\nfunction Pw() {\n return {\n a: null,\n b: null\n };\n}\nvar Ou = (function() {\n if (ra != null && ra.VTTCue)\n return self.VTTCue;\n const s = [\"\", \"lr\", \"rl\"], e = [\"start\", \"middle\", \"end\", \"left\", \"right\"];\n function t(a, l) {\n if (typeof l != \"string\" || !Array.isArray(a))\n return !1;\n const c = l.toLowerCase();\n return ~a.indexOf(c) ? c : !1;\n }\n function r(a) {\n return t(s, a);\n }\n function n(a) {\n return t(e, a);\n }\n function i(a, ...l) {\n let c = 1;\n for (; c < arguments.length; c++) {\n const u = arguments[c];\n for (const d in u)\n a[d] = u[d];\n }\n return a;\n }\n function o(a, l, c) {\n const u = this, d = {\n enumerable: !0\n };\n u.hasBeenReset = !1;\n let h = \"\", f = !1, p = a, y = l, E = c, b = null, R = \"\", A = !0, F = \"auto\", M = \"start\", H = 50, K = \"middle\", j = 50, C = \"middle\";\n Object.defineProperty(u, \"id\", i({}, d, {\n get: function() {\n return h;\n },\n set: function(k) {\n h = \"\" + k;\n }\n })), Object.defineProperty(u, \"pauseOnExit\", i({}, d, {\n get: function() {\n return f;\n },\n set: function(k) {\n f = !!k;\n }\n })), Object.defineProperty(u, \"startTime\", i({}, d, {\n get: function() {\n return p;\n },\n set: function(k) {\n if (typeof k != \"number\")\n throw new TypeError(\"Start time must be set to a number.\");\n p = k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"endTime\", i({}, d, {\n get: function() {\n return y;\n },\n set: function(k) {\n if (typeof k != \"number\")\n throw new TypeError(\"End time must be set to a number.\");\n y = k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"text\", i({}, d, {\n get: function() {\n return E;\n },\n set: function(k) {\n E = \"\" + k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"region\", i({}, d, {\n get: function() {\n return b;\n },\n set: function(k) {\n b = k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"vertical\", i({}, d, {\n get: function() {\n return R;\n },\n set: function(k) {\n const $ = r(k);\n if ($ === !1)\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n R = $, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"snapToLines\", i({}, d, {\n get: function() {\n return A;\n },\n set: function(k) {\n A = !!k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"line\", i({}, d, {\n get: function() {\n return F;\n },\n set: function(k) {\n if (typeof k != \"number\" && k !== \"auto\")\n throw new SyntaxError(\"An invalid number or illegal string was specified.\");\n F = k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"lineAlign\", i({}, d, {\n get: function() {\n return M;\n },\n set: function(k) {\n const $ = n(k);\n if (!$)\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n M = $, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"position\", i({}, d, {\n get: function() {\n return H;\n },\n set: function(k) {\n if (k < 0 || k > 100)\n throw new Error(\"Position must be between 0 and 100.\");\n H = k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"positionAlign\", i({}, d, {\n get: function() {\n return K;\n },\n set: function(k) {\n const $ = n(k);\n if (!$)\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n K = $, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"size\", i({}, d, {\n get: function() {\n return j;\n },\n set: function(k) {\n if (k < 0 || k > 100)\n throw new Error(\"Size must be between 0 and 100.\");\n j = k, this.hasBeenReset = !0;\n }\n })), Object.defineProperty(u, \"align\", i({}, d, {\n get: function() {\n return C;\n },\n set: function(k) {\n const $ = n(k);\n if (!$)\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n C = $, this.hasBeenReset = !0;\n }\n })), u.displayState = void 0;\n }\n return o.prototype.getCueAsHTML = function() {\n return self.WebVTT.convertCueToDOMTree(self, this.text);\n }, o;\n})();\nclass Mw {\n decode(e, t) {\n if (!e)\n return \"\";\n if (typeof e != \"string\")\n throw new Error(\"Error - expected string data.\");\n return decodeURIComponent(encodeURIComponent(e));\n }\n}\nfunction jp(s) {\n function e(r, n, i, o) {\n return (r | 0) * 3600 + (n | 0) * 60 + (i | 0) + parseFloat(o || 0);\n }\n const t = s.match(/^(?:(\\d+):)?(\\d{2}):(\\d{2})(\\.\\d+)?/);\n return t ? parseFloat(t[2]) > 59 ? e(t[2], t[3], 0, t[4]) : e(t[1], t[2], t[3], t[4]) : null;\n}\nclass Ow {\n constructor() {\n this.values = /* @__PURE__ */ Object.create(null);\n }\n // Only accept the first assignment to any key.\n set(e, t) {\n !this.get(e) && t !== \"\" && (this.values[e] = t);\n }\n // Return the value for a key, or a default value.\n // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n // a number of possible default values as properties where 'defaultKey' is\n // the key of the property that will be chosen; otherwise it's assumed to be\n // a single value.\n get(e, t, r) {\n return r ? this.has(e) ? this.values[e] : t[r] : this.has(e) ? this.values[e] : t;\n }\n // Check whether we have a value for a key.\n has(e) {\n return e in this.values;\n }\n // Accept a setting if its one of the given alternatives.\n alt(e, t, r) {\n for (let n = 0; n < r.length; ++n)\n if (t === r[n]) {\n this.set(e, t);\n break;\n }\n }\n // Accept a setting if its a valid (signed) integer.\n integer(e, t) {\n /^-?\\d+$/.test(t) && this.set(e, parseInt(t, 10));\n }\n // Accept a setting if its a valid percentage.\n percent(e, t) {\n if (/^([\\d]{1,3})(\\.[\\d]*)?%$/.test(t)) {\n const r = parseFloat(t);\n if (r >= 0 && r <= 100)\n return this.set(e, r), !0;\n }\n return !1;\n }\n}\nfunction Kp(s, e, t, r) {\n const n = r ? s.split(r) : [s];\n for (const i in n) {\n if (typeof n[i] != \"string\")\n continue;\n const o = n[i].split(t);\n if (o.length !== 2)\n continue;\n const a = o[0], l = o[1];\n e(a, l);\n }\n}\nconst bc = new Ou(0, 0, \"\"), to = bc.align === \"middle\" ? \"middle\" : \"center\";\nfunction Bw(s, e, t) {\n const r = s;\n function n() {\n const a = jp(s);\n if (a === null)\n throw new Error(\"Malformed timestamp: \" + r);\n return s = s.replace(/^[^\\sa-zA-Z-]+/, \"\"), a;\n }\n function i(a, l) {\n const c = new Ow();\n Kp(a, function(h, f) {\n let p;\n switch (h) {\n case \"region\":\n for (let y = t.length - 1; y >= 0; y--)\n if (t[y].id === f) {\n c.set(h, t[y].region);\n break;\n }\n break;\n case \"vertical\":\n c.alt(h, f, [\"rl\", \"lr\"]);\n break;\n case \"line\":\n p = f.split(\",\"), c.integer(h, p[0]), c.percent(h, p[0]) && c.set(\"snapToLines\", !1), c.alt(h, p[0], [\"auto\"]), p.length === 2 && c.alt(\"lineAlign\", p[1], [\"start\", to, \"end\"]);\n break;\n case \"position\":\n p = f.split(\",\"), c.percent(h, p[0]), p.length === 2 && c.alt(\"positionAlign\", p[1], [\"start\", to, \"end\", \"line-left\", \"line-right\", \"auto\"]);\n break;\n case \"size\":\n c.percent(h, f);\n break;\n case \"align\":\n c.alt(h, f, [\"start\", to, \"end\", \"left\", \"right\"]);\n break;\n }\n }, /:/, /\\s/), l.region = c.get(\"region\", null), l.vertical = c.get(\"vertical\", \"\");\n let u = c.get(\"line\", \"auto\");\n u === \"auto\" && bc.line === -1 && (u = -1), l.line = u, l.lineAlign = c.get(\"lineAlign\", \"start\"), l.snapToLines = c.get(\"snapToLines\", !0), l.size = c.get(\"size\", 100), l.align = c.get(\"align\", to);\n let d = c.get(\"position\", \"auto\");\n d === \"auto\" && bc.position === 50 && (d = l.align === \"start\" || l.align === \"left\" ? 0 : l.align === \"end\" || l.align === \"right\" ? 100 : 50), l.position = d;\n }\n function o() {\n s = s.replace(/^\\s+/, \"\");\n }\n if (o(), e.startTime = n(), o(), s.slice(0, 3) !== \"-->\")\n throw new Error(\"Malformed time stamp (time stamps must be separated by '-->'): \" + r);\n s = s.slice(3), o(), e.endTime = n(), o(), i(s, e);\n}\nfunction Hp(s) {\n return s.replace(/<br(?: \\/)?>/gi, `\n`);\n}\nclass Fw {\n constructor() {\n this.state = \"INITIAL\", this.buffer = \"\", this.decoder = new Mw(), this.regionList = [], this.cue = null, this.oncue = void 0, this.onparsingerror = void 0, this.onflush = void 0;\n }\n parse(e) {\n const t = this;\n e && (t.buffer += t.decoder.decode(e, {\n stream: !0\n }));\n function r() {\n let i = t.buffer, o = 0;\n for (i = Hp(i); o < i.length && i[o] !== \"\\r\" && i[o] !== `\n`; )\n ++o;\n const a = i.slice(0, o);\n return i[o] === \"\\r\" && ++o, i[o] === `\n` && ++o, t.buffer = i.slice(o), a;\n }\n function n(i) {\n Kp(i, function(o, a) {\n }, /:/);\n }\n try {\n let i = \"\";\n if (t.state === \"INITIAL\") {\n if (!/\\r\\n|\\n/.test(t.buffer))\n return this;\n i = r();\n const a = i.match(/^()?WEBVTT([ \\t].*)?$/);\n if (!(a != null && a[0]))\n throw new Error(\"Malformed WebVTT signature.\");\n t.state = \"HEADER\";\n }\n let o = !1;\n for (; t.buffer; ) {\n if (!/\\r\\n|\\n/.test(t.buffer))\n return this;\n switch (o ? o = !1 : i = r(), t.state) {\n case \"HEADER\":\n /:/.test(i) ? n(i) : i || (t.state = \"ID\");\n continue;\n case \"NOTE\":\n i || (t.state = \"ID\");\n continue;\n case \"ID\":\n if (/^NOTE($|[ \\t])/.test(i)) {\n t.state = \"NOTE\";\n break;\n }\n if (!i)\n continue;\n if (t.cue = new Ou(0, 0, \"\"), t.state = \"CUE\", i.indexOf(\"-->\") === -1) {\n t.cue.id = i;\n continue;\n }\n // Process line as start of a cue.\n /* falls through */\n case \"CUE\":\n if (!t.cue) {\n t.state = \"BADCUE\";\n continue;\n }\n try {\n Bw(i, t.cue, t.regionList);\n } catch {\n t.cue = null, t.state = \"BADCUE\";\n continue;\n }\n t.state = \"CUETEXT\";\n continue;\n case \"CUETEXT\":\n {\n const a = i.indexOf(\"-->\") !== -1;\n if (!i || a && (o = !0)) {\n t.oncue && t.cue && t.oncue(t.cue), t.cue = null, t.state = \"ID\";\n continue;\n }\n if (t.cue === null)\n continue;\n t.cue.text && (t.cue.text += `\n`), t.cue.text += i;\n }\n continue;\n case \"BADCUE\":\n i || (t.state = \"ID\");\n }\n }\n } catch {\n t.state === \"CUETEXT\" && t.cue && t.oncue && t.oncue(t.cue), t.cue = null, t.state = t.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n }\n return this;\n }\n flush() {\n const e = this;\n try {\n if ((e.cue || e.state === \"HEADER\") && (e.buffer += `\n\n`, e.parse()), e.state === \"INITIAL\" || e.state === \"BADWEBVTT\")\n throw new Error(\"Malformed WebVTT signature.\");\n } catch (t) {\n e.onparsingerror && e.onparsingerror(t);\n }\n return e.onflush && e.onflush(), this;\n }\n}\nconst Nw = /\\r\\n|\\n\\r|\\n|\\r/g, Al = function(e, t, r = 0) {\n return e.slice(r, r + t.length) === t;\n}, Uw = function(e) {\n let t = parseInt(e.slice(-3));\n const r = parseInt(e.slice(-6, -4)), n = parseInt(e.slice(-9, -7)), i = e.length > 9 ? parseInt(e.substring(0, e.indexOf(\":\"))) : 0;\n if (!ue(t) || !ue(r) || !ue(n) || !ue(i))\n throw Error(`Malformed X-TIMESTAMP-MAP: Local:${e}`);\n return t += 1e3 * r, t += 60 * 1e3 * n, t += 3600 * 1e3 * i, t;\n};\nfunction Bu(s, e, t) {\n return Xn(s.toString()) + Xn(e.toString()) + Xn(t);\n}\nconst $w = function(e, t, r) {\n let n = e[t], i = e[n.prevCC];\n if (!i || !i.new && n.new) {\n e.ccOffset = e.presentationOffset = n.start, n.new = !1;\n return;\n }\n for (; (o = i) != null && o.new; ) {\n var o;\n e.ccOffset += n.start - i.start, n.new = !1, n = i, i = e[n.prevCC];\n }\n e.presentationOffset = r;\n};\nfunction Gw(s, e, t, r, n, i, o) {\n const a = new Fw(), l = Tr(new Uint8Array(s)).trim().replace(Nw, `\n`).split(`\n`), c = [], u = e ? WT(e.baseTime, e.timescale) : 0;\n let d = \"00:00.000\", h = 0, f = 0, p, y = !0;\n a.oncue = function(E) {\n const b = t[r];\n let R = t.ccOffset;\n const A = (h - u) / 9e4;\n if (b != null && b.new && (f !== void 0 ? R = t.ccOffset = b.start : $w(t, r, A)), A) {\n if (!e) {\n p = new Error(\"Missing initPTS for VTT MPEGTS\");\n return;\n }\n R = A - t.presentationOffset;\n }\n const F = E.endTime - E.startTime, M = Ar((E.startTime + R - f) * 9e4, n * 9e4) / 9e4;\n E.startTime = Math.max(M, 0), E.endTime = Math.max(M + F, 0);\n const H = E.text.trim();\n E.text = decodeURIComponent(encodeURIComponent(H)), E.id || (E.id = Bu(E.startTime, E.endTime, H)), E.endTime > 0 && c.push(E);\n }, a.onparsingerror = function(E) {\n p = E;\n }, a.onflush = function() {\n if (p) {\n o(p);\n return;\n }\n i(c);\n }, l.forEach((E) => {\n if (y)\n if (Al(E, \"X-TIMESTAMP-MAP=\")) {\n y = !1, E.slice(16).split(\",\").forEach((b) => {\n Al(b, \"LOCAL:\") ? d = b.slice(6) : Al(b, \"MPEGTS:\") && (h = parseInt(b.slice(7)));\n });\n try {\n f = Uw(d) / 1e3;\n } catch (b) {\n p = b;\n }\n return;\n } else E === \"\" && (y = !1);\n a.parse(E + `\n`);\n }), a.flush();\n}\nconst Il = \"stpp.ttml.im1t\", qp = /^(\\d{2,}):(\\d{2}):(\\d{2}):(\\d{2})\\.?(\\d+)?$/, Wp = /^(\\d*(?:\\.\\d*)?)(h|m|s|ms|f|t)$/, Vw = {\n left: \"start\",\n center: \"center\",\n right: \"end\",\n start: \"start\",\n end: \"end\"\n};\nfunction rf(s, e, t, r) {\n const n = Ge(new Uint8Array(s), [\"mdat\"]);\n if (n.length === 0) {\n r(new Error(\"Could not parse IMSC1 mdat\"));\n return;\n }\n const i = n.map((a) => Tr(a)), o = qT(e.baseTime, 1, e.timescale);\n try {\n i.forEach((a) => t(jw(a, o)));\n } catch (a) {\n r(a);\n }\n}\nfunction jw(s, e) {\n const n = new DOMParser().parseFromString(s, \"text/xml\").getElementsByTagName(\"tt\")[0];\n if (!n)\n throw new Error(\"Invalid ttml\");\n const i = {\n frameRate: 30,\n subFrameRate: 1,\n frameRateMultiplier: 0,\n tickRate: 0\n }, o = Object.keys(i).reduce((d, h) => (d[h] = n.getAttribute(`ttp:${h}`) || i[h], d), {}), a = n.getAttribute(\"xml:space\") !== \"preserve\", l = sf(_l(n, \"styling\", \"style\")), c = sf(_l(n, \"layout\", \"region\")), u = _l(n, \"body\", \"[begin]\");\n return [].map.call(u, (d) => {\n const h = zp(d, a);\n if (!h || !d.hasAttribute(\"begin\"))\n return null;\n const f = Ll(d.getAttribute(\"begin\"), o), p = Ll(d.getAttribute(\"dur\"), o);\n let y = Ll(d.getAttribute(\"end\"), o);\n if (f === null)\n throw nf(d);\n if (y === null) {\n if (p === null)\n throw nf(d);\n y = f + p;\n }\n const E = new Ou(f - e, y - e, h);\n E.id = Bu(E.startTime, E.endTime, E.text);\n const b = c[d.getAttribute(\"region\")], R = l[d.getAttribute(\"style\")], A = Kw(b, R, l), {\n textAlign: F\n } = A;\n if (F) {\n const M = Vw[F];\n M && (E.lineAlign = M), E.align = F;\n }\n return nt(E, A), E;\n }).filter((d) => d !== null);\n}\nfunction _l(s, e, t) {\n const r = s.getElementsByTagName(e)[0];\n return r ? [].slice.call(r.querySelectorAll(t)) : [];\n}\nfunction sf(s) {\n return s.reduce((e, t) => {\n const r = t.getAttribute(\"xml:id\");\n return r && (e[r] = t), e;\n }, {});\n}\nfunction zp(s, e) {\n return [].slice.call(s.childNodes).reduce((t, r, n) => {\n var i;\n return r.nodeName === \"br\" && n ? t + `\n` : (i = r.childNodes) != null && i.length ? zp(r, e) : e ? t + r.textContent.trim().replace(/\\s+/g, \" \") : t + r.textContent;\n }, \"\");\n}\nfunction Kw(s, e, t) {\n const r = \"http://www.w3.org/ns/ttml#styling\";\n let n = null;\n const i = [\n \"displayAlign\",\n \"textAlign\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\"\n // 'fontWeight',\n // 'lineHeight',\n // 'wrapOption',\n // 'fontStyle',\n // 'direction',\n // 'writingMode'\n ], o = s != null && s.hasAttribute(\"style\") ? s.getAttribute(\"style\") : null;\n return o && t.hasOwnProperty(o) && (n = t[o]), i.reduce((a, l) => {\n const c = Rl(e, r, l) || Rl(s, r, l) || Rl(n, r, l);\n return c && (a[l] = c), a;\n }, {});\n}\nfunction Rl(s, e, t) {\n return s && s.hasAttributeNS(e, t) ? s.getAttributeNS(e, t) : null;\n}\nfunction nf(s) {\n return new Error(`Could not parse ttml timestamp ${s}`);\n}\nfunction Ll(s, e) {\n if (!s)\n return null;\n let t = jp(s);\n return t === null && (qp.test(s) ? t = Hw(s, e) : Wp.test(s) && (t = qw(s, e))), t;\n}\nfunction Hw(s, e) {\n const t = qp.exec(s), r = (t[4] | 0) + (t[5] | 0) / e.subFrameRate;\n return (t[1] | 0) * 3600 + (t[2] | 0) * 60 + (t[3] | 0) + r / e.frameRate;\n}\nfunction qw(s, e) {\n const t = Wp.exec(s), r = Number(t[1]);\n switch (t[2]) {\n case \"h\":\n return r * 3600;\n case \"m\":\n return r * 60;\n case \"ms\":\n return r * 1e3;\n case \"f\":\n return r / e.frameRate;\n case \"t\":\n return r / e.tickRate;\n }\n return r;\n}\nclass ro {\n constructor(e, t) {\n this.timelineController = void 0, this.cueRanges = [], this.trackName = void 0, this.startTime = null, this.endTime = null, this.screen = null, this.timelineController = e, this.trackName = t;\n }\n dispatchCue() {\n this.startTime !== null && (this.timelineController.addCues(this.trackName, this.startTime, this.endTime, this.screen, this.cueRanges), this.startTime = null);\n }\n newCue(e, t, r) {\n (this.startTime === null || this.startTime > e) && (this.startTime = e), this.endTime = t, this.screen = r, this.timelineController.createCaptionsTrack(this.trackName);\n }\n reset() {\n this.cueRanges = [], this.startTime = null;\n }\n}\nclass Ww {\n constructor(e) {\n this.hls = void 0, this.media = null, this.config = void 0, this.enabled = !0, this.Cues = void 0, this.textTracks = [], this.tracks = [], this.initPTS = [], this.unparsedVttFrags = [], this.captionsTracks = {}, this.nonNativeCaptionsTracks = {}, this.cea608Parser1 = void 0, this.cea608Parser2 = void 0, this.lastCc = -1, this.lastSn = -1, this.lastPartIndex = -1, this.prevCC = -1, this.vttCCs = af(), this.captionsProperties = void 0, this.hls = e, this.config = e.config, this.Cues = e.config.cueHandler, this.captionsProperties = {\n textTrack1: {\n label: this.config.captionsTextTrack1Label,\n languageCode: this.config.captionsTextTrack1LanguageCode\n },\n textTrack2: {\n label: this.config.captionsTextTrack2Label,\n languageCode: this.config.captionsTextTrack2LanguageCode\n },\n textTrack3: {\n label: this.config.captionsTextTrack3Label,\n languageCode: this.config.captionsTextTrack3LanguageCode\n },\n textTrack4: {\n label: this.config.captionsTextTrack4Label,\n languageCode: this.config.captionsTextTrack4LanguageCode\n }\n }, e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.on(I.FRAG_LOADING, this.onFragLoading, this), e.on(I.FRAG_LOADED, this.onFragLoaded, this), e.on(I.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this), e.on(I.FRAG_DECRYPTED, this.onFragDecrypted, this), e.on(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.on(I.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this);\n }\n destroy() {\n const {\n hls: e\n } = this;\n e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.off(I.FRAG_LOADING, this.onFragLoading, this), e.off(I.FRAG_LOADED, this.onFragLoaded, this), e.off(I.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this), e.off(I.FRAG_DECRYPTED, this.onFragDecrypted, this), e.off(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.off(I.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), this.hls = this.config = this.media = null, this.cea608Parser1 = this.cea608Parser2 = void 0;\n }\n initCea608Parsers() {\n const e = new ro(this, \"textTrack1\"), t = new ro(this, \"textTrack2\"), r = new ro(this, \"textTrack3\"), n = new ro(this, \"textTrack4\");\n this.cea608Parser1 = new tf(1, e, t), this.cea608Parser2 = new tf(3, r, n);\n }\n addCues(e, t, r, n, i) {\n let o = !1;\n for (let a = i.length; a--; ) {\n const l = i[a], c = zw(l[0], l[1], t, r);\n if (c >= 0 && (l[0] = Math.min(l[0], t), l[1] = Math.max(l[1], r), o = !0, c / (r - t) > 0.5))\n return;\n }\n if (o || i.push([t, r]), this.config.renderTextTracksNatively) {\n const a = this.captionsTracks[e];\n this.Cues.newCue(a, t, r, n);\n } else {\n const a = this.Cues.newCue(null, t, r, n);\n this.hls.trigger(I.CUES_PARSED, {\n type: \"captions\",\n cues: a,\n track: e\n });\n }\n }\n // Triggered when an initial PTS is found; used for synchronisation of WebVTT.\n onInitPtsFound(e, {\n frag: t,\n id: r,\n initPTS: n,\n timescale: i,\n trackId: o\n }) {\n const {\n unparsedVttFrags: a\n } = this;\n r === pe.MAIN && (this.initPTS[t.cc] = {\n baseTime: n,\n timescale: i,\n trackId: o\n }), a.length && (this.unparsedVttFrags = [], a.forEach((l) => {\n this.initPTS[l.frag.cc] ? this.onFragLoaded(I.FRAG_LOADED, l) : this.hls.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n success: !1,\n frag: l.frag,\n error: new Error(\"Subtitle discontinuity domain does not match main\")\n });\n }));\n }\n getExistingTrack(e, t) {\n const {\n media: r\n } = this;\n if (r)\n for (let n = 0; n < r.textTracks.length; n++) {\n const i = r.textTracks[n];\n if (of(i, {\n name: e,\n lang: t,\n characteristics: \"transcribes-spoken-dialog,describes-music-and-sound\"\n }))\n return i;\n }\n return null;\n }\n createCaptionsTrack(e) {\n this.config.renderTextTracksNatively ? this.createNativeTrack(e) : this.createNonNativeTrack(e);\n }\n createNativeTrack(e) {\n if (this.captionsTracks[e])\n return;\n const {\n captionsProperties: t,\n captionsTracks: r,\n media: n\n } = this, {\n label: i,\n languageCode: o\n } = t[e], a = this.getExistingTrack(i, o);\n if (a)\n r[e] = a, Sn(r[e]), Np(r[e], n);\n else {\n const l = this.createTextTrack(\"captions\", i, o);\n l && (l[e] = !0, r[e] = l);\n }\n }\n createNonNativeTrack(e) {\n if (this.nonNativeCaptionsTracks[e])\n return;\n const t = this.captionsProperties[e];\n if (!t)\n return;\n const r = t.label, n = {\n _id: e,\n label: r,\n kind: \"captions\",\n default: t.media ? !!t.media.default : !1,\n closedCaptions: t.media\n };\n this.nonNativeCaptionsTracks[e] = n, this.hls.trigger(I.NON_NATIVE_TEXT_TRACKS_FOUND, {\n tracks: [n]\n });\n }\n createTextTrack(e, t, r) {\n const n = this.media;\n if (n)\n return n.addTextTrack(e, t, r);\n }\n onMediaAttaching(e, t) {\n this.media = t.media, t.mediaSource || this._cleanTracks();\n }\n onMediaDetaching(e, t) {\n const r = !!t.transferMedia;\n if (this.media = null, r)\n return;\n const {\n captionsTracks: n\n } = this;\n Object.keys(n).forEach((i) => {\n Sn(n[i]), delete n[i];\n }), this.nonNativeCaptionsTracks = {};\n }\n onManifestLoading() {\n this.lastCc = -1, this.lastSn = -1, this.lastPartIndex = -1, this.prevCC = -1, this.vttCCs = af(), this._cleanTracks(), this.tracks = [], this.captionsTracks = {}, this.nonNativeCaptionsTracks = {}, this.textTracks = [], this.unparsedVttFrags = [], this.initPTS = [], this.cea608Parser1 && this.cea608Parser2 && (this.cea608Parser1.reset(), this.cea608Parser2.reset());\n }\n _cleanTracks() {\n const {\n media: e\n } = this;\n if (!e)\n return;\n const t = e.textTracks;\n if (t)\n for (let r = 0; r < t.length; r++)\n Sn(t[r]);\n }\n onSubtitleTracksUpdated(e, t) {\n const r = t.subtitleTracks || [], n = r.some((i) => i.textCodec === Il);\n if (this.config.enableWebVTT || n && this.config.enableIMSC1) {\n if (Ap(this.tracks, r)) {\n this.tracks = r;\n return;\n }\n if (this.textTracks = [], this.tracks = r, this.config.renderTextTracksNatively) {\n const o = this.media, a = o ? Eo(o.textTracks) : null;\n if (this.tracks.forEach((l, c) => {\n let u;\n if (a) {\n let d = null;\n for (let h = 0; h < a.length; h++)\n if (a[h] && of(a[h], l)) {\n d = a[h], a[h] = null;\n break;\n }\n d && (u = d);\n }\n if (u)\n Sn(u);\n else {\n const d = Yp(l);\n u = this.createTextTrack(d, l.name, l.lang), u && (u.mode = \"disabled\");\n }\n u && this.textTracks.push(u);\n }), a != null && a.length) {\n const l = a.filter((c) => c !== null).map((c) => c.label);\n l.length && this.hls.logger.warn(`Media element contains unused subtitle tracks: ${l.join(\", \")}. Replace media element for each source to clear TextTracks and captions menu.`);\n }\n } else if (this.tracks.length) {\n const o = this.tracks.map((a) => ({\n label: a.name,\n kind: a.type.toLowerCase(),\n default: a.default,\n subtitleTrack: a\n }));\n this.hls.trigger(I.NON_NATIVE_TEXT_TRACKS_FOUND, {\n tracks: o\n });\n }\n }\n }\n onManifestLoaded(e, t) {\n this.config.enableCEA708Captions && t.captions && t.captions.forEach((r) => {\n const n = /(?:CC|SERVICE)([1-4])/.exec(r.instreamId);\n if (!n)\n return;\n const i = `textTrack${n[1]}`, o = this.captionsProperties[i];\n o && (o.label = r.name, r.lang && (o.languageCode = r.lang), o.media = r);\n });\n }\n closedCaptionsForLevel(e) {\n const t = this.hls.levels[e.level];\n return t == null ? void 0 : t.attrs[\"CLOSED-CAPTIONS\"];\n }\n onFragLoading(e, t) {\n if (this.enabled && t.frag.type === pe.MAIN) {\n var r, n;\n const {\n cea608Parser1: i,\n cea608Parser2: o,\n lastSn: a\n } = this, {\n cc: l,\n sn: c\n } = t.frag, u = (r = (n = t.part) == null ? void 0 : n.index) != null ? r : -1;\n i && o && (c !== a + 1 || c === a && u !== this.lastPartIndex + 1 || l !== this.lastCc) && (i.reset(), o.reset()), this.lastCc = l, this.lastSn = c, this.lastPartIndex = u;\n }\n }\n onFragLoaded(e, t) {\n const {\n frag: r,\n payload: n\n } = t;\n if (r.type === pe.SUBTITLE)\n if (n.byteLength) {\n const i = r.decryptdata, o = \"stats\" in t;\n if (i == null || !i.encrypted || o) {\n const a = this.tracks[r.level], l = this.vttCCs;\n l[r.cc] || (l[r.cc] = {\n start: r.start,\n prevCC: this.prevCC,\n new: !0\n }, this.prevCC = r.cc), a && a.textCodec === Il ? this._parseIMSC1(r, n) : this._parseVTTs(t);\n }\n } else\n this.hls.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n success: !1,\n frag: r,\n error: new Error(\"Empty subtitle payload\")\n });\n }\n _parseIMSC1(e, t) {\n const r = this.hls;\n rf(t, this.initPTS[e.cc], (n) => {\n this._appendCues(n, e.level), r.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n success: !0,\n frag: e\n });\n }, (n) => {\n r.logger.log(`Failed to parse IMSC1: ${n}`), r.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n success: !1,\n frag: e,\n error: n\n });\n });\n }\n _parseVTTs(e) {\n var t;\n const {\n frag: r,\n payload: n\n } = e, {\n initPTS: i,\n unparsedVttFrags: o\n } = this, a = i.length - 1;\n if (!i[r.cc] && a === -1) {\n o.push(e);\n return;\n }\n const l = this.hls, c = (t = r.initSegment) != null && t.data ? _r(r.initSegment.data, new Uint8Array(n)).buffer : n;\n Gw(c, this.initPTS[r.cc], this.vttCCs, r.cc, r.start, (u) => {\n this._appendCues(u, r.level), l.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n success: !0,\n frag: r\n });\n }, (u) => {\n const d = u.message === \"Missing initPTS for VTT MPEGTS\";\n d ? o.push(e) : this._fallbackToIMSC1(r, n), l.logger.log(`Failed to parse VTT cue: ${u}`), !(d && a > r.cc) && l.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n success: !1,\n frag: r,\n error: u\n });\n });\n }\n _fallbackToIMSC1(e, t) {\n const r = this.tracks[e.level];\n r.textCodec || rf(t, this.initPTS[e.cc], () => {\n r.textCodec = Il, this._parseIMSC1(e, t);\n }, () => {\n r.textCodec = \"wvtt\";\n });\n }\n _appendCues(e, t) {\n const r = this.hls;\n if (this.config.renderTextTracksNatively) {\n const n = this.textTracks[t];\n if (!n || n.mode === \"disabled\")\n return;\n e.forEach((i) => Up(n, i));\n } else {\n const n = this.tracks[t];\n if (!n)\n return;\n const i = n.default ? \"default\" : \"subtitles\" + t;\n r.trigger(I.CUES_PARSED, {\n type: \"subtitles\",\n cues: e,\n track: i\n });\n }\n }\n onFragDecrypted(e, t) {\n const {\n frag: r\n } = t;\n r.type === pe.SUBTITLE && this.onFragLoaded(I.FRAG_LOADED, t);\n }\n onSubtitleTracksCleared() {\n this.tracks = [], this.captionsTracks = {};\n }\n onFragParsingUserdata(e, t) {\n if (!this.enabled || !this.config.enableCEA708Captions)\n return;\n const {\n frag: r,\n samples: n\n } = t;\n if (!(r.type === pe.MAIN && this.closedCaptionsForLevel(r) === \"NONE\"))\n for (let i = 0; i < n.length; i++) {\n const o = n[i].bytes;\n if (o) {\n this.cea608Parser1 || this.initCea608Parsers();\n const a = this.extractCea608Data(o);\n this.cea608Parser1.addData(n[i].pts, a[0]), this.cea608Parser2.addData(n[i].pts, a[1]);\n }\n }\n }\n onBufferFlushing(e, {\n startOffset: t,\n endOffset: r,\n endOffsetSubtitles: n,\n type: i\n }) {\n const {\n media: o\n } = this;\n if (!(!o || o.currentTime < r)) {\n if (!i || i === \"video\") {\n const {\n captionsTracks: a\n } = this;\n Object.keys(a).forEach((l) => Sc(a[l], t, r));\n }\n if (this.config.renderTextTracksNatively && t === 0 && n !== void 0) {\n const {\n textTracks: a\n } = this;\n Object.keys(a).forEach((l) => Sc(a[l], t, n));\n }\n }\n }\n extractCea608Data(e) {\n const t = [[], []], r = e[0] & 31;\n let n = 2;\n for (let i = 0; i < r; i++) {\n const o = e[n++], a = 127 & e[n++], l = 127 & e[n++];\n if (a === 0 && l === 0)\n continue;\n if ((4 & o) !== 0) {\n const u = 3 & o;\n (u === 0 || u === 1) && (t[u].push(a), t[u].push(l));\n }\n }\n return t;\n }\n}\nfunction Yp(s) {\n return s.characteristics && /transcribes-spoken-dialog/gi.test(s.characteristics) && /describes-music-and-sound/gi.test(s.characteristics) ? \"captions\" : \"subtitles\";\n}\nfunction of(s, e) {\n return !!s && s.kind === Yp(e) && yc(e, s);\n}\nfunction zw(s, e, t, r) {\n return Math.min(e, r) - Math.max(s, t);\n}\nfunction af() {\n return {\n ccOffset: 0,\n presentationOffset: 0,\n 0: {\n start: 0,\n prevCC: -1,\n new: !0\n }\n };\n}\nconst Yw = /\\s/, Zw = {\n newCue(s, e, t, r) {\n const n = [];\n let i, o, a, l, c;\n const u = self.VTTCue || self.TextTrackCue;\n for (let h = 0; h < r.rows.length; h++)\n if (i = r.rows[h], a = !0, l = 0, c = \"\", !i.isEmpty()) {\n var d;\n for (let y = 0; y < i.chars.length; y++)\n Yw.test(i.chars[y].uchar) && a ? l++ : (c += i.chars[y].uchar, a = !1);\n i.cueStartTime = e, e === t && (t += 1e-4), l >= 16 ? l-- : l++;\n const f = Hp(c.trim()), p = Bu(e, t, f);\n s != null && (d = s.cues) != null && d.getCueById(p) || (o = new u(e, t, f), o.id = p, o.line = h + 1, o.align = \"left\", o.position = 10 + Math.min(80, Math.floor(l * 8 / 32) * 10), n.push(o));\n }\n return s && n.length && (n.sort((h, f) => h.line === \"auto\" || f.line === \"auto\" ? 0 : h.line > 8 && f.line > 8 ? f.line - h.line : h.line - f.line), n.forEach((h) => Up(s, h))), n;\n }\n};\nfunction Xw() {\n if (\n // @ts-ignore\n self.fetch && self.AbortController && self.ReadableStream && self.Request\n )\n try {\n return new self.ReadableStream({}), !0;\n } catch {\n }\n return !1;\n}\nconst Jw = /(\\d+)-(\\d+)\\/(\\d+)/;\nclass lf {\n constructor(e) {\n this.fetchSetup = void 0, this.requestTimeout = void 0, this.request = null, this.response = null, this.controller = void 0, this.context = null, this.config = null, this.callbacks = null, this.stats = void 0, this.loader = null, this.fetchSetup = e.fetchSetup || rA, this.controller = new self.AbortController(), this.stats = new fu();\n }\n destroy() {\n this.loader = this.callbacks = this.context = this.config = this.request = null, this.abortInternal(), this.response = null, this.fetchSetup = this.controller = this.stats = null;\n }\n abortInternal() {\n this.controller && !this.stats.loading.end && (this.stats.aborted = !0, this.controller.abort());\n }\n abort() {\n var e;\n this.abortInternal(), (e = this.callbacks) != null && e.onAbort && this.callbacks.onAbort(this.stats, this.context, this.response);\n }\n load(e, t, r) {\n const n = this.stats;\n if (n.loading.start)\n throw new Error(\"Loader can only be used once.\");\n n.loading.start = self.performance.now();\n const i = Qw(e, this.controller.signal), o = e.responseType === \"arraybuffer\", a = o ? \"byteLength\" : \"length\", {\n maxTimeToFirstByteMs: l,\n maxLoadTimeMs: c\n } = t.loadPolicy;\n this.context = e, this.config = t, this.callbacks = r, this.request = this.fetchSetup(e, i), self.clearTimeout(this.requestTimeout), t.timeout = l && ue(l) ? l : c, this.requestTimeout = self.setTimeout(() => {\n this.callbacks && (this.abortInternal(), this.callbacks.onTimeout(n, e, this.response));\n }, t.timeout), (xi(this.request) ? this.request.then(self.fetch) : self.fetch(this.request)).then((d) => {\n var h;\n this.response = this.loader = d;\n const f = Math.max(self.performance.now(), n.loading.start);\n if (self.clearTimeout(this.requestTimeout), t.timeout = c, this.requestTimeout = self.setTimeout(() => {\n this.callbacks && (this.abortInternal(), this.callbacks.onTimeout(n, e, this.response));\n }, c - (f - n.loading.start)), !d.ok) {\n const {\n status: y,\n statusText: E\n } = d;\n throw new sA(E || \"fetch, bad network response\", y, d);\n }\n n.loading.first = f, n.total = tA(d.headers) || n.total;\n const p = (h = this.callbacks) == null ? void 0 : h.onProgress;\n return p && ue(t.highWaterMark) ? this.loadProgressively(d, n, e, t.highWaterMark, p) : o ? d.arrayBuffer() : e.responseType === \"json\" ? d.json() : d.text();\n }).then((d) => {\n var h, f;\n const p = this.response;\n if (!p)\n throw new Error(\"loader destroyed\");\n self.clearTimeout(this.requestTimeout), n.loading.end = Math.max(self.performance.now(), n.loading.first);\n const y = d[a];\n y && (n.loaded = n.total = y);\n const E = {\n url: p.url,\n data: d,\n code: p.status\n }, b = (h = this.callbacks) == null ? void 0 : h.onProgress;\n b && !ue(t.highWaterMark) && b(n, e, d, p), (f = this.callbacks) == null || f.onSuccess(E, n, e, p);\n }).catch((d) => {\n var h;\n if (self.clearTimeout(this.requestTimeout), n.aborted)\n return;\n const f = d && d.code || 0, p = d ? d.message : null;\n (h = this.callbacks) == null || h.onError({\n code: f,\n text: p\n }, e, d ? d.details : null, n);\n });\n }\n getCacheAge() {\n let e = null;\n if (this.response) {\n const t = this.response.headers.get(\"age\");\n e = t ? parseFloat(t) : null;\n }\n return e;\n }\n getResponseHeader(e) {\n return this.response ? this.response.headers.get(e) : null;\n }\n loadProgressively(e, t, r, n = 0, i) {\n const o = new ip(), a = e.body.getReader(), l = () => a.read().then((c) => {\n if (c.done)\n return o.dataLength && i(t, r, o.flush().buffer, e), Promise.resolve(new ArrayBuffer(0));\n const u = c.value, d = u.length;\n return t.loaded += d, d < n || o.dataLength ? (o.push(u), o.dataLength >= n && i(t, r, o.flush().buffer, e)) : i(t, r, u.buffer, e), l();\n }).catch(() => Promise.reject());\n return l();\n }\n}\nfunction Qw(s, e) {\n const t = {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"same-origin\",\n signal: e,\n headers: new self.Headers(nt({}, s.headers))\n };\n return s.rangeEnd && t.headers.set(\"Range\", \"bytes=\" + s.rangeStart + \"-\" + String(s.rangeEnd - 1)), t;\n}\nfunction eA(s) {\n const e = Jw.exec(s);\n if (e)\n return parseInt(e[2]) - parseInt(e[1]) + 1;\n}\nfunction tA(s) {\n const e = s.get(\"Content-Range\");\n if (e) {\n const r = eA(e);\n if (ue(r))\n return r;\n }\n const t = s.get(\"Content-Length\");\n if (t)\n return parseInt(t);\n}\nfunction rA(s, e) {\n return new self.Request(s.url, e);\n}\nclass sA extends Error {\n constructor(e, t, r) {\n super(e), this.code = void 0, this.details = void 0, this.code = t, this.details = r;\n }\n}\nconst nA = /^age:\\s*[\\d.]+\\s*$/im;\nclass Zp {\n constructor(e) {\n this.xhrSetup = void 0, this.requestTimeout = void 0, this.retryTimeout = void 0, this.retryDelay = void 0, this.config = null, this.callbacks = null, this.context = null, this.loader = null, this.stats = void 0, this.xhrSetup = e && e.xhrSetup || null, this.stats = new fu(), this.retryDelay = 0;\n }\n destroy() {\n this.callbacks = null, this.abortInternal(), this.loader = null, this.config = null, this.context = null, this.xhrSetup = null;\n }\n abortInternal() {\n const e = this.loader;\n self.clearTimeout(this.requestTimeout), self.clearTimeout(this.retryTimeout), e && (e.onreadystatechange = null, e.onprogress = null, e.readyState !== 4 && (this.stats.aborted = !0, e.abort()));\n }\n abort() {\n var e;\n this.abortInternal(), (e = this.callbacks) != null && e.onAbort && this.callbacks.onAbort(this.stats, this.context, this.loader);\n }\n load(e, t, r) {\n if (this.stats.loading.start)\n throw new Error(\"Loader can only be used once.\");\n this.stats.loading.start = self.performance.now(), this.context = e, this.config = t, this.callbacks = r, this.loadInternal();\n }\n loadInternal() {\n const {\n config: e,\n context: t\n } = this;\n if (!e || !t)\n return;\n const r = this.loader = new self.XMLHttpRequest(), n = this.stats;\n n.loading.first = 0, n.loaded = 0, n.aborted = !1;\n const i = this.xhrSetup;\n i ? Promise.resolve().then(() => {\n if (!(this.loader !== r || this.stats.aborted))\n return i(r, t.url);\n }).catch((o) => {\n if (!(this.loader !== r || this.stats.aborted))\n return r.open(\"GET\", t.url, !0), i(r, t.url);\n }).then(() => {\n this.loader !== r || this.stats.aborted || this.openAndSendXhr(r, t, e);\n }).catch((o) => {\n var a;\n (a = this.callbacks) == null || a.onError({\n code: r.status,\n text: o.message\n }, t, r, n);\n }) : this.openAndSendXhr(r, t, e);\n }\n openAndSendXhr(e, t, r) {\n e.readyState || e.open(\"GET\", t.url, !0);\n const n = t.headers, {\n maxTimeToFirstByteMs: i,\n maxLoadTimeMs: o\n } = r.loadPolicy;\n if (n)\n for (const a in n)\n e.setRequestHeader(a, n[a]);\n t.rangeEnd && e.setRequestHeader(\"Range\", \"bytes=\" + t.rangeStart + \"-\" + (t.rangeEnd - 1)), e.onreadystatechange = this.readystatechange.bind(this), e.onprogress = this.loadprogress.bind(this), e.responseType = t.responseType, self.clearTimeout(this.requestTimeout), r.timeout = i && ue(i) ? i : o, this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), r.timeout), e.send();\n }\n readystatechange() {\n const {\n context: e,\n loader: t,\n stats: r\n } = this;\n if (!e || !t)\n return;\n const n = t.readyState, i = this.config;\n if (!r.aborted && n >= 2 && (r.loading.first === 0 && (r.loading.first = Math.max(self.performance.now(), r.loading.start), i.timeout !== i.loadPolicy.maxLoadTimeMs && (self.clearTimeout(this.requestTimeout), i.timeout = i.loadPolicy.maxLoadTimeMs, this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), i.loadPolicy.maxLoadTimeMs - (r.loading.first - r.loading.start)))), n === 4)) {\n self.clearTimeout(this.requestTimeout), t.onreadystatechange = null, t.onprogress = null;\n const c = t.status, u = t.responseType === \"text\" ? t.responseText : null;\n if (c >= 200 && c < 300) {\n const p = u ?? t.response;\n if (p != null) {\n var o, a;\n r.loading.end = Math.max(self.performance.now(), r.loading.first);\n const y = t.responseType === \"arraybuffer\" ? p.byteLength : p.length;\n r.loaded = r.total = y, r.bwEstimate = r.total * 8e3 / (r.loading.end - r.loading.first);\n const E = (o = this.callbacks) == null ? void 0 : o.onProgress;\n E && E(r, e, p, t);\n const b = {\n url: t.responseURL,\n data: p,\n code: c\n };\n (a = this.callbacks) == null || a.onSuccess(b, r, e, t);\n return;\n }\n }\n const d = i.loadPolicy.errorRetry, h = r.retry, f = {\n url: e.url,\n data: void 0,\n code: c\n };\n if (ta(d, h, !1, f))\n this.retry(d);\n else {\n var l;\n rt.error(`${c} while loading ${e.url}`), (l = this.callbacks) == null || l.onError({\n code: c,\n text: t.statusText\n }, e, t, r);\n }\n }\n }\n loadtimeout() {\n if (!this.config) return;\n const e = this.config.loadPolicy.timeoutRetry, t = this.stats.retry;\n if (ta(e, t, !0))\n this.retry(e);\n else {\n var r;\n rt.warn(`timeout while loading ${(r = this.context) == null ? void 0 : r.url}`);\n const n = this.callbacks;\n n && (this.abortInternal(), n.onTimeout(this.stats, this.context, this.loader));\n }\n }\n retry(e) {\n const {\n context: t,\n stats: r\n } = this;\n this.retryDelay = yu(e, r.retry), r.retry++, rt.warn(`${status ? \"HTTP Status \" + status : \"Timeout\"} while loading ${t == null ? void 0 : t.url}, retrying ${r.retry}/${e.maxNumRetry} in ${this.retryDelay}ms`), this.abortInternal(), this.loader = null, self.clearTimeout(this.retryTimeout), this.retryTimeout = self.setTimeout(this.loadInternal.bind(this), this.retryDelay);\n }\n loadprogress(e) {\n const t = this.stats;\n t.loaded = e.loaded, e.lengthComputable && (t.total = e.total);\n }\n getCacheAge() {\n let e = null;\n if (this.loader && nA.test(this.loader.getAllResponseHeaders())) {\n const t = this.loader.getResponseHeader(\"age\");\n e = t ? parseFloat(t) : null;\n }\n return e;\n }\n getResponseHeader(e) {\n return this.loader && new RegExp(`^${e}:\\\\s*[\\\\d.]+\\\\s*$`, \"im\").test(this.loader.getAllResponseHeaders()) ? this.loader.getResponseHeader(e) : null;\n }\n}\nconst iA = {\n maxTimeToFirstByteMs: 8e3,\n maxLoadTimeMs: 2e4,\n timeoutRetry: null,\n errorRetry: null\n}, oA = tt(tt({\n autoStartLoad: !0,\n // used by stream-controller\n startPosition: -1,\n // used by stream-controller\n defaultAudioCodec: void 0,\n // used by stream-controller\n debug: !1,\n // used by logger\n capLevelOnFPSDrop: !1,\n // used by fps-controller\n capLevelToPlayerSize: !1,\n // used by cap-level-controller\n ignoreDevicePixelRatio: !1,\n // used by cap-level-controller\n maxDevicePixelRatio: Number.POSITIVE_INFINITY,\n // used by cap-level-controller\n preferManagedMediaSource: !0,\n initialLiveManifestSize: 1,\n // used by stream-controller\n maxBufferLength: 30,\n // used by stream-controller\n backBufferLength: 1 / 0,\n // used by buffer-controller\n frontBufferFlushThreshold: 1 / 0,\n startOnSegmentBoundary: !1,\n // used by stream-controller\n maxBufferSize: 60 * 1e3 * 1e3,\n // used by stream-controller\n maxFragLookUpTolerance: 0.25,\n // used by stream-controller\n maxBufferHole: 0.1,\n // used by stream-controller and gap-controller\n detectStallWithCurrentTimeMs: 1250,\n // used by gap-controller\n highBufferWatchdogPeriod: 2,\n // used by gap-controller\n nudgeOffset: 0.1,\n // used by gap-controller\n nudgeMaxRetry: 3,\n // used by gap-controller\n nudgeOnVideoHole: !0,\n // used by gap-controller\n liveSyncMode: \"edge\",\n // used by stream-controller\n liveSyncDurationCount: 3,\n // used by latency-controller\n liveSyncOnStallIncrease: 1,\n // used by latency-controller\n liveMaxLatencyDurationCount: 1 / 0,\n // used by latency-controller\n liveSyncDuration: void 0,\n // used by latency-controller\n liveMaxLatencyDuration: void 0,\n // used by latency-controller\n maxLiveSyncPlaybackRate: 1,\n // used by latency-controller\n liveDurationInfinity: !1,\n // used by buffer-controller\n /**\n * @deprecated use backBufferLength\n */\n liveBackBufferLength: null,\n // used by buffer-controller\n maxMaxBufferLength: 600,\n // used by stream-controller\n enableWorker: !0,\n // used by transmuxer\n workerPath: null,\n // used by transmuxer\n enableSoftwareAES: !0,\n // used by decrypter\n startLevel: void 0,\n // used by level-controller\n startFragPrefetch: !1,\n // used by stream-controller\n fpsDroppedMonitoringPeriod: 5e3,\n // used by fps-controller\n fpsDroppedMonitoringThreshold: 0.2,\n // used by fps-controller\n appendErrorMaxRetry: 3,\n // used by buffer-controller\n ignorePlaylistParsingErrors: !1,\n loader: Zp,\n // loader: FetchLoader,\n fLoader: void 0,\n // used by fragment-loader\n pLoader: void 0,\n // used by playlist-loader\n xhrSetup: void 0,\n // used by xhr-loader\n licenseXhrSetup: void 0,\n // used by eme-controller\n licenseResponseCallback: void 0,\n // used by eme-controller\n abrController: yb,\n bufferController: l2,\n capLevelController: Du,\n errorController: bb,\n fpsController: cw,\n stretchShortVideoTrack: !1,\n // used by mp4-remuxer\n maxAudioFramesDrift: 1,\n // used by mp4-remuxer\n forceKeyFrameOnDiscontinuity: !0,\n // used by ts-demuxer\n abrEwmaFastLive: 3,\n // used by abr-controller\n abrEwmaSlowLive: 9,\n // used by abr-controller\n abrEwmaFastVoD: 3,\n // used by abr-controller\n abrEwmaSlowVoD: 9,\n // used by abr-controller\n abrEwmaDefaultEstimate: 5e5,\n // 500 kbps // used by abr-controller\n abrEwmaDefaultEstimateMax: 5e6,\n // 5 mbps\n abrBandWidthFactor: 0.95,\n // used by abr-controller\n abrBandWidthUpFactor: 0.7,\n // used by abr-controller\n abrMaxWithRealBitrate: !1,\n // used by abr-controller\n maxStarvationDelay: 4,\n // used by abr-controller\n maxLoadingDelay: 4,\n // used by abr-controller\n minAutoBitrate: 0,\n // used by hls\n emeEnabled: !1,\n // used by eme-controller\n widevineLicenseUrl: void 0,\n // used by eme-controller\n drmSystems: {},\n // used by eme-controller\n drmSystemOptions: {},\n // used by eme-controller\n requestMediaKeySystemAccessFunc: Yg,\n // used by eme-controller\n requireKeySystemAccessOnStart: !1,\n // used by eme-controller\n testBandwidth: !0,\n progressive: !1,\n lowLatencyMode: !0,\n cmcd: void 0,\n enableDateRangeMetadataCues: !0,\n enableEmsgMetadataCues: !0,\n enableEmsgKLVMetadata: !1,\n enableID3MetadataCues: !0,\n enableInterstitialPlayback: !0,\n interstitialAppendInPlace: !0,\n interstitialLiveLookAhead: 10,\n useMediaCapabilities: !0,\n preserveManualLevelOnError: !1,\n certLoadPolicy: {\n default: iA\n },\n keyLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 8e3,\n maxLoadTimeMs: 2e4,\n timeoutRetry: {\n maxNumRetry: 1,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 2e4,\n backoff: \"linear\"\n },\n errorRetry: {\n maxNumRetry: 8,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 2e4,\n backoff: \"linear\"\n }\n }\n },\n manifestLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 1 / 0,\n maxLoadTimeMs: 2e4,\n timeoutRetry: {\n maxNumRetry: 2,\n retryDelayMs: 0,\n maxRetryDelayMs: 0\n },\n errorRetry: {\n maxNumRetry: 1,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 8e3\n }\n }\n },\n playlistLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 1e4,\n maxLoadTimeMs: 2e4,\n timeoutRetry: {\n maxNumRetry: 2,\n retryDelayMs: 0,\n maxRetryDelayMs: 0\n },\n errorRetry: {\n maxNumRetry: 2,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 8e3\n }\n }\n },\n fragLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 1e4,\n maxLoadTimeMs: 12e4,\n timeoutRetry: {\n maxNumRetry: 4,\n retryDelayMs: 0,\n maxRetryDelayMs: 0\n },\n errorRetry: {\n maxNumRetry: 6,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 8e3\n }\n }\n },\n steeringManifestLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 1e4,\n maxLoadTimeMs: 2e4,\n timeoutRetry: {\n maxNumRetry: 2,\n retryDelayMs: 0,\n maxRetryDelayMs: 0\n },\n errorRetry: {\n maxNumRetry: 1,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 8e3\n }\n }\n },\n interstitialAssetListLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 1e4,\n maxLoadTimeMs: 3e4,\n timeoutRetry: {\n maxNumRetry: 0,\n retryDelayMs: 0,\n maxRetryDelayMs: 0\n },\n errorRetry: {\n maxNumRetry: 0,\n retryDelayMs: 1e3,\n maxRetryDelayMs: 8e3\n }\n }\n },\n // These default settings are deprecated in favor of the above policies\n // and are maintained for backwards compatibility\n manifestLoadingTimeOut: 1e4,\n manifestLoadingMaxRetry: 1,\n manifestLoadingRetryDelay: 1e3,\n manifestLoadingMaxRetryTimeout: 64e3,\n levelLoadingTimeOut: 1e4,\n levelLoadingMaxRetry: 4,\n levelLoadingRetryDelay: 1e3,\n levelLoadingMaxRetryTimeout: 64e3,\n fragLoadingTimeOut: 2e4,\n fragLoadingMaxRetry: 6,\n fragLoadingRetryDelay: 1e3,\n fragLoadingMaxRetryTimeout: 64e3\n}, aA()), {}, {\n subtitleStreamController: Sw,\n subtitleTrackController: hw,\n timelineController: Ww,\n audioStreamController: n2,\n audioTrackController: i2,\n emeController: _n,\n cmcdController: iw,\n contentSteeringController: aw,\n interstitialsController: xw\n});\nfunction aA() {\n return {\n cueHandler: Zw,\n // used by timeline-controller\n enableWebVTT: !0,\n // used by timeline-controller\n enableIMSC1: !0,\n // used by timeline-controller\n enableCEA708Captions: !0,\n // used by timeline-controller\n captionsTextTrack1Label: \"English\",\n // used by timeline-controller\n captionsTextTrack1LanguageCode: \"en\",\n // used by timeline-controller\n captionsTextTrack2Label: \"Spanish\",\n // used by timeline-controller\n captionsTextTrack2LanguageCode: \"es\",\n // used by timeline-controller\n captionsTextTrack3Label: \"Unknown CC\",\n // used by timeline-controller\n captionsTextTrack3LanguageCode: \"\",\n // used by timeline-controller\n captionsTextTrack4Label: \"Unknown CC\",\n // used by timeline-controller\n captionsTextTrack4LanguageCode: \"\",\n // used by timeline-controller\n renderTextTracksNatively: !0\n };\n}\nfunction lA(s, e, t) {\n if ((e.liveSyncDurationCount || e.liveMaxLatencyDurationCount) && (e.liveSyncDuration || e.liveMaxLatencyDuration))\n throw new Error(\"Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration\");\n if (e.liveMaxLatencyDurationCount !== void 0 && (e.liveSyncDurationCount === void 0 || e.liveMaxLatencyDurationCount <= e.liveSyncDurationCount))\n throw new Error('Illegal hls.js config: \"liveMaxLatencyDurationCount\" must be greater than \"liveSyncDurationCount\"');\n if (e.liveMaxLatencyDuration !== void 0 && (e.liveSyncDuration === void 0 || e.liveMaxLatencyDuration <= e.liveSyncDuration))\n throw new Error('Illegal hls.js config: \"liveMaxLatencyDuration\" must be greater than \"liveSyncDuration\"');\n const r = Tc(s), n = [\"manifest\", \"level\", \"frag\"], i = [\"TimeOut\", \"MaxRetry\", \"RetryDelay\", \"MaxRetryTimeout\"];\n return n.forEach((o) => {\n const a = `${o === \"level\" ? \"playlist\" : o}LoadPolicy`, l = e[a] === void 0, c = [];\n i.forEach((u) => {\n const d = `${o}Loading${u}`, h = e[d];\n if (h !== void 0 && l) {\n c.push(d);\n const f = r[a].default;\n switch (e[a] = {\n default: f\n }, u) {\n case \"TimeOut\":\n f.maxLoadTimeMs = h, f.maxTimeToFirstByteMs = h;\n break;\n case \"MaxRetry\":\n f.errorRetry.maxNumRetry = h, f.timeoutRetry.maxNumRetry = h;\n break;\n case \"RetryDelay\":\n f.errorRetry.retryDelayMs = h, f.timeoutRetry.retryDelayMs = h;\n break;\n case \"MaxRetryTimeout\":\n f.errorRetry.maxRetryDelayMs = h, f.timeoutRetry.maxRetryDelayMs = h;\n break;\n }\n }\n }), c.length && t.warn(`hls.js config: \"${c.join('\", \"')}\" setting(s) are deprecated, use \"${a}\": ${at(e[a])}`);\n }), tt(tt({}, r), e);\n}\nfunction Tc(s) {\n return s && typeof s == \"object\" ? Array.isArray(s) ? s.map(Tc) : Object.keys(s).reduce((e, t) => (e[t] = Tc(s[t]), e), {}) : s;\n}\nfunction cA(s, e) {\n const t = s.loader;\n t !== lf && t !== Zp ? (e.log(\"[config]: Custom loader detected, cannot enable progressive streaming\"), s.progressive = !1) : Xw() && (s.loader = lf, s.progressive = !0, s.enableSoftwareAES = !0, e.log(\"[config]: Progressive streaming enabled, using FetchLoader\"));\n}\nconst xo = 2, uA = 0.1, dA = 0.05, hA = 100;\nclass fA extends Hg {\n constructor(e, t) {\n super(\"gap-controller\", e.logger), this.hls = void 0, this.fragmentTracker = void 0, this.media = null, this.mediaSource = void 0, this.nudgeRetry = 0, this.stallReported = !1, this.stalled = null, this.moved = !1, this.seeking = !1, this.buffered = {}, this.lastCurrentTime = 0, this.ended = 0, this.waiting = 0, this.onMediaPlaying = () => {\n this.ended = 0, this.waiting = 0;\n }, this.onMediaWaiting = () => {\n var r;\n (r = this.media) != null && r.seeking || (this.waiting = self.performance.now(), this.tick());\n }, this.onMediaEnded = () => {\n if (this.hls) {\n var r;\n this.ended = ((r = this.media) == null ? void 0 : r.currentTime) || 1, this.hls.trigger(I.MEDIA_ENDED, {\n stalled: !1\n });\n }\n }, this.hls = e, this.fragmentTracker = t, this.registerListeners();\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e && (e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.BUFFER_APPENDED, this.onBufferAppended, this));\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e && (e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.BUFFER_APPENDED, this.onBufferAppended, this));\n }\n destroy() {\n super.destroy(), this.unregisterListeners(), this.media = this.hls = this.fragmentTracker = null, this.mediaSource = void 0;\n }\n onMediaAttached(e, t) {\n this.setInterval(hA), this.mediaSource = t.mediaSource;\n const r = this.media = t.media;\n cr(r, \"playing\", this.onMediaPlaying), cr(r, \"waiting\", this.onMediaWaiting), cr(r, \"ended\", this.onMediaEnded);\n }\n onMediaDetaching(e, t) {\n this.clearInterval();\n const {\n media: r\n } = this;\n r && (pr(r, \"playing\", this.onMediaPlaying), pr(r, \"waiting\", this.onMediaWaiting), pr(r, \"ended\", this.onMediaEnded), this.media = null), this.mediaSource = void 0;\n }\n onBufferAppended(e, t) {\n this.buffered = t.timeRanges;\n }\n get hasBuffered() {\n return Object.keys(this.buffered).length > 0;\n }\n tick() {\n var e;\n if (!((e = this.media) != null && e.readyState) || !this.hasBuffered)\n return;\n const t = this.media.currentTime;\n this.poll(t, this.lastCurrentTime), this.lastCurrentTime = t;\n }\n /**\n * Checks if the playhead is stuck within a gap, and if so, attempts to free it.\n * A gap is an unbuffered range between two buffered ranges (or the start and the first buffered range).\n *\n * @param lastCurrentTime - Previously read playhead position\n */\n poll(e, t) {\n var r, n;\n const i = (r = this.hls) == null ? void 0 : r.config;\n if (!i)\n return;\n const o = this.media;\n if (!o)\n return;\n const {\n seeking: a\n } = o, l = this.seeking && !a, c = !this.seeking && a, u = o.paused && !a || o.ended || o.playbackRate === 0;\n if (this.seeking = a, e !== t) {\n t && (this.ended = 0), this.moved = !0, a || (this.nudgeRetry = 0, i.nudgeOnVideoHole && !u && e > t && this.nudgeOnVideoHole(e, t)), this.waiting === 0 && this.stallResolved(e);\n return;\n }\n if (c || l) {\n l && this.stallResolved(e);\n return;\n }\n if (u) {\n this.nudgeRetry = 0, this.stallResolved(e), !this.ended && o.ended && this.hls && (this.ended = e || 1, this.hls.trigger(I.MEDIA_ENDED, {\n stalled: !1\n }));\n return;\n }\n if (!Ce.getBuffered(o).length) {\n this.nudgeRetry = 0;\n return;\n }\n const d = Ce.bufferInfo(o, e, 0), h = d.nextStart || 0, f = this.fragmentTracker;\n if (a && f && this.hls) {\n const H = cf(this.hls.inFlightFragments, e), K = d.len > xo, j = !h || H || h - e > xo && !f.getPartialFragment(e);\n if (K || j)\n return;\n this.moved = !1;\n }\n const p = (n = this.hls) == null ? void 0 : n.latestLevelDetails;\n if (!this.moved && this.stalled !== null && f) {\n if (!(d.len > 0) && !h)\n return;\n const K = Math.max(h, d.start || 0) - e, C = !!(p != null && p.live) ? p.targetduration * 2 : xo, k = so(e, f);\n if (K > 0 && (K <= C || k)) {\n o.paused || this._trySkipBufferHole(k);\n return;\n }\n }\n const y = i.detectStallWithCurrentTimeMs, E = self.performance.now(), b = this.waiting;\n let R = this.stalled;\n if (R === null)\n if (b > 0 && E - b < y)\n R = this.stalled = b;\n else {\n this.stalled = E;\n return;\n }\n const A = E - R;\n if (!a && (A >= y || b) && this.hls) {\n var F;\n if (((F = this.mediaSource) == null ? void 0 : F.readyState) === \"ended\" && !(p != null && p.live) && Math.abs(e - ((p == null ? void 0 : p.edge) || 0)) < 1) {\n if (this.ended)\n return;\n this.ended = e || 1, this.hls.trigger(I.MEDIA_ENDED, {\n stalled: !0\n });\n return;\n }\n if (this._reportStall(d), !this.media || !this.hls)\n return;\n }\n const M = Ce.bufferInfo(o, e, i.maxBufferHole);\n this._tryFixBufferStall(M, A, e);\n }\n stallResolved(e) {\n const t = this.stalled;\n if (t && this.hls && (this.stalled = null, this.stallReported)) {\n const r = self.performance.now() - t;\n this.log(`playback not stuck anymore @${e}, after ${Math.round(r)}ms`), this.stallReported = !1, this.waiting = 0, this.hls.trigger(I.STALL_RESOLVED, {});\n }\n }\n nudgeOnVideoHole(e, t) {\n var r;\n const n = this.buffered.video;\n if (this.hls && this.media && this.fragmentTracker && (r = this.buffered.audio) != null && r.length && n && n.length > 1 && e > n.end(0)) {\n const i = Ce.bufferedInfo(Ce.timeRangesToArray(this.buffered.audio), e, 0);\n if (i.len > 1 && t >= i.start) {\n const o = Ce.timeRangesToArray(n), a = Ce.bufferedInfo(o, t, 0).bufferedIndex;\n if (a > -1 && a < o.length - 1) {\n const l = Ce.bufferedInfo(o, e, 0).bufferedIndex, c = o[a].end, u = o[a + 1].start;\n if ((l === -1 || l > a) && u - c < 1 && // `maxBufferHole` may be too small and setting it to 0 should not disable this feature\n e - c < 2) {\n const d = new Error(`nudging playhead to flush pipeline after video hole. currentTime: ${e} hole: ${c} -> ${u} buffered index: ${l}`);\n this.warn(d.message), this.media.currentTime += 1e-6;\n let h = so(e, this.fragmentTracker);\n h && \"fragment\" in h ? h = h.fragment : h || (h = void 0);\n const f = Ce.bufferInfo(this.media, e, 0);\n this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_SEEK_OVER_HOLE,\n fatal: !1,\n error: d,\n reason: d.message,\n frag: h,\n buffer: f.len,\n bufferInfo: f\n });\n }\n }\n }\n }\n }\n /**\n * Detects and attempts to fix known buffer stalling issues.\n * @param bufferInfo - The properties of the current buffer.\n * @param stalledDurationMs - The amount of time Hls.js has been stalling for.\n * @private\n */\n _tryFixBufferStall(e, t, r) {\n var n, i;\n const {\n fragmentTracker: o,\n media: a\n } = this, l = (n = this.hls) == null ? void 0 : n.config;\n if (!a || !o || !l)\n return;\n const c = (i = this.hls) == null ? void 0 : i.latestLevelDetails, u = so(r, o);\n if ((u || c != null && c.live && r < c.fragmentStart) && (this._trySkipBufferHole(u) || !this.media))\n return;\n const d = e.buffered, h = this.adjacentTraversal(e, r);\n (d && d.length > 1 && e.len > l.maxBufferHole || e.nextStart && (e.nextStart - r < l.maxBufferHole || h)) && (t > l.highBufferWatchdogPeriod * 1e3 || this.waiting) && (this.warn(\"Trying to nudge playhead over buffer-hole\"), this._tryNudgeBuffer(e));\n }\n adjacentTraversal(e, t) {\n const r = this.fragmentTracker, n = e.nextStart;\n if (r && n) {\n const i = r.getFragAtPos(t, pe.MAIN), o = r.getFragAtPos(n, pe.MAIN);\n if (i && o)\n return o.sn - i.sn < 2;\n }\n return !1;\n }\n /**\n * Triggers a BUFFER_STALLED_ERROR event, but only once per stall period.\n * @param bufferLen - The playhead distance from the end of the current buffer segment.\n * @private\n */\n _reportStall(e) {\n const {\n hls: t,\n media: r,\n stallReported: n,\n stalled: i\n } = this;\n if (!n && i !== null && r && t) {\n this.stallReported = !0;\n const o = new Error(`Playback stalling at @${r.currentTime} due to low buffer (${at(e)})`);\n this.warn(o.message), t.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_STALLED_ERROR,\n fatal: !1,\n error: o,\n buffer: e.len,\n bufferInfo: e,\n stalled: {\n start: i\n }\n });\n }\n }\n /**\n * Attempts to fix buffer stalls by jumping over known gaps caused by partial fragments\n * @param appended - The fragment or part found at the current time (where playback is stalling).\n * @private\n */\n _trySkipBufferHole(e) {\n var t;\n const {\n fragmentTracker: r,\n media: n\n } = this, i = (t = this.hls) == null ? void 0 : t.config;\n if (!n || !r || !i)\n return 0;\n const o = n.currentTime, a = Ce.bufferInfo(n, o, 0), l = o < a.start ? a.start : a.nextStart;\n if (l && this.hls) {\n const u = a.len <= i.maxBufferHole, d = a.len > 0 && a.len < 1 && n.readyState < 3, h = l - o;\n if (h > 0 && (u || d)) {\n if (h > i.maxBufferHole) {\n let p = !1;\n if (o === 0) {\n const y = r.getAppendedFrag(0, pe.MAIN);\n y && l < y.end && (p = !0);\n }\n if (!p && e) {\n var c;\n if (!((c = this.hls.loadLevelObj) != null && c.details) || cf(this.hls.inFlightFragments, l))\n return 0;\n let E = !1, b = e.end;\n for (; b < l; ) {\n const R = so(b, r);\n if (R)\n b += R.duration;\n else {\n E = !0;\n break;\n }\n }\n if (E)\n return 0;\n }\n }\n const f = Math.max(l + dA, o + uA);\n if (this.warn(`skipping hole, adjusting currentTime from ${o} to ${f}`), this.moved = !0, n.currentTime = f, !(e != null && e.gap)) {\n const p = new Error(`fragment loaded with buffer holes, seeking from ${o} to ${f}`), y = {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_SEEK_OVER_HOLE,\n fatal: !1,\n error: p,\n reason: p.message,\n buffer: a.len,\n bufferInfo: a\n };\n e && (\"fragment\" in e ? y.part = e : y.frag = e), this.hls.trigger(I.ERROR, y);\n }\n return f;\n }\n }\n return 0;\n }\n /**\n * Attempts to fix buffer stalls by advancing the mediaElement's current time by a small amount.\n * @private\n */\n _tryNudgeBuffer(e) {\n const {\n hls: t,\n media: r,\n nudgeRetry: n\n } = this, i = t == null ? void 0 : t.config;\n if (!r || !i)\n return 0;\n const o = r.currentTime;\n if (this.nudgeRetry++, n < i.nudgeMaxRetry) {\n const a = o + (n + 1) * i.nudgeOffset, l = new Error(`Nudging 'currentTime' from ${o} to ${a}`);\n this.warn(l.message), r.currentTime = a, t.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_NUDGE_ON_STALL,\n error: l,\n fatal: !1,\n buffer: e.len,\n bufferInfo: e\n });\n } else {\n const a = new Error(`Playhead still not moving while enough data buffered @${o} after ${i.nudgeMaxRetry} nudges`);\n this.error(a.message), t.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.BUFFER_STALLED_ERROR,\n error: a,\n fatal: !0,\n buffer: e.len,\n bufferInfo: e\n });\n }\n }\n}\nfunction cf(s, e) {\n const t = uf(s.main);\n if (t && t.start <= e)\n return t;\n const r = uf(s.audio);\n return r && r.start <= e ? r : null;\n}\nfunction uf(s) {\n if (!s)\n return null;\n switch (s.state) {\n case ne.IDLE:\n case ne.STOPPED:\n case ne.ENDED:\n case ne.ERROR:\n return null;\n }\n return s.frag;\n}\nfunction so(s, e) {\n return e.getAppendedFrag(s, pe.MAIN) || e.getPartialFragment(s);\n}\nconst gA = 0.25;\nfunction wc() {\n if (!(typeof self > \"u\"))\n return self.VTTCue || self.TextTrackCue;\n}\nfunction Cl(s, e, t, r, n) {\n let i = new s(e, t, \"\");\n try {\n i.value = r, n && (i.type = n);\n } catch {\n i = new s(e, t, at(n ? tt({\n type: n\n }, r) : r));\n }\n return i;\n}\nconst no = (() => {\n const s = wc();\n try {\n s && new s(0, Number.POSITIVE_INFINITY, \"\");\n } catch {\n return Number.MAX_VALUE;\n }\n return Number.POSITIVE_INFINITY;\n})();\nclass pA {\n constructor(e) {\n this.hls = void 0, this.id3Track = null, this.media = null, this.dateRangeCuesAppended = {}, this.removeCues = !0, this.assetCue = void 0, this.onEventCueEnter = () => {\n this.hls && this.hls.trigger(I.EVENT_CUE_ENTER, {});\n }, this.hls = e, this._registerListeners();\n }\n destroy() {\n this._unregisterListeners(), this.id3Track = null, this.media = null, this.dateRangeCuesAppended = {}, this.hls = this.onEventCueEnter = null;\n }\n _registerListeners() {\n const {\n hls: e\n } = this;\n e && (e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this));\n }\n _unregisterListeners() {\n const {\n hls: e\n } = this;\n e && (e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this));\n }\n // Add ID3 metatadata text track.\n onMediaAttaching(e, t) {\n var r;\n this.media = t.media, ((r = t.overrides) == null ? void 0 : r.cueRemoval) === !1 && (this.removeCues = !1);\n }\n onMediaAttached() {\n var e;\n const t = (e = this.hls) == null ? void 0 : e.latestLevelDetails;\n t && this.updateDateRangeCues(t);\n }\n onMediaDetaching(e, t) {\n this.media = null, !t.transferMedia && (this.id3Track && (this.removeCues && Sn(this.id3Track, this.onEventCueEnter), this.id3Track = null), this.dateRangeCuesAppended = {});\n }\n onManifestLoading() {\n this.dateRangeCuesAppended = {};\n }\n createTrack(e) {\n const t = this.getID3Track(e.textTracks);\n return t.mode = \"hidden\", t;\n }\n getID3Track(e) {\n if (this.media) {\n for (let t = 0; t < e.length; t++) {\n const r = e[t];\n if (r.kind === \"metadata\" && r.label === \"id3\")\n return Np(r, this.media), r;\n }\n return this.media.addTextTrack(\"metadata\", \"id3\");\n }\n }\n onFragParsingMetadata(e, t) {\n if (!this.media || !this.hls)\n return;\n const {\n enableEmsgMetadataCues: r,\n enableID3MetadataCues: n\n } = this.hls.config;\n if (!r && !n)\n return;\n const {\n samples: i\n } = t;\n this.id3Track || (this.id3Track = this.createTrack(this.media));\n const o = wc();\n if (o)\n for (let a = 0; a < i.length; a++) {\n const l = i[a].type;\n if (l === br.emsg && !r || !n)\n continue;\n const c = hp(i[a].data), u = i[a].pts;\n let d = u + i[a].duration;\n d > no && (d = no), d - u <= 0 && (d = u + gA);\n for (let f = 0; f < c.length; f++) {\n const p = c[f];\n if (!fp(p)) {\n this.updateId3CueEnds(u, l);\n const y = Cl(o, u, d, p, l);\n y && this.id3Track.addCue(y);\n }\n }\n }\n }\n updateId3CueEnds(e, t) {\n var r;\n const n = (r = this.id3Track) == null ? void 0 : r.cues;\n if (n)\n for (let i = n.length; i--; ) {\n const o = n[i];\n o.type === t && o.startTime < e && o.endTime === no && (o.endTime = e);\n }\n }\n onBufferFlushing(e, {\n startOffset: t,\n endOffset: r,\n type: n\n }) {\n const {\n id3Track: i,\n hls: o\n } = this;\n if (!o)\n return;\n const {\n config: {\n enableEmsgMetadataCues: a,\n enableID3MetadataCues: l\n }\n } = o;\n if (i && (a || l)) {\n let c;\n n === \"audio\" ? c = (u) => u.type === br.audioId3 && l : n === \"video\" ? c = (u) => u.type === br.emsg && a : c = (u) => u.type === br.audioId3 && l || u.type === br.emsg && a, Sc(i, t, r, c);\n }\n }\n onLevelUpdated(e, {\n details: t\n }) {\n this.updateDateRangeCues(t, !0);\n }\n onLevelPtsUpdated(e, t) {\n Math.abs(t.drift) > 0.01 && this.updateDateRangeCues(t.details);\n }\n updateDateRangeCues(e, t) {\n if (!this.hls || !this.media)\n return;\n const {\n assetPlayerId: r,\n timelineOffset: n,\n enableDateRangeMetadataCues: i,\n interstitialsController: o\n } = this.hls.config;\n if (!i)\n return;\n const a = wc();\n if (r && n && !o) {\n const {\n fragmentStart: y,\n fragmentEnd: E\n } = e;\n let b = this.assetCue;\n b ? (b.startTime = y, b.endTime = E) : a && (b = this.assetCue = Cl(a, y, E, {\n assetPlayerId: this.hls.config.assetPlayerId\n }, \"hlsjs.interstitial.asset\"), b && (b.id = r, this.id3Track || (this.id3Track = this.createTrack(this.media)), this.id3Track.addCue(b), b.addEventListener(\"enter\", this.onEventCueEnter)));\n }\n if (!e.hasProgramDateTime)\n return;\n const {\n id3Track: l\n } = this, {\n dateRanges: c\n } = e, u = Object.keys(c);\n let d = this.dateRangeCuesAppended;\n if (l && t) {\n var h;\n if ((h = l.cues) != null && h.length) {\n const y = Object.keys(d).filter((E) => !u.includes(E));\n for (let E = y.length; E--; ) {\n var f;\n const b = y[E], R = (f = d[b]) == null ? void 0 : f.cues;\n delete d[b], R && Object.keys(R).forEach((A) => {\n const F = R[A];\n if (F) {\n F.removeEventListener(\"enter\", this.onEventCueEnter);\n try {\n l.removeCue(F);\n } catch {\n }\n }\n });\n }\n } else\n d = this.dateRangeCuesAppended = {};\n }\n const p = e.fragments[e.fragments.length - 1];\n if (!(u.length === 0 || !ue(p == null ? void 0 : p.programDateTime))) {\n this.id3Track || (this.id3Track = this.createTrack(this.media));\n for (let y = 0; y < u.length; y++) {\n const E = u[y], b = c[E], R = b.startTime, A = d[E], F = (A == null ? void 0 : A.cues) || {};\n let M = (A == null ? void 0 : A.durationKnown) || !1, H = no;\n const {\n duration: K,\n endDate: j\n } = b;\n if (j && K !== null)\n H = R + K, M = !0;\n else if (b.endOnNext && !M) {\n const k = u.reduce(($, W) => {\n if (W !== b.id) {\n const _ = c[W];\n if (_.class === b.class && _.startDate > b.startDate && (!$ || b.startDate < $.startDate))\n return _;\n }\n return $;\n }, null);\n k && (H = k.startTime, M = !0);\n }\n const C = Object.keys(b.attr);\n for (let k = 0; k < C.length; k++) {\n const $ = C[k];\n if (!Ob($))\n continue;\n const W = F[$];\n if (W)\n M && !(A != null && A.durationKnown) ? W.endTime = H : Math.abs(W.startTime - R) > 0.01 && (W.startTime = R, W.endTime = H);\n else if (a) {\n let _ = b.attr[$];\n Bb($) && (_ = Ig(_));\n const x = Cl(a, R, H, {\n key: $,\n data: _\n }, br.dateRange);\n x && (x.id = E, this.id3Track.addCue(x), F[$] = x, o && ($ === \"X-ASSET-LIST\" || $ === \"X-ASSET-URL\") && x.addEventListener(\"enter\", this.onEventCueEnter));\n }\n }\n d[E] = {\n cues: F,\n dateRange: b,\n durationKnown: M\n };\n }\n }\n }\n}\nclass mA {\n constructor(e) {\n this.hls = void 0, this.config = void 0, this.media = null, this.currentTime = 0, this.stallCount = 0, this._latency = null, this._targetLatencyUpdated = !1, this.onTimeupdate = () => {\n const {\n media: t\n } = this, r = this.levelDetails;\n if (!t || !r)\n return;\n this.currentTime = t.currentTime;\n const n = this.computeLatency();\n if (n === null)\n return;\n this._latency = n;\n const {\n lowLatencyMode: i,\n maxLiveSyncPlaybackRate: o\n } = this.config;\n if (!i || o === 1 || !r.live)\n return;\n const a = this.targetLatency;\n if (a === null)\n return;\n const l = n - a, c = Math.min(this.maxLatency, a + r.targetduration);\n if (l < c && l > 0.05 && this.forwardBufferLength > 1) {\n const d = Math.min(2, Math.max(1, o)), h = Math.round(2 / (1 + Math.exp(-0.75 * l - this.edgeStalled)) * 20) / 20, f = Math.min(d, Math.max(1, h));\n this.changeMediaPlaybackRate(t, f);\n } else t.playbackRate !== 1 && t.playbackRate !== 0 && this.changeMediaPlaybackRate(t, 1);\n }, this.hls = e, this.config = e.config, this.registerListeners();\n }\n get levelDetails() {\n var e;\n return ((e = this.hls) == null ? void 0 : e.latestLevelDetails) || null;\n }\n get latency() {\n return this._latency || 0;\n }\n get maxLatency() {\n const {\n config: e\n } = this;\n if (e.liveMaxLatencyDuration !== void 0)\n return e.liveMaxLatencyDuration;\n const t = this.levelDetails;\n return t ? e.liveMaxLatencyDurationCount * t.targetduration : 0;\n }\n get targetLatency() {\n const e = this.levelDetails;\n if (e === null || this.hls === null)\n return null;\n const {\n holdBack: t,\n partHoldBack: r,\n targetduration: n\n } = e, {\n liveSyncDuration: i,\n liveSyncDurationCount: o,\n lowLatencyMode: a\n } = this.config, l = this.hls.userConfig;\n let c = a && r || t;\n (this._targetLatencyUpdated || l.liveSyncDuration || l.liveSyncDurationCount || c === 0) && (c = i !== void 0 ? i : o * n);\n const u = n;\n return c + Math.min(this.stallCount * this.config.liveSyncOnStallIncrease, u);\n }\n set targetLatency(e) {\n this.stallCount = 0, this.config.liveSyncDuration = e, this._targetLatencyUpdated = !0;\n }\n get liveSyncPosition() {\n const e = this.estimateLiveEdge(), t = this.targetLatency;\n if (e === null || t === null)\n return null;\n const r = this.levelDetails;\n if (r === null)\n return null;\n const n = r.edge, i = e - t - this.edgeStalled, o = n - r.totalduration, a = n - (this.config.lowLatencyMode && r.partTarget || r.targetduration);\n return Math.min(Math.max(o, i), a);\n }\n get drift() {\n const e = this.levelDetails;\n return e === null ? 1 : e.drift;\n }\n get edgeStalled() {\n const e = this.levelDetails;\n if (e === null)\n return 0;\n const t = (this.config.lowLatencyMode && e.partTarget || e.targetduration) * 3;\n return Math.max(e.age - t, 0);\n }\n get forwardBufferLength() {\n const {\n media: e\n } = this, t = this.levelDetails;\n if (!e || !t)\n return 0;\n const r = e.buffered.length;\n return (r ? e.buffered.end(r - 1) : t.edge) - this.currentTime;\n }\n destroy() {\n this.unregisterListeners(), this.onMediaDetaching(), this.hls = null;\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e && (e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.ERROR, this.onError, this));\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e && (e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.ERROR, this.onError, this));\n }\n onMediaAttached(e, t) {\n this.media = t.media, this.media.addEventListener(\"timeupdate\", this.onTimeupdate);\n }\n onMediaDetaching() {\n this.media && (this.media.removeEventListener(\"timeupdate\", this.onTimeupdate), this.media = null);\n }\n onManifestLoading() {\n this._latency = null, this.stallCount = 0;\n }\n onLevelUpdated(e, {\n details: t\n }) {\n t.advanced && this.onTimeupdate(), !t.live && this.media && this.media.removeEventListener(\"timeupdate\", this.onTimeupdate);\n }\n onError(e, t) {\n var r;\n t.details === J.BUFFER_STALLED_ERROR && (this.stallCount++, this.hls && (r = this.levelDetails) != null && r.live && this.hls.logger.warn(\"[latency-controller]: Stall detected, adjusting target latency\"));\n }\n changeMediaPlaybackRate(e, t) {\n var r, n;\n e.playbackRate !== t && ((r = this.hls) == null || r.logger.debug(`[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${(n = this.targetLatency) == null ? void 0 : n.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${e.playbackRate} to ${t}`), e.playbackRate = t);\n }\n estimateLiveEdge() {\n const e = this.levelDetails;\n return e === null ? null : e.edge + e.age;\n }\n computeLatency() {\n const e = this.estimateLiveEdge();\n return e === null ? null : e - this.currentTime;\n }\n}\nclass yA extends ku {\n constructor(e, t) {\n super(e, \"level-controller\"), this._levels = [], this._firstLevel = -1, this._maxAutoLevel = -1, this._startLevel = void 0, this.currentLevel = null, this.currentLevelIndex = -1, this.manualLevelIndex = -1, this.steering = void 0, this.onParsedComplete = void 0, this.steering = t, this._registerListeners();\n }\n _registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this), e.on(I.ERROR, this.onError, this);\n }\n _unregisterListeners() {\n const {\n hls: e\n } = this;\n e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this), e.off(I.ERROR, this.onError, this);\n }\n destroy() {\n this._unregisterListeners(), this.steering = null, this.resetLevels(), super.destroy();\n }\n stopLoad() {\n this._levels.forEach((t) => {\n t.loadError = 0, t.fragmentError = 0;\n }), super.stopLoad();\n }\n resetLevels() {\n this._startLevel = void 0, this.manualLevelIndex = -1, this.currentLevelIndex = -1, this.currentLevel = null, this._levels = [], this._maxAutoLevel = -1;\n }\n onManifestLoading(e, t) {\n this.resetLevels();\n }\n onManifestLoaded(e, t) {\n const r = this.hls.config.preferManagedMediaSource, n = [], i = {}, o = {};\n let a = !1, l = !1, c = !1;\n t.levels.forEach((u) => {\n const d = u.attrs;\n let {\n audioCodec: h,\n videoCodec: f\n } = u;\n h && (u.audioCodec = h = Xo(h, r) || void 0), f && (f = u.videoCodec = JS(f));\n const {\n width: p,\n height: y,\n unknownCodecs: E\n } = u, b = (E == null ? void 0 : E.length) || 0;\n if (a || (a = !!(p && y)), l || (l = !!f), c || (c = !!h), b || h && !this.isAudioSupported(h) || f && !this.isVideoSupported(f)) {\n this.log(`Some or all CODECS not supported \"${d.CODECS}\"`);\n return;\n }\n const {\n CODECS: R,\n \"FRAME-RATE\": A,\n \"HDCP-LEVEL\": F,\n \"PATHWAY-ID\": M,\n RESOLUTION: H,\n \"VIDEO-RANGE\": K\n } = d, C = `${`${M || \".\"}-`}${u.bitrate}-${H}-${A}-${R}-${K}-${F}`;\n if (i[C])\n if (i[C].uri !== u.url && !u.attrs[\"PATHWAY-ID\"]) {\n const k = o[C] += 1;\n u.attrs[\"PATHWAY-ID\"] = new Array(k + 1).join(\".\");\n const $ = this.createLevel(u);\n i[C] = $, n.push($);\n } else\n i[C].addGroupId(\"audio\", d.AUDIO), i[C].addGroupId(\"text\", d.SUBTITLES);\n else {\n const k = this.createLevel(u);\n i[C] = k, o[C] = 1, n.push(k);\n }\n }), this.filterAndSortMediaOptions(n, t, a, l, c);\n }\n createLevel(e) {\n const t = new mi(e), r = e.supplemental;\n if (r != null && r.videoCodec && !this.isVideoSupported(r.videoCodec)) {\n const n = new Error(`SUPPLEMENTAL-CODECS not supported \"${r.videoCodec}\"`);\n this.log(n.message), t.supportedResult = Fg(n, []);\n }\n return t;\n }\n isAudioSupported(e) {\n return gi(e, \"audio\", this.hls.config.preferManagedMediaSource);\n }\n isVideoSupported(e) {\n return gi(e, \"video\", this.hls.config.preferManagedMediaSource);\n }\n filterAndSortMediaOptions(e, t, r, n, i) {\n var o;\n let a = [], l = [], c = e;\n const u = ((o = t.stats) == null ? void 0 : o.parsing) || {};\n if ((r || n) && i && (c = c.filter(({\n videoCodec: R,\n videoRange: A,\n width: F,\n height: M\n }) => (!!R || !!(F && M)) && lb(A))), c.length === 0) {\n Promise.resolve().then(() => {\n if (this.hls) {\n let R = \"no level with compatible codecs found in manifest\", A = R;\n t.levels.length && (A = `one or more CODECS in variant not supported: ${at(t.levels.map((M) => M.attrs.CODECS).filter((M, H, K) => K.indexOf(M) === H))}`, this.warn(A), R += ` (${A})`);\n const F = new Error(R);\n this.hls.trigger(I.ERROR, {\n type: ve.MEDIA_ERROR,\n details: J.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n fatal: !0,\n url: t.url,\n error: F,\n reason: A\n });\n }\n }), u.end = performance.now();\n return;\n }\n t.audioTracks && (a = t.audioTracks.filter((R) => !R.audioCodec || this.isAudioSupported(R.audioCodec)), df(a)), t.subtitles && (l = t.subtitles, df(l));\n const d = c.slice(0);\n c.sort((R, A) => {\n if (R.attrs[\"HDCP-LEVEL\"] !== A.attrs[\"HDCP-LEVEL\"])\n return (R.attrs[\"HDCP-LEVEL\"] || \"\") > (A.attrs[\"HDCP-LEVEL\"] || \"\") ? 1 : -1;\n if (r && R.height !== A.height)\n return R.height - A.height;\n if (R.frameRate !== A.frameRate)\n return R.frameRate - A.frameRate;\n if (R.videoRange !== A.videoRange)\n return Jo.indexOf(R.videoRange) - Jo.indexOf(A.videoRange);\n if (R.videoCodec !== A.videoCodec) {\n const F = sh(R.videoCodec), M = sh(A.videoCodec);\n if (F !== M)\n return M - F;\n }\n if (R.uri === A.uri && R.codecSet !== A.codecSet) {\n const F = Zo(R.codecSet), M = Zo(A.codecSet);\n if (F !== M)\n return M - F;\n }\n return R.averageBitrate !== A.averageBitrate ? R.averageBitrate - A.averageBitrate : 0;\n });\n let h = d[0];\n if (this.steering && (c = this.steering.filterParsedLevels(c), c.length !== d.length)) {\n for (let R = 0; R < d.length; R++)\n if (d[R].pathwayId === c[0].pathwayId) {\n h = d[R];\n break;\n }\n }\n this._levels = c;\n for (let R = 0; R < c.length; R++)\n if (c[R] === h) {\n var f;\n this._firstLevel = R;\n const A = h.bitrate, F = this.hls.bandwidthEstimate;\n if (this.log(`manifest loaded, ${c.length} level(s) found, first bitrate: ${A}`), ((f = this.hls.userConfig) == null ? void 0 : f.abrEwmaDefaultEstimate) === void 0) {\n const M = Math.min(A, this.hls.config.abrEwmaDefaultEstimateMax);\n M > F && F === this.hls.abrEwmaDefaultEstimate && (this.hls.bandwidthEstimate = M);\n }\n break;\n }\n const p = i && !n, y = this.hls.config, E = !!(y.audioStreamController && y.audioTrackController), b = {\n levels: c,\n audioTracks: a,\n subtitleTracks: l,\n sessionData: t.sessionData,\n sessionKeys: t.sessionKeys,\n firstLevel: this._firstLevel,\n stats: t.stats,\n audio: i,\n video: n,\n altAudio: E && !p && a.some((R) => !!R.url)\n };\n u.end = performance.now(), this.hls.trigger(I.MANIFEST_PARSED, b);\n }\n get levels() {\n return this._levels.length === 0 ? null : this._levels;\n }\n get loadLevelObj() {\n return this.currentLevel;\n }\n get level() {\n return this.currentLevelIndex;\n }\n set level(e) {\n const t = this._levels;\n if (t.length === 0)\n return;\n if (e < 0 || e >= t.length) {\n const u = new Error(\"invalid level idx\"), d = e < 0;\n if (this.hls.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.LEVEL_SWITCH_ERROR,\n level: e,\n fatal: d,\n error: u,\n reason: u.message\n }), d)\n return;\n e = Math.min(e, t.length - 1);\n }\n const r = this.currentLevelIndex, n = this.currentLevel, i = n ? n.attrs[\"PATHWAY-ID\"] : void 0, o = t[e], a = o.attrs[\"PATHWAY-ID\"];\n if (this.currentLevelIndex = e, this.currentLevel = o, r === e && n && i === a)\n return;\n this.log(`Switching to level ${e} (${o.height ? o.height + \"p \" : \"\"}${o.videoRange ? o.videoRange + \" \" : \"\"}${o.codecSet ? o.codecSet + \" \" : \"\"}@${o.bitrate})${a ? \" with Pathway \" + a : \"\"} from level ${r}${i ? \" with Pathway \" + i : \"\"}`);\n const l = {\n level: e,\n attrs: o.attrs,\n details: o.details,\n bitrate: o.bitrate,\n averageBitrate: o.averageBitrate,\n maxBitrate: o.maxBitrate,\n realBitrate: o.realBitrate,\n width: o.width,\n height: o.height,\n codecSet: o.codecSet,\n audioCodec: o.audioCodec,\n videoCodec: o.videoCodec,\n audioGroups: o.audioGroups,\n subtitleGroups: o.subtitleGroups,\n loaded: o.loaded,\n loadError: o.loadError,\n fragmentError: o.fragmentError,\n name: o.name,\n id: o.id,\n uri: o.uri,\n url: o.url,\n urlId: 0,\n audioGroupIds: o.audioGroupIds,\n textGroupIds: o.textGroupIds\n };\n this.hls.trigger(I.LEVEL_SWITCHING, l);\n const c = o.details;\n if (!c || c.live) {\n const u = this.switchParams(o.uri, n == null ? void 0 : n.details, c);\n this.loadPlaylist(u);\n }\n }\n get manualLevel() {\n return this.manualLevelIndex;\n }\n set manualLevel(e) {\n this.manualLevelIndex = e, this._startLevel === void 0 && (this._startLevel = e), e !== -1 && (this.level = e);\n }\n get firstLevel() {\n return this._firstLevel;\n }\n set firstLevel(e) {\n this._firstLevel = e;\n }\n get startLevel() {\n if (this._startLevel === void 0) {\n const e = this.hls.config.startLevel;\n return e !== void 0 ? e : this.hls.firstAutoLevel;\n }\n return this._startLevel;\n }\n set startLevel(e) {\n this._startLevel = e;\n }\n get pathways() {\n return this.steering ? this.steering.pathways() : [];\n }\n get pathwayPriority() {\n return this.steering ? this.steering.pathwayPriority : null;\n }\n set pathwayPriority(e) {\n if (this.steering) {\n const t = this.steering.pathways(), r = e.filter((n) => t.indexOf(n) !== -1);\n if (e.length < 1) {\n this.warn(`pathwayPriority ${e} should contain at least one pathway from list: ${t}`);\n return;\n }\n this.steering.pathwayPriority = r;\n }\n }\n onError(e, t) {\n t.fatal || !t.context || t.context.type === Ke.LEVEL && t.context.level === this.level && this.checkRetry(t);\n }\n // reset errors on the successful load of a fragment\n onFragBuffered(e, {\n frag: t\n }) {\n if (t !== void 0 && t.type === pe.MAIN) {\n const r = t.elementaryStreams;\n if (!Object.keys(r).some((i) => !!r[i]))\n return;\n const n = this._levels[t.level];\n n != null && n.loadError && (this.log(`Resetting level error count of ${n.loadError} on frag buffered`), n.loadError = 0);\n }\n }\n onLevelLoaded(e, t) {\n var r;\n const {\n level: n,\n details: i\n } = t, o = t.levelInfo;\n if (!o) {\n var a;\n this.warn(`Invalid level index ${n}`), (a = t.deliveryDirectives) != null && a.skip && (i.deltaUpdateFailed = !0);\n return;\n }\n if (o === this.currentLevel || t.withoutMultiVariant) {\n o.fragmentError === 0 && (o.loadError = 0);\n let l = o.details;\n l === t.details && l.advanced && (l = void 0), this.playlistLoaded(n, t, l);\n } else (r = t.deliveryDirectives) != null && r.skip && (i.deltaUpdateFailed = !0);\n }\n loadPlaylist(e) {\n super.loadPlaylist(), this.shouldLoadPlaylist(this.currentLevel) && this.scheduleLoading(this.currentLevel, e);\n }\n loadingPlaylist(e, t) {\n super.loadingPlaylist(e, t);\n const r = this.getUrlWithDirectives(e.uri, t), n = this.currentLevelIndex, i = e.attrs[\"PATHWAY-ID\"], o = e.details, a = o == null ? void 0 : o.age;\n this.log(`Loading level index ${n}${(t == null ? void 0 : t.msn) !== void 0 ? \" at sn \" + t.msn + \" part \" + t.part : \"\"}${i ? \" Pathway \" + i : \"\"}${a && o.live ? \" age \" + a.toFixed(1) + (o.type && \" \" + o.type || \"\") : \"\"} ${r}`), this.hls.trigger(I.LEVEL_LOADING, {\n url: r,\n level: n,\n levelInfo: e,\n pathwayId: e.attrs[\"PATHWAY-ID\"],\n id: 0,\n // Deprecated Level urlId\n deliveryDirectives: t || null\n });\n }\n get nextLoadLevel() {\n return this.manualLevelIndex !== -1 ? this.manualLevelIndex : this.hls.nextAutoLevel;\n }\n set nextLoadLevel(e) {\n this.level = e, this.manualLevelIndex === -1 && (this.hls.nextAutoLevel = e);\n }\n removeLevel(e) {\n var t;\n if (this._levels.length === 1)\n return;\n const r = this._levels.filter((i, o) => o !== e ? !0 : (this.steering && this.steering.removeLevel(i), i === this.currentLevel && (this.currentLevel = null, this.currentLevelIndex = -1, i.details && i.details.fragments.forEach((a) => a.level = -1)), !1));\n rp(r), this._levels = r, this.currentLevelIndex > -1 && (t = this.currentLevel) != null && t.details && (this.currentLevelIndex = this.currentLevel.details.fragments[0].level), this.manualLevelIndex > -1 && (this.manualLevelIndex = this.currentLevelIndex);\n const n = r.length - 1;\n this._firstLevel = Math.min(this._firstLevel, n), this._startLevel && (this._startLevel = Math.min(this._startLevel, n)), this.hls.trigger(I.LEVELS_UPDATED, {\n levels: r\n });\n }\n onLevelsUpdated(e, {\n levels: t\n }) {\n this._levels = t;\n }\n checkMaxAutoUpdated() {\n const {\n autoLevelCapping: e,\n maxAutoLevel: t,\n maxHdcpLevel: r\n } = this.hls;\n this._maxAutoLevel !== t && (this._maxAutoLevel = t, this.hls.trigger(I.MAX_AUTO_LEVEL_UPDATED, {\n autoLevelCapping: e,\n levels: this.levels,\n maxAutoLevel: t,\n minAutoLevel: this.hls.minAutoLevel,\n maxHdcpLevel: r\n }));\n }\n}\nfunction df(s) {\n const e = {};\n s.forEach((t) => {\n const r = t.groupId || \"\";\n t.id = e[r] = e[r] || 0, e[r]++;\n });\n}\nfunction Xp() {\n return self.SourceBuffer || self.WebKitSourceBuffer;\n}\nfunction Jp() {\n if (!Ms())\n return !1;\n const e = Xp();\n return !e || e.prototype && typeof e.prototype.appendBuffer == \"function\" && typeof e.prototype.remove == \"function\";\n}\nfunction vA() {\n if (!Jp())\n return !1;\n const s = Ms();\n return typeof (s == null ? void 0 : s.isTypeSupported) == \"function\" && ([\"avc1.42E01E,mp4a.40.2\", \"av01.0.01M.08\", \"vp09.00.50.08\"].some((e) => s.isTypeSupported(pi(e, \"video\"))) || [\"mp4a.40.2\", \"fLaC\"].some((e) => s.isTypeSupported(pi(e, \"audio\"))));\n}\nfunction EA() {\n var s;\n const e = Xp();\n return typeof (e == null || (s = e.prototype) == null ? void 0 : s.changeType) == \"function\";\n}\nconst xA = 100;\nclass SA extends Tu {\n constructor(e, t, r) {\n super(e, t, r, \"stream-controller\", pe.MAIN), this.audioCodecSwap = !1, this.level = -1, this._forceStartLoad = !1, this._hasEnoughToStart = !1, this.altAudio = 0, this.audioOnly = !1, this.fragPlaying = null, this.fragLastKbps = 0, this.couldBacktrack = !1, this.backtrackFragment = null, this.audioCodecSwitch = !1, this.videoBuffer = null, this.onMediaPlaying = () => {\n this.tick();\n }, this.onMediaSeeked = () => {\n const n = this.media, i = n ? n.currentTime : null;\n if (i === null || !ue(i) || (this.log(`Media seeked to ${i.toFixed(3)}`), !this.getBufferedFrag(i)))\n return;\n const o = this.getFwdBufferInfoAtPos(n, i, pe.MAIN, 0);\n if (o === null || o.len === 0) {\n this.warn(`Main forward buffer length at ${i} on \"seeked\" event ${o ? o.len : \"empty\"})`);\n return;\n }\n this.tick();\n }, this.registerListeners();\n }\n registerListeners() {\n super.registerListeners();\n const {\n hls: e\n } = this;\n e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this), e.on(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.on(I.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this), e.on(I.BUFFER_CREATED, this.onBufferCreated, this), e.on(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n unregisterListeners() {\n super.unregisterListeners();\n const {\n hls: e\n } = this;\n e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this), e.off(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.off(I.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this), e.off(I.BUFFER_CREATED, this.onBufferCreated, this), e.off(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n onHandlerDestroying() {\n this.onMediaPlaying = this.onMediaSeeked = null, this.unregisterListeners(), super.onHandlerDestroying();\n }\n startLoad(e, t) {\n if (this.levels) {\n const {\n lastCurrentTime: r,\n hls: n\n } = this;\n if (this.stopLoad(), this.setInterval(xA), this.level = -1, !this.startFragRequested) {\n let i = n.startLevel;\n i === -1 && (n.config.testBandwidth && this.levels.length > 1 ? (i = 0, this.bitrateTest = !0) : i = n.firstAutoLevel), n.nextLoadLevel = i, this.level = n.loadLevel, this._hasEnoughToStart = !!t;\n }\n r > 0 && e === -1 && !t && (this.log(`Override startPosition with lastCurrentTime @${r.toFixed(3)}`), e = r), this.state = ne.IDLE, this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick();\n } else\n this._forceStartLoad = !0, this.state = ne.STOPPED;\n }\n stopLoad() {\n this._forceStartLoad = !1, super.stopLoad();\n }\n doTick() {\n switch (this.state) {\n case ne.WAITING_LEVEL: {\n const {\n levels: e,\n level: t\n } = this, r = e == null ? void 0 : e[t], n = r == null ? void 0 : r.details;\n if (n && (!n.live || this.levelLastLoaded === r && !this.waitForLive(r))) {\n if (this.waitForCdnTuneIn(n))\n break;\n this.state = ne.IDLE;\n break;\n } else if (this.hls.nextLoadLevel !== this.level) {\n this.state = ne.IDLE;\n break;\n }\n break;\n }\n case ne.FRAG_LOADING_WAITING_RETRY:\n this.checkRetryDate();\n break;\n }\n this.state === ne.IDLE && this.doTickIdle(), this.onTickEnd();\n }\n onTickEnd() {\n var e;\n super.onTickEnd(), (e = this.media) != null && e.readyState && this.media.seeking === !1 && (this.lastCurrentTime = this.media.currentTime), this.checkFragmentChanged();\n }\n doTickIdle() {\n const {\n hls: e,\n levelLastLoaded: t,\n levels: r,\n media: n\n } = this;\n if (t === null || !n && !this.primaryPrefetch && (this.startFragRequested || !e.config.startFragPrefetch) || this.altAudio && this.audioOnly)\n return;\n const i = this.buffering ? e.nextLoadLevel : e.loadLevel;\n if (!(r != null && r[i]))\n return;\n const o = r[i], a = this.getMainFwdBufferInfo();\n if (a === null)\n return;\n const l = this.getLevelDetails();\n if (l && this._streamEnded(a, l)) {\n const y = {};\n this.altAudio === 2 && (y.type = \"video\"), this.hls.trigger(I.BUFFER_EOS, y), this.state = ne.ENDED;\n return;\n }\n if (!this.buffering)\n return;\n e.loadLevel !== i && e.manualLevel === -1 && this.log(`Adapting to level ${i} from level ${this.level}`), this.level = e.nextLoadLevel = i;\n const c = o.details;\n if (!c || this.state === ne.WAITING_LEVEL || this.waitForLive(o)) {\n this.level = i, this.state = ne.WAITING_LEVEL, this.startFragRequested = !1;\n return;\n }\n const u = a.len, d = this.getMaxBufferLength(o.maxBitrate);\n if (u >= d)\n return;\n this.backtrackFragment && this.backtrackFragment.start > a.end && (this.backtrackFragment = null);\n const h = this.backtrackFragment ? this.backtrackFragment.start : a.end;\n let f = this.getNextFragment(h, c);\n if (this.couldBacktrack && !this.fragPrevious && f && Vt(f) && this.fragmentTracker.getState(f) !== Ht.OK) {\n var p;\n const E = ((p = this.backtrackFragment) != null ? p : f).sn - c.startSN, b = c.fragments[E - 1];\n b && f.cc === b.cc && (f = b, this.fragmentTracker.removeFragment(b));\n } else this.backtrackFragment && a.len && (this.backtrackFragment = null);\n if (f && this.isLoopLoading(f, h)) {\n if (!f.gap) {\n const E = this.audioOnly && !this.altAudio ? ot.AUDIO : ot.VIDEO, b = (E === ot.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n b && this.afterBufferFlushed(b, E, pe.MAIN);\n }\n f = this.getNextFragmentLoopLoading(f, c, a, pe.MAIN, d);\n }\n f && (f.initSegment && !f.initSegment.data && !this.bitrateTest && (f = f.initSegment), this.loadFragment(f, o, h));\n }\n loadFragment(e, t, r) {\n const n = this.fragmentTracker.getState(e);\n n === Ht.NOT_LOADED || n === Ht.PARTIAL ? Vt(e) ? this.bitrateTest ? (this.log(`Fragment ${e.sn} of level ${e.level} is being downloaded to test bitrate and will not be buffered`), this._loadBitrateTestFrag(e, t)) : super.loadFragment(e, t, r) : this._loadInitSegment(e, t) : this.clearTrackerIfNeeded(e);\n }\n getBufferedFrag(e) {\n return this.fragmentTracker.getBufferedFrag(e, pe.MAIN);\n }\n followingBufferedFrag(e) {\n return e ? this.getBufferedFrag(e.end + 0.5) : null;\n }\n /*\n on immediate level switch :\n - pause playback if playing\n - cancel any pending load request\n - and trigger a buffer flush\n */\n immediateLevelSwitch() {\n this.abortCurrentFrag(), this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n }\n /**\n * try to switch ASAP without breaking video playback:\n * in order to ensure smooth but quick level switching,\n * we need to find the next flushable buffer range\n * we should take into account new segment fetch time\n */\n nextLevelSwitch() {\n const {\n levels: e,\n media: t\n } = this;\n if (t != null && t.readyState) {\n let r;\n const n = this.getAppendedFrag(t.currentTime);\n n && n.start > 1 && this.flushMainBuffer(0, n.start - 1);\n const i = this.getLevelDetails();\n if (i != null && i.live) {\n const a = this.getMainFwdBufferInfo();\n if (!a || a.len < i.targetduration * 2)\n return;\n }\n if (!t.paused && e) {\n const a = this.hls.nextLoadLevel, l = e[a], c = this.fragLastKbps;\n c && this.fragCurrent ? r = this.fragCurrent.duration * l.maxBitrate / (1e3 * c) + 1 : r = 0;\n } else\n r = 0;\n const o = this.getBufferedFrag(t.currentTime + r);\n if (o) {\n const a = this.followingBufferedFrag(o);\n if (a) {\n this.abortCurrentFrag();\n const l = a.maxStartPTS ? a.maxStartPTS : a.start, c = a.duration, u = Math.max(o.end, l + Math.min(Math.max(c - this.config.maxFragLookUpTolerance, c * (this.couldBacktrack ? 0.5 : 0.125)), c * (this.couldBacktrack ? 0.75 : 0.25)));\n this.flushMainBuffer(u, Number.POSITIVE_INFINITY);\n }\n }\n }\n }\n abortCurrentFrag() {\n const e = this.fragCurrent;\n switch (this.fragCurrent = null, this.backtrackFragment = null, e && (e.abortRequests(), this.fragmentTracker.removeFragment(e)), this.state) {\n case ne.KEY_LOADING:\n case ne.FRAG_LOADING:\n case ne.FRAG_LOADING_WAITING_RETRY:\n case ne.PARSING:\n case ne.PARSED:\n this.state = ne.IDLE;\n break;\n }\n this.nextLoadPosition = this.getLoadPosition();\n }\n flushMainBuffer(e, t) {\n super.flushMainBuffer(e, t, this.altAudio === 2 ? \"video\" : null);\n }\n onMediaAttached(e, t) {\n super.onMediaAttached(e, t);\n const r = t.media;\n cr(r, \"playing\", this.onMediaPlaying), cr(r, \"seeked\", this.onMediaSeeked);\n }\n onMediaDetaching(e, t) {\n const {\n media: r\n } = this;\n r && (pr(r, \"playing\", this.onMediaPlaying), pr(r, \"seeked\", this.onMediaSeeked)), this.videoBuffer = null, this.fragPlaying = null, super.onMediaDetaching(e, t), !t.transferMedia && (this._hasEnoughToStart = !1);\n }\n onManifestLoading() {\n super.onManifestLoading(), this.log(\"Trigger BUFFER_RESET\"), this.hls.trigger(I.BUFFER_RESET, void 0), this.couldBacktrack = !1, this.fragLastKbps = 0, this.fragPlaying = this.backtrackFragment = null, this.altAudio = 0, this.audioOnly = !1;\n }\n onManifestParsed(e, t) {\n let r = !1, n = !1;\n for (let i = 0; i < t.levels.length; i++) {\n const o = t.levels[i].audioCodec;\n o && (r = r || o.indexOf(\"mp4a.40.2\") !== -1, n = n || o.indexOf(\"mp4a.40.5\") !== -1);\n }\n this.audioCodecSwitch = r && n && !EA(), this.audioCodecSwitch && this.log(\"Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC\"), this.levels = t.levels, this.startFragRequested = !1;\n }\n onLevelLoading(e, t) {\n const {\n levels: r\n } = this;\n if (!r || this.state !== ne.IDLE)\n return;\n const n = t.levelInfo;\n (!n.details || n.details.live && (this.levelLastLoaded !== n || n.details.expired) || this.waitForCdnTuneIn(n.details)) && (this.state = ne.WAITING_LEVEL);\n }\n onLevelLoaded(e, t) {\n var r;\n const {\n levels: n,\n startFragRequested: i\n } = this, o = t.level, a = t.details, l = a.totalduration;\n if (!n) {\n this.warn(`Levels were reset while loading level ${o}`);\n return;\n }\n this.log(`Level ${o} loaded [${a.startSN},${a.endSN}]${a.lastPartSn ? `[part-${a.lastPartSn}-${a.lastPartIndex}]` : \"\"}, cc [${a.startCC}, ${a.endCC}] duration:${l}`);\n const c = t.levelInfo, u = this.fragCurrent;\n u && (this.state === ne.FRAG_LOADING || this.state === ne.FRAG_LOADING_WAITING_RETRY) && u.level !== t.level && u.loader && this.abortCurrentFrag();\n let d = 0;\n if (a.live || (r = c.details) != null && r.live) {\n var h;\n if (this.checkLiveUpdate(a), a.deltaUpdateFailed)\n return;\n d = this.alignPlaylists(a, c.details, (h = this.levelLastLoaded) == null ? void 0 : h.details);\n }\n if (c.details = a, this.levelLastLoaded = c, i || this.setStartPosition(a, d), this.hls.trigger(I.LEVEL_UPDATED, {\n details: a,\n level: o\n }), this.state === ne.WAITING_LEVEL) {\n if (this.waitForCdnTuneIn(a))\n return;\n this.state = ne.IDLE;\n }\n i && a.live && this.synchronizeToLiveEdge(a), this.tick();\n }\n synchronizeToLiveEdge(e) {\n const {\n config: t,\n media: r\n } = this;\n if (!r)\n return;\n const n = this.hls.liveSyncPosition, i = this.getLoadPosition(), o = e.fragmentStart, a = e.edge, l = i >= o - t.maxFragLookUpTolerance && i <= a;\n if (n !== null && r.duration > n && (i < n || !l)) {\n const u = t.liveMaxLatencyDuration !== void 0 ? t.liveMaxLatencyDuration : t.liveMaxLatencyDurationCount * e.targetduration;\n if ((!l && r.readyState < 4 || i < a - u) && (this._hasEnoughToStart || (this.nextLoadPosition = n), r.readyState))\n if (this.warn(`Playback: ${i.toFixed(3)} is located too far from the end of live sliding playlist: ${a}, reset currentTime to : ${n.toFixed(3)}`), this.config.liveSyncMode === \"buffered\") {\n var c;\n const d = Ce.bufferInfo(r, n, 0);\n if (!((c = d.buffered) != null && c.length)) {\n r.currentTime = n;\n return;\n }\n if (d.start <= i) {\n r.currentTime = n;\n return;\n }\n const {\n nextStart: f\n } = Ce.bufferedInfo(d.buffered, i, 0);\n f && (r.currentTime = f);\n } else\n r.currentTime = n;\n }\n }\n _handleFragmentLoadProgress(e) {\n var t;\n const r = e.frag, {\n part: n,\n payload: i\n } = e, {\n levels: o\n } = this;\n if (!o) {\n this.warn(`Levels were reset while fragment load was in progress. Fragment ${r.sn} of level ${r.level} will not be buffered`);\n return;\n }\n const a = o[r.level];\n if (!a) {\n this.warn(`Level ${r.level} not found on progress`);\n return;\n }\n const l = a.details;\n if (!l) {\n this.warn(`Dropping fragment ${r.sn} of level ${r.level} after level details were reset`), this.fragmentTracker.removeFragment(r);\n return;\n }\n const c = a.videoCodec, u = l.PTSKnown || !l.live, d = (t = r.initSegment) == null ? void 0 : t.data, h = this._getAudioCodec(a), f = this.transmuxer = this.transmuxer || new wp(this.hls, pe.MAIN, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this)), p = n ? n.index : -1, y = p !== -1, E = new Eu(r.level, r.sn, r.stats.chunkCount, i.byteLength, p, y), b = this.initPTS[r.cc];\n f.push(i, d, h, c, r, n, l.totalduration, u, E, b);\n }\n onAudioTrackSwitching(e, t) {\n const r = this.hls, n = this.altAudio === 2;\n if (Qo(t.url, r))\n this.altAudio = 1;\n else {\n if (this.mediaBuffer !== this.media) {\n this.log(\"Switching on main audio, use media.buffered to schedule main fragment loading\"), this.mediaBuffer = this.media;\n const o = this.fragCurrent;\n o && (this.log(\"Switching to main audio track, cancel main fragment load\"), o.abortRequests(), this.fragmentTracker.removeFragment(o)), this.resetTransmuxer(), this.resetLoadingState();\n } else this.audioOnly && this.resetTransmuxer();\n if (n) {\n this.fragmentTracker.removeAllFragments(), r.once(I.BUFFER_FLUSHED, () => {\n this.hls && this.hls.trigger(I.AUDIO_TRACK_SWITCHED, t);\n }), r.trigger(I.BUFFER_FLUSHING, {\n startOffset: 0,\n endOffset: Number.POSITIVE_INFINITY,\n type: null\n });\n return;\n }\n r.trigger(I.AUDIO_TRACK_SWITCHED, t);\n }\n }\n onAudioTrackSwitched(e, t) {\n const r = Qo(t.url, this.hls);\n if (r) {\n const n = this.videoBuffer;\n n && this.mediaBuffer !== n && (this.log(\"Switching on alternate audio, use video.buffered to schedule main fragment loading\"), this.mediaBuffer = n);\n }\n this.altAudio = r ? 2 : 0, this.tick();\n }\n onBufferCreated(e, t) {\n const r = t.tracks;\n let n, i, o = !1;\n for (const a in r) {\n const l = r[a];\n if (l.id === \"main\") {\n if (i = a, n = l, a === \"video\") {\n const c = r[a];\n c && (this.videoBuffer = c.buffer);\n }\n } else\n o = !0;\n }\n o && n ? (this.log(`Alternate track found, use ${i}.buffered to schedule main fragment loading`), this.mediaBuffer = n.buffer) : this.mediaBuffer = this.media;\n }\n onFragBuffered(e, t) {\n const {\n frag: r,\n part: n\n } = t, i = r.type === pe.MAIN;\n if (i) {\n if (this.fragContextChanged(r)) {\n this.warn(`Fragment ${r.sn}${n ? \" p: \" + n.index : \"\"} of level ${r.level} finished buffering, but was aborted. state: ${this.state}`), this.state === ne.PARSED && (this.state = ne.IDLE);\n return;\n }\n const a = n ? n.stats : r.stats;\n this.fragLastKbps = Math.round(8 * a.total / (a.buffering.end - a.loading.first)), Vt(r) && (this.fragPrevious = r), this.fragBufferedComplete(r, n);\n }\n const o = this.media;\n o && (!this._hasEnoughToStart && Ce.getBuffered(o).length && (this._hasEnoughToStart = !0, this.seekToStartPos()), i && this.tick());\n }\n get hasEnoughToStart() {\n return this._hasEnoughToStart;\n }\n onError(e, t) {\n var r;\n if (t.fatal) {\n this.state = ne.ERROR;\n return;\n }\n switch (t.details) {\n case J.FRAG_GAP:\n case J.FRAG_PARSING_ERROR:\n case J.FRAG_DECRYPT_ERROR:\n case J.FRAG_LOAD_ERROR:\n case J.FRAG_LOAD_TIMEOUT:\n case J.KEY_LOAD_ERROR:\n case J.KEY_LOAD_TIMEOUT:\n this.onFragmentOrKeyLoadError(pe.MAIN, t);\n break;\n case J.LEVEL_LOAD_ERROR:\n case J.LEVEL_LOAD_TIMEOUT:\n case J.LEVEL_PARSING_ERROR:\n !t.levelRetry && this.state === ne.WAITING_LEVEL && ((r = t.context) == null ? void 0 : r.type) === Ke.LEVEL && (this.state = ne.IDLE);\n break;\n case J.BUFFER_ADD_CODEC_ERROR:\n case J.BUFFER_APPEND_ERROR:\n if (t.parent !== \"main\")\n return;\n this.reduceLengthAndFlushBuffer(t) && this.resetLoadingState();\n break;\n case J.BUFFER_FULL_ERROR:\n if (t.parent !== \"main\")\n return;\n this.reduceLengthAndFlushBuffer(t) && (!this.config.interstitialsController && this.config.assetPlayerId ? this._hasEnoughToStart = !0 : this.flushMainBuffer(0, Number.POSITIVE_INFINITY));\n break;\n case J.INTERNAL_EXCEPTION:\n this.recoverWorkerError(t);\n break;\n }\n }\n onFragLoadEmergencyAborted() {\n this.state = ne.IDLE, this._hasEnoughToStart || (this.startFragRequested = !1, this.nextLoadPosition = this.lastCurrentTime), this.tickImmediate();\n }\n onBufferFlushed(e, {\n type: t\n }) {\n if (t !== ot.AUDIO || !this.altAudio) {\n const r = (t === ot.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n r && (this.afterBufferFlushed(r, t, pe.MAIN), this.tick());\n }\n }\n onLevelsUpdated(e, t) {\n this.level > -1 && this.fragCurrent && (this.level = this.fragCurrent.level, this.level === -1 && this.resetWhenMissingContext(this.fragCurrent)), this.levels = t.levels;\n }\n swapAudioCodec() {\n this.audioCodecSwap = !this.audioCodecSwap;\n }\n /**\n * Seeks to the set startPosition if not equal to the mediaElement's current time.\n */\n seekToStartPos() {\n const {\n media: e\n } = this;\n if (!e)\n return;\n const t = e.currentTime;\n let r = this.startPosition;\n if (r >= 0 && t < r) {\n if (e.seeking) {\n this.log(`could not seek to ${r}, already seeking at ${t}`);\n return;\n }\n const n = this.timelineOffset;\n n && r && (r += n);\n const i = this.getLevelDetails(), o = Ce.getBuffered(e), a = o.length ? o.start(0) : 0, l = a - r, c = Math.max(this.config.maxBufferHole, this.config.maxFragLookUpTolerance);\n (this.config.startOnSegmentBoundary || l > 0 && (l < c || this.loadingParts && l < 2 * ((i == null ? void 0 : i.partTarget) || 0))) && (this.log(`adjusting start position by ${l} to match buffer start`), r += l, this.startPosition = r), t < r && (this.log(`seek to target start position ${r} from current time ${t} buffer start ${a}`), e.currentTime = r);\n }\n }\n _getAudioCodec(e) {\n let t = this.config.defaultAudioCodec || e.audioCodec;\n return this.audioCodecSwap && t && (this.log(\"Swapping audio codec\"), t.indexOf(\"mp4a.40.5\") !== -1 ? t = \"mp4a.40.2\" : t = \"mp4a.40.5\"), t;\n }\n _loadBitrateTestFrag(e, t) {\n e.bitrateTest = !0, this._doFragLoad(e, t).then((r) => {\n const {\n hls: n\n } = this, i = r == null ? void 0 : r.frag;\n if (!i || this.fragContextChanged(i))\n return;\n t.fragmentError = 0, this.state = ne.IDLE, this.startFragRequested = !1, this.bitrateTest = !1;\n const o = i.stats;\n o.parsing.start = o.parsing.end = o.buffering.start = o.buffering.end = self.performance.now(), n.trigger(I.FRAG_LOADED, r), i.bitrateTest = !1;\n }).catch((r) => {\n this.state === ne.STOPPED || this.state === ne.ERROR || (this.warn(r), this.resetFragmentLoading(e));\n });\n }\n _handleTransmuxComplete(e) {\n const t = this.playlistType, {\n hls: r\n } = this, {\n remuxResult: n,\n chunkMeta: i\n } = e, o = this.getCurrentContext(i);\n if (!o) {\n this.resetWhenMissingContext(i);\n return;\n }\n const {\n frag: a,\n part: l,\n level: c\n } = o, {\n video: u,\n text: d,\n id3: h,\n initSegment: f\n } = n, {\n details: p\n } = c, y = this.altAudio ? void 0 : n.audio;\n if (this.fragContextChanged(a)) {\n this.fragmentTracker.removeFragment(a);\n return;\n }\n if (this.state = ne.PARSING, f) {\n const E = f.tracks;\n if (E) {\n const F = a.initSegment || a;\n if (this.unhandledEncryptionError(f, a))\n return;\n this._bufferInitSegment(c, E, F, i), r.trigger(I.FRAG_PARSING_INIT_SEGMENT, {\n frag: F,\n id: t,\n tracks: E\n });\n }\n const b = f.initPTS, R = f.timescale, A = this.initPTS[a.cc];\n if (ue(b) && (!A || A.baseTime !== b || A.timescale !== R)) {\n const F = f.trackId;\n this.initPTS[a.cc] = {\n baseTime: b,\n timescale: R,\n trackId: F\n }, r.trigger(I.INIT_PTS_FOUND, {\n frag: a,\n id: t,\n initPTS: b,\n timescale: R,\n trackId: F\n });\n }\n }\n if (u && p) {\n y && u.type === \"audiovideo\" && this.logMuxedErr(a);\n const E = p.fragments[a.sn - 1 - p.startSN], b = a.sn === p.startSN, R = !E || a.cc > E.cc;\n if (n.independent !== !1) {\n const {\n startPTS: A,\n endPTS: F,\n startDTS: M,\n endDTS: H\n } = u;\n if (l)\n l.elementaryStreams[u.type] = {\n startPTS: A,\n endPTS: F,\n startDTS: M,\n endDTS: H\n };\n else if (u.firstKeyFrame && u.independent && i.id === 1 && !R && (this.couldBacktrack = !0), u.dropped && u.independent) {\n const K = this.getMainFwdBufferInfo(), j = (K ? K.end : this.getLoadPosition()) + this.config.maxBufferHole, C = u.firstKeyFramePTS ? u.firstKeyFramePTS : A;\n if (!b && j < C - this.config.maxBufferHole && !R) {\n this.backtrack(a);\n return;\n } else R && (a.gap = !0);\n a.setElementaryStreamInfo(u.type, a.start, F, a.start, H, !0);\n } else b && A - (p.appliedTimelineOffset || 0) > xo && (a.gap = !0);\n a.setElementaryStreamInfo(u.type, A, F, M, H), this.backtrackFragment && (this.backtrackFragment = a), this.bufferFragmentData(u, a, l, i, b || R);\n } else if (b || R)\n a.gap = !0;\n else {\n this.backtrack(a);\n return;\n }\n }\n if (y) {\n const {\n startPTS: E,\n endPTS: b,\n startDTS: R,\n endDTS: A\n } = y;\n l && (l.elementaryStreams[ot.AUDIO] = {\n startPTS: E,\n endPTS: b,\n startDTS: R,\n endDTS: A\n }), a.setElementaryStreamInfo(ot.AUDIO, E, b, R, A), this.bufferFragmentData(y, a, l, i);\n }\n if (p && h != null && h.samples.length) {\n const E = {\n id: t,\n frag: a,\n details: p,\n samples: h.samples\n };\n r.trigger(I.FRAG_PARSING_METADATA, E);\n }\n if (p && d) {\n const E = {\n id: t,\n frag: a,\n details: p,\n samples: d.samples\n };\n r.trigger(I.FRAG_PARSING_USERDATA, E);\n }\n }\n logMuxedErr(e) {\n this.warn(`${Vt(e) ? \"Media\" : \"Init\"} segment with muxed audiovideo where only video expected: ${e.url}`);\n }\n _bufferInitSegment(e, t, r, n) {\n if (this.state !== ne.PARSING)\n return;\n this.audioOnly = !!t.audio && !t.video, this.altAudio && !this.audioOnly && (delete t.audio, t.audiovideo && this.logMuxedErr(r));\n const {\n audio: i,\n video: o,\n audiovideo: a\n } = t;\n if (i) {\n const c = e.audioCodec;\n let u = fo(i.codec, c);\n u === \"mp4a\" && (u = \"mp4a.40.5\");\n const d = navigator.userAgent.toLowerCase();\n if (this.audioCodecSwitch) {\n u && (u.indexOf(\"mp4a.40.5\") !== -1 ? u = \"mp4a.40.2\" : u = \"mp4a.40.5\");\n const h = i.metadata;\n h && \"channelCount\" in h && (h.channelCount || 1) !== 1 && d.indexOf(\"firefox\") === -1 && (u = \"mp4a.40.5\");\n }\n u && u.indexOf(\"mp4a.40.5\") !== -1 && d.indexOf(\"android\") !== -1 && i.container !== \"audio/mpeg\" && (u = \"mp4a.40.2\", this.log(`Android: force audio codec to ${u}`)), c && c !== u && this.log(`Swapping manifest audio codec \"${c}\" for \"${u}\"`), i.levelCodec = u, i.id = pe.MAIN, this.log(`Init audio buffer, container:${i.container}, codecs[selected/level/parsed]=[${u || \"\"}/${c || \"\"}/${i.codec}]`), delete t.audiovideo;\n }\n if (o) {\n o.levelCodec = e.videoCodec, o.id = pe.MAIN;\n const c = o.codec;\n if ((c == null ? void 0 : c.length) === 4)\n switch (c) {\n case \"hvc1\":\n case \"hev1\":\n o.codec = \"hvc1.1.6.L120.90\";\n break;\n case \"av01\":\n o.codec = \"av01.0.04M.08\";\n break;\n case \"avc1\":\n o.codec = \"avc1.42e01e\";\n break;\n }\n this.log(`Init video buffer, container:${o.container}, codecs[level/parsed]=[${e.videoCodec || \"\"}/${c}]${o.codec !== c ? \" parsed-corrected=\" + o.codec : \"\"}${o.supplemental ? \" supplemental=\" + o.supplemental : \"\"}`), delete t.audiovideo;\n }\n a && (this.log(`Init audiovideo buffer, container:${a.container}, codecs[level/parsed]=[${e.codecs}/${a.codec}]`), delete t.video, delete t.audio);\n const l = Object.keys(t);\n if (l.length) {\n if (this.hls.trigger(I.BUFFER_CODECS, t), !this.hls)\n return;\n l.forEach((c) => {\n const d = t[c].initSegment;\n d != null && d.byteLength && this.hls.trigger(I.BUFFER_APPENDING, {\n type: c,\n data: d,\n frag: r,\n part: null,\n chunkMeta: n,\n parent: r.type\n });\n });\n }\n this.tickImmediate();\n }\n getMainFwdBufferInfo() {\n const e = this.mediaBuffer && this.altAudio === 2 ? this.mediaBuffer : this.media;\n return this.getFwdBufferInfo(e, pe.MAIN);\n }\n get maxBufferLength() {\n const {\n levels: e,\n level: t\n } = this, r = e == null ? void 0 : e[t];\n return r ? this.getMaxBufferLength(r.maxBitrate) : this.config.maxBufferLength;\n }\n backtrack(e) {\n this.couldBacktrack = !0, this.backtrackFragment = e, this.resetTransmuxer(), this.flushBufferGap(e), this.fragmentTracker.removeFragment(e), this.fragPrevious = null, this.nextLoadPosition = e.start, this.state = ne.IDLE;\n }\n checkFragmentChanged() {\n const e = this.media;\n let t = null;\n if (e && e.readyState > 1 && e.seeking === !1) {\n const r = e.currentTime;\n if (Ce.isBuffered(e, r) ? t = this.getAppendedFrag(r) : Ce.isBuffered(e, r + 0.1) && (t = this.getAppendedFrag(r + 0.1)), t) {\n this.backtrackFragment = null;\n const n = this.fragPlaying, i = t.level;\n (!n || t.sn !== n.sn || n.level !== i) && (this.fragPlaying = t, this.hls.trigger(I.FRAG_CHANGED, {\n frag: t\n }), (!n || n.level !== i) && this.hls.trigger(I.LEVEL_SWITCHED, {\n level: i\n }));\n }\n }\n }\n get nextLevel() {\n const e = this.nextBufferedFrag;\n return e ? e.level : -1;\n }\n get currentFrag() {\n var e;\n if (this.fragPlaying)\n return this.fragPlaying;\n const t = ((e = this.media) == null ? void 0 : e.currentTime) || this.lastCurrentTime;\n return ue(t) ? this.getAppendedFrag(t) : null;\n }\n get currentProgramDateTime() {\n var e;\n const t = ((e = this.media) == null ? void 0 : e.currentTime) || this.lastCurrentTime;\n if (ue(t)) {\n const r = this.getLevelDetails(), n = this.currentFrag || (r ? Js(null, r.fragments, t) : null);\n if (n) {\n const i = n.programDateTime;\n if (i !== null) {\n const o = i + (t - n.start) * 1e3;\n return new Date(o);\n }\n }\n }\n return null;\n }\n get currentLevel() {\n const e = this.currentFrag;\n return e ? e.level : -1;\n }\n get nextBufferedFrag() {\n const e = this.currentFrag;\n return e ? this.followingBufferedFrag(e) : null;\n }\n get forceStartLoad() {\n return this._forceStartLoad;\n }\n}\nclass bA extends Lr {\n constructor(e, t) {\n super(\"key-loader\", t), this.config = void 0, this.keyIdToKeyInfo = {}, this.emeController = null, this.config = e;\n }\n abort(e) {\n for (const r in this.keyIdToKeyInfo) {\n const n = this.keyIdToKeyInfo[r].loader;\n if (n) {\n var t;\n if (e && e !== ((t = n.context) == null ? void 0 : t.frag.type))\n return;\n n.abort();\n }\n }\n }\n detach() {\n for (const e in this.keyIdToKeyInfo) {\n const t = this.keyIdToKeyInfo[e];\n (t.mediaKeySessionContext || t.decryptdata.isCommonEncryption) && delete this.keyIdToKeyInfo[e];\n }\n }\n destroy() {\n this.detach();\n for (const e in this.keyIdToKeyInfo) {\n const t = this.keyIdToKeyInfo[e].loader;\n t && t.destroy();\n }\n this.keyIdToKeyInfo = {};\n }\n createKeyLoadError(e, t = J.KEY_LOAD_ERROR, r, n, i) {\n return new as({\n type: ve.NETWORK_ERROR,\n details: t,\n fatal: !1,\n frag: e,\n response: i,\n error: r,\n networkDetails: n\n });\n }\n loadClear(e, t, r) {\n if (this.emeController && this.config.emeEnabled && !this.emeController.getSelectedKeySystemFormats().length) {\n if (t.length)\n for (let n = 0, i = t.length; n < i; n++) {\n const o = t[n];\n if (e.cc <= o.cc && (!Vt(e) || !Vt(o) || e.sn < o.sn) || !r && n == i - 1)\n return this.emeController.selectKeySystemFormat(o).then((a) => {\n if (!this.emeController)\n return;\n o.setKeyFormat(a);\n const l = po(a);\n if (l)\n return this.emeController.getKeySystemAccess([l]);\n });\n }\n if (this.config.requireKeySystemAccessOnStart) {\n const n = zn(this.config);\n if (n.length)\n return this.emeController.getKeySystemAccess(n);\n }\n }\n return null;\n }\n load(e) {\n return !e.decryptdata && e.encrypted && this.emeController && this.config.emeEnabled ? this.emeController.selectKeySystemFormat(e).then((t) => this.loadInternal(e, t)) : this.loadInternal(e);\n }\n loadInternal(e, t) {\n var r, n;\n t && e.setKeyFormat(t);\n const i = e.decryptdata;\n if (!i) {\n const c = new Error(t ? `Expected frag.decryptdata to be defined after setting format ${t}` : `Missing decryption data on fragment in onKeyLoading (emeEnabled with controller: ${this.emeController && this.config.emeEnabled})`);\n return Promise.reject(this.createKeyLoadError(e, J.KEY_LOAD_ERROR, c));\n }\n const o = i.uri;\n if (!o)\n return Promise.reject(this.createKeyLoadError(e, J.KEY_LOAD_ERROR, new Error(`Invalid key URI: \"${o}\"`)));\n const a = kl(i);\n let l = this.keyIdToKeyInfo[a];\n if ((r = l) != null && r.decryptdata.key)\n return i.key = l.decryptdata.key, Promise.resolve({\n frag: e,\n keyInfo: l\n });\n if (this.emeController && (n = l) != null && n.keyLoadPromise)\n switch (this.emeController.getKeyStatus(l.decryptdata)) {\n case \"usable\":\n case \"usable-in-future\":\n return l.keyLoadPromise.then((u) => {\n const {\n keyInfo: d\n } = u;\n return i.key = d.decryptdata.key, {\n frag: e,\n keyInfo: d\n };\n });\n }\n switch (this.log(`${this.keyIdToKeyInfo[a] ? \"Rel\" : \"L\"}oading${i.keyId ? \" keyId: \" + fr(i.keyId) : \"\"} URI: ${i.uri} from ${e.type} ${e.level}`), l = this.keyIdToKeyInfo[a] = {\n decryptdata: i,\n keyLoadPromise: null,\n loader: null,\n mediaKeySessionContext: null\n }, i.method) {\n case \"SAMPLE-AES\":\n case \"SAMPLE-AES-CENC\":\n case \"SAMPLE-AES-CTR\":\n return i.keyFormat === \"identity\" ? this.loadKeyHTTP(l, e) : this.loadKeyEME(l, e);\n case \"AES-128\":\n case \"AES-256\":\n case \"AES-256-CTR\":\n return this.loadKeyHTTP(l, e);\n default:\n return Promise.reject(this.createKeyLoadError(e, J.KEY_LOAD_ERROR, new Error(`Key supplied with unsupported METHOD: \"${i.method}\"`)));\n }\n }\n loadKeyEME(e, t) {\n const r = {\n frag: t,\n keyInfo: e\n };\n if (this.emeController && this.config.emeEnabled) {\n const n = this.emeController.loadKey(r);\n return (e.keyLoadPromise = n.then((i) => (e.mediaKeySessionContext = i, r))).catch((i) => {\n throw e.keyLoadPromise = null, \"data\" in i && (i.data.frag = t), i;\n });\n }\n return Promise.resolve(r);\n }\n loadKeyHTTP(e, t) {\n const r = this.config, n = r.loader, i = new n(r);\n return t.keyLoader = e.loader = i, e.keyLoadPromise = new Promise((o, a) => {\n const l = {\n keyInfo: e,\n frag: t,\n responseType: \"arraybuffer\",\n url: e.decryptdata.uri\n }, c = r.keyLoadPolicy.default, u = {\n loadPolicy: c,\n timeout: c.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0\n }, d = {\n onSuccess: (h, f, p, y) => {\n const {\n frag: E,\n keyInfo: b\n } = p, R = kl(b.decryptdata);\n if (!E.decryptdata || b !== this.keyIdToKeyInfo[R])\n return a(this.createKeyLoadError(E, J.KEY_LOAD_ERROR, new Error(\"after key load, decryptdata unset or changed\"), y));\n b.decryptdata.key = E.decryptdata.key = new Uint8Array(h.data), E.keyLoader = null, b.loader = null, o({\n frag: E,\n keyInfo: b\n });\n },\n onError: (h, f, p, y) => {\n this.resetLoader(f), a(this.createKeyLoadError(t, J.KEY_LOAD_ERROR, new Error(`HTTP Error ${h.code} loading key ${h.text}`), p, tt({\n url: l.url,\n data: void 0\n }, h)));\n },\n onTimeout: (h, f, p) => {\n this.resetLoader(f), a(this.createKeyLoadError(t, J.KEY_LOAD_TIMEOUT, new Error(\"key loading timed out\"), p));\n },\n onAbort: (h, f, p) => {\n this.resetLoader(f), a(this.createKeyLoadError(t, J.INTERNAL_ABORTED, new Error(\"key loading aborted\"), p));\n }\n };\n i.load(l, u, d);\n });\n }\n resetLoader(e) {\n const {\n frag: t,\n keyInfo: r,\n url: n\n } = e, i = r.loader;\n t.keyLoader === i && (t.keyLoader = null, r.loader = null);\n const o = kl(r.decryptdata) || n;\n delete this.keyIdToKeyInfo[o], i && i.destroy();\n }\n}\nfunction kl(s) {\n if (s.keyFormat !== lr.FAIRPLAY) {\n const e = s.keyId;\n if (e)\n return fr(e);\n }\n return s.uri;\n}\nfunction hf(s) {\n const {\n type: e\n } = s;\n switch (e) {\n case Ke.AUDIO_TRACK:\n return pe.AUDIO;\n case Ke.SUBTITLE_TRACK:\n return pe.SUBTITLE;\n default:\n return pe.MAIN;\n }\n}\nfunction Dl(s, e) {\n let t = s.url;\n return (t === void 0 || t.indexOf(\"data:\") === 0) && (t = e.url), t;\n}\nclass TA {\n constructor(e) {\n this.hls = void 0, this.loaders = /* @__PURE__ */ Object.create(null), this.variableList = null, this.onManifestLoaded = this.checkAutostartLoad, this.hls = e, this.registerListeners();\n }\n startLoad(e) {\n }\n stopLoad() {\n this.destroyInternalLoaders();\n }\n registerListeners() {\n const {\n hls: e\n } = this;\n e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this), e.on(I.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this);\n }\n unregisterListeners() {\n const {\n hls: e\n } = this;\n e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_LOADING, this.onLevelLoading, this), e.off(I.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this), e.off(I.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this);\n }\n /**\n * Returns defaults or configured loader-type overloads (pLoader and loader config params)\n */\n createInternalLoader(e) {\n const t = this.hls.config, r = t.pLoader, n = t.loader, i = r || n, o = new i(t);\n return this.loaders[e.type] = o, o;\n }\n getInternalLoader(e) {\n return this.loaders[e.type];\n }\n resetInternalLoader(e) {\n this.loaders[e] && delete this.loaders[e];\n }\n /**\n * Call `destroy` on all internal loader instances mapped (one per context type)\n */\n destroyInternalLoaders() {\n for (const e in this.loaders) {\n const t = this.loaders[e];\n t && t.destroy(), this.resetInternalLoader(e);\n }\n }\n destroy() {\n this.variableList = null, this.unregisterListeners(), this.destroyInternalLoaders();\n }\n onManifestLoading(e, t) {\n const {\n url: r\n } = t;\n this.variableList = null, this.load({\n id: null,\n level: 0,\n responseType: \"text\",\n type: Ke.MANIFEST,\n url: r,\n deliveryDirectives: null,\n levelOrTrack: null\n });\n }\n onLevelLoading(e, t) {\n const {\n id: r,\n level: n,\n pathwayId: i,\n url: o,\n deliveryDirectives: a,\n levelInfo: l\n } = t;\n this.load({\n id: r,\n level: n,\n pathwayId: i,\n responseType: \"text\",\n type: Ke.LEVEL,\n url: o,\n deliveryDirectives: a,\n levelOrTrack: l\n });\n }\n onAudioTrackLoading(e, t) {\n const {\n id: r,\n groupId: n,\n url: i,\n deliveryDirectives: o,\n track: a\n } = t;\n this.load({\n id: r,\n groupId: n,\n level: null,\n responseType: \"text\",\n type: Ke.AUDIO_TRACK,\n url: i,\n deliveryDirectives: o,\n levelOrTrack: a\n });\n }\n onSubtitleTrackLoading(e, t) {\n const {\n id: r,\n groupId: n,\n url: i,\n deliveryDirectives: o,\n track: a\n } = t;\n this.load({\n id: r,\n groupId: n,\n level: null,\n responseType: \"text\",\n type: Ke.SUBTITLE_TRACK,\n url: i,\n deliveryDirectives: o,\n levelOrTrack: a\n });\n }\n onLevelsUpdated(e, t) {\n const r = this.loaders[Ke.LEVEL];\n if (r) {\n const n = r.context;\n n && !t.levels.some((i) => i === n.levelOrTrack) && (r.abort(), delete this.loaders[Ke.LEVEL]);\n }\n }\n load(e) {\n var t;\n const r = this.hls.config;\n let n = this.getInternalLoader(e);\n if (n) {\n const c = this.hls.logger, u = n.context;\n if (u && u.levelOrTrack === e.levelOrTrack && (u.url === e.url || u.deliveryDirectives && !e.deliveryDirectives)) {\n u.url === e.url ? c.log(`[playlist-loader]: ignore ${e.url} ongoing request`) : c.log(`[playlist-loader]: ignore ${e.url} in favor of ${u.url}`);\n return;\n }\n c.log(`[playlist-loader]: aborting previous loader for type: ${e.type}`), n.abort();\n }\n let i;\n if (e.type === Ke.MANIFEST ? i = r.manifestLoadPolicy.default : i = nt({}, r.playlistLoadPolicy.default, {\n timeoutRetry: null,\n errorRetry: null\n }), n = this.createInternalLoader(e), ue((t = e.deliveryDirectives) == null ? void 0 : t.part)) {\n let c;\n if (e.type === Ke.LEVEL && e.level !== null ? c = this.hls.levels[e.level].details : e.type === Ke.AUDIO_TRACK && e.id !== null ? c = this.hls.audioTracks[e.id].details : e.type === Ke.SUBTITLE_TRACK && e.id !== null && (c = this.hls.subtitleTracks[e.id].details), c) {\n const u = c.partTarget, d = c.targetduration;\n if (u && d) {\n const h = Math.max(u * 3, d * 0.8) * 1e3;\n i = nt({}, i, {\n maxTimeToFirstByteMs: Math.min(h, i.maxTimeToFirstByteMs),\n maxLoadTimeMs: Math.min(h, i.maxTimeToFirstByteMs)\n });\n }\n }\n }\n const o = i.errorRetry || i.timeoutRetry || {}, a = {\n loadPolicy: i,\n timeout: i.maxLoadTimeMs,\n maxRetry: o.maxNumRetry || 0,\n retryDelay: o.retryDelayMs || 0,\n maxRetryDelay: o.maxRetryDelayMs || 0\n }, l = {\n onSuccess: (c, u, d, h) => {\n const f = this.getInternalLoader(d);\n this.resetInternalLoader(d.type);\n const p = c.data;\n u.parsing.start = performance.now(), zr.isMediaPlaylist(p) || d.type !== Ke.MANIFEST ? this.handleTrackOrLevelPlaylist(c, u, d, h || null, f) : this.handleMasterPlaylist(c, u, d, h);\n },\n onError: (c, u, d, h) => {\n this.handleNetworkError(u, d, !1, c, h);\n },\n onTimeout: (c, u, d) => {\n this.handleNetworkError(u, d, !0, void 0, c);\n }\n };\n n.load(e, a, l);\n }\n checkAutostartLoad() {\n if (!this.hls)\n return;\n const {\n config: {\n autoStartLoad: e,\n startPosition: t\n },\n forceStartLoad: r\n } = this.hls;\n (e || r) && (this.hls.logger.log(`${e ? \"auto\" : \"force\"} startLoad with configured startPosition ${t}`), this.hls.startLoad(t));\n }\n handleMasterPlaylist(e, t, r, n) {\n const i = this.hls, o = e.data, a = Dl(e, r), l = zr.parseMasterPlaylist(o, a);\n if (l.playlistParsingError) {\n t.parsing.end = performance.now(), this.handleManifestParsingError(e, r, l.playlistParsingError, n, t);\n return;\n }\n const {\n contentSteering: c,\n levels: u,\n sessionData: d,\n sessionKeys: h,\n startTimeOffset: f,\n variableList: p\n } = l;\n this.variableList = p, u.forEach((R) => {\n const {\n unknownCodecs: A\n } = R;\n if (A) {\n const {\n preferManagedMediaSource: F\n } = this.hls.config;\n let {\n audioCodec: M,\n videoCodec: H\n } = R;\n for (let K = A.length; K--; ) {\n const j = A[K];\n gi(j, \"audio\", F) ? (R.audioCodec = M = M ? `${M},${j}` : j, Fn.audio[M.substring(0, 4)] = 2, A.splice(K, 1)) : gi(j, \"video\", F) && (R.videoCodec = H = H ? `${H},${j}` : j, Fn.video[H.substring(0, 4)] = 2, A.splice(K, 1));\n }\n }\n });\n const {\n AUDIO: y = [],\n SUBTITLES: E,\n \"CLOSED-CAPTIONS\": b\n } = zr.parseMasterPlaylistMedia(o, a, l);\n y.length && !y.some((A) => !A.url) && u[0].audioCodec && !u[0].attrs.AUDIO && (this.hls.logger.log(\"[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one\"), y.unshift({\n type: \"main\",\n name: \"main\",\n groupId: \"main\",\n default: !1,\n autoselect: !1,\n forced: !1,\n id: -1,\n attrs: new gt({}),\n bitrate: 0,\n url: \"\"\n })), i.trigger(I.MANIFEST_LOADED, {\n levels: u,\n audioTracks: y,\n subtitles: E,\n captions: b,\n contentSteering: c,\n url: a,\n stats: t,\n networkDetails: n,\n sessionData: d,\n sessionKeys: h,\n startTimeOffset: f,\n variableList: p\n });\n }\n handleTrackOrLevelPlaylist(e, t, r, n, i) {\n const o = this.hls, {\n id: a,\n level: l,\n type: c\n } = r, u = Dl(e, r), d = ue(l) ? l : ue(a) ? a : 0, h = hf(r), f = zr.parseLevelPlaylist(e.data, u, d, h, 0, this.variableList);\n if (c === Ke.MANIFEST) {\n const p = {\n attrs: new gt({}),\n bitrate: 0,\n details: f,\n name: \"\",\n url: u\n };\n f.requestScheduled = t.loading.start + Qg(f, 0), o.trigger(I.MANIFEST_LOADED, {\n levels: [p],\n audioTracks: [],\n url: u,\n stats: t,\n networkDetails: n,\n sessionData: null,\n sessionKeys: null,\n contentSteering: null,\n startTimeOffset: null,\n variableList: null\n });\n }\n t.parsing.end = performance.now(), r.levelDetails = f, this.handlePlaylistLoaded(f, e, t, r, n, i);\n }\n handleManifestParsingError(e, t, r, n, i) {\n this.hls.trigger(I.ERROR, {\n type: ve.NETWORK_ERROR,\n details: J.MANIFEST_PARSING_ERROR,\n fatal: t.type === Ke.MANIFEST,\n url: e.url,\n err: r,\n error: r,\n reason: r.message,\n response: e,\n context: t,\n networkDetails: n,\n stats: i\n });\n }\n handleNetworkError(e, t, r = !1, n, i) {\n let o = `A network ${r ? \"timeout\" : \"error\" + (n ? \" (status \" + n.code + \")\" : \"\")} occurred while loading ${e.type}`;\n e.type === Ke.LEVEL ? o += `: ${e.level} id: ${e.id}` : (e.type === Ke.AUDIO_TRACK || e.type === Ke.SUBTITLE_TRACK) && (o += ` id: ${e.id} group-id: \"${e.groupId}\"`);\n const a = new Error(o);\n this.hls.logger.warn(`[playlist-loader]: ${o}`);\n let l = J.UNKNOWN, c = !1;\n const u = this.getInternalLoader(e);\n switch (e.type) {\n case Ke.MANIFEST:\n l = r ? J.MANIFEST_LOAD_TIMEOUT : J.MANIFEST_LOAD_ERROR, c = !0;\n break;\n case Ke.LEVEL:\n l = r ? J.LEVEL_LOAD_TIMEOUT : J.LEVEL_LOAD_ERROR, c = !1;\n break;\n case Ke.AUDIO_TRACK:\n l = r ? J.AUDIO_TRACK_LOAD_TIMEOUT : J.AUDIO_TRACK_LOAD_ERROR, c = !1;\n break;\n case Ke.SUBTITLE_TRACK:\n l = r ? J.SUBTITLE_TRACK_LOAD_TIMEOUT : J.SUBTITLE_LOAD_ERROR, c = !1;\n break;\n }\n u && this.resetInternalLoader(e.type);\n const d = {\n type: ve.NETWORK_ERROR,\n details: l,\n fatal: c,\n url: e.url,\n loader: u,\n context: e,\n error: a,\n networkDetails: t,\n stats: i\n };\n if (n) {\n const h = (t == null ? void 0 : t.url) || e.url;\n d.response = tt({\n url: h,\n data: void 0\n }, n);\n }\n this.hls.trigger(I.ERROR, d);\n }\n handlePlaylistLoaded(e, t, r, n, i, o) {\n const a = this.hls, {\n type: l,\n level: c,\n levelOrTrack: u,\n id: d,\n groupId: h,\n deliveryDirectives: f\n } = n, p = Dl(t, n), y = hf(n);\n let E = typeof n.level == \"number\" && y === pe.MAIN ? c : void 0;\n const b = e.playlistParsingError;\n if (b) {\n if (this.hls.logger.warn(`${b} ${e.url}`), !a.config.ignorePlaylistParsingErrors) {\n a.trigger(I.ERROR, {\n type: ve.NETWORK_ERROR,\n details: J.LEVEL_PARSING_ERROR,\n fatal: !1,\n url: p,\n error: b,\n reason: b.message,\n response: t,\n context: n,\n level: E,\n parent: y,\n networkDetails: i,\n stats: r\n });\n return;\n }\n e.playlistParsingError = null;\n }\n if (!e.fragments.length) {\n const R = e.playlistParsingError = new Error(\"No Segments found in Playlist\");\n a.trigger(I.ERROR, {\n type: ve.NETWORK_ERROR,\n details: J.LEVEL_EMPTY_ERROR,\n fatal: !1,\n url: p,\n error: R,\n reason: R.message,\n response: t,\n context: n,\n level: E,\n parent: y,\n networkDetails: i,\n stats: r\n });\n return;\n }\n switch (e.live && o && (o.getCacheAge && (e.ageHeader = o.getCacheAge() || 0), (!o.getCacheAge || isNaN(e.ageHeader)) && (e.ageHeader = 0)), l) {\n case Ke.MANIFEST:\n case Ke.LEVEL:\n if (E) {\n if (!u)\n E = 0;\n else if (u !== a.levels[E]) {\n const R = a.levels.indexOf(u);\n R > -1 && (E = R);\n }\n }\n a.trigger(I.LEVEL_LOADED, {\n details: e,\n levelInfo: u || a.levels[0],\n level: E || 0,\n id: d || 0,\n stats: r,\n networkDetails: i,\n deliveryDirectives: f,\n withoutMultiVariant: l === Ke.MANIFEST\n });\n break;\n case Ke.AUDIO_TRACK:\n a.trigger(I.AUDIO_TRACK_LOADED, {\n details: e,\n track: u,\n id: d || 0,\n groupId: h || \"\",\n stats: r,\n networkDetails: i,\n deliveryDirectives: f\n });\n break;\n case Ke.SUBTITLE_TRACK:\n a.trigger(I.SUBTITLE_TRACK_LOADED, {\n details: e,\n track: u,\n id: d || 0,\n groupId: h || \"\",\n stats: r,\n networkDetails: i,\n deliveryDirectives: f\n });\n break;\n }\n }\n}\nclass Hr {\n /**\n * Get the video-dev/hls.js package version.\n */\n static get version() {\n return vi;\n }\n /**\n * Check if the required MediaSource Extensions are available.\n */\n static isMSESupported() {\n return Jp();\n }\n /**\n * Check if MediaSource Extensions are available and isTypeSupported checks pass for any baseline codecs.\n */\n static isSupported() {\n return vA();\n }\n /**\n * Get the MediaSource global used for MSE playback (ManagedMediaSource, MediaSource, or WebKitMediaSource).\n */\n static getMediaSource() {\n return Ms();\n }\n static get Events() {\n return I;\n }\n static get MetadataSchema() {\n return br;\n }\n static get ErrorTypes() {\n return ve;\n }\n static get ErrorDetails() {\n return J;\n }\n /**\n * Get the default configuration applied to new instances.\n */\n static get DefaultConfig() {\n return Hr.defaultConfig ? Hr.defaultConfig : oA;\n }\n /**\n * Replace the default configuration applied to new instances.\n */\n static set DefaultConfig(e) {\n Hr.defaultConfig = e;\n }\n /**\n * Creates an instance of an HLS client that can attach to exactly one `HTMLMediaElement`.\n * @param userConfig - Configuration options applied over `Hls.DefaultConfig`\n */\n constructor(e = {}) {\n this.config = void 0, this.userConfig = void 0, this.logger = void 0, this.coreComponents = void 0, this.networkControllers = void 0, this._emitter = new wu(), this._autoLevelCapping = -1, this._maxHdcpLevel = null, this.abrController = void 0, this.bufferController = void 0, this.capLevelController = void 0, this.latencyController = void 0, this.levelController = void 0, this.streamController = void 0, this.audioStreamController = void 0, this.subtititleStreamController = void 0, this.audioTrackController = void 0, this.subtitleTrackController = void 0, this.interstitialsController = void 0, this.gapController = void 0, this.emeController = void 0, this.cmcdController = void 0, this._media = null, this._url = null, this._sessionId = void 0, this.triggeringException = void 0, this.started = !1;\n const t = this.logger = LS(e.debug || !1, \"Hls instance\", e.assetPlayerId), r = this.config = lA(Hr.DefaultConfig, e, t);\n this.userConfig = e, r.progressive && cA(r, t);\n const {\n abrController: n,\n bufferController: i,\n capLevelController: o,\n errorController: a,\n fpsController: l\n } = r, c = new a(this), u = this.abrController = new n(this), d = new Tb(this), h = r.interstitialsController, f = h ? this.interstitialsController = new h(this, Hr) : null, p = this.bufferController = new i(this, d), y = this.capLevelController = new o(this), E = new l(this), b = new TA(this), R = r.contentSteeringController, A = R ? new R(this) : null, F = this.levelController = new yA(this, A), M = new pA(this), H = new bA(this.config, this.logger), K = this.streamController = new SA(this, d, H), j = this.gapController = new fA(this, d);\n y.setStreamController(K), E.setStreamController(K);\n const C = [b, F, K];\n f && C.splice(1, 0, f), A && C.splice(1, 0, A), this.networkControllers = C;\n const k = [u, p, j, y, E, M, d];\n this.audioTrackController = this.createController(r.audioTrackController, C);\n const $ = r.audioStreamController;\n $ && C.push(this.audioStreamController = new $(this, d, H)), this.subtitleTrackController = this.createController(r.subtitleTrackController, C);\n const W = r.subtitleStreamController;\n W && C.push(this.subtititleStreamController = new W(this, d, H)), this.createController(r.timelineController, k), H.emeController = this.emeController = this.createController(r.emeController, k), this.cmcdController = this.createController(r.cmcdController, k), this.latencyController = this.createController(mA, k), this.coreComponents = k, C.push(c);\n const _ = c.onErrorOut;\n typeof _ == \"function\" && this.on(I.ERROR, _, c), this.on(I.MANIFEST_LOADED, b.onManifestLoaded, b);\n }\n createController(e, t) {\n if (e) {\n const r = new e(this);\n return t && t.push(r), r;\n }\n return null;\n }\n // Delegate the EventEmitter through the public API of Hls.js\n on(e, t, r = this) {\n this._emitter.on(e, t, r);\n }\n once(e, t, r = this) {\n this._emitter.once(e, t, r);\n }\n removeAllListeners(e) {\n this._emitter.removeAllListeners(e);\n }\n off(e, t, r = this, n) {\n this._emitter.off(e, t, r, n);\n }\n listeners(e) {\n return this._emitter.listeners(e);\n }\n emit(e, t, r) {\n return this._emitter.emit(e, t, r);\n }\n trigger(e, t) {\n if (this.config.debug)\n return this.emit(e, e, t);\n try {\n return this.emit(e, e, t);\n } catch (r) {\n if (this.logger.error(\"An internal error happened while handling event \" + e + '. Error message: \"' + r.message + '\". Here is a stacktrace:', r), !this.triggeringException) {\n this.triggeringException = !0;\n const n = e === I.ERROR;\n this.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.INTERNAL_EXCEPTION,\n fatal: n,\n event: e,\n error: r\n }), this.triggeringException = !1;\n }\n }\n return !1;\n }\n listenerCount(e) {\n return this._emitter.listenerCount(e);\n }\n /**\n * Dispose of the instance\n */\n destroy() {\n this.logger.log(\"destroy\"), this.trigger(I.DESTROYING, void 0), this.detachMedia(), this.removeAllListeners(), this._autoLevelCapping = -1, this._url = null, this.networkControllers.forEach((t) => t.destroy()), this.networkControllers.length = 0, this.coreComponents.forEach((t) => t.destroy()), this.coreComponents.length = 0;\n const e = this.config;\n e.xhrSetup = e.fetchSetup = void 0, this.userConfig = null;\n }\n /**\n * Attaches Hls.js to a media element\n */\n attachMedia(e) {\n if (!e || \"media\" in e && !e.media) {\n const i = new Error(`attachMedia failed: invalid argument (${e})`);\n this.trigger(I.ERROR, {\n type: ve.OTHER_ERROR,\n details: J.ATTACH_MEDIA_ERROR,\n fatal: !0,\n error: i\n });\n return;\n }\n this.logger.log(\"attachMedia\"), this._media && (this.logger.warn(\"media must be detached before attaching\"), this.detachMedia());\n const t = \"media\" in e, r = t ? e.media : e, n = t ? e : {\n media: r\n };\n this._media = r, this.trigger(I.MEDIA_ATTACHING, n);\n }\n /**\n * Detach Hls.js from the media\n */\n detachMedia() {\n this.logger.log(\"detachMedia\"), this.trigger(I.MEDIA_DETACHING, {}), this._media = null;\n }\n /**\n * Detach HTMLMediaElement, MediaSource, and SourceBuffers without reset, for attaching to another instance\n */\n transferMedia() {\n this._media = null;\n const e = this.bufferController.transferMedia();\n return this.trigger(I.MEDIA_DETACHING, {\n transferMedia: e\n }), e;\n }\n /**\n * Set the source URL. Can be relative or absolute.\n */\n loadSource(e) {\n this.stopLoad();\n const t = this.media, r = this._url, n = this._url = hu.buildAbsoluteURL(self.location.href, e, {\n alwaysNormalize: !0\n });\n this._autoLevelCapping = -1, this._maxHdcpLevel = null, this.logger.log(`loadSource:${n}`), t && r && (r !== n || this.bufferController.hasSourceTypes()) && (this.detachMedia(), this.attachMedia(t)), this.trigger(I.MANIFEST_LOADING, {\n url: e\n });\n }\n /**\n * Gets the currently loaded URL\n */\n get url() {\n return this._url;\n }\n /**\n * Whether or not enough has been buffered to seek to start position or use `media.currentTime` to determine next load position\n */\n get hasEnoughToStart() {\n return this.streamController.hasEnoughToStart;\n }\n /**\n * Get the startPosition set on startLoad(position) or on autostart with config.startPosition\n */\n get startPosition() {\n return this.streamController.startPositionValue;\n }\n /**\n * Start loading data from the stream source.\n * Depending on default config, client starts loading automatically when a source is set.\n *\n * @param startPosition - Set the start position to stream from.\n * Defaults to -1 (None: starts from earliest point)\n */\n startLoad(e = -1, t) {\n this.logger.log(`startLoad(${e + (t ? \", <skip seek to start>\" : \"\")})`), this.started = !0, this.resumeBuffering();\n for (let r = 0; r < this.networkControllers.length && (this.networkControllers[r].startLoad(e, t), !(!this.started || !this.networkControllers)); r++)\n ;\n }\n /**\n * Stop loading of any stream data.\n */\n stopLoad() {\n this.logger.log(\"stopLoad\"), this.started = !1;\n for (let e = 0; e < this.networkControllers.length && (this.networkControllers[e].stopLoad(), !(this.started || !this.networkControllers)); e++)\n ;\n }\n /**\n * Returns whether loading, toggled with `startLoad()` and `stopLoad()`, is active or not`.\n */\n get loadingEnabled() {\n return this.started;\n }\n /**\n * Returns state of fragment loading toggled by calling `pauseBuffering()` and `resumeBuffering()`.\n */\n get bufferingEnabled() {\n return this.streamController.bufferingEnabled;\n }\n /**\n * Resumes stream controller segment loading after `pauseBuffering` has been called.\n */\n resumeBuffering() {\n this.bufferingEnabled || (this.logger.log(\"resume buffering\"), this.networkControllers.forEach((e) => {\n e.resumeBuffering && e.resumeBuffering();\n }));\n }\n /**\n * Prevents stream controller from loading new segments until `resumeBuffering` is called.\n * This allows for media buffering to be paused without interupting playlist loading.\n */\n pauseBuffering() {\n this.bufferingEnabled && (this.logger.log(\"pause buffering\"), this.networkControllers.forEach((e) => {\n e.pauseBuffering && e.pauseBuffering();\n }));\n }\n get inFlightFragments() {\n const e = {\n [pe.MAIN]: this.streamController.inFlightFrag\n };\n return this.audioStreamController && (e[pe.AUDIO] = this.audioStreamController.inFlightFrag), this.subtititleStreamController && (e[pe.SUBTITLE] = this.subtititleStreamController.inFlightFrag), e;\n }\n /**\n * Swap through possible audio codecs in the stream (for example to switch from stereo to 5.1)\n */\n swapAudioCodec() {\n this.logger.log(\"swapAudioCodec\"), this.streamController.swapAudioCodec();\n }\n /**\n * When the media-element fails, this allows to detach and then re-attach it\n * as one call (convenience method).\n *\n * Automatic recovery of media-errors by this process is configurable.\n */\n recoverMediaError() {\n this.logger.log(\"recoverMediaError\");\n const e = this._media, t = e == null ? void 0 : e.currentTime;\n this.detachMedia(), e && (this.attachMedia(e), t && this.startLoad(t));\n }\n removeLevel(e) {\n this.levelController.removeLevel(e);\n }\n /**\n * @returns a UUID for this player instance\n */\n get sessionId() {\n let e = this._sessionId;\n return e || (e = this._sessionId = fw()), e;\n }\n /**\n * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH\n */\n get levels() {\n const e = this.levelController.levels;\n return e || [];\n }\n /**\n * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.\n */\n get latestLevelDetails() {\n return this.streamController.getLevelDetails() || null;\n }\n /**\n * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.\n */\n get loadLevelObj() {\n return this.levelController.loadLevelObj;\n }\n /**\n * Index of quality level (variant) currently played\n */\n get currentLevel() {\n return this.streamController.currentLevel;\n }\n /**\n * Set quality level index immediately. This will flush the current buffer to replace the quality asap. That means playback will interrupt at least shortly to re-buffer and re-sync eventually. Set to -1 for automatic level selection.\n */\n set currentLevel(e) {\n this.logger.log(`set currentLevel:${e}`), this.levelController.manualLevel = e, this.streamController.immediateLevelSwitch();\n }\n /**\n * Index of next quality level loaded as scheduled by stream controller.\n */\n get nextLevel() {\n return this.streamController.nextLevel;\n }\n /**\n * Set quality level index for next loaded data.\n * This will switch the video quality asap, without interrupting playback.\n * May abort current loading of data, and flush parts of buffer (outside currently played fragment region).\n * @param newLevel - Pass -1 for automatic level selection\n */\n set nextLevel(e) {\n this.logger.log(`set nextLevel:${e}`), this.levelController.manualLevel = e, this.streamController.nextLevelSwitch();\n }\n /**\n * Return the quality level of the currently or last (of none is loaded currently) segment\n */\n get loadLevel() {\n return this.levelController.level;\n }\n /**\n * Set quality level index for next loaded data in a conservative way.\n * This will switch the quality without flushing, but interrupt current loading.\n * Thus the moment when the quality switch will appear in effect will only be after the already existing buffer.\n * @param newLevel - Pass -1 for automatic level selection\n */\n set loadLevel(e) {\n this.logger.log(`set loadLevel:${e}`), this.levelController.manualLevel = e;\n }\n /**\n * get next quality level loaded\n */\n get nextLoadLevel() {\n return this.levelController.nextLoadLevel;\n }\n /**\n * Set quality level of next loaded segment in a fully \"non-destructive\" way.\n * Same as `loadLevel` but will wait for next switch (until current loading is done).\n */\n set nextLoadLevel(e) {\n this.levelController.nextLoadLevel = e;\n }\n /**\n * Return \"first level\": like a default level, if not set,\n * falls back to index of first level referenced in manifest\n */\n get firstLevel() {\n return Math.max(this.levelController.firstLevel, this.minAutoLevel);\n }\n /**\n * Sets \"first-level\", see getter.\n */\n set firstLevel(e) {\n this.logger.log(`set firstLevel:${e}`), this.levelController.firstLevel = e;\n }\n /**\n * Return the desired start level for the first fragment that will be loaded.\n * The default value of -1 indicates automatic start level selection.\n * Setting hls.nextAutoLevel without setting a startLevel will result in\n * the nextAutoLevel value being used for one fragment load.\n */\n get startLevel() {\n const e = this.levelController.startLevel;\n return e === -1 && this.abrController.forcedAutoLevel > -1 ? this.abrController.forcedAutoLevel : e;\n }\n /**\n * set start level (level of first fragment that will be played back)\n * if not overrided by user, first level appearing in manifest will be used as start level\n * if -1 : automatic start level selection, playback will start from level matching download bandwidth\n * (determined from download of first segment)\n */\n set startLevel(e) {\n this.logger.log(`set startLevel:${e}`), e !== -1 && (e = Math.max(e, this.minAutoLevel)), this.levelController.startLevel = e;\n }\n /**\n * Whether level capping is enabled.\n * Default value is set via `config.capLevelToPlayerSize`.\n */\n get capLevelToPlayerSize() {\n return this.config.capLevelToPlayerSize;\n }\n /**\n * Enables or disables level capping. If disabled after previously enabled, `nextLevelSwitch` will be immediately called.\n */\n set capLevelToPlayerSize(e) {\n const t = !!e;\n t !== this.config.capLevelToPlayerSize && (t ? this.capLevelController.startCapping() : (this.capLevelController.stopCapping(), this.autoLevelCapping = -1, this.streamController.nextLevelSwitch()), this.config.capLevelToPlayerSize = t);\n }\n /**\n * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n */\n get autoLevelCapping() {\n return this._autoLevelCapping;\n }\n /**\n * Returns the current bandwidth estimate in bits per second, when available. Otherwise, `NaN` is returned.\n */\n get bandwidthEstimate() {\n const {\n bwEstimator: e\n } = this.abrController;\n return e ? e.getEstimate() : NaN;\n }\n set bandwidthEstimate(e) {\n this.abrController.resetEstimator(e);\n }\n get abrEwmaDefaultEstimate() {\n const {\n bwEstimator: e\n } = this.abrController;\n return e ? e.defaultEstimate : NaN;\n }\n /**\n * get time to first byte estimate\n * @type {number}\n */\n get ttfbEstimate() {\n const {\n bwEstimator: e\n } = this.abrController;\n return e ? e.getEstimateTTFB() : NaN;\n }\n /**\n * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n */\n set autoLevelCapping(e) {\n this._autoLevelCapping !== e && (this.logger.log(`set autoLevelCapping:${e}`), this._autoLevelCapping = e, this.levelController.checkMaxAutoUpdated());\n }\n get maxHdcpLevel() {\n return this._maxHdcpLevel;\n }\n set maxHdcpLevel(e) {\n ab(e) && this._maxHdcpLevel !== e && (this._maxHdcpLevel = e, this.levelController.checkMaxAutoUpdated());\n }\n /**\n * True when automatic level selection enabled\n */\n get autoLevelEnabled() {\n return this.levelController.manualLevel === -1;\n }\n /**\n * Level set manually (if any)\n */\n get manualLevel() {\n return this.levelController.manualLevel;\n }\n /**\n * min level selectable in auto mode according to config.minAutoBitrate\n */\n get minAutoLevel() {\n const {\n levels: e,\n config: {\n minAutoBitrate: t\n }\n } = this;\n if (!e) return 0;\n const r = e.length;\n for (let n = 0; n < r; n++)\n if (e[n].maxBitrate >= t)\n return n;\n return 0;\n }\n /**\n * max level selectable in auto mode according to autoLevelCapping\n */\n get maxAutoLevel() {\n const {\n levels: e,\n autoLevelCapping: t,\n maxHdcpLevel: r\n } = this;\n let n;\n if (t === -1 && e != null && e.length ? n = e.length - 1 : n = t, r)\n for (let i = n; i--; ) {\n const o = e[i].attrs[\"HDCP-LEVEL\"];\n if (o && o <= r)\n return i;\n }\n return n;\n }\n get firstAutoLevel() {\n return this.abrController.firstAutoLevel;\n }\n /**\n * next automatically selected quality level\n */\n get nextAutoLevel() {\n return this.abrController.nextAutoLevel;\n }\n /**\n * this setter is used to force next auto level.\n * this is useful to force a switch down in auto mode:\n * in case of load error on level N, hls.js can set nextAutoLevel to N-1 for example)\n * forced value is valid for one fragment. upon successful frag loading at forced level,\n * this value will be resetted to -1 by ABR controller.\n */\n set nextAutoLevel(e) {\n this.abrController.nextAutoLevel = e;\n }\n /**\n * get the datetime value relative to media.currentTime for the active level Program Date Time if present\n */\n get playingDate() {\n return this.streamController.currentProgramDateTime;\n }\n get mainForwardBufferInfo() {\n return this.streamController.getMainFwdBufferInfo();\n }\n get maxBufferLength() {\n return this.streamController.maxBufferLength;\n }\n /**\n * Find and select the best matching audio track, making a level switch when a Group change is necessary.\n * Updates `hls.config.audioPreference`. Returns the selected track, or null when no matching track is found.\n */\n setAudioOption(e) {\n var t;\n return ((t = this.audioTrackController) == null ? void 0 : t.setAudioOption(e)) || null;\n }\n /**\n * Find and select the best matching subtitle track, making a level switch when a Group change is necessary.\n * Updates `hls.config.subtitlePreference`. Returns the selected track, or null when no matching track is found.\n */\n setSubtitleOption(e) {\n var t;\n return ((t = this.subtitleTrackController) == null ? void 0 : t.setSubtitleOption(e)) || null;\n }\n /**\n * Get the complete list of audio tracks across all media groups\n */\n get allAudioTracks() {\n const e = this.audioTrackController;\n return e ? e.allAudioTracks : [];\n }\n /**\n * Get the list of selectable audio tracks\n */\n get audioTracks() {\n const e = this.audioTrackController;\n return e ? e.audioTracks : [];\n }\n /**\n * index of the selected audio track (index in audio track lists)\n */\n get audioTrack() {\n const e = this.audioTrackController;\n return e ? e.audioTrack : -1;\n }\n /**\n * selects an audio track, based on its index in audio track lists\n */\n set audioTrack(e) {\n const t = this.audioTrackController;\n t && (t.audioTrack = e);\n }\n /**\n * get the complete list of subtitle tracks across all media groups\n */\n get allSubtitleTracks() {\n const e = this.subtitleTrackController;\n return e ? e.allSubtitleTracks : [];\n }\n /**\n * get alternate subtitle tracks list from playlist\n */\n get subtitleTracks() {\n const e = this.subtitleTrackController;\n return e ? e.subtitleTracks : [];\n }\n /**\n * index of the selected subtitle track (index in subtitle track lists)\n */\n get subtitleTrack() {\n const e = this.subtitleTrackController;\n return e ? e.subtitleTrack : -1;\n }\n get media() {\n return this._media;\n }\n /**\n * select an subtitle track, based on its index in subtitle track lists\n */\n set subtitleTrack(e) {\n const t = this.subtitleTrackController;\n t && (t.subtitleTrack = e);\n }\n /**\n * Whether subtitle display is enabled or not\n */\n get subtitleDisplay() {\n const e = this.subtitleTrackController;\n return e ? e.subtitleDisplay : !1;\n }\n /**\n * Enable/disable subtitle display rendering\n */\n set subtitleDisplay(e) {\n const t = this.subtitleTrackController;\n t && (t.subtitleDisplay = e);\n }\n /**\n * get mode for Low-Latency HLS loading\n */\n get lowLatencyMode() {\n return this.config.lowLatencyMode;\n }\n /**\n * Enable/disable Low-Latency HLS part playlist and segment loading, and start live streams at playlist PART-HOLD-BACK rather than HOLD-BACK.\n */\n set lowLatencyMode(e) {\n this.config.lowLatencyMode = e;\n }\n /**\n * Position (in seconds) of live sync point (ie edge of live position minus safety delay defined by ```hls.config.liveSyncDuration```)\n * @returns null prior to loading live Playlist\n */\n get liveSyncPosition() {\n return this.latencyController.liveSyncPosition;\n }\n /**\n * Estimated position (in seconds) of live edge (ie edge of live playlist plus time sync playlist advanced)\n * @returns 0 before first playlist is loaded\n */\n get latency() {\n return this.latencyController.latency;\n }\n /**\n * maximum distance from the edge before the player seeks forward to ```hls.liveSyncPosition```\n * configured using ```liveMaxLatencyDurationCount``` (multiple of target duration) or ```liveMaxLatencyDuration```\n * @returns 0 before first playlist is loaded\n */\n get maxLatency() {\n return this.latencyController.maxLatency;\n }\n /**\n * target distance from the edge as calculated by the latency controller\n */\n get targetLatency() {\n return this.latencyController.targetLatency;\n }\n set targetLatency(e) {\n this.latencyController.targetLatency = e;\n }\n /**\n * the rate at which the edge of the current live playlist is advancing or 1 if there is none\n */\n get drift() {\n return this.latencyController.drift;\n }\n /**\n * set to true when startLoad is called before MANIFEST_PARSED event\n */\n get forceStartLoad() {\n return this.streamController.forceStartLoad;\n }\n /**\n * ContentSteering pathways getter\n */\n get pathways() {\n return this.levelController.pathways;\n }\n /**\n * ContentSteering pathwayPriority getter/setter\n */\n get pathwayPriority() {\n return this.levelController.pathwayPriority;\n }\n set pathwayPriority(e) {\n this.levelController.pathwayPriority = e;\n }\n /**\n * returns true when all SourceBuffers are buffered to the end\n */\n get bufferedToEnd() {\n var e;\n return !!((e = this.bufferController) != null && e.bufferedToEnd);\n }\n /**\n * returns Interstitials Program Manager\n */\n get interstitialsManager() {\n var e;\n return ((e = this.interstitialsController) == null ? void 0 : e.interstitialsManager) || null;\n }\n /**\n * returns mediaCapabilities.decodingInfo for a variant/rendition\n */\n getMediaDecodingInfo(e, t = this.allAudioTracks) {\n const r = $g(t);\n return Ng(e, r, navigator.mediaCapabilities);\n }\n}\nHr.defaultConfig = void 0;\nconst on = \"https://sdk-api.neynar.com\", wA = \"https://api.allorigins.win/get\", bi = \"https://i.imgur.com/gxH8azy.png\";\nvar AA = {\n SDK_VERSION: '\"1.2.15\"'\n};\nconst IA = AA.SDK_VERSION, an = async (s, e = {}) => (e.headers = {\n ...e.headers,\n \"x-sdk\": \"react\",\n \"x-sdk-version\": IA\n}, fetch(s, e));\nasync function _A({\n type: s,\n identifier: e,\n viewerFid: t,\n client_id: r\n}) {\n try {\n let n = `${on}/v2/farcaster/cast?type=${s}&identifier=${e}${t ? `&viewer_fid=${t}` : \"\"}&client_id=${r}`;\n const o = await (await an(n)).json();\n return (o == null ? void 0 : o.cast) || null;\n } catch (n) {\n return console.error(\"Error fetching cast by identifier\", n), null;\n }\n}\nconst RA = ({\n type: s,\n identifier: e,\n viewerFid: t,\n allowReactions: r = !1,\n renderEmbeds: n = !0,\n renderFrames: i = !1,\n onLikeBtnPress: o,\n onRecastBtnPress: a,\n onCommentBtnPress: l,\n onFrameBtnPress: c,\n containerStyles: u,\n textStyles: d\n}) => {\n var F;\n const {\n client_id: h\n } = ts(), [f, p] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), [y, E] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!0), [b, R] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), A = (f == null ? void 0 : f.author.fid) === t;\n return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n s && e && (E(!0), R(null), _A({\n type: s,\n identifier: e,\n viewerFid: t,\n client_id: h\n }).then((M) => {\n p(M);\n }).catch((M) => {\n R(M);\n }).finally(() => {\n E(!1);\n }));\n }, [s, e, t, h]), y ? /* @__PURE__ */ q.jsx(\"div\", {\n style: {\n padding: \"20px\"\n },\n children: \"Loading...\"\n }) : !f || b ? /* @__PURE__ */ q.jsx(\"div\", {\n children: \"Error: could not fetch cast data\"\n }) : i && !c ? /* @__PURE__ */ q.jsx(\"div\", {\n children: \"Error: onFrameBtnPress must be provided when renderEmbeds is true.\"\n }) : /* @__PURE__ */ q.jsx(oa, {\n username: f.author.username,\n displayName: f.author.display_name,\n avatarImgUrl: f.author.pfp_url,\n text: f.text,\n hash: f.hash,\n reactions: f.reactions,\n replies: f.replies.count,\n embeds: f.embeds ?? [],\n frames: f.frames ?? [],\n renderEmbeds: n,\n renderFrames: i,\n channel: f.channel ? {\n id: f.channel.id,\n name: f.channel.name,\n url: f.parent_url\n } : void 0,\n viewerFid: t,\n allowReactions: r,\n hasPowerBadge: f.author.power_badge,\n appAvatarImgUrl: ((F = f.app) == null ? void 0 : F.pfp_url) || null,\n isOwnProfile: A,\n containerStyles: u,\n textStyles: d,\n onLikeBtnPress: o,\n onRecastBtnPress: a,\n onCommentBtnPress: l,\n onFrameBtnPress: c,\n timestamp: f.timestamp\n });\n}, LA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n classes: [\"s1uo4lx4\"]\n}), Pl = /* @__PURE__ */ new Map(), io = /* @__PURE__ */ new Map(), ff = /* @__PURE__ */ new Map(), gf = (s) => new Promise((e) => setTimeout(e, s)), Qp = async (s, e = 0) => {\n const t = new URL(s).hostname;\n if (ff.get(t))\n return {\n ogImage: \"\",\n ogTitle: \"\",\n ogDescription: \"\"\n };\n if (Pl.has(s))\n return Pl.get(s);\n if (io.has(s))\n return io.get(s);\n const r = (async () => {\n try {\n await gf(100);\n const n = await fetch(`${wA}?url=${encodeURIComponent(s)}`, {\n method: \"GET\"\n });\n if (!n.ok) {\n if (n.status === 429 && e < 5) {\n const E = Math.pow(2, e) * 1e3;\n return await gf(E), Qp(s, e + 1);\n }\n throw ff.set(t, !0), new Error(`Failed to fetch Open Graph data: ${n.statusText}`);\n }\n const i = await n.json(), a = new DOMParser().parseFromString(i.contents, \"text/html\"), l = a.querySelector('meta[property=\"og:image\"]'), c = a.querySelector('meta[property=\"og:title\"]'), u = a.querySelector('meta[property=\"og:description\"]'), d = a.querySelector(\"title\"), h = l && l.getAttribute(\"content\") || \"\", f = c ? c.getAttribute(\"content\") || \"\" : d ? d.innerText : \"\", p = u && u.getAttribute(\"content\") || \"\", y = {\n ogImage: h,\n ogTitle: f,\n ogDescription: p\n };\n return Pl.set(s, y), y;\n } catch (n) {\n return console.error(\"Error fetching Open Graph data\", n), {\n ogImage: \"\",\n ogTitle: \"\",\n ogDescription: \"\"\n };\n } finally {\n io.delete(s);\n }\n })();\n return io.set(s, r), r;\n}, Ac = [];\nlet Ml = 0;\nconst CA = 5, kA = (s) => {\n Ac.push(s), em();\n}, em = async () => {\n if (Ml >= CA || Ac.length === 0)\n return;\n Ml++;\n const s = Ac.shift();\n s && await s(), Ml--, em();\n}, DA = ({\n src: s,\n alt: e,\n style: t\n}) => /* @__PURE__ */ q.jsx(\"img\", {\n src: s,\n alt: e,\n style: {\n display: \"block\",\n height: \"auto\",\n maxHeight: \"150px\",\n width: \"auto\",\n maxWidth: \"100%\",\n objectFit: \"cover\",\n border: \"1px solid grey\",\n borderRadius: \"10px\",\n margin: \"4px 0\",\n ...t\n }\n}), PA = ({\n url: s\n}) => {\n const e = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);\n return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n if (e.current)\n if (Hr.isSupported() && s.endsWith(\".m3u8\")) {\n const t = new Hr();\n t.loadSource(s), t.attachMedia(e.current), t.on(Hr.Events.MANIFEST_PARSED, () => {\n e.current.play();\n });\n } else\n e.current.src = s, e.current.addEventListener(\"loadedmetadata\", () => {\n e.current.play();\n });\n }, [s]), /* @__PURE__ */ q.jsx(\"video\", {\n ref: e,\n controls: !0,\n muted: !0,\n style: {\n width: \"auto\",\n maxWidth: \"100%\",\n maxHeight: \"400px\",\n borderRadius: \"10px\",\n margin: \"10px 0\",\n objectFit: \"contain\"\n }\n });\n}, MA = (s) => /\\.(jpeg|jpg|gif|png|webp|bmp|svg)$/.test(s) || s.startsWith(\"https://imagedelivery.net\"), OA = (s, e, t) => {\n const [r, n] = react__WEBPACK_IMPORTED_MODULE_0___default().useState([]), i = react__WEBPACK_IMPORTED_MODULE_0___default().useCallback(async (o) => (await Promise.all(o.map(async (l) => {\n if (l.url) {\n const c = l.url;\n return MA(c) ? /* @__PURE__ */ q.jsx(DA, {\n src: c,\n alt: \"Embedded image\"\n }, c) : c.endsWith(\".m3u8\") || c.endsWith(\".mp4\") ? /* @__PURE__ */ q.jsx(PA, {\n url: c\n }, c) : new Promise((u) => {\n kA(async () => {\n const {\n ogImage: d,\n ogTitle: h\n } = await Qp(c), f = new URL(c).hostname.replace(\"www.\", \"\");\n u(/* @__PURE__ */ q.jsxs(LA, {\n href: c,\n target: \"_blank\",\n rel: \"noreferrer\",\n children: [d && /* @__PURE__ */ q.jsx(\"img\", {\n src: d,\n alt: h,\n style: {\n width: \"50px\",\n height: \"50px\",\n objectFit: \"cover\",\n borderRadius: \"5px\"\n }\n }), /* @__PURE__ */ q.jsxs(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\"\n },\n children: [/* @__PURE__ */ q.jsx(\"p\", {\n style: {\n margin: 0\n },\n children: h || c\n }), /* @__PURE__ */ q.jsx(\"p\", {\n style: {\n margin: 0,\n color: \"grey\",\n fontSize: \"12px\"\n },\n children: f\n })]\n })]\n }, c));\n });\n });\n } else if (l.cast_id)\n return /* @__PURE__ */ q.jsx(\"div\", {\n style: {\n maxWidth: \"85%\"\n },\n children: /* @__PURE__ */ q.jsx(RA, {\n type: \"hash\",\n identifier: l.cast_id.hash,\n viewerFid: t,\n allowReactions: e,\n renderEmbeds: !1\n }, l.cast_id.fid)\n }, `cast-${l.cast_id.hash}`);\n return null;\n }))).filter((l) => l !== null), [e, t]);\n return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n i(s).then(n);\n }, [s, i]), r;\n}, tm = ({\n onClick: s\n}) => /* @__PURE__ */ q.jsx(\"svg\", {\n width: \"18\",\n height: \"17\",\n viewBox: \"0 0 18 17\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n onClick: (e) => s ? s(e) : void 0,\n style: {\n cursor: \"pointer\"\n },\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M6.22857 12.6828H7.01285C7.01285 12.2496 6.66172 11.8985 6.22857 11.8985V12.6828ZM6.22857 15.8199H5.4443C5.4443 16.1137 5.60848 16.3828 5.8697 16.5172C6.13092 16.6517 6.44537 16.6288 6.68443 16.4581L6.22857 15.8199ZM10.6205 12.6828V11.8985C10.4571 11.8985 10.2977 11.9496 10.1647 12.0446L10.6205 12.6828ZM1.78428 3.27146C1.78428 2.54955 2.3695 1.96433 3.09141 1.96433V0.395777C1.50321 0.395777 0.215723 1.68327 0.215723 3.27146H1.78428ZM1.78428 10.5914V3.27146H0.215723V10.5914H1.78428ZM3.0914 11.8985C2.3695 11.8985 1.78428 11.3133 1.78428 10.5914H0.215723C0.215723 12.1796 1.50321 13.4671 3.0914 13.4671V11.8985ZM6.22857 11.8985H3.0914V13.4671H6.22857V11.8985ZM7.01285 15.8199V12.6828H5.4443V15.8199H7.01285ZM10.1647 12.0446L5.77272 15.1817L6.68443 16.4581L11.0764 13.321L10.1647 12.0446ZM14.5941 11.8985H10.6205V13.4671H14.5941V11.8985ZM15.9013 10.5914C15.9013 11.3133 15.316 11.8985 14.5941 11.8985V13.4671C16.1823 13.4671 17.4698 12.1796 17.4698 10.5914H15.9013ZM15.9013 3.27146V10.5914H17.4698V3.27146H15.9013ZM14.5941 1.96433C15.316 1.96433 15.9013 2.54955 15.9013 3.27146H17.4698C17.4698 1.68326 16.1823 0.395777 14.5941 0.395777V1.96433ZM3.09141 1.96433H14.5941V0.395777H3.09141V1.96433Z\",\n fill: \"#A0A3AD\"\n })\n}), BA = ({\n fill: s,\n onClick: e\n}) => /* @__PURE__ */ q.jsxs(\"svg\", {\n width: \"16\",\n height: \"15\",\n viewBox: \"0 0 16 15\",\n fill: s || \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n onClick: (t) => e ? e(t) : void 0,\n style: {\n cursor: \"pointer\"\n },\n children: [/* @__PURE__ */ q.jsx(\"path\", {\n d: \"M14.9245 14.2506C14.7258 14.2506 14.5352 14.1716 14.3946 14.0311C14.2541 13.8905 14.1751 13.6999 14.1751 13.5011V10.5034H11.1774C10.9787 10.5034 10.7881 10.4245 10.6475 10.2839C10.507 10.1434 10.428 9.95279 10.428 9.75403C10.428 9.55527 10.507 9.36465 10.6475 9.22411C10.7881 9.08357 10.9787 9.00461 11.1774 9.00461H14.9245C15.1233 9.00461 15.3139 9.08357 15.4545 9.22411C15.595 9.36465 15.674 9.55527 15.674 9.75403V13.5011C15.674 13.6999 15.595 13.8905 15.4545 14.0311C15.3139 14.1716 15.1233 14.2506 14.9245 14.2506ZM5.18207 6.00693H1.43497C1.23621 6.00693 1.04559 5.92797 0.905047 5.78743C0.764503 5.64688 0.685547 5.45627 0.685547 5.25751V1.51041C0.685547 1.31165 0.764503 1.12103 0.905047 0.980486C1.04559 0.839943 1.23621 0.760986 1.43497 0.760986C1.63373 0.760986 1.82434 0.839943 1.96489 0.980486C2.10543 1.12103 2.18439 1.31165 2.18439 1.51041V4.50809H5.18207C5.38083 4.50809 5.57145 4.58704 5.71199 4.72759C5.85253 4.86813 5.93149 5.05875 5.93149 5.25751C5.93149 5.45627 5.85253 5.64688 5.71199 5.78743C5.57145 5.92797 5.38083 6.00693 5.18207 6.00693Z\",\n fill: s || \"#A0A3AD\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M8.17934 15C6.33556 15.0003 4.55637 14.3209 3.18205 13.0918C1.80774 11.8627 0.934766 10.17 0.730106 8.33765C0.719281 8.23923 0.727945 8.13965 0.755606 8.04458C0.783266 7.94951 0.82938 7.86083 0.891315 7.78358C1.0164 7.62758 1.19833 7.52765 1.39709 7.50579C1.59585 7.48393 1.79515 7.54191 1.95116 7.667C2.10716 7.79208 2.20708 7.97401 2.22895 8.17277C2.37708 9.52376 2.97983 10.7843 3.93838 11.7478C4.89692 12.7113 6.15438 13.3205 7.50459 13.4755C8.85479 13.6306 10.2176 13.3223 11.3696 12.6012C12.5216 11.8801 13.3944 10.789 13.845 9.50674C13.8731 9.40817 13.9211 9.31642 13.986 9.23714C14.051 9.15787 14.1316 9.09277 14.2227 9.04586C14.3138 8.99895 14.4136 8.97123 14.5159 8.96442C14.6181 8.95761 14.7207 8.97185 14.8173 9.00625C14.9138 9.04066 15.0023 9.09451 15.0772 9.16446C15.1521 9.23442 15.2118 9.31899 15.2528 9.41296C15.2937 9.50693 15.3149 9.6083 15.3151 9.71079C15.3153 9.81329 15.2944 9.91473 15.2539 10.0089C14.7359 11.4705 13.7774 12.7355 12.5103 13.6294C11.2432 14.5233 9.73002 15.0022 8.17934 15ZM14.8792 7.50579C14.6939 7.50691 14.5148 7.43937 14.3764 7.3162C14.238 7.19302 14.1501 7.02295 14.1297 6.8388C13.975 5.49429 13.3699 4.24169 12.4128 3.28476C11.4558 2.32782 10.2031 1.72285 8.85858 1.56824C7.51405 1.41364 6.15676 1.7185 5.0075 2.43324C3.85823 3.14798 2.9846 4.23054 2.52872 5.50484C2.50062 5.6034 2.4526 5.69516 2.38763 5.77443C2.32266 5.85371 2.24212 5.91881 2.15099 5.96572C2.05987 6.01263 1.96008 6.04035 1.85781 6.04716C1.75555 6.05397 1.65297 6.03973 1.55642 6.00532C1.45988 5.97092 1.37141 5.91707 1.29651 5.84712C1.2216 5.77716 1.16183 5.69258 1.12091 5.59861C1.07999 5.50464 1.05878 5.40328 1.05859 5.30078C1.0584 5.19829 1.07923 5.09685 1.1198 5.00273C1.68406 3.40202 2.77497 2.04025 4.21397 1.14029C5.65297 0.240337 7.35485 -0.144505 9.04106 0.0487522C10.7273 0.242009 12.2979 1.00192 13.496 2.20411C14.6941 3.4063 15.4486 4.97958 15.6361 6.66644C15.6571 6.86306 15.5997 7.06004 15.4761 7.21445C15.3526 7.36887 15.173 7.4682 14.9766 7.4908L14.8792 7.50579Z\",\n fill: s || \"#A0A3AD\"\n })]\n}), rm = ({\n fill: s,\n onClick: e\n}) => /* @__PURE__ */ q.jsxs(\"svg\", {\n width: \"17\",\n height: \"15\",\n viewBox: \"0 0 17 15\",\n fill: s ? \"red\" : \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n onClick: (t) => e ? e(t) : void 0,\n style: {\n cursor: \"pointer\"\n },\n children: [/* @__PURE__ */ q.jsx(\"path\", {\n d: \"M13.8719 2.25042L14.2947 1.58984L13.8719 2.25042C15.2467 3.13022 15.7676 5.22206 14.8856 7.61317C14.0436 9.89583 11.9555 12.2374 8.51573 13.3648C5.07606 12.2374 2.98799 9.89584 2.14596 7.61316C1.26392 5.22203 1.7848 3.13022 3.15951 2.25042L3.15951 2.25042C4.58542 1.33783 5.64997 1.52983 6.39945 1.92503C7.21272 2.35388 7.73108 3.07114 7.86143 3.26838L8.51573 4.25838L9.17002 3.26838C9.30038 3.07113 9.81873 2.35388 10.632 1.92503C11.3815 1.52983 12.446 1.33783 13.8719 2.25042Z\",\n stroke: s || \"#A0A3AD\",\n strokeWidth: \"1.56855\"\n }), /* @__PURE__ */ q.jsx(\"mask\", {\n id: \"path-2-inside-1_187_1051\",\n fill: \"white\",\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M8.58444 13.9397C7.76139 13.6864 7.05334 13.3937 6.29976 12.9825C5.95633 12.7951 5.62285 12.5895 5.3003 12.3681C5.14416 12.2609 4.99108 12.1493 4.84063 12.0343C4.78132 11.9889 4.88038 12.0652 4.82156 12.0195C4.80388 12.0058 4.7863 11.9919 4.76869 11.9781C4.73364 11.9505 4.69884 11.9225 4.66413 11.8945C4.58948 11.8342 4.51582 11.7727 4.4428 11.7105C3.90499 11.252 3.41381 10.7389 2.98016 10.1809C3.01856 10.2303 2.97651 10.176 2.97064 10.1683C2.9583 10.1522 2.94604 10.1359 2.9338 10.1197C2.90939 10.0874 2.88527 10.0548 2.86126 10.0221C2.80961 9.95189 2.75908 9.8808 2.70932 9.8092C2.61492 9.67345 2.52441 9.535 2.4371 9.39457C2.2673 9.12145 2.11213 8.83926 1.97147 8.55006C1.93849 8.48228 1.90657 8.41396 1.87531 8.34537C1.85978 8.3113 1.84459 8.27709 1.82948 8.24284C1.82195 8.22575 1.81456 8.20864 1.80714 8.19152C1.80167 8.17889 1.76856 8.10061 1.79664 8.16736C1.73728 8.0262 1.68205 7.88329 1.63029 7.73916C1.52982 7.45942 1.44498 7.17407 1.37575 6.88502C1.34218 6.74492 1.31301 6.60379 1.28746 6.46202C1.2754 6.39502 1.2645 6.32782 1.2543 6.26052C1.24925 6.22713 1.24453 6.19369 1.23994 6.16023C1.25136 6.24358 1.23495 6.11772 1.23231 6.09532C1.20042 5.82444 1.18535 5.55158 1.18721 5.27885C1.18811 5.14691 1.19374 5.01501 1.20334 4.88343C1.20788 4.82128 1.21368 4.75922 1.22023 4.69726C1.2235 4.66651 1.22713 4.6358 1.23089 4.60511C1.23278 4.58982 1.23477 4.57457 1.23678 4.5593C1.22562 4.64425 1.23563 4.56956 1.23823 4.55163C1.27428 4.30419 1.32861 4.05943 1.40097 3.82006C1.43614 3.70375 1.47635 3.58899 1.52072 3.47587C1.53125 3.449 1.54219 3.42229 1.55326 3.39564C1.51941 3.47716 1.55889 3.38334 1.56717 3.36464C1.59226 3.30803 1.61886 3.25209 1.64643 3.19664C1.75101 2.98624 1.87476 2.78549 2.01534 2.59724C2.02371 2.58603 2.03221 2.57492 2.04071 2.5638C1.99275 2.62656 2.02446 2.58496 2.03493 2.57169C2.05223 2.54974 2.06993 2.52808 2.08773 2.50653C2.12631 2.45984 2.16629 2.41434 2.20713 2.36962C2.28587 2.28341 2.36926 2.20151 2.456 2.12339C2.49787 2.08568 2.54084 2.0492 2.58443 2.01352C2.60631 1.99561 2.62852 1.97808 2.65084 1.9607C2.58164 2.01466 2.67191 1.94557 2.68962 1.93265C2.83338 1.8277 2.98587 1.7348 3.14013 1.6463C3.54393 1.41459 3.92437 1.25567 4.3831 1.15072C4.47716 1.12921 4.57219 1.11204 4.6676 1.09771C4.74483 1.08611 4.61527 1.10399 4.69217 1.09444C4.71513 1.0916 4.73817 1.08917 4.76119 1.08677C4.81403 1.08124 4.86704 1.07739 4.92007 1.07423C5.10084 1.06348 5.28237 1.06851 5.46252 1.0864C5.48336 1.08846 5.50417 1.09092 5.52495 1.09338C5.59508 1.10167 5.46943 1.08526 5.53899 1.09521C5.57965 1.10103 5.62016 1.10795 5.66059 1.11524C5.74647 1.13073 5.83159 1.1503 5.91604 1.17227C6.0728 1.21311 6.22621 1.26621 6.37595 1.32786C6.31111 1.30115 6.41877 1.34702 6.43584 1.35477C6.46987 1.3702 6.50356 1.38639 6.53714 1.4028C6.60865 1.43779 6.67886 1.47543 6.74817 1.51462C6.87662 1.58723 7.00062 1.66753 7.12092 1.7529C7.14882 1.77271 7.17637 1.79297 7.20383 1.81338C7.21739 1.82348 7.23087 1.8337 7.24432 1.84396C7.29158 1.87992 7.1988 1.80839 7.24529 1.84482C7.30109 1.88853 7.35568 1.93375 7.40949 1.97982C7.50652 2.06288 7.59994 2.15008 7.69053 2.24011C7.84008 2.38879 7.98044 2.54677 8.11149 2.71194C8.12572 2.72987 8.17533 2.79414 8.11485 2.7157C8.12636 2.73065 8.13776 2.74568 8.1491 2.76075C8.1694 2.78769 8.18934 2.81491 8.20905 2.8423C8.23825 2.88286 8.2667 2.92398 8.29429 2.96566C8.40374 3.131 8.6286 3.131 8.73805 2.96566C8.76707 2.92181 8.79712 2.87866 8.82785 2.83598C8.84783 2.80823 8.86819 2.78075 8.88875 2.75344C8.90242 2.73529 8.94928 2.67474 8.88935 2.75214C8.90409 2.73312 8.919 2.71424 8.93399 2.69542C9.0671 2.52834 9.21071 2.36968 9.36261 2.21954C9.45411 2.12907 9.5493 2.04234 9.64732 1.95897C9.69737 1.91641 9.74847 1.87507 9.80017 1.83456C9.7388 1.88263 9.82694 1.81457 9.84213 1.80327C9.87427 1.77937 9.90683 1.75606 9.9396 1.73301C10.0608 1.64773 10.1866 1.56915 10.3159 1.49682C10.3802 1.46084 10.4457 1.42703 10.5119 1.39467C10.5455 1.37823 10.5795 1.36251 10.6136 1.34704C10.6308 1.33926 10.6481 1.33171 10.6654 1.32417C10.6915 1.31296 10.6885 1.3142 10.6564 1.3279C10.6681 1.32303 10.6798 1.31822 10.6916 1.31349C10.8423 1.25235 10.9973 1.20246 11.1548 1.16239C11.2332 1.14248 11.3123 1.12599 11.3918 1.11166C11.4323 1.10435 11.473 1.09815 11.5138 1.09231C11.4471 1.10186 11.5171 1.09226 11.5281 1.09095C11.5559 1.08767 11.5838 1.08499 11.6117 1.0824C11.793 1.06553 11.9757 1.06513 12.1573 1.0771C12.203 1.08011 12.2485 1.08444 12.294 1.08921C12.3172 1.09163 12.3402 1.0945 12.3633 1.09734C12.3036 1.08994 12.3813 1.10022 12.3881 1.10123C12.4921 1.11685 12.5952 1.13785 12.6975 1.16193C13.1586 1.27048 13.5378 1.44037 13.9464 1.67761C14.0904 1.76129 14.2314 1.8507 14.3656 1.9495C14.377 1.95791 14.3884 1.96648 14.3997 1.97503C14.4419 2.00688 14.351 1.93696 14.3926 1.96945C14.4149 1.98683 14.4369 2.00462 14.4588 2.02252C14.5059 2.06115 14.5519 2.1013 14.5971 2.14228C14.6835 2.22073 14.7656 2.30388 14.8439 2.39035C14.8815 2.43176 14.9178 2.47427 14.9534 2.51736C14.9712 2.53891 14.9887 2.56077 15.006 2.58274C15.0384 2.62388 14.9682 2.53335 15 2.575C15.0114 2.58983 15.0225 2.60479 15.0336 2.61978C15.1736 2.80871 15.2946 3.01142 15.3985 3.22224C15.4238 3.27356 15.4477 3.32553 15.4709 3.37782C15.4767 3.39096 15.4824 3.40414 15.4881 3.41734C15.5093 3.46656 15.464 3.35945 15.4845 3.40902C15.4975 3.44013 15.5099 3.47148 15.5221 3.50289C15.5661 3.61632 15.6049 3.73175 15.6398 3.84833C15.7115 4.08832 15.763 4.33416 15.7984 4.58204C15.8064 4.63806 15.7901 4.51842 15.7975 4.57463C15.7995 4.58992 15.8014 4.60521 15.8033 4.6205C15.807 4.6512 15.8104 4.68197 15.8137 4.71273C15.8208 4.77994 15.8264 4.84732 15.8312 4.91474C15.8404 5.04658 15.8447 5.17876 15.8453 5.31093C15.8464 5.58418 15.8287 5.85737 15.7961 6.12862C15.7941 6.14529 15.7919 6.16192 15.7898 6.17856C15.7822 6.23827 15.7983 6.11722 15.7901 6.17697C15.7855 6.21044 15.7806 6.24389 15.7755 6.27731C15.7644 6.35031 15.752 6.4231 15.7388 6.49573C15.7129 6.63769 15.6823 6.7788 15.6484 6.91905C15.5784 7.20843 15.4909 7.49348 15.3897 7.77343C15.3648 7.84232 15.3388 7.9108 15.3121 7.97902C15.2987 8.01338 15.2849 8.0476 15.2711 8.08179C15.2641 8.09896 15.257 8.11604 15.25 8.13315C15.2452 8.14458 15.2405 8.15598 15.2357 8.16738C15.2496 8.13453 15.251 8.13117 15.2399 8.15734C15.1786 8.30137 15.1131 8.44355 15.0443 8.58416C14.9028 8.87351 14.7451 9.15483 14.5745 9.42799C14.4868 9.56844 14.395 9.70634 14.3002 9.84213C14.254 9.90821 14.2069 9.97355 14.1592 10.0385C14.1351 10.0711 14.1108 10.1036 14.0864 10.136C14.0741 10.1522 14.0617 10.1684 14.0494 10.1845C14.0319 10.2073 14.0329 10.2061 14.0522 10.181C14.0439 10.1918 14.0355 10.2025 14.0271 10.2132C13.8135 10.4869 13.5849 10.7488 13.3445 10.9992C13.0948 11.2594 12.8309 11.5058 12.556 11.7391C12.4884 11.7965 12.4199 11.8528 12.3509 11.9086C12.3162 11.9366 12.2812 11.9643 12.2461 11.992C12.2285 12.0058 12.2108 12.0196 12.1931 12.0333C12.2377 11.9987 12.1636 12.0558 12.156 12.0616C12.005 12.1765 11.8508 12.2871 11.6942 12.3941C11.3706 12.6153 11.0348 12.8185 10.6904 13.0055C10.5122 13.1023 10.3313 13.1939 10.1484 13.2815C10.059 13.3243 9.96904 13.3658 9.87868 13.4064C9.8331 13.4269 9.78733 13.4469 9.74151 13.4669C9.7185 13.4769 9.69541 13.4868 9.67233 13.4966C9.6442 13.5086 9.64146 13.5098 9.66417 13.5002C9.64864 13.5067 9.63313 13.5132 9.61758 13.5196C9.2349 13.6788 8.84398 13.8179 8.44786 13.9398C8.31409 13.9809 8.2304 14.1178 8.26839 14.2559C8.3047 14.3878 8.45064 14.4765 8.5845 14.4353C10.1534 13.9525 11.626 13.1871 12.8857 12.131C13.9425 11.245 14.8349 10.1456 15.4543 8.91165C15.9942 7.83608 16.3357 6.64744 16.3583 5.43967C16.3774 4.41628 16.149 3.35704 15.5742 2.49789C15.2929 2.07732 14.9371 1.71816 14.5205 1.43134C13.7956 0.932295 12.9294 0.592822 12.045 0.557214C10.7717 0.505949 9.60126 1.17157 8.7697 2.09685C8.59779 2.28813 8.43634 2.49172 8.29431 2.70629C8.44223 2.70629 8.59015 2.70629 8.73807 2.70629C8.22434 1.93023 7.48255 1.25338 6.6264 0.880424C5.9305 0.577258 5.18555 0.490164 4.43721 0.617179C3.98766 0.69348 3.55546 0.856508 3.14849 1.05915C2.81945 1.22296 2.50653 1.41842 2.22115 1.65017C1.44904 2.27713 0.973026 3.20995 0.783732 4.17519C0.56509 5.29004 0.68737 6.45381 1.02051 7.53339C1.41084 8.79827 2.09407 9.95916 2.95641 10.9589C3.94757 12.1081 5.19614 13.0306 6.5582 13.6933C7.16712 13.9896 7.8008 14.2362 8.44788 14.4353C8.58174 14.4765 8.72768 14.3878 8.76399 14.2559C8.80189 14.1177 8.71821 13.9809 8.58444 13.9397Z\"\n })\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M8.58444 13.9397C7.76139 13.6864 7.05334 13.3937 6.29976 12.9825C5.95633 12.7951 5.62285 12.5895 5.3003 12.3681C5.14416 12.2609 4.99108 12.1493 4.84063 12.0343C4.78132 11.9889 4.88038 12.0652 4.82156 12.0195C4.80388 12.0058 4.7863 11.9919 4.76869 11.9781C4.73364 11.9505 4.69884 11.9225 4.66413 11.8945C4.58948 11.8342 4.51582 11.7727 4.4428 11.7105C3.90499 11.252 3.41381 10.7389 2.98016 10.1809C3.01856 10.2303 2.97651 10.176 2.97064 10.1683C2.9583 10.1522 2.94604 10.1359 2.9338 10.1197C2.90939 10.0874 2.88527 10.0548 2.86126 10.0221C2.80961 9.95189 2.75908 9.8808 2.70932 9.8092C2.61492 9.67345 2.52441 9.535 2.4371 9.39457C2.2673 9.12145 2.11213 8.83926 1.97147 8.55006C1.93849 8.48228 1.90657 8.41396 1.87531 8.34537C1.85978 8.3113 1.84459 8.27709 1.82948 8.24284C1.82195 8.22575 1.81456 8.20864 1.80714 8.19152C1.80167 8.17889 1.76856 8.10061 1.79664 8.16736C1.73728 8.0262 1.68205 7.88329 1.63029 7.73916C1.52982 7.45942 1.44498 7.17407 1.37575 6.88502C1.34218 6.74492 1.31301 6.60379 1.28746 6.46202C1.2754 6.39502 1.2645 6.32782 1.2543 6.26052C1.24925 6.22713 1.24453 6.19369 1.23994 6.16023C1.25136 6.24358 1.23495 6.11772 1.23231 6.09532C1.20042 5.82444 1.18535 5.55158 1.18721 5.27885C1.18811 5.14691 1.19374 5.01501 1.20334 4.88343C1.20788 4.82128 1.21368 4.75922 1.22023 4.69726C1.2235 4.66651 1.22713 4.6358 1.23089 4.60511C1.23278 4.58982 1.23477 4.57457 1.23678 4.5593C1.22562 4.64425 1.23563 4.56956 1.23823 4.55163C1.27428 4.30419 1.32861 4.05943 1.40097 3.82006C1.43614 3.70375 1.47635 3.58899 1.52072 3.47587C1.53125 3.449 1.54219 3.42229 1.55326 3.39564C1.51941 3.47716 1.55889 3.38334 1.56717 3.36464C1.59226 3.30803 1.61886 3.25209 1.64643 3.19664C1.75101 2.98624 1.87476 2.78549 2.01534 2.59724C2.02371 2.58603 2.03221 2.57492 2.04071 2.5638C1.99275 2.62656 2.02446 2.58496 2.03493 2.57169C2.05223 2.54974 2.06993 2.52808 2.08773 2.50653C2.12631 2.45984 2.16629 2.41434 2.20713 2.36962C2.28587 2.28341 2.36926 2.20151 2.456 2.12339C2.49787 2.08568 2.54084 2.0492 2.58443 2.01352C2.60631 1.99561 2.62852 1.97808 2.65084 1.9607C2.58164 2.01466 2.67191 1.94557 2.68962 1.93265C2.83338 1.8277 2.98587 1.7348 3.14013 1.6463C3.54393 1.41459 3.92437 1.25567 4.3831 1.15072C4.47716 1.12921 4.57219 1.11204 4.6676 1.09771C4.74483 1.08611 4.61527 1.10399 4.69217 1.09444C4.71513 1.0916 4.73817 1.08917 4.76119 1.08677C4.81403 1.08124 4.86704 1.07739 4.92007 1.07423C5.10084 1.06348 5.28237 1.06851 5.46252 1.0864C5.48336 1.08846 5.50417 1.09092 5.52495 1.09338C5.59508 1.10167 5.46943 1.08526 5.53899 1.09521C5.57965 1.10103 5.62016 1.10795 5.66059 1.11524C5.74647 1.13073 5.83159 1.1503 5.91604 1.17227C6.0728 1.21311 6.22621 1.26621 6.37595 1.32786C6.31111 1.30115 6.41877 1.34702 6.43584 1.35477C6.46987 1.3702 6.50356 1.38639 6.53714 1.4028C6.60865 1.43779 6.67886 1.47543 6.74817 1.51462C6.87662 1.58723 7.00062 1.66753 7.12092 1.7529C7.14882 1.77271 7.17637 1.79297 7.20383 1.81338C7.21739 1.82348 7.23087 1.8337 7.24432 1.84396C7.29158 1.87992 7.1988 1.80839 7.24529 1.84482C7.30109 1.88853 7.35568 1.93375 7.40949 1.97982C7.50652 2.06288 7.59994 2.15008 7.69053 2.24011C7.84008 2.38879 7.98044 2.54677 8.11149 2.71194C8.12572 2.72987 8.17533 2.79414 8.11485 2.7157C8.12636 2.73065 8.13776 2.74568 8.1491 2.76075C8.1694 2.78769 8.18934 2.81491 8.20905 2.8423C8.23825 2.88286 8.2667 2.92398 8.29429 2.96566C8.40374 3.131 8.6286 3.131 8.73805 2.96566C8.76707 2.92181 8.79712 2.87866 8.82785 2.83598C8.84783 2.80823 8.86819 2.78075 8.88875 2.75344C8.90242 2.73529 8.94928 2.67474 8.88935 2.75214C8.90409 2.73312 8.919 2.71424 8.93399 2.69542C9.0671 2.52834 9.21071 2.36968 9.36261 2.21954C9.45411 2.12907 9.5493 2.04234 9.64732 1.95897C9.69737 1.91641 9.74847 1.87507 9.80017 1.83456C9.7388 1.88263 9.82694 1.81457 9.84213 1.80327C9.87427 1.77937 9.90683 1.75606 9.9396 1.73301C10.0608 1.64773 10.1866 1.56915 10.3159 1.49682C10.3802 1.46084 10.4457 1.42703 10.5119 1.39467C10.5455 1.37823 10.5795 1.36251 10.6136 1.34704C10.6308 1.33926 10.6481 1.33171 10.6654 1.32417C10.6915 1.31296 10.6885 1.3142 10.6564 1.3279C10.6681 1.32303 10.6798 1.31822 10.6916 1.31349C10.8423 1.25235 10.9973 1.20246 11.1548 1.16239C11.2332 1.14248 11.3123 1.12599 11.3918 1.11166C11.4323 1.10435 11.473 1.09815 11.5138 1.09231C11.4471 1.10186 11.5171 1.09226 11.5281 1.09095C11.5559 1.08767 11.5838 1.08499 11.6117 1.0824C11.793 1.06553 11.9757 1.06513 12.1573 1.0771C12.203 1.08011 12.2485 1.08444 12.294 1.08921C12.3172 1.09163 12.3402 1.0945 12.3633 1.09734C12.3036 1.08994 12.3813 1.10022 12.3881 1.10123C12.4921 1.11685 12.5952 1.13785 12.6975 1.16193C13.1586 1.27048 13.5378 1.44037 13.9464 1.67761C14.0904 1.76129 14.2314 1.8507 14.3656 1.9495C14.377 1.95791 14.3884 1.96648 14.3997 1.97503C14.4419 2.00688 14.351 1.93696 14.3926 1.96945C14.4149 1.98683 14.4369 2.00462 14.4588 2.02252C14.5059 2.06115 14.5519 2.1013 14.5971 2.14228C14.6835 2.22073 14.7656 2.30388 14.8439 2.39035C14.8815 2.43176 14.9178 2.47427 14.9534 2.51736C14.9712 2.53891 14.9887 2.56077 15.006 2.58274C15.0384 2.62388 14.9682 2.53335 15 2.575C15.0114 2.58983 15.0225 2.60479 15.0336 2.61978C15.1736 2.80871 15.2946 3.01142 15.3985 3.22224C15.4238 3.27356 15.4477 3.32553 15.4709 3.37782C15.4767 3.39096 15.4824 3.40414 15.4881 3.41734C15.5093 3.46656 15.464 3.35945 15.4845 3.40902C15.4975 3.44013 15.5099 3.47148 15.5221 3.50289C15.5661 3.61632 15.6049 3.73175 15.6398 3.84833C15.7115 4.08832 15.763 4.33416 15.7984 4.58204C15.8064 4.63806 15.7901 4.51842 15.7975 4.57463C15.7995 4.58992 15.8014 4.60521 15.8033 4.6205C15.807 4.6512 15.8104 4.68197 15.8137 4.71273C15.8208 4.77994 15.8264 4.84732 15.8312 4.91474C15.8404 5.04658 15.8447 5.17876 15.8453 5.31093C15.8464 5.58418 15.8287 5.85737 15.7961 6.12862C15.7941 6.14529 15.7919 6.16192 15.7898 6.17856C15.7822 6.23827 15.7983 6.11722 15.7901 6.17697C15.7855 6.21044 15.7806 6.24389 15.7755 6.27731C15.7644 6.35031 15.752 6.4231 15.7388 6.49573C15.7129 6.63769 15.6823 6.7788 15.6484 6.91905C15.5784 7.20843 15.4909 7.49348 15.3897 7.77343C15.3648 7.84232 15.3388 7.9108 15.3121 7.97902C15.2987 8.01338 15.2849 8.0476 15.2711 8.08179C15.2641 8.09896 15.257 8.11604 15.25 8.13315C15.2452 8.14458 15.2405 8.15598 15.2357 8.16738C15.2496 8.13453 15.251 8.13117 15.2399 8.15734C15.1786 8.30137 15.1131 8.44355 15.0443 8.58416C14.9028 8.87351 14.7451 9.15483 14.5745 9.42799C14.4868 9.56844 14.395 9.70634 14.3002 9.84213C14.254 9.90821 14.2069 9.97355 14.1592 10.0385C14.1351 10.0711 14.1108 10.1036 14.0864 10.136C14.0741 10.1522 14.0617 10.1684 14.0494 10.1845C14.0319 10.2073 14.0329 10.2061 14.0522 10.181C14.0439 10.1918 14.0355 10.2025 14.0271 10.2132C13.8135 10.4869 13.5849 10.7488 13.3445 10.9992C13.0948 11.2594 12.8309 11.5058 12.556 11.7391C12.4884 11.7965 12.4199 11.8528 12.3509 11.9086C12.3162 11.9366 12.2812 11.9643 12.2461 11.992C12.2285 12.0058 12.2108 12.0196 12.1931 12.0333C12.2377 11.9987 12.1636 12.0558 12.156 12.0616C12.005 12.1765 11.8508 12.2871 11.6942 12.3941C11.3706 12.6153 11.0348 12.8185 10.6904 13.0055C10.5122 13.1023 10.3313 13.1939 10.1484 13.2815C10.059 13.3243 9.96904 13.3658 9.87868 13.4064C9.8331 13.4269 9.78733 13.4469 9.74151 13.4669C9.7185 13.4769 9.69541 13.4868 9.67233 13.4966C9.6442 13.5086 9.64146 13.5098 9.66417 13.5002C9.64864 13.5067 9.63313 13.5132 9.61758 13.5196C9.2349 13.6788 8.84398 13.8179 8.44786 13.9398C8.31409 13.9809 8.2304 14.1178 8.26839 14.2559C8.3047 14.3878 8.45064 14.4765 8.5845 14.4353C10.1534 13.9525 11.626 13.1871 12.8857 12.131C13.9425 11.245 14.8349 10.1456 15.4543 8.91165C15.9942 7.83608 16.3357 6.64744 16.3583 5.43967C16.3774 4.41628 16.149 3.35704 15.5742 2.49789C15.2929 2.07732 14.9371 1.71816 14.5205 1.43134C13.7956 0.932295 12.9294 0.592822 12.045 0.557214C10.7717 0.505949 9.60126 1.17157 8.7697 2.09685C8.59779 2.28813 8.43634 2.49172 8.29431 2.70629C8.44223 2.70629 8.59015 2.70629 8.73807 2.70629C8.22434 1.93023 7.48255 1.25338 6.6264 0.880424C5.9305 0.577258 5.18555 0.490164 4.43721 0.617179C3.98766 0.69348 3.55546 0.856508 3.14849 1.05915C2.81945 1.22296 2.50653 1.41842 2.22115 1.65017C1.44904 2.27713 0.973026 3.20995 0.783732 4.17519C0.56509 5.29004 0.68737 6.45381 1.02051 7.53339C1.41084 8.79827 2.09407 9.95916 2.95641 10.9589C3.94757 12.1081 5.19614 13.0306 6.5582 13.6933C7.16712 13.9896 7.8008 14.2362 8.44788 14.4353C8.58174 14.4765 8.72768 14.3878 8.76399 14.2559C8.80189 14.1177 8.71821 13.9809 8.58444 13.9397Z\",\n stroke: s || \"#A0A3AD\",\n strokeWidth: \"3.13711\",\n mask: \"url(#path-2-inside-1_187_1051)\"\n })]\n});\nfunction sm({\n onClick: s,\n size: e = 24\n}) {\n return /* @__PURE__ */ q.jsx(\"svg\", {\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n role: \"img\",\n viewBox: \"0 0 16 16\",\n width: e,\n height: e,\n fill: \"#4A4A4A\",\n style: {\n display: \"inline-block\",\n userSelect: \"none\",\n verticalAlign: \"text-bottom\",\n overflow: \"visible\",\n cursor: \"pointer\",\n padding: \"4px\"\n },\n onClick: s,\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z\"\n })\n });\n}\nconst FA = () => Ir, NA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(FA())({\n classes: [\"rect7e5\"]\n}), UA = () => Ir, $A = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(UA())({\n classes: [\"p13mqntt\"]\n}), GA = () => Ir, VA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(GA())({\n classes: [\"p1r47dz2\"]\n}), jA = () => Ir, KA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(jA())({\n classes: [\"cnojpqv\"]\n}), HA = ({\n hash: s,\n reactions: e,\n onComment: t,\n onRecast: r,\n onLike: n,\n isLiked: i\n}) => {\n const {\n client_id: o,\n user: a,\n isAuthenticated: l\n } = ts(), [c, u] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!1), [d, h] = react__WEBPACK_IMPORTED_MODULE_0___default().useState({\n top: 0,\n left: 0\n }), [f, p] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), [y, E] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(i), [b, R] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!1), A = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null), F = react__WEBPACK_IMPORTED_MODULE_0___default().useRef({\n comment: null,\n recast: null,\n like: null\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n E(e.likes.some((H) => H.fid === (a == null ? void 0 : a.fid))), R(e.recasts.some((H) => H.fid === (a == null ? void 0 : a.fid)));\n }, [e, a]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const H = localStorage.getItem(jn.NEYNAR_AUTHENTICATED_USER);\n if (H)\n try {\n p(JSON.parse(H).signer_uuid);\n } catch (K) {\n console.error(\"Error parsing JSON from local storage:\", K), p(null);\n }\n else\n console.warn(\"No NEYNAR_AUTHENTICATED_USER found in local storage.\");\n }, [l]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n (f || l) && c && u(!1);\n }, [f, l, c]);\n const M = async (H, K) => {\n if (f)\n switch (K) {\n case \"comment\":\n if (t)\n t();\n else\n throw new Error(\"No comment handler function provided\");\n break;\n case \"recast\":\n if (r)\n R(r());\n else\n throw new Error(\"No recast handler function provided\");\n break;\n case \"like\":\n if (n)\n E(n());\n else\n throw new Error(\"No like handler function provided\");\n break;\n }\n const j = F.current[K];\n if (j) {\n const C = j.getBoundingClientRect(), k = A.current;\n if (k) {\n const $ = k.getBoundingClientRect();\n h({\n top: C.top - $.height - 10,\n left: C.left + C.width / 2 - $.width / 2\n });\n }\n }\n };\n return /* @__PURE__ */ q.jsxs(NA, {\n children: [c && /* @__PURE__ */ q.jsxs($A, {\n ref: A,\n style: {\n top: d.top,\n left: d.left\n },\n children: [/* @__PURE__ */ q.jsx(VA, {\n children: /* @__PURE__ */ q.jsx(pS, {\n variant: gs.NEYNAR\n })\n }), /* @__PURE__ */ q.jsx(KA, {\n children: /* @__PURE__ */ q.jsx(sm, {\n onClick: () => u(!1),\n size: 16\n })\n })]\n }), /* @__PURE__ */ q.jsx(Ir, {\n style: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\"\n },\n children: /* @__PURE__ */ q.jsxs(Ir, {\n spacingVertical: \"15px\",\n style: {\n display: \"flex\",\n gap: \"42px\"\n },\n children: [/* @__PURE__ */ q.jsx(\"div\", {\n ref: (H) => F.current.comment = H,\n children: /* @__PURE__ */ q.jsx(tm, {\n onClick: (H) => M(H, \"comment\")\n })\n }), /* @__PURE__ */ q.jsx(\"div\", {\n ref: (H) => F.current.recast = H,\n children: /* @__PURE__ */ q.jsx(BA, {\n fill: b ? \"green\" : void 0,\n onClick: (H) => M(H, \"recast\")\n })\n }), /* @__PURE__ */ q.jsx(\"div\", {\n ref: (H) => F.current.like = H,\n children: /* @__PURE__ */ q.jsx(rm, {\n fill: y ? \"red\" : void 0,\n onClick: (H) => M(H, \"like\")\n })\n })]\n })\n })]\n });\n};\nfunction qA({\n onClick: s\n}) {\n return /* @__PURE__ */ q.jsx(\"svg\", {\n style: {\n cursor: \"pointer\"\n },\n width: \"16\",\n height: \"15\",\n viewBox: \"0 0 16 15\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n onClick: (e) => s ? s(e) : void 0,\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M15.2003 7.49063C14.7504 7.49063 14.4504 7.79057 14.4504 8.24048V12.7396C14.4504 13.1895 14.1505 13.4894 13.7006 13.4894H3.20268C2.75277 13.4894 2.45283 13.1895 2.45283 12.7396V8.24048C2.45283 7.79057 2.15289 7.49063 1.70298 7.49063C1.25307 7.49063 0.953125 7.79057 0.953125 8.24048V12.7396C0.953125 14.0143 1.92793 14.9891 3.20268 14.9891H13.7006C14.9753 14.9891 15.9501 14.0143 15.9501 12.7396V8.24048C15.9501 7.79057 15.6502 7.49063 15.2003 7.49063ZM5.97713 4.26627L7.70178 2.54161V9.74018C7.70178 10.1901 8.00172 10.49 8.45163 10.49C8.90155 10.49 9.20149 10.1901 9.20149 9.74018V2.54161L10.9261 4.26627C11.2261 4.56621 11.676 4.56621 11.9759 4.26627C12.2759 3.96633 12.2759 3.51642 11.9759 3.21648L8.97653 0.217073C8.90155 0.142088 8.82656 0.0671031 8.75157 0.0671031C8.6016 -0.00788202 8.37665 -0.00788202 8.15169 0.0671031C8.07671 0.0671031 8.00172 0.142088 7.92674 0.217073L4.92734 3.21648C4.62739 3.51642 4.62739 3.96633 4.92734 4.26627C5.22728 4.56621 5.67719 4.56621 5.97713 4.26627Z\",\n fill: \"#A0A3AD\"\n })\n });\n}\nconst Ic = ({\n url: s\n}) => {\n const [e, t] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!1), r = async (n) => {\n try {\n await navigator.clipboard.writeText(s), t(!0), setTimeout(() => {\n t(!1);\n }, 2e3);\n } catch (i) {\n console.error(\"Failed to copy the text to clipboard:\", i);\n }\n };\n return /* @__PURE__ */ q.jsx(\"div\", {\n children: e ? /* @__PURE__ */ q.jsx(\"svg\", {\n style: {\n cursor: \"pointer\",\n fill: \"green\"\n },\n width: \"16\",\n height: \"15\",\n viewBox: \"0 0 16 15\",\n xmlns: \"http://www.w3.org/2000/svg\",\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M5.99967 12.8136L1.71967 8.53364L0.559673 9.69364L5.99967 15.1336L16.4397 4.69364L15.2797 3.53364L5.99967 12.8136Z\"\n })\n }) : /* @__PURE__ */ q.jsx(qA, {\n onClick: r\n })\n });\n}, WA = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n width: \"10\",\n height: \"10\",\n viewBox: \"0 0 10 10\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n children: [/* @__PURE__ */ q.jsx(\"path\", {\n d: \"M5.85855 0.555664H8.31281M8.31281 0.555664V2.73754M8.31281 0.555664L4.31445 4.11122\",\n stroke: \"#FFFFFF\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M3.31445 1H1.31445C0.762168 1 0.314453 1.44772 0.314453 2V8C0.314453 8.55228 0.762168 9 1.31445 9H7.31445C7.86674 9 8.31445 8.55228 8.31445 8V6H7.31445V8H1.31445V2H3.31445V1Z\",\n fill: \"#FFFFFF\"\n })]\n}), zA = () => /* @__PURE__ */ q.jsx(\"svg\", {\n width: \"10\",\n height: \"14\",\n viewBox: \"0 0 10 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M5.01451 12.5187L4.96833 12.5174L4.93914 12.522C4.93113 12.516 4.92402 12.5087 4.91808 12.5005L4.51231 12.7926L4.91808 12.5005C4.9049 12.4822 4.89824 12.46 4.89913 12.4375L4.89953 12.4275V12.4176V8.81194V8.31194H4.39953H1.8876H1.88753C1.76188 8.31196 1.63853 8.27825 1.53036 8.21433C1.42218 8.1504 1.33315 8.05862 1.27256 7.94854C1.21196 7.83847 1.18203 7.71415 1.18588 7.58856C1.18973 7.46301 1.2272 7.34079 1.29438 7.23466C1.2944 7.23463 1.29442 7.23459 1.29444 7.23456L4.90001 1.54377L4.90567 1.53483L4.91095 1.52567C4.92227 1.50601 4.93988 1.49074 4.96094 1.48232C4.982 1.47389 5.00528 1.47281 5.02703 1.47924L5.02912 1.47985C5.05077 1.48614 5.06969 1.4995 5.08286 1.5178C5.09603 1.53609 5.1027 1.55827 5.1018 1.58079L5.10141 1.59073V1.60067V5.20631V5.70631H5.60141H8.11333H8.1134C8.23905 5.70629 8.3624 5.74 8.47058 5.80392C8.57875 5.86784 8.66778 5.95963 8.72838 6.06971C8.78897 6.17978 8.81891 6.3041 8.81506 6.42969C8.81121 6.55528 8.77371 6.67753 8.70649 6.78369L5.10232 12.4723C5.10219 12.4725 5.10205 12.4727 5.10191 12.4729C5.09255 12.4873 5.07969 12.499 5.06452 12.507C5.04914 12.5152 5.03191 12.5192 5.01451 12.5187Z\",\n stroke: \"#FFFFFF\"\n })\n}), YA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n classes: [\"f1hmcrrf\"]\n}), ZA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"f1ki4il6\"]\n}), XA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"bgnz0ud\"]\n}), JA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n classes: [\"f1gbget9\"]\n}), QA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"f4rwe4i\"]\n}), eI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"f1qellgw\"]\n}), tI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"input\")({\n classes: [\"i1hgxwhi\"]\n}), rI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"s1ahcfax\"]\n}), sI = () => {\n const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (s.current) {\n let e = 0;\n const t = () => {\n e += 6, s.current && (s.current.style.transform = `rotate(${e}deg)`), requestAnimationFrame(t);\n };\n requestAnimationFrame(t);\n }\n }, []), /* @__PURE__ */ q.jsx(\"svg\", {\n ref: s,\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: \"1.5\",\n stroke: \"currentColor\",\n className: \"size-6 text-white\",\n style: {\n width: \"24px\",\n height: \"24px\"\n },\n children: /* @__PURE__ */ q.jsx(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99\"\n })\n });\n};\nfunction nI({\n number: s,\n text: e,\n actionType: t,\n target: r,\n frameUrl: n,\n handleOnClick: i\n}) {\n return /* @__PURE__ */ q.jsxs(YA, {\n onClick: () => i(s),\n children: [e, (t === \"link\" || t === \"post_redirect\" || t === \"mint\") && /* @__PURE__ */ q.jsx(WA, {}), t === \"tx\" && /* @__PURE__ */ q.jsx(zA, {})]\n });\n}\nfunction iI({\n frame: s,\n onFrameBtnPress: e\n}) {\n var h;\n const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(s), [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), l = () => {\n const f = t.buttons.map((p) => /* @__PURE__ */ q.jsx(nI, {\n number: p.index,\n text: p.title,\n actionType: p.action_type,\n target: p.target,\n frameUrl: s.frames_url,\n handleOnClick: (y) => {\n a(!0), e(y, t, r, n).finally(() => a(!1));\n }\n }, p.index));\n return /* @__PURE__ */ q.jsx(XA, {\n children: f\n });\n }, c = (f) => {\n i(f);\n }, u = (f) => {\n try {\n return new URL(f).hostname.replace(\"www.\", \"\");\n } catch {\n return \"\";\n }\n }, d = () => {\n switch (t.image_aspect_ratio) {\n case \"1:1\":\n return {\n aspectRatio: \"1 / 1\"\n };\n case \"1.91:1\":\n return {\n aspectRatio: \"1.91 / 1\"\n };\n default:\n return {\n aspectRatio: \"1.91 / 1\"\n };\n }\n };\n return /* @__PURE__ */ q.jsxs(q.Fragment, {\n children: [/* @__PURE__ */ q.jsxs(ZA, {\n children: [o && /* @__PURE__ */ q.jsx(rI, {\n children: /* @__PURE__ */ q.jsx(sI, {})\n }), t.frames_url && /* @__PURE__ */ q.jsxs(q.Fragment, {\n children: [/* @__PURE__ */ q.jsx(\"a\", {\n href: t.frames_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: {\n width: \"100%\"\n },\n children: /* @__PURE__ */ q.jsx(JA, {\n src: t.image,\n alt: `Frame image for ${t.frames_url}`,\n style: d()\n })\n }), ((h = t.input) == null ? void 0 : h.text) && /* @__PURE__ */ q.jsx(tI, {\n type: \"text\",\n placeholder: t.input.text,\n value: n,\n onChange: (f) => c(f.target.value)\n }), l()]\n })]\n }), t.frames_url && /* @__PURE__ */ q.jsx(QA, {\n children: u(t.frames_url)\n })]\n });\n}\nconst oI = ({\n frame: s,\n onFrameBtnPress: e\n}) => /* @__PURE__ */ q.jsx(eI, {\n children: s ? /* @__PURE__ */ q.jsx(iI, {\n frame: s,\n onFrameBtnPress: e\n }) : /* @__PURE__ */ q.jsx(q.Fragment, {})\n}), aI = ({\n url: s,\n onFrameBtnPress: e,\n initialFrame: t\n}) => {\n const {\n client_id: r,\n showToast: n\n } = ts(), [i] = du(jn.NEYNAR_AUTHENTICATED_USER, null), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(t || null), [u, d] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i ? a(i.signer_uuid) : console.warn(\"No NEYNAR_AUTHENTICATED_USER found in local storage.\");\n }, [i]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n t || (async () => {\n try {\n const y = await lI(`${on}/v2/farcaster/frame/crawl?url=${s}&client_id=${r}`, {\n method: \"GET\"\n });\n if (y.ok) {\n const b = (await y.json()).frame;\n if (Object.keys(b).length === 0)\n throw new Error(\"No frame data available\");\n c(b), d(null);\n } else\n throw new Error(`HTTP error! status: ${y.status}`);\n } catch (y) {\n console.error(`An error occurred: ${y}`), d(`Failed to fetch: ${y.message}`);\n }\n })();\n }, [s, n, t]);\n const h = (p) => {\n if (typeof p != \"object\" || p === null) return !1;\n const y = [\"version\", \"image\", \"buttons\", \"frames_url\"];\n for (const E of y)\n if (!(E in p)) return !1;\n return !(!Array.isArray(p.buttons) || p.buttons.some((E) => typeof E.index != \"number\"));\n }, f = async (p, y, E, b) => {\n try {\n const R = await e(p, y, E, b);\n if (!h(R))\n throw new Error(\"Invalid frame data received\");\n E(R);\n } catch (R) {\n n(xg.Error, `An error occurred while processing the button press: ${R}`);\n }\n };\n return u ? /* @__PURE__ */ q.jsx(\"div\", {\n style: {\n color: \"red\",\n padding: \"10px\",\n border: \"1px solid red\",\n borderRadius: \"5px\"\n },\n children: u\n }) : /* @__PURE__ */ q.jsx(oI, {\n frame: l,\n onFrameBtnPress: f\n });\n};\nfunction lI(s, e, t = 8e3) {\n return Promise.race([an(s, e), new Promise((r, n) => setTimeout(() => n(new Error(\"Request timed out\")), t))]);\n}\nfunction pf(s) {\n const e = Math.min(s, 1e9);\n return e >= 1e9 ? Math.floor(e / 1e8) / 10 + \"B\" : e >= 1e6 ? Math.floor(e / 1e5) / 10 + \"M\" : e >= 1e3 ? Math.floor(e / 100) / 10 + \"K\" : e.toString();\n}\nfunction cI(s) {\n if (!s)\n return console.error(\"Error: Timestamp is undefined or empty.\"), \"Invalid timestamp\";\n const e = new Date(s);\n if (isNaN(e.getTime()))\n return console.error(\"Error: Invalid timestamp provided:\", s), \"Invalid timestamp\";\n const t = /* @__PURE__ */ new Date(), n = new Intl.DateTimeFormat(void 0, {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: !0\n }).format(e).replace(\" \", \"\"), i = t.toDateString() === e.toDateString(), o = new Date(t.setDate(t.getDate() - 1)).toDateString() === e.toDateString();\n if (i)\n return `${n}, today`;\n if (o)\n return `${n}, yesterday`;\n const a = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], l = e.getDate(), c = a[e.getMonth()], u = e.getFullYear(), h = `${c} ${((f) => {\n if (f > 3 && f < 21) return `${f}th`;\n const p = [\"st\", \"nd\", \"rd\"], y = f % 10;\n return `${f}${p[y - 1] || \"th\"}`;\n })(l)} ${u}`;\n return `${n}, ${h}`;\n}\nconst uI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"sxqvxvq\"]\n}), dI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n classes: [\"s3kamov\"]\n}), hI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"m1wrvvhk\"]\n}), fI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"t1lcaq27\"]\n}), gI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"ugtp1wh\"]\n}), pI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"l1dqpn4e\"]\n}), mI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"l1bjnv2t\"]\n}), mf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"e15yf123\"]\n}), yI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"rxra94g\"]\n}), yf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"s1whgqrs\"]\n}), vI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"p\")({\n classes: [\"dz8marf\"]\n}), oa = react__WEBPACK_IMPORTED_MODULE_0___default().memo(({\n username: s,\n displayName: e,\n avatarImgUrl: t,\n text: r = \"\",\n hash: n,\n reactions: i,\n replies: o,\n embeds: a = [],\n frames: l = [],\n channel: c,\n viewerFid: u,\n hasPowerBadge: d,\n isEmbed: h = !0,\n allowReactions: f,\n renderEmbeds: p,\n renderFrames: y,\n onLikeBtnPress: E,\n onRecastBtnPress: b,\n onCommentBtnPress: R,\n onFrameBtnPress: A,\n direct_replies: F,\n containerStyles: M,\n textStyles: H,\n timestamp: K,\n appAvatarImgUrl: j\n}) => {\n const [C, k] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(i.likes_count), [$, W] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(i.likes.some((V) => V.fid === u)), _ = /* @__PURE__ */ q.jsx(mI, {\n children: ES(r, a)\n }), g = (a == null ? void 0 : a.length) === 1, x = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => l.map((V) => V.frames_url), [l]), w = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => a.filter((V) => !x.includes(V.url)), [a, x]), D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((V) => {\n V.currentTarget.src = bi;\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n W(i.likes.some((V) => V.fid === u));\n }, [i.likes, u]);\n const O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => E && E() ? (k((L) => L + 1), W(!$), !0) : !1, [E]), U = OA(w, f, u);\n return /* @__PURE__ */ q.jsx(uI, {\n style: {\n ...M,\n borderWidth: h ? \"1px\" : \"0\"\n },\n children: /* @__PURE__ */ q.jsxs(Pr, {\n children: [/* @__PURE__ */ q.jsx(Ir, {\n spacingRight: \"10px\",\n children: /* @__PURE__ */ q.jsx(Yo, {\n src: t && t.length > 0 ? t : bi,\n width: \"20px\",\n height: \"20px\",\n onError: D,\n loading: \"lazy\",\n alt: `${e ?? \"Skeleton\"} Avatar`\n })\n }), /* @__PURE__ */ q.jsxs(hI, {\n children: [/* @__PURE__ */ q.jsxs(Pr, {\n flexGrow: 1,\n alignItems: \"center\",\n children: [/* @__PURE__ */ q.jsxs(Pr, {\n children: [/* @__PURE__ */ q.jsx(vI, {\n children: e\n }), \" \", j && /* @__PURE__ */ q.jsx(Ir, {\n spacingLeft: \"5px\",\n children: /* @__PURE__ */ q.jsx(\"img\", {\n style: {\n padding: \"2px\",\n borderWidth: \"0.5px\"\n },\n className: \"border-white rounded-full\",\n src: j,\n width: \"18\",\n height: \"18\",\n onError: (V) => {\n V.currentTarget.style.display = \"none\";\n }\n })\n })]\n }), /* @__PURE__ */ q.jsxs(Pr, {\n alignItems: \"center\",\n children: [/* @__PURE__ */ q.jsxs(gI, {\n children: [\"@\", s, \" ·\"]\n }), \" \", /* @__PURE__ */ q.jsx(fI, {\n style: {\n color: \"#999999\",\n fontSize: \"14px\",\n fontFamily: \"Work Sans\"\n },\n children: cI(K)\n })]\n })]\n }), /* @__PURE__ */ q.jsx(Ir, {\n style: {\n marginTop: \"10px\"\n },\n children: /* @__PURE__ */ q.jsx(pI, {\n style: H,\n children: _\n })\n }), p && w && w.length > 0 ? /* @__PURE__ */ q.jsx(mf, {\n style: {\n margin: g ? \"4px 0\" : \"0\"\n },\n children: U.map((V, L) => /* @__PURE__ */ q.jsx(\"div\", {\n style: {\n width: \"100%\"\n },\n children: V\n }, L))\n }) : /* @__PURE__ */ q.jsx(q.Fragment, {}), y && l && l.length > 0 ? /* @__PURE__ */ q.jsx(mf, {\n children: l.map((V) => /* @__PURE__ */ q.jsx(aI, {\n url: V.frames_url,\n initialFrame: V,\n onFrameBtnPress: A\n }, V.frames_url))\n }) : null, /* @__PURE__ */ q.jsxs(yI, {\n style: {\n justifyContent: f ? \"space-between\" : \"flex-end\"\n },\n children: [f && /* @__PURE__ */ q.jsx(HA, {\n hash: n,\n reactions: i,\n onComment: R,\n onRecast: b,\n onLike: O,\n isLiked: $\n }), f && s && n && /* @__PURE__ */ q.jsx(Ic, {\n url: `https://farcaster.xyz/${s}/${n.slice(0, 10)}`\n })]\n }), /* @__PURE__ */ q.jsxs(yf, {\n style: {\n justifyContent: f ? \"\" : \"space-between\",\n marginTop: \"10px\"\n },\n children: [/* @__PURE__ */ q.jsxs(yf, {\n style: {\n justifyContent: f ? \"\" : \"space-between\",\n gap: 6\n },\n children: [/* @__PURE__ */ q.jsxs(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n color: \"#999999\"\n },\n children: [/* @__PURE__ */ q.jsx(tm, {}), o]\n }), /* @__PURE__ */ q.jsx(\"div\", {\n style: {\n padding: \"0px 10px\"\n }\n }), /* @__PURE__ */ q.jsxs(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n color: \"#999999\"\n },\n children: [/* @__PURE__ */ q.jsx(rm, {}), \" \", C]\n }), c && /* @__PURE__ */ q.jsxs(q.Fragment, {\n children: [/* @__PURE__ */ q.jsx(\"div\", {}), /* @__PURE__ */ q.jsxs(dI, {\n href: `https://farcaster.xyz/~/channel/${c.id}`,\n target: \"_blank\",\n children: [\"/\", c.id]\n })]\n })]\n }), !f && s && n && /* @__PURE__ */ q.jsx(Ic, {\n url: `https://farcaster.xyz/${s}/${n.slice(0, 10)}`\n })]\n })]\n })]\n })\n });\n}), EI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"s1m6ob1a\"]\n}), vf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"r1esevc7\"]\n}), Ef = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"vxb1f00\"]\n}), xI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"htv0qz7\"]\n}), xf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"rzksy2\"]\n});\nfunction SI(s) {\n return /* @__PURE__ */ q.jsx(EI, {\n children: s.casts.map((e, t) => /* @__PURE__ */ q.jsxs(vf, {\n children: [t !== 0 && /* @__PURE__ */ q.jsx(Ef, {\n style: {\n left: \"42px\"\n }\n }), /* @__PURE__ */ q.jsxs(xf, {\n children: [/* @__PURE__ */ q.jsx(oa, {\n isEmbed: !1,\n ...e\n }), t === 0 && /* @__PURE__ */ q.jsx(xI, {}), e.direct_replies && e.direct_replies.length > 0 && e.direct_replies.map((r, n) => /* @__PURE__ */ q.jsxs(vf, {\n children: [/* @__PURE__ */ q.jsx(Ef, {\n style: {\n left: \"42px\"\n }\n }), /* @__PURE__ */ q.jsx(xf, {\n children: /* @__PURE__ */ q.jsx(oa, {\n isEmbed: !1,\n ...r\n })\n })]\n }, n))]\n })]\n }, t))\n });\n}\nasync function bI({\n type: s,\n identifier: e,\n replyDepth: t = 2,\n includeChronologicalParentCasts: r = !1,\n limit: n = 20,\n viewerFid: i,\n clientId: o\n}) {\n try {\n let a = `${on}/v2/farcaster/cast/conversation?identifier=${encodeURIComponent(e)}&type=${s}&reply_depth=${t}&include_chronological_parent_casts=${r}&limit=${n}&client_id=${o}`;\n return i && (a += `&viewer_fid=${i}`), await (await an(a, {\n method: \"GET\",\n headers: {\n accept: \"application/json\"\n }\n })).json() || null;\n } catch (a) {\n return console.error(\"Error fetching conversation\", a), null;\n }\n}\nfunction nm(s) {\n return {\n username: s.author.username,\n displayName: s.author.display_name,\n avatarImgUrl: s.author.pfp_url,\n text: s.text,\n hash: s.hash,\n reactions: s.reactions,\n replies: s.replies.count,\n embeds: s.embeds,\n frames: s.frames,\n renderEmbeds: s.renderEmbeds,\n channel: s.channel,\n viewerFid: 2,\n hasPowerBadge: s.author.power_badge,\n appAvatarImgUrl: s.app.pfp_url,\n isOwnProfile: !1,\n allowReactions: !0,\n renderFrames: !1,\n direct_replies: s.direct_replies ? s.direct_replies.map(nm) : [],\n timestamp: s.timestamp\n };\n}\nfunction TI(s) {\n const e = [];\n return s.cast && e.push(nm(s.cast)), e;\n}\nconst mR = ({\n type: s,\n identifier: e,\n replyDepth: t = 2,\n includeChronologicalParentCasts: r = !1,\n limit: n = 20,\n viewerFid: i\n}) => {\n const {\n client_id: o\n } = ts(), [a, l] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), [c, u] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!0), [d, h] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null);\n return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n u(!0), h(null), bI({\n type: s,\n identifier: e,\n replyDepth: t,\n includeChronologicalParentCasts: r,\n limit: n,\n viewerFid: i,\n clientId: o\n }).then((f) => {\n l(f);\n }).catch((f) => {\n h(f);\n }).finally(() => {\n u(!1);\n });\n }, [s, e, t, r, n, i, o]), c ? /* @__PURE__ */ q.jsx(q.Fragment, {\n children: \" \"\n }) : d ? /* @__PURE__ */ q.jsx(q.Fragment, {\n children: \" \"\n }) : /* @__PURE__ */ q.jsx(SI, {\n casts: TI(a.conversation)\n });\n};\nvar Ol = { exports: {} }, Bl = {};\n/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar Sf;\nfunction wI() {\n if (Sf) return Bl;\n Sf = 1;\n var s = (react__WEBPACK_IMPORTED_MODULE_0___default());\n function e(d, h) {\n return d === h && (d !== 0 || 1 / d === 1 / h) || d !== d && h !== h;\n }\n var t = typeof Object.is == \"function\" ? Object.is : e, r = s.useState, n = s.useEffect, i = s.useLayoutEffect, o = s.useDebugValue;\n function a(d, h) {\n var f = h(), p = r({ inst: { value: f, getSnapshot: h } }), y = p[0].inst, E = p[1];\n return i(\n function() {\n y.value = f, y.getSnapshot = h, l(y) && E({ inst: y });\n },\n [d, f, h]\n ), n(\n function() {\n return l(y) && E({ inst: y }), d(function() {\n l(y) && E({ inst: y });\n });\n },\n [d]\n ), o(f), f;\n }\n function l(d) {\n var h = d.getSnapshot;\n d = d.value;\n try {\n var f = h();\n return !t(d, f);\n } catch {\n return !0;\n }\n }\n function c(d, h) {\n return h();\n }\n var u = typeof window > \"u\" || typeof window.document > \"u\" || typeof window.document.createElement > \"u\" ? c : a;\n return Bl.useSyncExternalStore = s.useSyncExternalStore !== void 0 ? s.useSyncExternalStore : u, Bl;\n}\nvar bf;\nfunction AI() {\n return bf || (bf = 1, Ol.exports = wI()), Ol.exports;\n}\nvar im = AI();\nconst om = 0, am = 1, lm = 2, Tf = 3;\nvar wf = Object.prototype.hasOwnProperty;\nfunction _c(s, e) {\n var t, r;\n if (s === e) return !0;\n if (s && e && (t = s.constructor) === e.constructor) {\n if (t === Date) return s.getTime() === e.getTime();\n if (t === RegExp) return s.toString() === e.toString();\n if (t === Array) {\n if ((r = s.length) === e.length)\n for (; r-- && _c(s[r], e[r]); ) ;\n return r === -1;\n }\n if (!t || typeof s == \"object\") {\n r = 0;\n for (t in s)\n if (wf.call(s, t) && ++r && !wf.call(e, t) || !(t in e) || !_c(s[t], e[t])) return !1;\n return Object.keys(e).length === r;\n }\n }\n return s !== s && e !== e;\n}\nconst qr = /* @__PURE__ */ new WeakMap(), Cs = () => {\n}, qt = (\n /*#__NOINLINE__*/\n Cs()\n), Rc = Object, $e = (s) => s === qt, Mr = (s) => typeof s == \"function\", Bs = (s, e) => ({\n ...s,\n ...e\n}), cm = (s) => Mr(s.then), Fl = {}, oo = {}, Fu = \"undefined\", Pi = typeof window != Fu, Lc = typeof document != Fu, II = Pi && \"Deno\" in window, _I = () => Pi && typeof window.requestAnimationFrame != Fu, _s = (s, e) => {\n const t = qr.get(s);\n return [\n // Getter\n () => !$e(e) && s.get(e) || Fl,\n // Setter\n (r) => {\n if (!$e(e)) {\n const n = s.get(e);\n e in oo || (oo[e] = n), t[5](e, Bs(n, r), n || Fl);\n }\n },\n // Subscriber\n t[6],\n // Get server cache snapshot\n () => !$e(e) && e in oo ? oo[e] : !$e(e) && s.get(e) || Fl\n ];\n};\nlet Cc = !0;\nconst RI = () => Cc, [kc, Dc] = Pi && window.addEventListener ? [\n window.addEventListener.bind(window),\n window.removeEventListener.bind(window)\n] : [\n Cs,\n Cs\n], LI = () => {\n const s = Lc && document.visibilityState;\n return $e(s) || s !== \"hidden\";\n}, CI = (s) => (Lc && document.addEventListener(\"visibilitychange\", s), kc(\"focus\", s), () => {\n Lc && document.removeEventListener(\"visibilitychange\", s), Dc(\"focus\", s);\n}), kI = (s) => {\n const e = () => {\n Cc = !0, s();\n }, t = () => {\n Cc = !1;\n };\n return kc(\"online\", e), kc(\"offline\", t), () => {\n Dc(\"online\", e), Dc(\"offline\", t);\n };\n}, DI = {\n isOnline: RI,\n isVisible: LI\n}, PI = {\n initFocus: CI,\n initReconnect: kI\n}, Af = !(react__WEBPACK_IMPORTED_MODULE_0___default().useId), Ti = !Pi || II, MI = (s) => _I() ? window.requestAnimationFrame(s) : setTimeout(s, 1), So = Ti ? react__WEBPACK_IMPORTED_MODULE_0__.useEffect : react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect, Nl = typeof navigator < \"u\" && navigator.connection, If = !Ti && Nl && ([\n \"slow-2g\",\n \"2g\"\n].includes(Nl.effectiveType) || Nl.saveData), ao = /* @__PURE__ */ new WeakMap(), OI = (s) => Rc.prototype.toString.call(s), Ul = (s, e) => s === `[object ${e}]`;\nlet BI = 0;\nconst Pc = (s) => {\n const e = typeof s, t = OI(s), r = Ul(t, \"Date\"), n = Ul(t, \"RegExp\"), i = Ul(t, \"Object\");\n let o, a;\n if (Rc(s) === s && !r && !n) {\n if (o = ao.get(s), o) return o;\n if (o = ++BI + \"~\", ao.set(s, o), Array.isArray(s)) {\n for (o = \"@\", a = 0; a < s.length; a++)\n o += Pc(s[a]) + \",\";\n ao.set(s, o);\n }\n if (i) {\n o = \"#\";\n const l = Rc.keys(s).sort();\n for (; !$e(a = l.pop()); )\n $e(s[a]) || (o += a + \":\" + Pc(s[a]) + \",\");\n ao.set(s, o);\n }\n } else\n o = r ? s.toJSON() : e == \"symbol\" ? s.toString() : e == \"string\" ? JSON.stringify(s) : \"\" + s;\n return o;\n}, wi = (s) => {\n if (Mr(s))\n try {\n s = s();\n } catch {\n s = \"\";\n }\n const e = s;\n return s = typeof s == \"string\" ? s : (Array.isArray(s) ? s.length : s) ? Pc(s) : \"\", [\n s,\n e\n ];\n};\nlet FI = 0;\nconst Mc = () => ++FI;\nasync function um(...s) {\n const [e, t, r, n] = s, i = Bs({\n populateCache: !0,\n throwOnError: !0\n }, typeof n == \"boolean\" ? {\n revalidate: n\n } : n || {});\n let o = i.populateCache;\n const a = i.rollbackOnError;\n let l = i.optimisticData;\n const c = (h) => typeof a == \"function\" ? a(h) : a !== !1, u = i.throwOnError;\n if (Mr(t)) {\n const h = t, f = [], p = e.keys();\n for (const y of p)\n // Skip the special useSWRInfinite and useSWRSubscription keys.\n !/^\\$(inf|sub)\\$/.test(y) && h(e.get(y)._k) && f.push(y);\n return Promise.all(f.map(d));\n }\n return d(t);\n async function d(h) {\n const [f] = wi(h);\n if (!f) return;\n const [p, y] = _s(e, f), [E, b, R, A] = qr.get(e), F = () => {\n const g = E[f];\n return (Mr(i.revalidate) ? i.revalidate(p().data, h) : i.revalidate !== !1) && (delete R[f], delete A[f], g && g[0]) ? g[0](lm).then(() => p().data) : p().data;\n };\n if (s.length < 3)\n return F();\n let M = r, H, K = !1;\n const j = Mc();\n b[f] = [\n j,\n 0\n ];\n const C = !$e(l), k = p(), $ = k.data, W = k._c, _ = $e(W) ? $ : W;\n if (C && (l = Mr(l) ? l(_, $) : l, y({\n data: l,\n _c: _\n })), Mr(M))\n try {\n M = M(_);\n } catch (g) {\n H = g, K = !0;\n }\n if (M && cm(M))\n if (M = await M.catch((g) => {\n H = g, K = !0;\n }), j !== b[f][0]) {\n if (K) throw H;\n return M;\n } else K && C && c(H) && (o = !0, y({\n data: _,\n _c: qt\n }));\n if (o && !K)\n if (Mr(o)) {\n const g = o(M, _);\n y({\n data: g,\n error: qt,\n _c: qt\n });\n } else\n y({\n data: M,\n error: qt,\n _c: qt\n });\n if (b[f][1] = Mc(), Promise.resolve(F()).then(() => {\n y({\n _c: qt\n });\n }), K) {\n if (u) throw H;\n return;\n }\n return M;\n }\n}\nconst _f = (s, e) => {\n for (const t in s)\n s[t][0] && s[t][0](e);\n}, NI = (s, e) => {\n if (!qr.has(s)) {\n const t = Bs(PI, e), r = /* @__PURE__ */ Object.create(null), n = um.bind(qt, s);\n let i = Cs;\n const o = /* @__PURE__ */ Object.create(null), a = (u, d) => {\n const h = o[u] || [];\n return o[u] = h, h.push(d), () => h.splice(h.indexOf(d), 1);\n }, l = (u, d, h) => {\n s.set(u, d);\n const f = o[u];\n if (f)\n for (const p of f)\n p(d, h);\n }, c = () => {\n if (!qr.has(s) && (qr.set(s, [\n r,\n /* @__PURE__ */ Object.create(null),\n /* @__PURE__ */ Object.create(null),\n /* @__PURE__ */ Object.create(null),\n n,\n l,\n a\n ]), !Ti)) {\n const u = t.initFocus(setTimeout.bind(qt, _f.bind(qt, r, om))), d = t.initReconnect(setTimeout.bind(qt, _f.bind(qt, r, am)));\n i = () => {\n u && u(), d && d(), qr.delete(s);\n };\n }\n };\n return c(), [\n s,\n n,\n c,\n i\n ];\n }\n return [\n s,\n qr.get(s)[4]\n ];\n}, UI = (s, e, t, r, n) => {\n const i = t.errorRetryCount, o = n.retryCount, a = ~~((Math.random() + 0.5) * (1 << (o < 8 ? o : 8))) * t.errorRetryInterval;\n !$e(i) && o > i || setTimeout(r, a, n);\n}, $I = _c, [Nu, GI] = NI(/* @__PURE__ */ new Map()), VI = Bs(\n {\n // events\n onLoadingSlow: Cs,\n onSuccess: Cs,\n onError: Cs,\n onErrorRetry: UI,\n onDiscarded: Cs,\n // switches\n revalidateOnFocus: !0,\n revalidateOnReconnect: !0,\n revalidateIfStale: !0,\n shouldRetryOnError: !0,\n // timeouts\n errorRetryInterval: If ? 1e4 : 5e3,\n focusThrottleInterval: 5 * 1e3,\n dedupingInterval: 2 * 1e3,\n loadingTimeout: If ? 5e3 : 3e3,\n // providers\n compare: $I,\n isPaused: () => !1,\n cache: Nu,\n mutate: GI,\n fallback: {}\n },\n // use web preset by default\n DI\n), jI = (s, e) => {\n const t = Bs(s, e);\n if (e) {\n const { use: r, fallback: n } = s, { use: i, fallback: o } = e;\n r && i && (t.use = r.concat(i)), n && o && (t.fallback = Bs(n, o));\n }\n return t;\n}, KI = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({}), dm = \"$inf$\", hm = Pi && window.__SWR_DEVTOOLS_USE__, HI = hm ? window.__SWR_DEVTOOLS_USE__ : [], qI = () => {\n hm && (window.__SWR_DEVTOOLS_REACT__ = (react__WEBPACK_IMPORTED_MODULE_0___default()));\n}, fm = (s) => Mr(s[1]) ? [\n s[0],\n s[1],\n s[2] || {}\n] : [\n s[0],\n null,\n (s[1] === null ? s[2] : s[1]) || {}\n], WI = () => {\n const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(KI);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => Bs(VI, s), [\n s\n ]);\n}, zI = (s) => (e, t, r) => s(e, t && ((...i) => {\n const [o] = wi(e), [, , , a] = qr.get(Nu);\n if (o.startsWith(dm))\n return t(...i);\n const l = a[o];\n return $e(l) ? t(...i) : (delete a[o], l);\n}), r), YI = HI.concat(zI), ZI = (s) => function(...t) {\n const r = WI(), [n, i, o] = fm(t), a = jI(r, o);\n let l = s;\n const { use: c } = a, u = (c || []).concat(YI);\n for (let d = u.length; d--; )\n l = u[d](l);\n return l(n, i || a.fetcher || null, a);\n}, XI = (s, e, t) => {\n const r = e[s] || (e[s] = []);\n return r.push(t), () => {\n const n = r.indexOf(t);\n n >= 0 && (r[n] = r[r.length - 1], r.pop());\n };\n}, JI = (s, e) => (...t) => {\n const [r, n, i] = fm(t), o = (i.use || []).concat(e);\n return s(r, n, {\n ...i,\n use: o\n });\n};\nqI();\nconst $l = (react__WEBPACK_IMPORTED_MODULE_0___default().use) || // This extra generic is to avoid TypeScript mixing up the generic and JSX sytax\n// and emitting an error.\n// We assume that this is only for the `use(thenable)` case, not `use(context)`.\n// https://github.com/facebook/react/blob/aed00dacfb79d17c53218404c52b1c7aa59c4a89/packages/react-server/src/ReactFizzThenable.js#L45\n((s) => {\n switch (s.status) {\n case \"pending\":\n throw s;\n case \"fulfilled\":\n return s.value;\n case \"rejected\":\n throw s.reason;\n default:\n throw s.status = \"pending\", s.then((e) => {\n s.status = \"fulfilled\", s.value = e;\n }, (e) => {\n s.status = \"rejected\", s.reason = e;\n }), s;\n }\n}), Gl = {\n dedupe: !0\n}, Rf = Promise.resolve(qt), QI = (s, e, t) => {\n const { cache: r, compare: n, suspense: i, fallbackData: o, revalidateOnMount: a, revalidateIfStale: l, refreshInterval: c, refreshWhenHidden: u, refreshWhenOffline: d, keepPreviousData: h } = t, [f, p, y, E] = qr.get(r), [b, R] = wi(s), A = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), F = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(b), H = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(e), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(t), j = () => K.current, C = () => j().isVisible() && j().isOnline(), [k, $, W, _] = _s(r, b), g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({}).current, x = $e(o) ? $e(t.fallback) ? qt : t.fallback[b] : o, w = (_e, xe) => {\n for (const Be in g) {\n const ye = Be;\n if (ye === \"data\") {\n if (!n(_e[ye], xe[ye]) && (!$e(_e[ye]) || !n(N, xe[ye])))\n return !1;\n } else if (xe[ye] !== _e[ye])\n return !1;\n }\n return !0;\n }, D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n const _e = !b || !e ? !1 : $e(a) ? j().isPaused() || i ? !1 : l !== !1 : a, xe = (we) => {\n const Ne = Bs(we);\n return delete Ne._k, _e ? {\n isValidating: !0,\n isLoading: !0,\n ...Ne\n } : Ne;\n }, Be = k(), ye = _(), be = xe(Be), Fe = Be === ye ? be : xe(ye);\n let Xe = be;\n return [\n () => {\n const we = xe(k());\n return w(we, Xe) ? (Xe.data = we.data, Xe.isLoading = we.isLoading, Xe.isValidating = we.isValidating, Xe.error = we.error, Xe) : (Xe = we, we);\n },\n () => Fe\n ];\n }, [\n r,\n b\n ]), O = im.useSyncExternalStore((0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (_e) => W(b, (xe, Be) => {\n w(Be, xe) || _e();\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n r,\n b\n ]\n ), D[0], D[1]), U = !A.current, V = f[b] && f[b].length > 0, L = O.data, m = $e(L) ? x && cm(x) ? $l(x) : x : L, v = O.error, P = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(m), N = h ? $e(L) ? $e(P.current) ? m : P.current : L : m, Y = V && !$e(v) ? !1 : U && !$e(a) ? a : j().isPaused() ? !1 : i ? $e(m) ? !1 : l : $e(m) || l, ee = !!(b && e && U && Y), ie = $e(O.isValidating) ? ee : O.isValidating, le = $e(O.isLoading) ? ee : O.isLoading, Te = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n async (_e) => {\n const xe = H.current;\n if (!b || !xe || F.current || j().isPaused())\n return !1;\n let Be, ye, be = !0;\n const Fe = _e || {}, Xe = !y[b] || !Fe.dedupe, we = () => Af ? !F.current && b === M.current && A.current : b === M.current, Ne = {\n isValidating: !1,\n isLoading: !1\n }, dt = () => {\n $(Ne);\n }, Je = () => {\n const it = y[b];\n it && it[1] === ye && delete y[b];\n }, Qe = {\n isValidating: !0\n };\n $e(k().data) && (Qe.isLoading = !0);\n try {\n if (Xe && ($(Qe), t.loadingTimeout && $e(k().data) && setTimeout(() => {\n be && we() && j().onLoadingSlow(b, t);\n }, t.loadingTimeout), y[b] = [\n xe(R),\n Mc()\n ]), [Be, ye] = y[b], Be = await Be, Xe && setTimeout(Je, t.dedupingInterval), !y[b] || y[b][1] !== ye)\n return Xe && we() && j().onDiscarded(b), !1;\n Ne.error = qt;\n const it = p[b];\n if (!$e(it) && // case 1\n (ye <= it[0] || // case 2\n ye <= it[1] || // case 3\n it[1] === 0))\n return dt(), Xe && we() && j().onDiscarded(b), !1;\n const je = k().data;\n Ne.data = n(je, Be) ? je : Be, Xe && we() && j().onSuccess(Be, b, t);\n } catch (it) {\n Je();\n const je = j(), { shouldRetryOnError: B } = je;\n je.isPaused() || (Ne.error = it, Xe && we() && (je.onError(it, b, je), (B === !0 || Mr(B) && B(it)) && (!j().revalidateOnFocus || !j().revalidateOnReconnect || C()) && je.onErrorRetry(it, b, je, (S) => {\n const T = f[b];\n T && T[0] && T[0](Tf, S);\n }, {\n retryCount: (Fe.retryCount || 0) + 1,\n dedupe: !0\n })));\n }\n return be = !1, dt(), !0;\n },\n // `setState` is immutable, and `eventsCallback`, `fnArg`, and\n // `keyValidating` are depending on `key`, so we can exclude them from\n // the deps array.\n //\n // FIXME:\n // `fn` and `config` might be changed during the lifecycle,\n // but they might be changed every render like this.\n // `useSWR('key', () => fetch('/api/'), { suspense: true })`\n // So we omit the values from the deps array\n // even though it might cause unexpected behaviors.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n b,\n r\n ]\n ), De = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n // Use callback to make sure `keyRef.current` returns latest result every time\n (..._e) => um(r, M.current, ..._e),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n if (So(() => {\n H.current = e, K.current = t, $e(L) || (P.current = L);\n }), So(() => {\n if (!b) return;\n const _e = Te.bind(qt, Gl);\n let xe = 0;\n j().revalidateOnFocus && (xe = Date.now() + j().focusThrottleInterval);\n const ye = XI(b, f, (be, Fe = {}) => {\n if (be == om) {\n const Xe = Date.now();\n j().revalidateOnFocus && Xe > xe && C() && (xe = Xe + j().focusThrottleInterval, _e());\n } else if (be == am)\n j().revalidateOnReconnect && C() && _e();\n else {\n if (be == lm)\n return Te();\n if (be == Tf)\n return Te(Fe);\n }\n });\n return F.current = !1, M.current = b, A.current = !0, $({\n _k: R\n }), Y && (y[b] || ($e(m) || Ti ? _e() : MI(_e))), () => {\n F.current = !0, ye();\n };\n }, [\n b\n ]), So(() => {\n let _e;\n function xe() {\n const ye = Mr(c) ? c(k().data) : c;\n ye && _e !== -1 && (_e = setTimeout(Be, ye));\n }\n function Be() {\n !k().error && (u || j().isVisible()) && (d || j().isOnline()) ? Te(Gl).then(xe) : xe();\n }\n return xe(), () => {\n _e && (clearTimeout(_e), _e = -1);\n };\n }, [\n c,\n u,\n d,\n b\n ]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue)(N), i) {\n const _e = b && $e(m);\n if (!Af && Ti && _e)\n throw new Error(\"Fallback data is required when using Suspense in SSR.\");\n _e && (H.current = e, K.current = t, F.current = !1);\n const xe = E[b], Be = !$e(xe) && _e ? De(xe) : Rf;\n if ($l(Be), !$e(v) && _e)\n throw v;\n const ye = _e ? Te(Gl) : Rf;\n !$e(N) && _e && (ye.status = \"fulfilled\", ye.value = !0), $l(ye);\n }\n return {\n mutate: De,\n get data() {\n return g.data = !0, N;\n },\n get error() {\n return g.error = !0, v;\n },\n get isValidating() {\n return g.isValidating = !0, ie;\n },\n get isLoading() {\n return g.isLoading = !0, le;\n }\n };\n}, e_ = ZI(QI), t_ = () => {\n}, r_ = (\n /*#__NOINLINE__*/\n t_()\n), Oc = Object, Lf = (s) => s === r_, s_ = (s) => typeof s == \"function\", lo = /* @__PURE__ */ new WeakMap(), n_ = (s) => Oc.prototype.toString.call(s), Vl = (s, e) => s === `[object ${e}]`;\nlet i_ = 0;\nconst Bc = (s) => {\n const e = typeof s, t = n_(s), r = Vl(t, \"Date\"), n = Vl(t, \"RegExp\"), i = Vl(t, \"Object\");\n let o, a;\n if (Oc(s) === s && !r && !n) {\n if (o = lo.get(s), o) return o;\n if (o = ++i_ + \"~\", lo.set(s, o), Array.isArray(s)) {\n for (o = \"@\", a = 0; a < s.length; a++)\n o += Bc(s[a]) + \",\";\n lo.set(s, o);\n }\n if (i) {\n o = \"#\";\n const l = Oc.keys(s).sort();\n for (; !Lf(a = l.pop()); )\n Lf(s[a]) || (o += a + \":\" + Bc(s[a]) + \",\");\n lo.set(s, o);\n }\n } else\n o = r ? s.toJSON() : e == \"symbol\" ? s.toString() : e == \"string\" ? JSON.stringify(s) : \"\" + s;\n return o;\n}, o_ = (s) => {\n if (s_(s))\n try {\n s = s();\n } catch {\n s = \"\";\n }\n const e = s;\n return s = typeof s == \"string\" ? s : (Array.isArray(s) ? s.length : s) ? Bc(s) : \"\", [\n s,\n e\n ];\n}, a_ = (s) => o_(s ? s(0, null) : null)[0], jl = Promise.resolve(), l_ = (s) => (e, t, r) => {\n const n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), { cache: i, initialSize: o = 1, revalidateAll: a = !1, persistSize: l = !1, revalidateFirstPage: c = !0, revalidateOnMount: u = !1, parallel: d = !1 } = r, [, , , h] = qr.get(Nu);\n let f;\n try {\n f = a_(e), f && (f = dm + f);\n } catch {\n }\n const [p, y, E] = _s(i, f), b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => $e(p()._l) ? o : p()._l, [\n i,\n f,\n o\n ]);\n im.useSyncExternalStore((0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (j) => f ? E(f, () => {\n j();\n }) : () => {\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n i,\n f\n ]\n ), b, b);\n const R = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const j = p()._l;\n return $e(j) ? o : j;\n }, [\n f,\n o\n ]), A = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(R());\n So(() => {\n if (!n.current) {\n n.current = !0;\n return;\n }\n f && y({\n _l: l ? A.current : R()\n });\n }, [\n f,\n i\n ]);\n const F = u && !n.current, M = s(f, async (j) => {\n const C = p()._i, k = p()._r;\n y({\n _r: qt\n });\n const $ = [], W = R(), [_] = _s(i, j), g = _().data, x = [];\n let w = null;\n for (let D = 0; D < W; ++D) {\n const [O, U] = wi(e(D, d ? null : w));\n if (!O)\n break;\n const [V, L] = _s(i, O);\n let m = V().data;\n const v = a || C || $e(m) || c && !D && !$e(g) || F || g && !$e(g[D]) && !r.compare(g[D], m);\n if (t && (typeof k == \"function\" ? k(m, U) : v)) {\n const P = async () => {\n if (!(O in h))\n m = await t(U);\n else {\n const Y = h[O];\n delete h[O], m = await Y;\n }\n L({\n data: m,\n _k: U\n }), $[D] = m;\n };\n d ? x.push(P) : await P();\n } else\n $[D] = m;\n d || (w = m);\n }\n return d && await Promise.all(x.map((D) => D())), y({\n _i: qt\n }), $;\n }, r), H = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n // eslint-disable-next-line func-names\n function(j, C) {\n const k = typeof C == \"boolean\" ? {\n revalidate: C\n } : C || {}, $ = k.revalidate !== !1;\n return f ? ($ && ($e(j) ? y({\n _i: !0,\n _r: k.revalidate\n }) : y({\n _i: !1,\n _r: k.revalidate\n })), arguments.length ? M.mutate(j, {\n ...k,\n revalidate: $\n }) : M.mutate()) : jl;\n },\n // swr.mutate is always the same reference\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n f,\n i\n ]\n ), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (j) => {\n if (!f) return jl;\n const [, C] = _s(i, f);\n let k;\n if (Mr(j) ? k = j(R()) : typeof j == \"number\" && (k = j), typeof k != \"number\") return jl;\n C({\n _l: k\n }), A.current = k;\n const $ = [], [W] = _s(i, f);\n let _ = null;\n for (let g = 0; g < k; ++g) {\n const [x] = wi(e(g, _)), [w] = _s(i, x), D = x ? w().data : qt;\n if ($e(D))\n return H(W().data);\n $.push(D), _ = D;\n }\n return H($);\n },\n // exclude getKey from the dependencies, which isn't allowed to change during the lifecycle\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n f,\n i,\n H,\n R\n ]\n );\n return {\n size: R(),\n setSize: K,\n mutate: H,\n get data() {\n return M.data;\n },\n get error() {\n return M.error;\n },\n get isValidating() {\n return M.isValidating;\n },\n get isLoading() {\n return M.isLoading;\n }\n };\n}, c_ = JI(e_, l_), u_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"sfmkqcr\"]\n}), d_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"hrldtio\"]\n}), h_ = (0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(({\n casts: s,\n cursor: e\n}) => /* @__PURE__ */ q.jsx(u_, {\n children: s.map((t, r) => /* @__PURE__ */ q.jsxs((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n children: [/* @__PURE__ */ q.jsx(oa, {\n isEmbed: !1,\n ...t\n }), r < s.length - 1 && /* @__PURE__ */ q.jsx(d_, {})]\n }, t.hash))\n}));\nfunction f_(s) {\n return s ? s.map((e) => {\n var r, n, i, o, a;\n const t = e != null && e.replies && typeof e.replies == \"object\" ? Number(e.replies.count) || 0 : Number(e == null ? void 0 : e.replies) || 0;\n return {\n username: ((r = e == null ? void 0 : e.author) == null ? void 0 : r.username) ?? \"\",\n displayName: ((n = e == null ? void 0 : e.author) == null ? void 0 : n.display_name) ?? \"\",\n avatarImgUrl: ((i = e == null ? void 0 : e.author) == null ? void 0 : i.pfp_url) ?? \"\",\n text: (e == null ? void 0 : e.text) ?? \"\",\n hash: (e == null ? void 0 : e.hash) ?? \"\",\n reactions: (e == null ? void 0 : e.reactions) ?? [],\n replies: t,\n embeds: (e == null ? void 0 : e.embeds) ?? [],\n frames: (e == null ? void 0 : e.frames) ?? [],\n renderEmbeds: (e == null ? void 0 : e.renderEmbeds) ?? !0,\n channel: (e == null ? void 0 : e.channel) ?? \"\",\n viewerFid: 2,\n hasPowerBadge: ((o = e == null ? void 0 : e.author) == null ? void 0 : o.power_badge) ?? !1,\n appAvatarImgUrl: ((a = e == null ? void 0 : e.app) == null ? void 0 : a.pfp_url) ?? \"\",\n isOwnProfile: !1,\n allowReactions: !0,\n renderFrames: !1,\n timestamp: e.timestamp ?? \"\"\n };\n }) : [];\n}\nconst g_ = (s) => an(s).then(async (e) => await e.json()), p_ = (s, e, t, r, n) => {\n if (e && (!e.casts || !e.casts.length)) return null;\n let i = `${on}/v2/farcaster/feed${t ? \"\" : \"?\"}`;\n const o = new URLSearchParams();\n t && (i += `${t}?`), n && (i += `client_id=${n}`), e && (i += `&cursor=${e.next.cursor}`);\n const a = (l, c) => {\n c != null && !i.includes(`${l}=`) && o.append(l, String(c));\n };\n if (r) {\n Object.entries(r).forEach(([c, u]) => {\n const d = c.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n a(d, u);\n });\n const l = o.toString();\n l && (i += i.includes(\"?\") ? `&${l}` : `?${l}`);\n }\n if (Object.keys(r).length > 1)\n return i;\n}, yR = ({\n path: s,\n ...e\n}) => {\n var f;\n const {\n client_id: t\n } = ts(), r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), {\n data: a,\n error: l,\n size: c,\n setSize: u,\n isValidating: d\n } = c_((p, y) => p_(p, y, s, e, t), g_), h = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (!a) return [];\n const p = a.flatMap((E) => (E == null ? void 0 : E.casts) ?? []), y = Array.from(new Set(p.map((E) => E.hash))).map((E) => p.find((b) => b.hash === E));\n return f_(y);\n }, [a]);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => (o.current && o.current.disconnect(), o.current = new IntersectionObserver((p) => {\n var E, b;\n const [y] = p;\n y.isIntersecting && !n && !d && a && ((b = (E = a[a.length - 1]) == null ? void 0 : E.next) != null && b.cursor) && (i(!0), u(c + 1).then(() => i(!1)));\n }, {\n rootMargin: \"100px\"\n }), r.current && o.current.observe(r.current), () => {\n o.current && o.current.disconnect();\n }), [r.current, n, d, a, c]), l ? /* @__PURE__ */ q.jsx(\"div\", {\n children: \"Error fetching feed data\"\n }) : /* @__PURE__ */ q.jsxs(\"div\", {\n children: [h.length !== 0 ? /* @__PURE__ */ q.jsx(h_, {\n casts: h,\n cursor: \"\"\n }) : /* @__PURE__ */ q.jsx(\"div\", {\n children: (f = a == null ? void 0 : a[0]) == null ? void 0 : f.message\n }), d && /* @__PURE__ */ q.jsxs(\"div\", {\n style: {\n display: \"flex\",\n justifyContent: \"center\",\n padding: \"10px\"\n },\n children: [/* @__PURE__ */ q.jsxs(\"span\", {\n style: {\n animation: \"blink 1.5s infinite\"\n },\n children: [\"Loading\", /* @__PURE__ */ q.jsx(\"span\", {\n className: \"dots\",\n children: \"...\"\n })]\n }), /* @__PURE__ */ q.jsx(\"style\", {\n children: `\n @keyframes blink {\n 0% { opacity: 1; }\n 50% { opacity: 0; }\n 100% { opacity: 1; }\n }\n `\n })]\n }), /* @__PURE__ */ q.jsx(\"div\", {\n ref: r\n })]\n });\n}, m_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n classes: [\"b1bqug8r\"]\n}), y_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n classes: [\"b1mra45w\"]\n}), Cf = \"https://farcaster.xyz\", gm = /(^|\\s)\\/\\w+/g, pm = /@\\w+/g, mm = /((https?:\\/\\/)?([a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})(\\/[^\\s]*)?)/g, kf = new RegExp(`(${gm.source})|(${pm.source})|(${mm.source})`, \"g\"), v_ = (s) => gm.test(s) ? `${Cf}/~/channel${s.trim()}` : pm.test(s) ? `${Cf}/${s.substring(1)}` : mm.test(s) ? s.startsWith(\"http\") ? s : `http://${s}` : \"\", E_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n classes: [\"sby9wa2\"]\n}), x_ = (s) => {\n if (!s) return [];\n const e = [];\n let t = 0, r;\n for (; (r = kf.exec(s)) !== null; ) {\n const n = r.index;\n t < n && e.push(s.slice(t, n));\n const i = v_(r[0]), o = r[0].trim().startsWith(\"/\");\n e.push(/* @__PURE__ */ q.jsx(\"span\", {\n children: /* @__PURE__ */ q.jsx(E_, {\n href: i,\n target: \"_blank\",\n style: o ? {\n marginLeft: 3.5\n } : {},\n children: r[0]\n }, n)\n })), t = kf.lastIndex;\n }\n return t < s.length && e.push(s.slice(t)), e;\n}, S_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"sdahm58\"]\n}), b_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"mziqyxp\"]\n}), T_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"uz7tpmf\"]\n}), w_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"d1rxlwac\"]\n}), A_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"ugc6yqp\"]\n}), Df = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"porjf9a\"]\n}), I_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"ttt7x9x\"]\n}), Pf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"b1wbe9o6\"]\n}), __ = (0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(({\n fid: s,\n username: e,\n displayName: t,\n avatarImgUrl: r,\n bio: n,\n followers: i,\n following: o,\n hasPowerBadge: a,\n isFollowing: l,\n isOwnProfile: c,\n onCast: u,\n containerStyles: d\n}) => {\n const h = x_(n), f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => pf(o), [o]), p = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => pf(i), [i]), y = () => {\n window.open(\"https://farcaster.xyz/~/settings\", \"_blank\");\n }, E = {\n color: d == null ? void 0 : d.color\n };\n return /* @__PURE__ */ q.jsxs(S_, {\n style: d,\n children: [c && u && /* @__PURE__ */ q.jsxs(Pr, {\n alignItems: \"center\",\n justifyContent: \"space-between\",\n spacingBottom: \"20px\",\n children: [/* @__PURE__ */ q.jsxs(A_, {\n children: [\"@\", e]\n }), /* @__PURE__ */ q.jsx(m_, {\n onClick: u,\n children: \"Cast\"\n })]\n }), /* @__PURE__ */ q.jsx(Pr, {\n children: /* @__PURE__ */ q.jsxs(b_, {\n children: [/* @__PURE__ */ q.jsxs(Pr, {\n alignItems: \"center\",\n flexGrow: 1,\n style: {\n gap: \"10px\"\n },\n children: [/* @__PURE__ */ q.jsx(Ir, {\n children: /* @__PURE__ */ q.jsx(Yo, {\n width: \"20px\",\n height: \"20px\",\n src: r ?? bi,\n loading: \"lazy\",\n alt: `${t ?? \"Skeleton\"} Avatar`\n })\n }), /* @__PURE__ */ q.jsx(Pr, {\n children: /* @__PURE__ */ q.jsx(w_, {\n children: t || `!${s}`\n })\n }), /* @__PURE__ */ q.jsxs(Pr, {\n alignItems: \"center\",\n children: [/* @__PURE__ */ q.jsxs(T_, {\n children: [\"@\", e]\n }), l && /* @__PURE__ */ q.jsx(I_, {\n children: \"Follows you\"\n })]\n }), /* @__PURE__ */ q.jsx(Pr, {\n children: c && /* @__PURE__ */ q.jsx(y_, {\n onClick: y,\n children: \"Edit Profile\"\n })\n })]\n }), (h == null ? void 0 : h.length) !== 0 ? /* @__PURE__ */ q.jsx(Pf, {\n children: h\n }) : /* @__PURE__ */ q.jsx(Pf, {\n style: {\n padding: \"26px 0px\"\n }\n }), /* @__PURE__ */ q.jsxs(Pr, {\n style: {\n justifyContent: \"space-between\",\n display: \"flex\",\n alignItems: \"center\"\n },\n children: [/* @__PURE__ */ q.jsxs(Df, {\n children: [/* @__PURE__ */ q.jsx(\"strong\", {\n style: E,\n children: f\n }), \" \", \"Following\"]\n }), /* @__PURE__ */ q.jsxs(Df, {\n children: [/* @__PURE__ */ q.jsx(\"strong\", {\n style: E,\n children: p\n }), \" \", \"Followers\"]\n }), e && /* @__PURE__ */ q.jsx(Ir, {\n style: {\n marginLeft: \"auto\"\n },\n children: /* @__PURE__ */ q.jsx(Ic, {\n url: `https://farcaster.xyz/${e}`\n })\n })]\n })]\n })\n })]\n });\n});\nasync function R_({\n fid: s,\n viewerFid: e,\n clientId: t\n}) {\n var r;\n try {\n let n = `${on}/v2/farcaster/user/bulk?client_id=${t}&fids=${s}`;\n e && (n += `&viewer_fid=${e}`);\n const o = await (await an(n)).json();\n return ((r = o == null ? void 0 : o.users) == null ? void 0 : r[0]) ?? null;\n } catch (n) {\n return console.error(\"Error fetching user by fid\", n), null;\n }\n}\nconst vR = ({\n fid: s,\n viewerFid: e,\n containerStyles: t\n}) => {\n var h;\n const {\n client_id: r\n } = ts(), [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), u = (n == null ? void 0 : n.fid) === e;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n s && (a(!0), c(null), R_({\n fid: s,\n viewerFid: e,\n clientId: r\n }).then((f) => {\n i(f);\n }).catch((f) => {\n c(f);\n }).finally(() => {\n a(!1);\n }));\n }, [s, e]);\n const d = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n }, []);\n return o ? /* @__PURE__ */ q.jsx(\"div\", {\n style: {\n padding: \"20px\"\n },\n children: \"Loading...\"\n }) : !n || l ? /* @__PURE__ */ q.jsx(\"div\", {\n children: \"Error fetching user data\"\n }) : /* @__PURE__ */ q.jsx(__, {\n fid: s,\n username: n.username,\n displayName: n.display_name,\n avatarImgUrl: n.pfp_url,\n bio: n.profile.bio.text,\n followers: n.follower_count,\n following: n.following_count,\n hasPowerBadge: n.power_badge,\n isOwnProfile: u,\n isFollowing: (h = n.viewer_context) == null ? void 0 : h.followed_by,\n onCast: d,\n containerStyles: t\n });\n}, L_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"ul\")({\n classes: [\"d12rx4om\"]\n}), C_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"li\")({\n classes: [\"lrpm6lp\"]\n}), k_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n classes: [\"a1e9hg3b\"]\n}), D_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"u1aqay1i\"]\n}), P_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"d1m0njq\"]\n}), M_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"u1lvlbuo\"]\n}), O_ = ({\n users: s,\n onSelect: e,\n customStyles: t = {}\n}) => /* @__PURE__ */ q.jsx(L_, {\n style: {\n ...t == null ? void 0 : t.dropdown\n },\n children: s.map((r) => /* @__PURE__ */ q.jsxs(C_, {\n style: {\n ...t == null ? void 0 : t.listItem\n },\n onClick: () => e(r),\n children: [/* @__PURE__ */ q.jsx(k_, {\n style: {\n ...t == null ? void 0 : t.avatar\n },\n src: r.pfp_url,\n alt: r.username\n }), /* @__PURE__ */ q.jsxs(D_, {\n style: {\n ...t.userInfo\n },\n children: [/* @__PURE__ */ q.jsx(P_, {\n children: r.display_name\n }), /* @__PURE__ */ q.jsxs(M_, {\n children: [\"@\", r.username]\n })]\n })]\n }, r.fid))\n}), B_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"c9hm20t\"]\n}), F_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"input\")({\n classes: [\"i80sd8h\"]\n});\nasync function N_({\n q: s,\n viewerFid: e,\n client_id: t\n}) {\n var r;\n try {\n let n = `${on}/v2/farcaster/user/search?q=${s}&limit=5${e ? `&viewer_fid=${e}` : \"\"}&client_id=${t}`;\n const o = await (await an(n)).json();\n return ((r = o == null ? void 0 : o.result) == null ? void 0 : r.users) || [];\n } catch {\n return null;\n }\n}\nconst ER = ({\n value: s,\n onChange: e,\n style: t = {},\n placeholder: r = \"Enter username\",\n disabled: n = !1,\n viewerFid: i,\n customStyles: o = {},\n limit: a = null\n}) => {\n const {\n client_id: l\n } = ts(), [c, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [d, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [f, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), y = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const M = (s == null ? void 0 : s.split(\",\")) || [];\n if (!M[M.length - 1]) {\n u(\"\");\n return;\n }\n u(M[M.length - 1].trim());\n }, [s]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c !== \"\" && !/^\\d+$/.test(c) ? E(c) : h(!1);\n }, [c]);\n const E = async (M) => {\n const H = await N_({\n q: M,\n viewerFid: i,\n client_id: l\n });\n H && (p(H), h(!0));\n }, b = (M) => {\n const H = M.target.value;\n e(H);\n }, R = (M) => {\n let H = s.split(\",\");\n a !== null && H.length >= a ? H[H.length - 1] = M.fid.toString() : H.push(M.fid.toString());\n const K = H.join(\",\");\n e(K), u(\"\"), h(!1);\n }, A = () => {\n c && isNaN(Number(c)) && h(!0);\n }, F = () => {\n setTimeout(() => h(!1), 200);\n };\n return /* @__PURE__ */ q.jsxs(B_, {\n style: t,\n children: [/* @__PURE__ */ q.jsx(F_, {\n ref: y,\n type: \"text\",\n value: s,\n onChange: b,\n onFocus: A,\n onBlur: F,\n placeholder: r,\n disabled: n\n }), d && /* @__PURE__ */ q.jsx(O_, {\n users: f,\n onSelect: R,\n customStyles: o\n })]\n });\n}, U_ = ({\n color: s = \"#855DCD\"\n}) => /* @__PURE__ */ q.jsxs(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: s,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n className: \"lucide lucide-search\",\n children: [/* @__PURE__ */ q.jsx(\"circle\", {\n cx: \"11\",\n cy: \"11\",\n r: \"8\"\n }), /* @__PURE__ */ q.jsx(\"path\", {\n d: \"m21 21-4.3-4.3\"\n })]\n}), $_ = ({\n color: s = \"#855DCD\"\n}) => /* @__PURE__ */ q.jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: s,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n className: \"lucide lucide-loader-circle\",\n children: /* @__PURE__ */ q.jsx(\"path\", {\n d: \"M21 12a9 9 0 1 1-6.219-8.56\"\n })\n}), G_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"ig7kcuc\"]\n}), V_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"input\")({\n classes: [\"sh7z7k6\"]\n}), j_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"s14ai203\"]\n}), K_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"if18nd6\"]\n}), H_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"sd833lb\"]\n}), q_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"ugo586m\"]\n}), W_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"ukwty1d\"]\n}), z_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"u77olmy\"]\n}), Y_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"s1xvkxww\"]\n}), Z_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"s1f6b1ja\"]\n}), X_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"udiufd8\"]\n}), J_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"f1b8a2h0\"]\n}), Q_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n classes: [\"l1yq26j0\"]\n}), eR = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"li\")({\n classes: [\"s18mk47k\"]\n}), xR = ({\n width: s,\n height: e,\n selectedUsers: t,\n onSelectUsers: r,\n ...n\n}) => {\n const {\n client_id: i\n } = ts(), {\n user: o,\n isAuthenticated: a\n } = Eg(), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [u, d] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [h, f] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), p = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n function M(H) {\n p.current && !p.current.contains(H.target) && (d([]), c(\"\"));\n }\n return document.addEventListener(\"mousedown\", M), () => {\n document.removeEventListener(\"mousedown\", M);\n };\n }, []);\n const b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(((M, H) => {\n let K;\n return (...j) => {\n clearTimeout(K), K = setTimeout(() => M(...j), H);\n };\n })(async (M, H) => {\n var K;\n if (!M) {\n d([]);\n return;\n }\n f(!0);\n try {\n const C = await (await an(H)).json();\n d(((K = C == null ? void 0 : C.result) == null ? void 0 : K.users) || []);\n } catch (j) {\n console.error(\"Error fetching data:\", j);\n } finally {\n f(!1);\n }\n }, 500), []), R = (M) => {\n const H = `${on}/v2/farcaster/user/search?q=${M.target.value}&client_id=${i}${a ? `&viewer_fid=${o == null ? void 0 : o.fid}` : \"\"})`;\n c(M.target.value), b(M.target.value, H);\n }, A = (M) => {\n t.some((H) => H.username === M.username) || (r([...t, M]), c(\"\"), d([]));\n }, F = (M) => {\n r(t.filter((H) => H.username !== M));\n };\n return /* @__PURE__ */ q.jsxs(G_, {\n ref: p,\n style: {\n width: s\n },\n children: [/* @__PURE__ */ q.jsxs(K_, {\n children: [t.map((M) => /* @__PURE__ */ q.jsxs(H_, {\n children: [/* @__PURE__ */ q.jsx(Yo, {\n src: M.pfp_url ?? bi,\n alt: `${M.username} Avatar`,\n style: {\n width: \"24px\",\n height: \"24px\",\n borderRadius: \"50%\"\n }\n }), /* @__PURE__ */ q.jsx(\"span\", {\n style: {\n marginLeft: \"8px\"\n },\n children: M.display_name\n }), /* @__PURE__ */ q.jsx(sm, {\n size: 20,\n onClick: () => F(M.username)\n })]\n }, M.username)), /* @__PURE__ */ q.jsxs(Y_, {\n children: [/* @__PURE__ */ q.jsx(Z_, {\n children: /* @__PURE__ */ q.jsx(U_, {\n color: \"#855DCD\"\n })\n }), /* @__PURE__ */ q.jsx(V_, {\n ...n,\n value: l,\n onChange: R,\n placeholder: \"Type to search users\",\n style: {\n width: s || \"100%\",\n height: e || \"40px\"\n }\n })]\n })]\n }), h ? /* @__PURE__ */ q.jsx(Q_, {\n children: /* @__PURE__ */ q.jsx($_, {\n color: \"#855DCD\"\n })\n }) : u.length !== 0 && /* @__PURE__ */ q.jsx(j_, {\n children: u.map((M) => /* @__PURE__ */ q.jsxs(eR, {\n onClick: () => A(M),\n children: [/* @__PURE__ */ q.jsx(Yo, {\n src: M.pfp_url ?? bi,\n alt: `${M.username} Avatar`,\n style: {\n width: \"40px\",\n height: \"40px\",\n borderRadius: \"50%\"\n }\n }), /* @__PURE__ */ q.jsxs(q_, {\n children: [/* @__PURE__ */ q.jsx(W_, {\n children: M.display_name\n }), /* @__PURE__ */ q.jsxs(X_, {\n children: [/* @__PURE__ */ q.jsxs(z_, {\n children: [\"@\", M.username]\n }), M.viewer_context && (M.viewer_context.following || M.viewer_context.followed_by) && /* @__PURE__ */ q.jsx(J_, {\n children: M.viewer_context.following && M.viewer_context.followed_by ? \"Following each other\" : M.viewer_context.following ? \"Following\" : M.viewer_context.followed_by ? \"Follows you\" : null\n })]\n })]\n })]\n }, M.username))\n })]\n });\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AbmV5bmFyL3JlYWN0L2Rpc3QvYnVuZGxlLmVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSwwQ0FBMEMsMERBQTBEO0FBQ3BHO0FBQ2tEO0FBQ3lKO0FBQzNNO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7QUFDQSxPQUFPO0FBQ1A7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0EsT0FBTztBQUNQO0FBQ0Esc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDRCQUE0QixrQ0FBa0M7QUFDOUQ7QUFDQTtBQUNBLDRCQUE0QixnQ0FBZ0M7QUFDNUQ7QUFDQTtBQUNBLDRCQUE0QixrQ0FBa0M7QUFDOUQ7QUFDQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0QixrQ0FBa0M7QUFDOUQ7QUFDQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNEJBQTRCLGdDQUFnQztBQUM1RDtBQUNBO0FBQ0EsNEJBQTRCLCtCQUErQjtBQUMzRDtBQUNBO0FBQ0EsNEJBQTRCLGlDQUFpQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDRCQUE0QiwwQkFBMEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNEJBQTRCLHFDQUFxQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxjQUFjO0FBQ3BELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxxQkFBcUI7QUFDM0QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHFCQUFxQjtBQUMzRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbUJBQW1CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxZQUFZLG9CQUFvQixpQ0FBaUMsb0JBQW9CO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQkFBMkI7QUFDMUM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMkJBQTJCO0FBQzlDLHFCQUFxQjtBQUNyQixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMkJBQTJCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixRQUFRO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw2Q0FBNkMsbUJBQW1CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELEVBQUU7QUFDN0Q7QUFDQTtBQUNBLG9EQUFvRCxXQUFXLHNCQUFzQixVQUFVO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLElBQUk7QUFDSjtBQUNBLGVBQWU7QUFDZjtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYixJQUFJLDJEQUEyRCxxQkFBcUIsSUFBSTtBQUN4RjtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSx5REFBeUQsZ0NBQWdDO0FBQ3pGO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCLHVDQUF1Qyx1Q0FBdUM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0EsS0FB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QUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLE9BQU87QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGNBQWM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSwrQkFBK0IsY0FBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxzQ0FBc0MsR0FBRywrQkFBK0I7QUFDeEUsY0FBYztBQUNkLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFFBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDRCQUE0QixLQUFLLGVBQWU7QUFDbkU7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0Esb0JBQW9CLDBCQUEwQixtQkFBbUI7QUFDakUsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxPQUFPO0FBQzdEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0NBQWdDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDhCQUE4QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxJQUFJLGFBQWE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDZDQUE2QztBQUM5QztBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0RBQWdELElBQUk7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGdCQUFnQiwwRkFBMEYsSUFBSTtBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsZ0JBQWdCLHFFQUFxRSxJQUFJO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQkFBZ0IsK0RBQStELElBQUk7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGdCQUFnQix1RUFBdUUsSUFBSTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLFVBQVUsd0JBQXdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBSTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUJBQXFCO0FBQ2pDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxRQUFRLHVCQUF1QjtBQUNyQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0EsWUFBWSwwQkFBMEIsa0JBQWtCLFVBQVU7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sWUFBWTtBQUNaO0FBQ0EsdUNBQXVDLG1CQUFtQjtBQUMxRDtBQUNBLGtEQUFrRCxRQUFRLE9BQU87QUFDakUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxrREFBa0QsUUFBUSxPQUFPO0FBQ2pFLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsT0FBTztBQUM1RSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxjQUFjLHFCQUFxQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLHFCQUFxQjtBQUMxRjtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsS0FBSztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx1QkFBdUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxjQUFjLG9CQUFvQixPQUFPLEtBQUssTUFBTTtBQUMvSDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNB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WTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsUUFBUTtBQUNSLDZCQUE2QixLQUFLO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ05BQWdOLG1CQUFtQjtBQUNuTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1SEFBdUgsZUFBZTtBQUN0STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLEtBQUs7QUFDL0I7QUFDQTtBQUNBLG9EQUFvRCxHQUFHLEdBQUcsYUFBYSx1QkFBdUIsc0RBQXNELEtBQUssd0NBQXdDLFlBQVksa0JBQWtCLHVFQUF1RSxHQUFHLGtCQUFrQixRQUFRO0FBQ25VO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxHQUFHLFFBQVEsVUFBVTtBQUMvRjtBQUNBLDZCQUE2QixLQUFLO0FBQ2xDLGdCQUFnQixtQkFBbUIsNkNBQTZDLEdBQUcsTUFBTSxXQUFXLElBQUksRUFBRTtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUs7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMkJBQTJCLEtBQUs7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMkJBQTJCLEtBQUs7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLDJDQUEyQyxRQUFRLEVBQUUsT0FBTztBQUM1RDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsMkNBQTJDLFFBQVEsRUFBRSxPQUFPO0FBQzVEO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDZCQUE2QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsS0FBSztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBKQUEwSixFQUFFO0FBQzVKLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsRUFBRSxnREFBZ0QsRUFBRTtBQUNoRixNQUFNO0FBQ04sZ0dBQWdHLFVBQVU7QUFDMUc7QUFDQSxJQUFJO0FBQ0o7QUFDQSxnSUFBZ0ksRUFBRTtBQUNsSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLElBQUk7QUFDSix3SUFBd0ksRUFBRTtBQUMxSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDJCQUEyQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsRUFBRSxjQUFjLEdBQUc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxFQUFFLHNDQUFzQyxLQUFLO0FBQzVGO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDBIQUEwSCxRQUFRLEtBQUssRUFBRTtBQUN6STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBzQ0FBMHNDO0FBQzFzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsS0FBSztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsU0FBUyxFQUFFO0FBQzFDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwrQkFBK0IsU0FBUyxFQUFFO0FBQzFDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVU7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUcsT0FBTztBQUNmO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLEtBQUs7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixPQUFPO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsT0FBTztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixPQUFPO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtCQUFrQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsT0FBTztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix3QkFBd0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsT0FBTztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxPQUFPO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLE9BQU87QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1LQUFtSztBQUNuSztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFNBQVM7QUFDdEM7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixVQUFVO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxrQ0FBa0M7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsMEJBQTBCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0EscUhBQXFILE9BQU87QUFDNUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLG1DQUFtQyxRQUFRLGlCQUFpQixFQUFFLEdBQUcsUUFBUTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFVBQVU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOLGdEQUFnRCxTQUFTLE1BQU0sS0FBSyxFQUFFLHVDQUF1QyxLQUFLLHlDQUF5QyxFQUFFLFFBQVE7QUFDcks7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyw4QkFBOEIsR0FBRyxtQkFBbUIsT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRTtBQUMzRjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsU0FBUyxLQUFLLEtBQUs7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5SEFBeUgsYUFBYTtBQUN0STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LDJGQUEyRixHQUFHO0FBQzlGO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLDJGQUEyRixhQUFhO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EscUNBQXFDLEdBQUc7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxnSUFBZ0ksYUFBYSxpR0FBaUcsV0FBVyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7QUFDOVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04saURBQWlELEdBQUcseUJBQXlCLEVBQUUsSUFBSSxNQUFNO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU8scURBQXFELG9CQUFvQjtBQUNoRjtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxhQUFhLFNBQVMsRUFBRTtBQUMzRSx1REFBdUQsRUFBRSxHQUFHLG9DQUFvQyxFQUFFLE1BQU07QUFDeEc7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsZ0VBQWdFLFVBQVU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsR0FBRyw4Q0FBOEMsdURBQXVEO0FBQ25JLGtCQUFrQixFQUFFO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxHQUFHLGtDQUFrQyxHQUFHLE9BQU8sR0FBRyxNQUFNLEVBQUU7QUFDeEc7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxpREFBaUQsR0FBRztBQUNwRDtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsRUFBRSxHQUFHLEVBQUUsYUFBYSxHQUFHO0FBQ2xHO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxHQUFHO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsRUFBRTtBQUNyRCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLG1EQUFtRCxxQkFBcUIsRUFBRSxFQUFFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRixFQUFFLElBQUksWUFBWSxJQUFJLGNBQWMsWUFBWSxnQkFBZ0IsR0FBRyxpQkFBaUI7QUFDdks7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsNkJBQTZCO0FBQ3RHO0FBQ0E7QUFDQSxnQ0FBZ0MsR0FBRyxHQUFHLE1BQU0sT0FBTyxFQUFFO0FBQ3JEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNCQUFzQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsRUFBRTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSw4Q0FBOEM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxFQUFFLE1BQU0sTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNO0FBQ3hHO0FBQ0E7QUFDQSw4QkFBOEIsWUFBWSxFQUFFLGFBQWE7QUFDekQ7QUFDQTtBQUNBLGFBQWEsMEJBQTBCLEdBQUcsYUFBYTtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLFdBQVcsRUFBRTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxlQUFlO0FBQ3hCO0FBQ0EsU0FBUyxVQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFlBQVksR0FBRyxHQUFHLEVBQUU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04scUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtWQUErVjtBQUMvVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsMkNBQTJDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhLElBQUksaURBQWlELEVBQUUsMkJBQTJCLEdBQUcsd0JBQXdCO0FBQ3hJO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYSxJQUFJLGFBQWEsR0FBRyxtQkFBbUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1R0FBdUc7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEtBQUs7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxFQUFFLHlDQUF5QyxFQUFFLHVDQUF1QyxFQUFFO0FBQzNJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsV0FBVztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVDQUF1QztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHNCQUFzQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLLGdEQUFnRDtBQUNyRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUssOENBQThDO0FBQ25EO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssNENBQTRDO0FBQ2pEO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUsseUNBQXlDO0FBQzlDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSywyQ0FBMkM7QUFDaEQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLLDZDQUE2QztBQUNsRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0RBQWdEO0FBQ3JEO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSyx5Q0FBeUM7QUFDOUM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4Q0FBOEM7QUFDbkQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDZDQUE2QztBQUNsRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLGtEQUFrRDtBQUN2RDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUsseUNBQXlDO0FBQzlDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssMENBQTBDO0FBQy9DO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsRUFBRSxNQUFNLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQUk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxFQUFFO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDBCQUEwQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3Q0FBd0MsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixHQUFHLGdCQUFnQixNQUFNO0FBQzdDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsNENBQTRDO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNERBQTRELDhDQUE4QyxnQkFBZ0IsMkJBQTJCLGFBQWEsUUFBUSxHQUFHLGVBQWUsS0FBSyxnQkFBZ0I7QUFDak47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxFQUFFO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLFdBQVc7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwrQkFBK0I7QUFDaEQ7QUFDQSxtQkFBbUIsRUFBRSxTQUFTLEVBQUU7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyx5Q0FBeUMsZUFBZSxvQ0FBb0MsRUFBRSxLQUFLLFNBQVM7QUFDakgsR0FBRyxXQUFXO0FBQ2Q7QUFDQTtBQUNBLDRIQUE0SDtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ1FBQWdRO0FBQ2hRO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEVBQUUsVUFBVSxjQUFjLHNGQUFzRjtBQUM5SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFHQUFxRyxHQUFHLFFBQVEsR0FBRyxLQUFLLEdBQUcsa0JBQWtCLEVBQUU7QUFDL0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxFQUFFLHVCQUF1QixFQUFFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzTEFBc0wsR0FBRyw4R0FBOEcsR0FBRyxvQkFBb0IsR0FBRyxlQUFlLEVBQUU7QUFDbFY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZ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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxHQUFHLEVBQUUsTUFBTTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLEVBQUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsMEZBQTBGLEVBQUU7QUFDNUY7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHdDQUF3QztBQUN6RSxvQkFBb0Isa0lBQWtJO0FBQ3RKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRIQUE0SDtBQUNoSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLEVBQUU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxFQUFFO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsRUFBRTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxFQUFFO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxFQUFFO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxFQUFFO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLHNCQUFzQixLQUFLO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsZUFBZSxHQUFHLDBCQUEwQixFQUFFLGNBQWMsRUFBRSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sYUFBYSxFQUFFO0FBQzNHO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHFEQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUM7QUFDRCxZQUFZLDZDQUFFO0FBQ2QsU0FBUyxnREFBRTtBQUNYO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxFQUFFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EseUdBQXlHLDZDQUE2QztBQUN0SixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxpQkFBaUIsK0NBQUUsY0FBYywrQ0FBRSxlQUFlLCtDQUFFO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pEO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHLHdDQUF3QztBQUMzQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLElBQUksK0RBQStELCtDQUFFLGlCQUFpQiwrQ0FBRSxzQkFBc0IsK0NBQUU7QUFDaEgsRUFBRSxnREFBRTtBQUNKO0FBQ0EsR0FBRyxRQUFRLGdEQUFFO0FBQ2I7QUFDQTtBQUNBLDhCQUE4QixHQUFHLGdDQUFnQyxFQUFFLGFBQWEsRUFBRTtBQUNsRjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGlEQUFpRCxTQUFTO0FBQzFELFFBQVE7QUFDUiw0Q0FBNEMsRUFBRSwwQkFBMEIsVUFBVTtBQUNsRjtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEVBQTBFLEVBQUU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsRUFBRTtBQUNoQjtBQUNBLGNBQWMsRUFBRTtBQUNoQixvS0FBb0ssR0FBRyxFQUFFO0FBQ3pLLG1DQUFtQyxFQUFFO0FBQ3JDO0FBQ0EsY0FBYyxFQUFFLEVBQUUsaUJBQWlCO0FBQ25DLEdBQUcsTUFBTSxFQUFFLEVBQUU7QUFDYixZQUFZLEVBQUUsSUFBSSxFQUFFO0FBQ3BCO0FBQ0EsMkJBQTJCLDBEQUFFO0FBQzdCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLFFBQVEsaURBQU87QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLCtDQUFFLDBCQUEwQiwrQ0FBRTtBQUMvQztBQUNBLEdBQUcsa0RBQWtELDhDQUFFLDZDQUE2Qyw4Q0FBRSx5REFBeUQsa0RBQUU7QUFDaks7QUFDQSxHQUFHO0FBQ0gsRUFBRSxnREFBRTtBQUNKO0FBQ0EsR0FBRztBQUNILFlBQVksa0RBQUU7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1gsU0FBUyx3Q0FBd0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMENBQTBDLEVBQUUsR0FBRyxlQUFlO0FBQzlELFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixxREFBcUQ7QUFDckQsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLHFEQUFxRDtBQUNyRCxhQUFhO0FBQ2Isd0RBQXdEO0FBQ3hELHlEQUF5RCxLQUFLO0FBQzlEO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiLFdBQVc7QUFDWCwwQ0FBMEMsRUFBRSxHQUFHLGVBQWU7QUFDOUQsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQyx3QkFBd0IsMERBQUU7QUFDM0I7QUFDQSxDQUFDLHdCQUF3QiwwREFBRTtBQUMzQjtBQUNBLENBQUMsd0JBQXdCLDBEQUFFO0FBQzNCO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVMsMENBQTBDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGVBQWUsR0FBRyw2Q0FBNkMsc0JBQXNCLFFBQVEsRUFBRSxlQUFlLEVBQUUsc0NBQXNDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRTtBQUNsTCxxQ0FBcUMsRUFBRTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLElBQUksaUJBQWlCLHFEQUFXLGlCQUFpQixxREFBVyxlQUFlLHFEQUFXO0FBQ3RGLFNBQVMsc0RBQVk7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLDhDQUFFO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixRQUFRLDRCQUE0QjtBQUM3RDtBQUNBO0FBQ0Esb0RBQW9ELFNBQVM7QUFDN0QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixTQUFTO0FBQ3BDLHNCQUFzQixTQUFTO0FBQy9CLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdUJBQXVCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrQ0FBa0MsU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQyxRQUFRLG9EQUFRLG1HQUFtRyw0Q0FBRSxHQUFHLGtEQUFFO0FBQzNIO0FBQ0E7QUFDQSw2SkFBNkosRUFBRTtBQUMvSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixjQUFjO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsSUFBSSxTQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FB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O0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFrQkUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5leW5hci9yZWFjdC9kaXN0L2J1bmRsZS5lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgeW0gPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgdm0gPSAocywgZSwgdCkgPT4gZSBpbiBzID8geW0ocywgZSwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogdCB9KSA6IHNbZV0gPSB0O1xudmFyIENyID0gKHMsIGUsIHQpID0+IHZtKHMsIHR5cGVvZiBlICE9IFwic3ltYm9sXCIgPyBlICsgXCJcIiA6IGUsIHQpO1xuaW1wb3J0IHsgc3R5bGVkIGFzIGRlIH0gZnJvbSBcIkBwaWdtZW50LWNzcy9yZWFjdFwiO1xuaW1wb3J0IHN0LCB7IGNyZWF0ZUNvbnRleHQgYXMgYWEsIHVzZU1lbW8gYXMgWnIsIHVzZUNvbnRleHQgYXMgQWksIHVzZVN0YXRlIGFzIHFlLCB1c2VSZWYgYXMgYnQsIHVzZUNhbGxiYWNrIGFzIHV0LCB1c2VFZmZlY3QgYXMgZnQsIHVzZUxheW91dEVmZmVjdCBhcyBFbSwgdXNlRGVidWdWYWx1ZSBhcyB4bSwgbWVtbyBhcyBNZiB9IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgR3IgPSB7XG4gIHZhcnM6IHtcbiAgICBjb2xvcnM6IHtcbiAgICAgIHByaW1hcnk6IFwidmFyKC0tY29sb3JzLXByaW1hcnkpXCJcbiAgICB9LFxuICAgIHR5cG9ncmFwaHk6IHtcbiAgICAgIGZvbnRzOiB7XG4gICAgICAgIGJhc2U6IFwidmFyKC0tdHlwb2dyYXBoeS1mb250cy1iYXNlKVwiXG4gICAgICB9LFxuICAgICAgZm9udFdlaWdodHM6IHtcbiAgICAgICAgcmVndWxhcjogXCJ2YXIoLS10eXBvZ3JhcGh5LWZvbnRXZWlnaHRzLXJlZ3VsYXIpXCIsXG4gICAgICAgIGJvbGQ6IFwidmFyKC0tdHlwb2dyYXBoeS1mb250V2VpZ2h0cy1ib2xkKVwiXG4gICAgICB9LFxuICAgICAgZm9udFNpemVzOiB7XG4gICAgICAgIGxhcmdlOiBcInZhcigtLXR5cG9ncmFwaHktZm9udFNpemVzLWxhcmdlKVwiLFxuICAgICAgICBtZWRpdW06IFwidmFyKC0tdHlwb2dyYXBoeS1mb250U2l6ZXMtbWVkaXVtKVwiLFxuICAgICAgICBzbWFsbDogXCJ2YXIoLS10eXBvZ3JhcGh5LWZvbnRTaXplcy1zbWFsbClcIlxuICAgICAgfVxuICAgIH0sXG4gICAgcGFsZXR0ZToge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1wYWxldHRlLWJhY2tncm91bmQpXCIsXG4gICAgICBib3JkZXI6IFwidmFyKC0tcGFsZXR0ZS1ib3JkZXIpXCIsXG4gICAgICB0ZXh0OiBcInZhcigtLXBhbGV0dGUtdGV4dClcIixcbiAgICAgIHRleHRNdXRlZDogXCJ2YXIoLS1wYWxldHRlLXRleHRNdXRlZClcIlxuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIEZjKHMpIHtcbiAgcmV0dXJuIHMgJiYgcy5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBcImRlZmF1bHRcIikgPyBzLmRlZmF1bHQgOiBzO1xufVxuZnVuY3Rpb24gTmMocykge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIFwiX19lc01vZHVsZVwiKSkgcmV0dXJuIHM7XG4gIHZhciBlID0gcy5kZWZhdWx0O1xuICBpZiAodHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIHQgPSBmdW5jdGlvbiByKCkge1xuICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByID8gUmVmbGVjdC5jb25zdHJ1Y3QoZSwgYXJndW1lbnRzLCB0aGlzLmNvbnN0cnVjdG9yKSA6IGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHQucHJvdG90eXBlID0gZS5wcm90b3R5cGU7XG4gIH0gZWxzZSB0ID0ge307XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogITBcbiAgfSksIE9iamVjdC5rZXlzKHMpLmZvckVhY2goZnVuY3Rpb24ocikge1xuICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLCByKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgciwgbi5nZXQgPyBuIDoge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc1tyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSksIHQ7XG59XG52YXIgVWEgPSB7IGV4cG9ydHM6IHt9IH0sIEtuID0ge307XG4vKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xudmFyIFd1O1xuZnVuY3Rpb24gU20oKSB7XG4gIGlmIChXdSkgcmV0dXJuIEtuO1xuICBXdSA9IDE7XG4gIHZhciBzID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLCBlID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpO1xuICBmdW5jdGlvbiB0KHIsIG4sIGkpIHtcbiAgICB2YXIgbyA9IG51bGw7XG4gICAgaWYgKGkgIT09IHZvaWQgMCAmJiAobyA9IFwiXCIgKyBpKSwgbi5rZXkgIT09IHZvaWQgMCAmJiAobyA9IFwiXCIgKyBuLmtleSksIFwia2V5XCIgaW4gbikge1xuICAgICAgaSA9IHt9O1xuICAgICAgZm9yICh2YXIgYSBpbiBuKVxuICAgICAgICBhICE9PSBcImtleVwiICYmIChpW2FdID0gblthXSk7XG4gICAgfSBlbHNlIGkgPSBuO1xuICAgIHJldHVybiBuID0gaS5yZWYsIHtcbiAgICAgICQkdHlwZW9mOiBzLFxuICAgICAgdHlwZTogcixcbiAgICAgIGtleTogbyxcbiAgICAgIHJlZjogbiAhPT0gdm9pZCAwID8gbiA6IG51bGwsXG4gICAgICBwcm9wczogaVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIEtuLkZyYWdtZW50ID0gZSwgS24uanN4ID0gdCwgS24uanN4cyA9IHQsIEtuO1xufVxudmFyIHp1O1xuZnVuY3Rpb24gYm0oKSB7XG4gIHJldHVybiB6dSB8fCAoenUgPSAxLCBVYS5leHBvcnRzID0gU20oKSksIFVhLmV4cG9ydHM7XG59XG52YXIgcSA9IGJtKCk7XG5sZXQgVW4gPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IodCwgciA9IHt9KSB7XG4gICAgc3VwZXIodCwgci5jYXVzZSA/IHsgY2F1c2U6IHIuY2F1c2UgfSA6IHZvaWQgMCk7XG4gICAgQ3IodGhpcywgXCJuYW1lXCIsIFwiQmFzZUVycm9yXCIpO1xuICAgIENyKHRoaXMsIFwiY2F1c2VcIik7XG4gICAgdGhpcy5jYXVzZSA9IHIuY2F1c2U7XG4gIH1cbn07XG5jbGFzcyBUbSBleHRlbmRzIFVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJJbnZhbGlkIGRvbWFpbiBtYW5pZmVzdFwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJBZGRNaW5pQXBwLkludmFsaWREb21haW5NYW5pZmVzdFwiKTtcbiAgfVxufVxubGV0IHdtID0gY2xhc3MgZXh0ZW5kcyBVbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiQWRkIG1pbmlhcHAgcmVqZWN0ZWQgYnkgdXNlclwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJBZGRNaW5pQXBwLlJlamVjdGVkQnlVc2VyXCIpO1xuICB9XG59LCBPZiA9IGNsYXNzIGV4dGVuZHMgVW4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlNpZ24gaW4gcmVqZWN0ZWQgYnkgdXNlclwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJTaWduSW4uUmVqZWN0ZWRCeVVzZXJcIik7XG4gIH1cbn07XG5jbGFzcyBBbSBleHRlbmRzIFVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJTaWduIG1hbmlmZXN0IHJlamVjdGVkIGJ5IHVzZXJcIik7XG4gICAgQ3IodGhpcywgXCJuYW1lXCIsIFwiU2lnbk1hbmlmZXN0LlJlamVjdGVkQnlVc2VyXCIpO1xuICB9XG59XG5jbGFzcyBJbSBleHRlbmRzIFVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJJbnZhbGlkIGRvbWFpbiBwcm92aWRlZFwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJTaWduTWFuaWZlc3QuSW52YWxpZERvbWFpblwiKTtcbiAgfVxufVxuY2xhc3MgX20gZXh0ZW5kcyBVbiB7XG4gIGNvbnN0cnVjdG9yKHQgPSBcIk1hbmlmZXN0IHNpZ25pbmcgZmFpbGVkXCIpIHtcbiAgICBzdXBlcih0KTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJTaWduTWFuaWZlc3QuR2VuZXJpY0Vycm9yXCIpO1xuICB9XG59XG52YXIgWmU7XG4oZnVuY3Rpb24ocykge1xuICBzLmFzc2VydEVxdWFsID0gKG4pID0+IHtcbiAgfTtcbiAgZnVuY3Rpb24gZShuKSB7XG4gIH1cbiAgcy5hc3NlcnRJcyA9IGU7XG4gIGZ1bmN0aW9uIHQobikge1xuICAgIHRocm93IG5ldyBFcnJvcigpO1xuICB9XG4gIHMuYXNzZXJ0TmV2ZXIgPSB0LCBzLmFycmF5VG9FbnVtID0gKG4pID0+IHtcbiAgICBjb25zdCBpID0ge307XG4gICAgZm9yIChjb25zdCBvIG9mIG4pXG4gICAgICBpW29dID0gbztcbiAgICByZXR1cm4gaTtcbiAgfSwgcy5nZXRWYWxpZEVudW1WYWx1ZXMgPSAobikgPT4ge1xuICAgIGNvbnN0IGkgPSBzLm9iamVjdEtleXMobikuZmlsdGVyKChhKSA9PiB0eXBlb2YgbltuW2FdXSAhPSBcIm51bWJlclwiKSwgbyA9IHt9O1xuICAgIGZvciAoY29uc3QgYSBvZiBpKVxuICAgICAgb1thXSA9IG5bYV07XG4gICAgcmV0dXJuIHMub2JqZWN0VmFsdWVzKG8pO1xuICB9LCBzLm9iamVjdFZhbHVlcyA9IChuKSA9PiBzLm9iamVjdEtleXMobikubWFwKGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gbltpXTtcbiAgfSksIHMub2JqZWN0S2V5cyA9IHR5cGVvZiBPYmplY3Qua2V5cyA9PSBcImZ1bmN0aW9uXCIgPyAobikgPT4gT2JqZWN0LmtleXMobikgOiAobikgPT4ge1xuICAgIGNvbnN0IGkgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG8gaW4gbilcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCBvKSAmJiBpLnB1c2gobyk7XG4gICAgcmV0dXJuIGk7XG4gIH0sIHMuZmluZCA9IChuLCBpKSA9PiB7XG4gICAgZm9yIChjb25zdCBvIG9mIG4pXG4gICAgICBpZiAoaShvKSlcbiAgICAgICAgcmV0dXJuIG87XG4gIH0sIHMuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT0gXCJmdW5jdGlvblwiID8gKG4pID0+IE51bWJlci5pc0ludGVnZXIobikgOiAobikgPT4gdHlwZW9mIG4gPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobikgJiYgTWF0aC5mbG9vcihuKSA9PT0gbjtcbiAgZnVuY3Rpb24gcihuLCBpID0gXCIgfCBcIikge1xuICAgIHJldHVybiBuLm1hcCgobykgPT4gdHlwZW9mIG8gPT0gXCJzdHJpbmdcIiA/IGAnJHtvfSdgIDogbykuam9pbihpKTtcbiAgfVxuICBzLmpvaW5WYWx1ZXMgPSByLCBzLmpzb25TdHJpbmdpZnlSZXBsYWNlciA9IChuLCBpKSA9PiB0eXBlb2YgaSA9PSBcImJpZ2ludFwiID8gaS50b1N0cmluZygpIDogaTtcbn0pKFplIHx8IChaZSA9IHt9KSk7XG52YXIgWXU7XG4oZnVuY3Rpb24ocykge1xuICBzLm1lcmdlU2hhcGVzID0gKGUsIHQpID0+ICh7XG4gICAgLi4uZSxcbiAgICAuLi50XG4gICAgLy8gc2Vjb25kIG92ZXJ3cml0ZXMgZmlyc3RcbiAgfSk7XG59KShZdSB8fCAoWXUgPSB7fSkpO1xuY29uc3QgbWUgPSBaZS5hcnJheVRvRW51bShbXG4gIFwic3RyaW5nXCIsXG4gIFwibmFuXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiaW50ZWdlclwiLFxuICBcImZsb2F0XCIsXG4gIFwiYm9vbGVhblwiLFxuICBcImRhdGVcIixcbiAgXCJiaWdpbnRcIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJhcnJheVwiLFxuICBcIm9iamVjdFwiLFxuICBcInVua25vd25cIixcbiAgXCJwcm9taXNlXCIsXG4gIFwidm9pZFwiLFxuICBcIm5ldmVyXCIsXG4gIFwibWFwXCIsXG4gIFwic2V0XCJcbl0pLCB3cyA9IChzKSA9PiB7XG4gIHN3aXRjaCAodHlwZW9mIHMpIHtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gbWUudW5kZWZpbmVkO1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBtZS5zdHJpbmc7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIE51bWJlci5pc05hTihzKSA/IG1lLm5hbiA6IG1lLm51bWJlcjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIG1lLmJvb2xlYW47XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICByZXR1cm4gbWUuZnVuY3Rpb247XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIG1lLmJpZ2ludDtcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICByZXR1cm4gbWUuc3ltYm9sO1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHMpID8gbWUuYXJyYXkgOiBzID09PSBudWxsID8gbWUubnVsbCA6IHMudGhlbiAmJiB0eXBlb2Ygcy50aGVuID09IFwiZnVuY3Rpb25cIiAmJiBzLmNhdGNoICYmIHR5cGVvZiBzLmNhdGNoID09IFwiZnVuY3Rpb25cIiA/IG1lLnByb21pc2UgOiB0eXBlb2YgTWFwIDwgXCJ1XCIgJiYgcyBpbnN0YW5jZW9mIE1hcCA/IG1lLm1hcCA6IHR5cGVvZiBTZXQgPCBcInVcIiAmJiBzIGluc3RhbmNlb2YgU2V0ID8gbWUuc2V0IDogdHlwZW9mIERhdGUgPCBcInVcIiAmJiBzIGluc3RhbmNlb2YgRGF0ZSA/IG1lLmRhdGUgOiBtZS5vYmplY3Q7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBtZS51bmtub3duO1xuICB9XG59LCBhZSA9IFplLmFycmF5VG9FbnVtKFtcbiAgXCJpbnZhbGlkX3R5cGVcIixcbiAgXCJpbnZhbGlkX2xpdGVyYWxcIixcbiAgXCJjdXN0b21cIixcbiAgXCJpbnZhbGlkX3VuaW9uXCIsXG4gIFwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yXCIsXG4gIFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIsXG4gIFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgXCJpbnZhbGlkX2FyZ3VtZW50c1wiLFxuICBcImludmFsaWRfcmV0dXJuX3R5cGVcIixcbiAgXCJpbnZhbGlkX2RhdGVcIixcbiAgXCJpbnZhbGlkX3N0cmluZ1wiLFxuICBcInRvb19zbWFsbFwiLFxuICBcInRvb19iaWdcIixcbiAgXCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1wiLFxuICBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICBcIm5vdF9maW5pdGVcIlxuXSk7XG5jbGFzcyBwcyBleHRlbmRzIEVycm9yIHtcbiAgZ2V0IGVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc3N1ZXM7XG4gIH1cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKCksIHRoaXMuaXNzdWVzID0gW10sIHRoaXMuYWRkSXNzdWUgPSAocikgPT4ge1xuICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIHJdO1xuICAgIH0sIHRoaXMuYWRkSXNzdWVzID0gKHIgPSBbXSkgPT4ge1xuICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIC4uLnJdO1xuICAgIH07XG4gICAgY29uc3QgdCA9IG5ldy50YXJnZXQucHJvdG90eXBlO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCB0KSA6IHRoaXMuX19wcm90b19fID0gdCwgdGhpcy5uYW1lID0gXCJab2RFcnJvclwiLCB0aGlzLmlzc3VlcyA9IGU7XG4gIH1cbiAgZm9ybWF0KGUpIHtcbiAgICBjb25zdCB0ID0gZSB8fCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gaS5tZXNzYWdlO1xuICAgIH0sIHIgPSB7IF9lcnJvcnM6IFtdIH0sIG4gPSAoaSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBvIG9mIGkuaXNzdWVzKVxuICAgICAgICBpZiAoby5jb2RlID09PSBcImludmFsaWRfdW5pb25cIilcbiAgICAgICAgICBvLnVuaW9uRXJyb3JzLm1hcChuKTtcbiAgICAgICAgZWxzZSBpZiAoby5jb2RlID09PSBcImludmFsaWRfcmV0dXJuX3R5cGVcIilcbiAgICAgICAgICBuKG8ucmV0dXJuVHlwZUVycm9yKTtcbiAgICAgICAgZWxzZSBpZiAoby5jb2RlID09PSBcImludmFsaWRfYXJndW1lbnRzXCIpXG4gICAgICAgICAgbihvLmFyZ3VtZW50c0Vycm9yKTtcbiAgICAgICAgZWxzZSBpZiAoby5wYXRoLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICByLl9lcnJvcnMucHVzaCh0KG8pKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbGV0IGEgPSByLCBsID0gMDtcbiAgICAgICAgICBmb3IgKDsgbCA8IG8ucGF0aC5sZW5ndGg7ICkge1xuICAgICAgICAgICAgY29uc3QgYyA9IG8ucGF0aFtsXTtcbiAgICAgICAgICAgIGwgPT09IG8ucGF0aC5sZW5ndGggLSAxID8gKGFbY10gPSBhW2NdIHx8IHsgX2Vycm9yczogW10gfSwgYVtjXS5fZXJyb3JzLnB1c2godChvKSkpIDogYVtjXSA9IGFbY10gfHwgeyBfZXJyb3JzOiBbXSB9LCBhID0gYVtjXSwgbCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIG4odGhpcyksIHI7XG4gIH1cbiAgc3RhdGljIGFzc2VydChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIHBzKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGEgWm9kRXJyb3I6ICR7ZX1gKTtcbiAgfVxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICB9XG4gIGdldCBtZXNzYWdlKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcywgWmUuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgfVxuICBnZXQgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICB9XG4gIGZsYXR0ZW4oZSA9ICh0KSA9PiB0Lm1lc3NhZ2UpIHtcbiAgICBjb25zdCB0ID0ge30sIHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdGhpcy5pc3N1ZXMpXG4gICAgICBpZiAobi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaSA9IG4ucGF0aFswXTtcbiAgICAgICAgdFtpXSA9IHRbaV0gfHwgW10sIHRbaV0ucHVzaChlKG4pKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByLnB1c2goZShuKSk7XG4gICAgcmV0dXJuIHsgZm9ybUVycm9yczogciwgZmllbGRFcnJvcnM6IHQgfTtcbiAgfVxuICBnZXQgZm9ybUVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuKCk7XG4gIH1cbn1cbnBzLmNyZWF0ZSA9IChzKSA9PiBuZXcgcHMocyk7XG5jb25zdCBLbCA9IChzLCBlKSA9PiB7XG4gIGxldCB0O1xuICBzd2l0Y2ggKHMuY29kZSkge1xuICAgIGNhc2UgYWUuaW52YWxpZF90eXBlOlxuICAgICAgcy5yZWNlaXZlZCA9PT0gbWUudW5kZWZpbmVkID8gdCA9IFwiUmVxdWlyZWRcIiA6IHQgPSBgRXhwZWN0ZWQgJHtzLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtzLnJlY2VpdmVkfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfbGl0ZXJhbDpcbiAgICAgIHQgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KHMuZXhwZWN0ZWQsIFplLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUudW5yZWNvZ25pemVkX2tleXM6XG4gICAgICB0ID0gYFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke1plLmpvaW5WYWx1ZXMocy5rZXlzLCBcIiwgXCIpfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfdW5pb246XG4gICAgICB0ID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpcbiAgICAgIHQgPSBgSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke1plLmpvaW5WYWx1ZXMocy5vcHRpb25zKX1gO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX2VudW1fdmFsdWU6XG4gICAgICB0ID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHtaZS5qb2luVmFsdWVzKHMub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtzLnJlY2VpdmVkfSdgO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX2FyZ3VtZW50czpcbiAgICAgIHQgPSBcIkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzXCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfcmV0dXJuX3R5cGU6XG4gICAgICB0ID0gXCJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlXCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfZGF0ZTpcbiAgICAgIHQgPSBcIkludmFsaWQgZGF0ZVwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX3N0cmluZzpcbiAgICAgIHR5cGVvZiBzLnZhbGlkYXRpb24gPT0gXCJvYmplY3RcIiA/IFwiaW5jbHVkZXNcIiBpbiBzLnZhbGlkYXRpb24gPyAodCA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGluY2x1ZGUgXCIke3MudmFsaWRhdGlvbi5pbmNsdWRlc31cImAsIHR5cGVvZiBzLnZhbGlkYXRpb24ucG9zaXRpb24gPT0gXCJudW1iZXJcIiAmJiAodCA9IGAke3R9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtzLnZhbGlkYXRpb24ucG9zaXRpb259YCkpIDogXCJzdGFydHNXaXRoXCIgaW4gcy52YWxpZGF0aW9uID8gdCA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggXCIke3MudmFsaWRhdGlvbi5zdGFydHNXaXRofVwiYCA6IFwiZW5kc1dpdGhcIiBpbiBzLnZhbGlkYXRpb24gPyB0ID0gYEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggXCIke3MudmFsaWRhdGlvbi5lbmRzV2l0aH1cImAgOiBaZS5hc3NlcnROZXZlcihzLnZhbGlkYXRpb24pIDogcy52YWxpZGF0aW9uICE9PSBcInJlZ2V4XCIgPyB0ID0gYEludmFsaWQgJHtzLnZhbGlkYXRpb259YCA6IHQgPSBcIkludmFsaWRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUudG9vX3NtYWxsOlxuICAgICAgcy50eXBlID09PSBcImFycmF5XCIgPyB0ID0gYEFycmF5IG11c3QgY29udGFpbiAke3MuZXhhY3QgPyBcImV4YWN0bHlcIiA6IHMuaW5jbHVzaXZlID8gXCJhdCBsZWFzdFwiIDogXCJtb3JlIHRoYW5cIn0gJHtzLm1pbmltdW19IGVsZW1lbnQocylgIDogcy50eXBlID09PSBcInN0cmluZ1wiID8gdCA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcImF0IGxlYXN0XCIgOiBcIm92ZXJcIn0gJHtzLm1pbmltdW19IGNoYXJhY3RlcihzKWAgOiBzLnR5cGUgPT09IFwibnVtYmVyXCIgPyB0ID0gYE51bWJlciBtdXN0IGJlICR7cy5leGFjdCA/IFwiZXhhY3RseSBlcXVhbCB0byBcIiA6IHMuaW5jbHVzaXZlID8gXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXCIgOiBcImdyZWF0ZXIgdGhhbiBcIn0ke3MubWluaW11bX1gIDogcy50eXBlID09PSBcImJpZ2ludFwiID8gdCA9IGBOdW1iZXIgbXVzdCBiZSAke3MuZXhhY3QgPyBcImV4YWN0bHkgZXF1YWwgdG8gXCIgOiBzLmluY2x1c2l2ZSA/IFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFwiIDogXCJncmVhdGVyIHRoYW4gXCJ9JHtzLm1pbmltdW19YCA6IHMudHlwZSA9PT0gXCJkYXRlXCIgPyB0ID0gYERhdGUgbXVzdCBiZSAke3MuZXhhY3QgPyBcImV4YWN0bHkgZXF1YWwgdG8gXCIgOiBzLmluY2x1c2l2ZSA/IFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFwiIDogXCJncmVhdGVyIHRoYW4gXCJ9JHtuZXcgRGF0ZShOdW1iZXIocy5taW5pbXVtKSl9YCA6IHQgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUudG9vX2JpZzpcbiAgICAgIHMudHlwZSA9PT0gXCJhcnJheVwiID8gdCA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtzLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBzLmluY2x1c2l2ZSA/IFwiYXQgbW9zdFwiIDogXCJsZXNzIHRoYW5cIn0gJHtzLm1heGltdW19IGVsZW1lbnQocylgIDogcy50eXBlID09PSBcInN0cmluZ1wiID8gdCA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcImF0IG1vc3RcIiA6IFwidW5kZXJcIn0gJHtzLm1heGltdW19IGNoYXJhY3RlcihzKWAgOiBzLnR5cGUgPT09IFwibnVtYmVyXCIgPyB0ID0gYE51bWJlciBtdXN0IGJlICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcImxlc3MgdGhhbiBvciBlcXVhbCB0b1wiIDogXCJsZXNzIHRoYW5cIn0gJHtzLm1heGltdW19YCA6IHMudHlwZSA9PT0gXCJiaWdpbnRcIiA/IHQgPSBgQmlnSW50IG11c3QgYmUgJHtzLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBzLmluY2x1c2l2ZSA/IFwibGVzcyB0aGFuIG9yIGVxdWFsIHRvXCIgOiBcImxlc3MgdGhhblwifSAke3MubWF4aW11bX1gIDogcy50eXBlID09PSBcImRhdGVcIiA/IHQgPSBgRGF0ZSBtdXN0IGJlICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcInNtYWxsZXIgdGhhbiBvciBlcXVhbCB0b1wiIDogXCJzbWFsbGVyIHRoYW5cIn0gJHtuZXcgRGF0ZShOdW1iZXIocy5tYXhpbXVtKSl9YCA6IHQgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUuY3VzdG9tOlxuICAgICAgdCA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpcbiAgICAgIHQgPSBcIkludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUubm90X211bHRpcGxlX29mOlxuICAgICAgdCA9IGBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7cy5tdWx0aXBsZU9mfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLm5vdF9maW5pdGU6XG4gICAgICB0ID0gXCJOdW1iZXIgbXVzdCBiZSBmaW5pdGVcIjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0ID0gZS5kZWZhdWx0RXJyb3IsIFplLmFzc2VydE5ldmVyKHMpO1xuICB9XG4gIHJldHVybiB7IG1lc3NhZ2U6IHQgfTtcbn07XG5sZXQgUm0gPSBLbDtcbmZ1bmN0aW9uIExtKCkge1xuICByZXR1cm4gUm07XG59XG5jb25zdCBDbSA9IChzKSA9PiB7XG4gIGNvbnN0IHsgZGF0YTogZSwgcGF0aDogdCwgZXJyb3JNYXBzOiByLCBpc3N1ZURhdGE6IG4gfSA9IHMsIGkgPSBbLi4udCwgLi4ubi5wYXRoIHx8IFtdXSwgbyA9IHtcbiAgICAuLi5uLFxuICAgIHBhdGg6IGlcbiAgfTtcbiAgaWYgKG4ubWVzc2FnZSAhPT0gdm9pZCAwKVxuICAgIHJldHVybiB7XG4gICAgICAuLi5uLFxuICAgICAgcGF0aDogaSxcbiAgICAgIG1lc3NhZ2U6IG4ubWVzc2FnZVxuICAgIH07XG4gIGxldCBhID0gXCJcIjtcbiAgY29uc3QgbCA9IHIuZmlsdGVyKChjKSA9PiAhIWMpLnNsaWNlKCkucmV2ZXJzZSgpO1xuICBmb3IgKGNvbnN0IGMgb2YgbClcbiAgICBhID0gYyhvLCB7IGRhdGE6IGUsIGRlZmF1bHRFcnJvcjogYSB9KS5tZXNzYWdlO1xuICByZXR1cm4ge1xuICAgIC4uLm4sXG4gICAgcGF0aDogaSxcbiAgICBtZXNzYWdlOiBhXG4gIH07XG59O1xuZnVuY3Rpb24gaGUocywgZSkge1xuICBjb25zdCB0ID0gTG0oKSwgciA9IENtKHtcbiAgICBpc3N1ZURhdGE6IGUsXG4gICAgZGF0YTogcy5kYXRhLFxuICAgIHBhdGg6IHMucGF0aCxcbiAgICBlcnJvck1hcHM6IFtcbiAgICAgIHMuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgIC8vIGNvbnRleHR1YWwgZXJyb3IgbWFwIGlzIGZpcnN0IHByaW9yaXR5XG4gICAgICBzLnNjaGVtYUVycm9yTWFwLFxuICAgICAgLy8gdGhlbiBzY2hlbWEtYm91bmQgbWFwIGlmIGF2YWlsYWJsZVxuICAgICAgdCxcbiAgICAgIC8vIHRoZW4gZ2xvYmFsIG92ZXJyaWRlIG1hcFxuICAgICAgdCA9PT0gS2wgPyB2b2lkIDAgOiBLbFxuICAgICAgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICBdLmZpbHRlcigobikgPT4gISFuKVxuICB9KTtcbiAgcy5jb21tb24uaXNzdWVzLnB1c2gocik7XG59XG5jbGFzcyB3ciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmFsdWUgPSBcInZhbGlkXCI7XG4gIH1cbiAgZGlydHkoKSB7XG4gICAgdGhpcy52YWx1ZSA9PT0gXCJ2YWxpZFwiICYmICh0aGlzLnZhbHVlID0gXCJkaXJ0eVwiKTtcbiAgfVxuICBhYm9ydCgpIHtcbiAgICB0aGlzLnZhbHVlICE9PSBcImFib3J0ZWRcIiAmJiAodGhpcy52YWx1ZSA9IFwiYWJvcnRlZFwiKTtcbiAgfVxuICBzdGF0aWMgbWVyZ2VBcnJheShlLCB0KSB7XG4gICAgY29uc3QgciA9IFtdO1xuICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICBpZiAobi5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICByZXR1cm4gUmU7XG4gICAgICBuLnN0YXR1cyA9PT0gXCJkaXJ0eVwiICYmIGUuZGlydHkoKSwgci5wdXNoKG4udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0dXM6IGUudmFsdWUsIHZhbHVlOiByIH07XG4gIH1cbiAgc3RhdGljIGFzeW5jIG1lcmdlT2JqZWN0QXN5bmMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdCkge1xuICAgICAgY29uc3QgaSA9IGF3YWl0IG4ua2V5LCBvID0gYXdhaXQgbi52YWx1ZTtcbiAgICAgIHIucHVzaCh7XG4gICAgICAgIGtleTogaSxcbiAgICAgICAgdmFsdWU6IG9cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd3IubWVyZ2VPYmplY3RTeW5jKGUsIHIpO1xuICB9XG4gIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdCkge1xuICAgICAgY29uc3QgeyBrZXk6IGksIHZhbHVlOiBvIH0gPSBuO1xuICAgICAgaWYgKGkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCBvLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgIHJldHVybiBSZTtcbiAgICAgIGkuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgZS5kaXJ0eSgpLCBvLnN0YXR1cyA9PT0gXCJkaXJ0eVwiICYmIGUuZGlydHkoKSwgaS52YWx1ZSAhPT0gXCJfX3Byb3RvX19cIiAmJiAodHlwZW9mIG8udmFsdWUgPCBcInVcIiB8fCBuLmFsd2F5c1NldCkgJiYgKHJbaS52YWx1ZV0gPSBvLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBlLnZhbHVlLCB2YWx1ZTogciB9O1xuICB9XG59XG5jb25zdCBSZSA9IE9iamVjdC5mcmVlemUoe1xuICBzdGF0dXM6IFwiYWJvcnRlZFwiXG59KSwgV24gPSAocykgPT4gKHsgc3RhdHVzOiBcImRpcnR5XCIsIHZhbHVlOiBzIH0pLCBSciA9IChzKSA9PiAoeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IHMgfSksIFp1ID0gKHMpID0+IHMuc3RhdHVzID09PSBcImFib3J0ZWRcIiwgWHUgPSAocykgPT4gcy5zdGF0dXMgPT09IFwiZGlydHlcIiwgTG4gPSAocykgPT4gcy5zdGF0dXMgPT09IFwidmFsaWRcIiwgYm8gPSAocykgPT4gdHlwZW9mIFByb21pc2UgPCBcInVcIiAmJiBzIGluc3RhbmNlb2YgUHJvbWlzZTtcbnZhciBFZTtcbihmdW5jdGlvbihzKSB7XG4gIHMuZXJyVG9PYmogPSAoZSkgPT4gdHlwZW9mIGUgPT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZTogZSB9IDogZSB8fCB7fSwgcy50b1N0cmluZyA9IChlKSA9PiB0eXBlb2YgZSA9PSBcInN0cmluZ1wiID8gZSA6IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWVzc2FnZTtcbn0pKEVlIHx8IChFZSA9IHt9KSk7XG5jbGFzcyBEcyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICB0aGlzLl9jYWNoZWRQYXRoID0gW10sIHRoaXMucGFyZW50ID0gZSwgdGhpcy5kYXRhID0gdCwgdGhpcy5fcGF0aCA9IHIsIHRoaXMuX2tleSA9IG47XG4gIH1cbiAgZ2V0IHBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGgubGVuZ3RoIHx8IChBcnJheS5pc0FycmF5KHRoaXMuX2tleSkgPyB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgLi4udGhpcy5fa2V5KSA6IHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCB0aGlzLl9rZXkpKSwgdGhpcy5fY2FjaGVkUGF0aDtcbiAgfVxufVxuY29uc3QgSnUgPSAocywgZSkgPT4ge1xuICBpZiAoTG4oZSkpXG4gICAgcmV0dXJuIHsgc3VjY2VzczogITAsIGRhdGE6IGUudmFsdWUgfTtcbiAgaWYgKCFzLmNvbW1vbi5pc3N1ZXMubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkIGJ1dCBubyBpc3N1ZXMgZGV0ZWN0ZWQuXCIpO1xuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6ICExLFxuICAgIGdldCBlcnJvcigpIHtcbiAgICAgIGlmICh0aGlzLl9lcnJvcilcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgY29uc3QgdCA9IG5ldyBwcyhzLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yID0gdCwgdGhpcy5fZXJyb3I7XG4gICAgfVxuICB9O1xufTtcbmZ1bmN0aW9uIFZlKHMpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiB7fTtcbiAgY29uc3QgeyBlcnJvck1hcDogZSwgaW52YWxpZF90eXBlX2Vycm9yOiB0LCByZXF1aXJlZF9lcnJvcjogciwgZGVzY3JpcHRpb246IG4gfSA9IHM7XG4gIGlmIChlICYmICh0IHx8IHIpKVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdXNlIFwiaW52YWxpZF90eXBlX2Vycm9yXCIgb3IgXCJyZXF1aXJlZF9lcnJvclwiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTtcbiAgcmV0dXJuIGUgPyB7IGVycm9yTWFwOiBlLCBkZXNjcmlwdGlvbjogbiB9IDogeyBlcnJvck1hcDogKG8sIGEpID0+IHtcbiAgICBjb25zdCB7IG1lc3NhZ2U6IGwgfSA9IHM7XG4gICAgcmV0dXJuIG8uY29kZSA9PT0gXCJpbnZhbGlkX2VudW1fdmFsdWVcIiA/IHsgbWVzc2FnZTogbCA/PyBhLmRlZmF1bHRFcnJvciB9IDogdHlwZW9mIGEuZGF0YSA+IFwidVwiID8geyBtZXNzYWdlOiBsID8/IHIgPz8gYS5kZWZhdWx0RXJyb3IgfSA6IG8uY29kZSAhPT0gXCJpbnZhbGlkX3R5cGVcIiA/IHsgbWVzc2FnZTogYS5kZWZhdWx0RXJyb3IgfSA6IHsgbWVzc2FnZTogbCA/PyB0ID8/IGEuZGVmYXVsdEVycm9yIH07XG4gIH0sIGRlc2NyaXB0aW9uOiBuIH07XG59XG5jbGFzcyBZZSB7XG4gIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLmRlc2NyaXB0aW9uO1xuICB9XG4gIF9nZXRUeXBlKGUpIHtcbiAgICByZXR1cm4gd3MoZS5kYXRhKTtcbiAgfVxuICBfZ2V0T3JSZXR1cm5DdHgoZSwgdCkge1xuICAgIHJldHVybiB0IHx8IHtcbiAgICAgIGNvbW1vbjogZS5wYXJlbnQuY29tbW9uLFxuICAgICAgZGF0YTogZS5kYXRhLFxuICAgICAgcGFyc2VkVHlwZTogd3MoZS5kYXRhKSxcbiAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICBwYXJlbnQ6IGUucGFyZW50XG4gICAgfTtcbiAgfVxuICBfcHJvY2Vzc0lucHV0UGFyYW1zKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBuZXcgd3IoKSxcbiAgICAgIGN0eDoge1xuICAgICAgICBjb21tb246IGUucGFyZW50LmNvbW1vbixcbiAgICAgICAgZGF0YTogZS5kYXRhLFxuICAgICAgICBwYXJzZWRUeXBlOiB3cyhlLmRhdGEpLFxuICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICAgIHBhcmVudDogZS5wYXJlbnRcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIF9wYXJzZVN5bmMoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLl9wYXJzZShlKTtcbiAgICBpZiAoYm8odCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jaHJvbm91cyBwYXJzZSBlbmNvdW50ZXJlZCBwcm9taXNlLlwiKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBfcGFyc2VBc3luYyhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuX3BhcnNlKGUpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodCk7XG4gIH1cbiAgcGFyc2UoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnNhZmVQYXJzZShlLCB0KTtcbiAgICBpZiAoci5zdWNjZXNzKVxuICAgICAgcmV0dXJuIHIuZGF0YTtcbiAgICB0aHJvdyByLmVycm9yO1xuICB9XG4gIHNhZmVQYXJzZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIGNvbW1vbjoge1xuICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICBhc3luYzogKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuYXN5bmMpID8/ICExLFxuICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZXJyb3JNYXBcbiAgICAgIH0sXG4gICAgICBwYXRoOiAodCA9PSBudWxsID8gdm9pZCAwIDogdC5wYXRoKSB8fCBbXSxcbiAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICBkYXRhOiBlLFxuICAgICAgcGFyc2VkVHlwZTogd3MoZSlcbiAgICB9LCBuID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YTogZSwgcGF0aDogci5wYXRoLCBwYXJlbnQ6IHIgfSk7XG4gICAgcmV0dXJuIEp1KHIsIG4pO1xuICB9XG4gIFwifnZhbGlkYXRlXCIoZSkge1xuICAgIHZhciByLCBuO1xuICAgIGNvbnN0IHQgPSB7XG4gICAgICBjb21tb246IHtcbiAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgYXN5bmM6ICEhdGhpc1tcIn5zdGFuZGFyZFwiXS5hc3luY1xuICAgICAgfSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgIGRhdGE6IGUsXG4gICAgICBwYXJzZWRUeXBlOiB3cyhlKVxuICAgIH07XG4gICAgaWYgKCF0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuX3BhcnNlU3luYyh7IGRhdGE6IGUsIHBhdGg6IFtdLCBwYXJlbnQ6IHQgfSk7XG4gICAgICAgIHJldHVybiBMbihpKSA/IHtcbiAgICAgICAgICB2YWx1ZTogaS52YWx1ZVxuICAgICAgICB9IDoge1xuICAgICAgICAgIGlzc3VlczogdC5jb21tb24uaXNzdWVzXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIChuID0gKHIgPSBpID09IG51bGwgPyB2b2lkIDAgOiBpLm1lc3NhZ2UpID09IG51bGwgPyB2b2lkIDAgOiByLnRvTG93ZXJDYXNlKCkpICE9IG51bGwgJiYgbi5pbmNsdWRlcyhcImVuY291bnRlcmVkXCIpICYmICh0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jID0gITApLCB0LmNvbW1vbiA9IHtcbiAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgIGFzeW5jOiAhMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXJzZUFzeW5jKHsgZGF0YTogZSwgcGF0aDogW10sIHBhcmVudDogdCB9KS50aGVuKChpKSA9PiBMbihpKSA/IHtcbiAgICAgIHZhbHVlOiBpLnZhbHVlXG4gICAgfSA6IHtcbiAgICAgIGlzc3VlczogdC5jb21tb24uaXNzdWVzXG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgcGFyc2VBc3luYyhlLCB0KSB7XG4gICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZSwgdCk7XG4gICAgaWYgKHIuc3VjY2VzcylcbiAgICAgIHJldHVybiByLmRhdGE7XG4gICAgdGhyb3cgci5lcnJvcjtcbiAgfVxuICBhc3luYyBzYWZlUGFyc2VBc3luYyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIGNvbW1vbjoge1xuICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZXJyb3JNYXAsXG4gICAgICAgIGFzeW5jOiAhMFxuICAgICAgfSxcbiAgICAgIHBhdGg6ICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LnBhdGgpIHx8IFtdLFxuICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgIGRhdGE6IGUsXG4gICAgICBwYXJzZWRUeXBlOiB3cyhlKVxuICAgIH0sIG4gPSB0aGlzLl9wYXJzZSh7IGRhdGE6IGUsIHBhdGg6IHIucGF0aCwgcGFyZW50OiByIH0pLCBpID0gYXdhaXQgKGJvKG4pID8gbiA6IFByb21pc2UucmVzb2x2ZShuKSk7XG4gICAgcmV0dXJuIEp1KHIsIGkpO1xuICB9XG4gIHJlZmluZShlLCB0KSB7XG4gICAgY29uc3QgciA9IChuKSA9PiB0eXBlb2YgdCA9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0ID4gXCJ1XCIgPyB7IG1lc3NhZ2U6IHQgfSA6IHR5cGVvZiB0ID09IFwiZnVuY3Rpb25cIiA/IHQobikgOiB0O1xuICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KChuLCBpKSA9PiB7XG4gICAgICBjb25zdCBvID0gZShuKSwgYSA9ICgpID0+IGkuYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiBhZS5jdXN0b20sXG4gICAgICAgIC4uLnIobilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHR5cGVvZiBQcm9taXNlIDwgXCJ1XCIgJiYgbyBpbnN0YW5jZW9mIFByb21pc2UgPyBvLnRoZW4oKGwpID0+IGwgPyAhMCA6IChhKCksICExKSkgOiBvID8gITAgOiAoYSgpLCAhMSk7XG4gICAgfSk7XG4gIH1cbiAgcmVmaW5lbWVudChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHIsIG4pID0+IGUocikgPyAhMCA6IChuLmFkZElzc3VlKHR5cGVvZiB0ID09IFwiZnVuY3Rpb25cIiA/IHQociwgbikgOiB0KSwgITEpKTtcbiAgfVxuICBfcmVmaW5lbWVudChlKSB7XG4gICAgcmV0dXJuIG5ldyBZcyh7XG4gICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICB0eXBlTmFtZToga2UuWm9kRWZmZWN0cyxcbiAgICAgIGVmZmVjdDogeyB0eXBlOiBcInJlZmluZW1lbnRcIiwgcmVmaW5lbWVudDogZSB9XG4gICAgfSk7XG4gIH1cbiAgc3VwZXJSZWZpbmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KGUpO1xuICB9XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLnNwYSA9IHRoaXMuc2FmZVBhcnNlQXN5bmMsIHRoaXMuX2RlZiA9IGUsIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyksIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKSwgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyksIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyksIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKSwgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpLCB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKSwgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKSwgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKSwgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKSwgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyksIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyksIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpLCB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpLCB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyksIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKSwgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKSwgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyksIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyksIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyksIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpLCB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpLCB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKSwgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyksIHRoaXNbXCJ+c3RhbmRhcmRcIl0gPSB7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgdmVuZG9yOiBcInpvZFwiLFxuICAgICAgdmFsaWRhdGU6ICh0KSA9PiB0aGlzW1wifnZhbGlkYXRlXCJdKHQpXG4gICAgfTtcbiAgfVxuICBvcHRpb25hbCgpIHtcbiAgICByZXR1cm4gZnMuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gIH1cbiAgbnVsbGFibGUoKSB7XG4gICAgcmV0dXJuIFpzLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICB9XG4gIG51bGxpc2goKSB7XG4gICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpO1xuICB9XG4gIGFycmF5KCkge1xuICAgIHJldHVybiBZci5jcmVhdGUodGhpcyk7XG4gIH1cbiAgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gX28uY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gIH1cbiAgb3IoZSkge1xuICAgIHJldHVybiB3by5jcmVhdGUoW3RoaXMsIGVdLCB0aGlzLl9kZWYpO1xuICB9XG4gIGFuZChlKSB7XG4gICAgcmV0dXJuIEFvLmNyZWF0ZSh0aGlzLCBlLCB0aGlzLl9kZWYpO1xuICB9XG4gIHRyYW5zZm9ybShlKSB7XG4gICAgcmV0dXJuIG5ldyBZcyh7XG4gICAgICAuLi5WZSh0aGlzLl9kZWYpLFxuICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgdHlwZU5hbWU6IGtlLlpvZEVmZmVjdHMsXG4gICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtOiBlIH1cbiAgICB9KTtcbiAgfVxuICBkZWZhdWx0KGUpIHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiID8gZSA6ICgpID0+IGU7XG4gICAgcmV0dXJuIG5ldyBSbyh7XG4gICAgICAuLi5WZSh0aGlzLl9kZWYpLFxuICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgZGVmYXVsdFZhbHVlOiB0LFxuICAgICAgdHlwZU5hbWU6IGtlLlpvZERlZmF1bHRcbiAgICB9KTtcbiAgfVxuICBicmFuZCgpIHtcbiAgICByZXR1cm4gbmV3IFVmKHtcbiAgICAgIHR5cGVOYW1lOiBrZS5ab2RCcmFuZGVkLFxuICAgICAgdHlwZTogdGhpcyxcbiAgICAgIC4uLlZlKHRoaXMuX2RlZilcbiAgICB9KTtcbiAgfVxuICBjYXRjaChlKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIiA/IGUgOiAoKSA9PiBlO1xuICAgIHJldHVybiBuZXcgTG8oe1xuICAgICAgLi4uVmUodGhpcy5fZGVmKSxcbiAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgIGNhdGNoVmFsdWU6IHQsXG4gICAgICB0eXBlTmFtZToga2UuWm9kQ2F0Y2hcbiAgICB9KTtcbiAgfVxuICBkZXNjcmliZShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyB0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGRlc2NyaXB0aW9uOiBlXG4gICAgfSk7XG4gIH1cbiAgcGlwZShlKSB7XG4gICAgcmV0dXJuICRjLmNyZWF0ZSh0aGlzLCBlKTtcbiAgfVxuICByZWFkb25seSgpIHtcbiAgICByZXR1cm4gQ28uY3JlYXRlKHRoaXMpO1xuICB9XG4gIGlzT3B0aW9uYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHZvaWQgMCkuc3VjY2VzcztcbiAgfVxuICBpc051bGxhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICB9XG59XG5jb25zdCBrbSA9IC9eY1teXFxzLV17OCx9JC9pLCBEbSA9IC9eWzAtOWEtel0rJC8sIFBtID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC9pLCBNbSA9IC9eWzAtOWEtZkEtRl17OH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17MTJ9JC9pLCBPbSA9IC9eW2EtejAtOV8tXXsyMX0kL2ksIEJtID0gL15bQS1aYS16MC05LV9dK1xcLltBLVphLXowLTktX10rXFwuW0EtWmEtejAtOS1fXSokLywgRm0gPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cXGQrWSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtZJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzooPzpbLStdP1xcZCtXKXwoPzpbLStdP1xcZCtbLixdXFxkK1ckKSk/KD86KD86Wy0rXT9cXGQrRCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtEJCkpPyg/OlQoPz1bXFxkKy1dKSg/Oig/OlstK10/XFxkK0gpfCg/OlstK10/XFxkK1suLF1cXGQrSCQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86Wy0rXT9cXGQrKD86Wy4sXVxcZCspP1MpPyk/PyQvLCBObSA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aMC05XycrXFwtXFwuXSopW0EtWjAtOV8rLV1AKFtBLVowLTldW0EtWjAtOVxcLV0qXFwuKStbQS1aXXsyLH0kL2ksIFVtID0gXCJeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJFwiO1xubGV0ICRhO1xuY29uc3QgJG0gPSAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvLCBHbSA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwvKDNbMC0yXXxbMTJdP1swLTldKSQvLCBWbSA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7Nyw3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXXsxLH18OjooZmZmZig6MHsxLDR9KXswLDF9Oil7MCwxfSgoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pKSQvLCBqbSA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7Nyw3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXXsxLH18OjooZmZmZig6MHsxLDR9KXswLDF9Oil7MCwxfSgoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pKVxcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC8sIEttID0gL14oWzAtOWEtekEtWisvXXs0fSkqKChbMC05YS16QS1aKy9dezJ9PT0pfChbMC05YS16QS1aKy9dezN9PSkpPyQvLCBIbSA9IC9eKFswLTlhLXpBLVotX117NH0pKigoWzAtOWEtekEtWi1fXXsyfSg9PSk/KXwoWzAtOWEtekEtWi1fXXszfSg9KT8pKT8kLywgQmYgPSBcIigoXFxcXGRcXFxcZFsyNDY4XVswNDhdfFxcXFxkXFxcXGRbMTM1NzldWzI2XXxcXFxcZFxcXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pfCgwWzQ2OV18MTEpLSgwWzEtOV18WzEyXVxcXFxkfDMwKXwoMDIpLSgwWzEtOV18MVxcXFxkfDJbMC04XSkpKVwiLCBxbSA9IG5ldyBSZWdFeHAoYF4ke0JmfSRgKTtcbmZ1bmN0aW9uIEZmKHMpIHtcbiAgbGV0IGUgPSBcIlswLTVdXFxcXGRcIjtcbiAgcy5wcmVjaXNpb24gPyBlID0gYCR7ZX1cXFxcLlxcXFxkeyR7cy5wcmVjaXNpb259fWAgOiBzLnByZWNpc2lvbiA9PSBudWxsICYmIChlID0gYCR7ZX0oXFxcXC5cXFxcZCspP2ApO1xuICBjb25zdCB0ID0gcy5wcmVjaXNpb24gPyBcIitcIiA6IFwiP1wiO1xuICByZXR1cm4gYChbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKDoke2V9KSR7dH1gO1xufVxuZnVuY3Rpb24gV20ocykge1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7RmYocyl9JGApO1xufVxuZnVuY3Rpb24gem0ocykge1xuICBsZXQgZSA9IGAke0JmfVQke0ZmKHMpfWA7XG4gIGNvbnN0IHQgPSBbXTtcbiAgcmV0dXJuIHQucHVzaChzLmxvY2FsID8gXCJaP1wiIDogXCJaXCIpLCBzLm9mZnNldCAmJiB0LnB1c2goXCIoWystXVxcXFxkezJ9Oj9cXFxcZHsyfSlcIiksIGUgPSBgJHtlfSgke3Quam9pbihcInxcIil9KWAsIG5ldyBSZWdFeHAoYF4ke2V9JGApO1xufVxuZnVuY3Rpb24gWW0ocywgZSkge1xuICByZXR1cm4gISEoKGUgPT09IFwidjRcIiB8fCAhZSkgJiYgJG0udGVzdChzKSB8fCAoZSA9PT0gXCJ2NlwiIHx8ICFlKSAmJiBWbS50ZXN0KHMpKTtcbn1cbmZ1bmN0aW9uIFptKHMsIGUpIHtcbiAgaWYgKCFCbS50ZXN0KHMpKVxuICAgIHJldHVybiAhMTtcbiAgdHJ5IHtcbiAgICBjb25zdCBbdF0gPSBzLnNwbGl0KFwiLlwiKTtcbiAgICBpZiAoIXQpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgciA9IHQucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIikucGFkRW5kKHQubGVuZ3RoICsgKDQgLSB0Lmxlbmd0aCAlIDQpICUgNCwgXCI9XCIpLCBuID0gSlNPTi5wYXJzZShhdG9iKHIpKTtcbiAgICByZXR1cm4gISh0eXBlb2YgbiAhPSBcIm9iamVjdFwiIHx8IG4gPT09IG51bGwgfHwgXCJ0eXBcIiBpbiBuICYmIChuID09IG51bGwgPyB2b2lkIDAgOiBuLnR5cCkgIT09IFwiSldUXCIgfHwgIW4uYWxnIHx8IGUgJiYgbi5hbGcgIT09IGUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gITE7XG4gIH1cbn1cbmZ1bmN0aW9uIFhtKHMsIGUpIHtcbiAgcmV0dXJuICEhKChlID09PSBcInY0XCIgfHwgIWUpICYmIEdtLnRlc3QocykgfHwgKGUgPT09IFwidjZcIiB8fCAhZSkgJiYgam0udGVzdChzKSk7XG59XG5jbGFzcyBScyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSAmJiAoZS5kYXRhID0gU3RyaW5nKGUuZGF0YSkpLCB0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5zdHJpbmcpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShpLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnN0cmluZyxcbiAgICAgICAgcmVjZWl2ZWQ6IGkucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICBjb25zdCByID0gbmV3IHdyKCk7XG4gICAgbGV0IG47XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuX2RlZi5jaGVja3MpXG4gICAgICBpZiAoaS5raW5kID09PSBcIm1pblwiKVxuICAgICAgICBlLmRhdGEubGVuZ3RoIDwgaS52YWx1ZSAmJiAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwibWF4XCIpXG4gICAgICAgIGUuZGF0YS5sZW5ndGggPiBpLnZhbHVlICYmIChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgICBjb2RlOiBhZS50b29fYmlnLFxuICAgICAgICAgIG1heGltdW06IGkudmFsdWUsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgY29uc3QgbyA9IGUuZGF0YS5sZW5ndGggPiBpLnZhbHVlLCBhID0gZS5kYXRhLmxlbmd0aCA8IGkudmFsdWU7XG4gICAgICAgIChvIHx8IGEpICYmIChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIG8gPyBoZShuLCB7XG4gICAgICAgICAgY29kZTogYWUudG9vX2JpZyxcbiAgICAgICAgICBtYXhpbXVtOiBpLnZhbHVlLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgICAgICBleGFjdDogITAsXG4gICAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICAgIH0pIDogYSAmJiBoZShuLCB7XG4gICAgICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgICAgIGV4YWN0OiAhMCxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICB9IGVsc2UgaWYgKGkua2luZCA9PT0gXCJlbWFpbFwiKVxuICAgICAgICBObS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwiZW1vamlcIilcbiAgICAgICAgJGEgfHwgKCRhID0gbmV3IFJlZ0V4cChVbSwgXCJ1XCIpKSwgJGEudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtb2ppXCIsXG4gICAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICAgIH0pLCByLmRpcnR5KCkpO1xuICAgICAgZWxzZSBpZiAoaS5raW5kID09PSBcInV1aWRcIilcbiAgICAgICAgTW0udGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwibmFub2lkXCIpXG4gICAgICAgIE9tLnRlc3QoZS5kYXRhKSB8fCAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgICAgdmFsaWRhdGlvbjogXCJuYW5vaWRcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwiY3VpZFwiKVxuICAgICAgICBrbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgICB9KSwgci5kaXJ0eSgpKTtcbiAgICAgIGVsc2UgaWYgKGkua2luZCA9PT0gXCJjdWlkMlwiKVxuICAgICAgICBEbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwidWxpZFwiKVxuICAgICAgICBQbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwidWxpZFwiLFxuICAgICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgICB9KSwgci5kaXJ0eSgpKTtcbiAgICAgIGVsc2UgaWYgKGkua2luZCA9PT0gXCJ1cmxcIilcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgVVJMKGUuZGF0YSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1cmxcIixcbiAgICAgICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICAgICAgfSksIHIuZGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSBpLmtpbmQgPT09IFwicmVnZXhcIiA/IChpLnJlZ2V4Lmxhc3RJbmRleCA9IDAsIGkucmVnZXgudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgdmFsaWRhdGlvbjogXCJyZWdleFwiLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSkgOiBpLmtpbmQgPT09IFwidHJpbVwiID8gZS5kYXRhID0gZS5kYXRhLnRyaW0oKSA6IGkua2luZCA9PT0gXCJpbmNsdWRlc1wiID8gZS5kYXRhLmluY2x1ZGVzKGkudmFsdWUsIGkucG9zaXRpb24pIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGkudmFsdWUsIHBvc2l0aW9uOiBpLnBvc2l0aW9uIH0sXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIHIuZGlydHkoKSkgOiBpLmtpbmQgPT09IFwidG9Mb3dlckNhc2VcIiA/IGUuZGF0YSA9IGUuZGF0YS50b0xvd2VyQ2FzZSgpIDogaS5raW5kID09PSBcInRvVXBwZXJDYXNlXCIgPyBlLmRhdGEgPSBlLmRhdGEudG9VcHBlckNhc2UoKSA6IGkua2luZCA9PT0gXCJzdGFydHNXaXRoXCIgPyBlLmRhdGEuc3RhcnRzV2l0aChpLnZhbHVlKSB8fCAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGkudmFsdWUgfSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJlbmRzV2l0aFwiID8gZS5kYXRhLmVuZHNXaXRoKGkudmFsdWUpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IHsgZW5kc1dpdGg6IGkudmFsdWUgfSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJkYXRldGltZVwiID8gem0oaSkudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJkYXRlXCIgPyBxbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIHIuZGlydHkoKSkgOiBpLmtpbmQgPT09IFwidGltZVwiID8gV20oaSkudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IFwidGltZVwiLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcImR1cmF0aW9uXCIgPyBGbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImR1cmF0aW9uXCIsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcImlwXCIgPyBZbShlLmRhdGEsIGkudmVyc2lvbikgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImlwXCIsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcImp3dFwiID8gWm0oZS5kYXRhLCBpLmFsZykgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImp3dFwiLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJjaWRyXCIgPyBYbShlLmRhdGEsIGkudmVyc2lvbikgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImNpZHJcIixcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIHIuZGlydHkoKSkgOiBpLmtpbmQgPT09IFwiYmFzZTY0XCIgPyBLbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImJhc2U2NFwiLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJiYXNlNjR1cmxcIiA/IEhtLnRlc3QoZS5kYXRhKSB8fCAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgIHZhbGlkYXRpb246IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogWmUuYXNzZXJ0TmV2ZXIoaSk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByLnZhbHVlLCB2YWx1ZTogZS5kYXRhIH07XG4gIH1cbiAgX3JlZ2V4KGUsIHQsIHIpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZpbmVtZW50KChuKSA9PiBlLnRlc3QobiksIHtcbiAgICAgIHZhbGlkYXRpb246IHQsXG4gICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHIpXG4gICAgfSk7XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IFJzKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgZW1haWwoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgdXJsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBlbW9qaShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICB1dWlkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgbmFub2lkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcIm5hbm9pZFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBjdWlkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWRcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgY3VpZDIoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZDJcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgdWxpZChlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1bGlkXCIsIC4uLkVlLmVyclRvT2JqKGUpIH0pO1xuICB9XG4gIGJhc2U2NChlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJiYXNlNjRcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgYmFzZTY0dXJsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJiYXNlNjR1cmxcIixcbiAgICAgIC4uLkVlLmVyclRvT2JqKGUpXG4gICAgfSk7XG4gIH1cbiAgand0KGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImp3dFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBpcChlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBjaWRyKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImNpZHJcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgZGF0ZXRpbWUoZSkge1xuICAgIHJldHVybiB0eXBlb2YgZSA9PSBcInN0cmluZ1wiID8gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgb2Zmc2V0OiAhMSxcbiAgICAgIGxvY2FsOiAhMSxcbiAgICAgIG1lc3NhZ2U6IGVcbiAgICB9KSA6IHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgIHByZWNpc2lvbjogdHlwZW9mIChlID09IG51bGwgPyB2b2lkIDAgOiBlLnByZWNpc2lvbikgPiBcInVcIiA/IG51bGwgOiBlID09IG51bGwgPyB2b2lkIDAgOiBlLnByZWNpc2lvbixcbiAgICAgIG9mZnNldDogKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUub2Zmc2V0KSA/PyAhMSxcbiAgICAgIGxvY2FsOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5sb2NhbCkgPz8gITEsXG4gICAgICAuLi5FZS5lcnJUb09iaihlID09IG51bGwgPyB2b2lkIDAgOiBlLm1lc3NhZ2UpXG4gICAgfSk7XG4gIH1cbiAgZGF0ZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJkYXRlXCIsIG1lc3NhZ2U6IGUgfSk7XG4gIH1cbiAgdGltZShlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlID09IFwic3RyaW5nXCIgPyB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcInRpbWVcIixcbiAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgIG1lc3NhZ2U6IGVcbiAgICB9KSA6IHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUucHJlY2lzaW9uKSA+IFwidVwiID8gbnVsbCA6IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUucHJlY2lzaW9uLFxuICAgICAgLi4uRWUuZXJyVG9PYmooZSA9PSBudWxsID8gdm9pZCAwIDogZS5tZXNzYWdlKVxuICAgIH0pO1xuICB9XG4gIGR1cmF0aW9uKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImR1cmF0aW9uXCIsIC4uLkVlLmVyclRvT2JqKGUpIH0pO1xuICB9XG4gIHJlZ2V4KGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJyZWdleFwiLFxuICAgICAgcmVnZXg6IGUsXG4gICAgICAuLi5FZS5lcnJUb09iaih0KVxuICAgIH0pO1xuICB9XG4gIGluY2x1ZGVzKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgdmFsdWU6IGUsXG4gICAgICBwb3NpdGlvbjogdCA9PSBudWxsID8gdm9pZCAwIDogdC5wb3NpdGlvbixcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQubWVzc2FnZSlcbiAgICB9KTtcbiAgfVxuICBzdGFydHNXaXRoKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQpXG4gICAgfSk7XG4gIH1cbiAgZW5kc1dpdGgoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcImVuZHNXaXRoXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQpXG4gICAgfSk7XG4gIH1cbiAgbWluKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtaW5cIixcbiAgICAgIHZhbHVlOiBlLFxuICAgICAgLi4uRWUuZXJyVG9PYmoodClcbiAgICB9KTtcbiAgfVxuICBtYXgoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgdmFsdWU6IGUsXG4gICAgICAuLi5FZS5lcnJUb09iaih0KVxuICAgIH0pO1xuICB9XG4gIGxlbmd0aChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQpXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gYC5taW4oMSlgXG4gICAqL1xuICBub25lbXB0eShlKSB7XG4gICAgcmV0dXJuIHRoaXMubWluKDEsIEVlLmVyclRvT2JqKGUpKTtcbiAgfVxuICB0cmltKCkge1xuICAgIHJldHVybiBuZXcgUnMoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRyaW1cIiB9XVxuICAgIH0pO1xuICB9XG4gIHRvTG93ZXJDYXNlKCkge1xuICAgIHJldHVybiBuZXcgUnMoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvTG93ZXJDYXNlXCIgfV1cbiAgICB9KTtcbiAgfVxuICB0b1VwcGVyQ2FzZSgpIHtcbiAgICByZXR1cm4gbmV3IFJzKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gIH1cbiAgZ2V0IGlzRGF0ZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJkYXRlXCIpO1xuICB9XG4gIGdldCBpc1RpbWUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwidGltZVwiKTtcbiAgfVxuICBnZXQgaXNEdXJhdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJkdXJhdGlvblwiKTtcbiAgfVxuICBnZXQgaXNFbWFpbCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJlbWFpbFwiKTtcbiAgfVxuICBnZXQgaXNVUkwoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwidXJsXCIpO1xuICB9XG4gIGdldCBpc0Vtb2ppKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoZSkgPT4gZS5raW5kID09PSBcImVtb2ppXCIpO1xuICB9XG4gIGdldCBpc1VVSUQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwidXVpZFwiKTtcbiAgfVxuICBnZXQgaXNOQU5PSUQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwibmFub2lkXCIpO1xuICB9XG4gIGdldCBpc0NVSUQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgfVxuICBnZXQgaXNDVUlEMigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJjdWlkMlwiKTtcbiAgfVxuICBnZXQgaXNVTElEKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoZSkgPT4gZS5raW5kID09PSBcInVsaWRcIik7XG4gIH1cbiAgZ2V0IGlzSVAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiaXBcIik7XG4gIH1cbiAgZ2V0IGlzQ0lEUigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJjaWRyXCIpO1xuICB9XG4gIGdldCBpc0Jhc2U2NCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJiYXNlNjRcIik7XG4gIH1cbiAgZ2V0IGlzQmFzZTY0dXJsKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoZSkgPT4gZS5raW5kID09PSBcImJhc2U2NHVybFwiKTtcbiAgfVxuICBnZXQgbWluTGVuZ3RoKCkge1xuICAgIGxldCBlID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIHQua2luZCA9PT0gXCJtaW5cIiAmJiAoZSA9PT0gbnVsbCB8fCB0LnZhbHVlID4gZSkgJiYgKGUgPSB0LnZhbHVlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgbWF4TGVuZ3RoKCkge1xuICAgIGxldCBlID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIHQua2luZCA9PT0gXCJtYXhcIiAmJiAoZSA9PT0gbnVsbCB8fCB0LnZhbHVlIDwgZSkgJiYgKGUgPSB0LnZhbHVlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxufVxuUnMuY3JlYXRlID0gKHMpID0+IG5ldyBScyh7XG4gIGNoZWNrczogW10sXG4gIHR5cGVOYW1lOiBrZS5ab2RTdHJpbmcsXG4gIGNvZXJjZTogKHMgPT0gbnVsbCA/IHZvaWQgMCA6IHMuY29lcmNlKSA/PyAhMSxcbiAgLi4uVmUocylcbn0pO1xuZnVuY3Rpb24gSm0ocywgZSkge1xuICBjb25zdCB0ID0gKHMudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoLCByID0gKGUudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoLCBuID0gdCA+IHIgPyB0IDogciwgaSA9IE51bWJlci5wYXJzZUludChzLnRvRml4ZWQobikucmVwbGFjZShcIi5cIiwgXCJcIikpLCBvID0gTnVtYmVyLnBhcnNlSW50KGUudG9GaXhlZChuKS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gIHJldHVybiBpICUgbyAvIDEwICoqIG47XG59XG5jbGFzcyBDbiBleHRlbmRzIFllIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5taW4gPSB0aGlzLmd0ZSwgdGhpcy5tYXggPSB0aGlzLmx0ZSwgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UgJiYgKGUuZGF0YSA9IE51bWJlcihlLmRhdGEpKSwgdGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUubnVtYmVyKSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUoaSwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS5udW1iZXIsXG4gICAgICAgIHJlY2VpdmVkOiBpLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgbGV0IHI7XG4gICAgY29uc3QgbiA9IG5ldyB3cigpO1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgaS5raW5kID09PSBcImludFwiID8gWmUuaXNJbnRlZ2VyKGUuZGF0YSkgfHwgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBcImludGVnZXJcIixcbiAgICAgICAgcmVjZWl2ZWQ6IFwiZmxvYXRcIixcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJtaW5cIiA/IChpLmluY2x1c2l2ZSA/IGUuZGF0YSA8IGkudmFsdWUgOiBlLmRhdGEgPD0gaS52YWx1ZSkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS50b29fc21hbGwsXG4gICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGluY2x1c2l2ZTogaS5pbmNsdXNpdmUsXG4gICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJtYXhcIiA/IChpLmluY2x1c2l2ZSA/IGUuZGF0YSA+IGkudmFsdWUgOiBlLmRhdGEgPj0gaS52YWx1ZSkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS50b29fYmlnLFxuICAgICAgICBtYXhpbXVtOiBpLnZhbHVlLFxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBpbmNsdXNpdmU6IGkuaW5jbHVzaXZlLFxuICAgICAgICBleGFjdDogITEsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIG4uZGlydHkoKSkgOiBpLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiID8gSm0oZS5kYXRhLCBpLnZhbHVlKSAhPT0gMCAmJiAociA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIHIpLCBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgbXVsdGlwbGVPZjogaS52YWx1ZSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJmaW5pdGVcIiA/IE51bWJlci5pc0Zpbml0ZShlLmRhdGEpIHx8IChyID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgciksIGhlKHIsIHtcbiAgICAgICAgY29kZTogYWUubm90X2Zpbml0ZSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IFplLmFzc2VydE5ldmVyKGkpO1xuICAgIHJldHVybiB7IHN0YXR1czogbi52YWx1ZSwgdmFsdWU6IGUuZGF0YSB9O1xuICB9XG4gIGd0ZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITAsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBndChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITEsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBsdGUoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICEwLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgbHQoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICExLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgc2V0TGltaXQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiBuZXcgQ24oe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbXG4gICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBlLFxuICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgIGluY2x1c2l2ZTogcixcbiAgICAgICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhuKVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IENuKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgaW50KGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJpbnRcIixcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgcG9zaXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IDAsXG4gICAgICBpbmNsdXNpdmU6ICExLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KTtcbiAgfVxuICBuZWdhdGl2ZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICB2YWx1ZTogMCxcbiAgICAgIGluY2x1c2l2ZTogITEsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIG5vbnBvc2l0aXZlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgbm9ubmVnYXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IDAsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KTtcbiAgfVxuICBtdWx0aXBsZU9mKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtdWx0aXBsZU9mXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpXG4gICAgfSk7XG4gIH1cbiAgZmluaXRlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJmaW5pdGVcIixcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgc2FmZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgdmFsdWU6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KS5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICB2YWx1ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIGdldCBtaW5WYWx1ZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpXG4gICAgICB0LmtpbmQgPT09IFwibWluXCIgJiYgKGUgPT09IG51bGwgfHwgdC52YWx1ZSA+IGUpICYmIChlID0gdC52YWx1ZSk7XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZ2V0IG1heFZhbHVlKCkge1xuICAgIGxldCBlID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIHQua2luZCA9PT0gXCJtYXhcIiAmJiAoZSA9PT0gbnVsbCB8fCB0LnZhbHVlIDwgZSkgJiYgKGUgPSB0LnZhbHVlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgaXNJbnQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiaW50XCIgfHwgZS5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiBaZS5pc0ludGVnZXIoZS52YWx1ZSkpO1xuICB9XG4gIGdldCBpc0Zpbml0ZSgpIHtcbiAgICBsZXQgZSA9IG51bGwsIHQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICBpZiAoci5raW5kID09PSBcImZpbml0ZVwiIHx8IHIua2luZCA9PT0gXCJpbnRcIiB8fCByLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICByLmtpbmQgPT09IFwibWluXCIgPyAodCA9PT0gbnVsbCB8fCByLnZhbHVlID4gdCkgJiYgKHQgPSByLnZhbHVlKSA6IHIua2luZCA9PT0gXCJtYXhcIiAmJiAoZSA9PT0gbnVsbCB8fCByLnZhbHVlIDwgZSkgJiYgKGUgPSByLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KSAmJiBOdW1iZXIuaXNGaW5pdGUoZSk7XG4gIH1cbn1cbkNuLmNyZWF0ZSA9IChzKSA9PiBuZXcgQ24oe1xuICBjaGVja3M6IFtdLFxuICB0eXBlTmFtZToga2UuWm9kTnVtYmVyLFxuICBjb2VyY2U6IChzID09IG51bGwgPyB2b2lkIDAgOiBzLmNvZXJjZSkgfHwgITEsXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIEpuIGV4dGVuZHMgWWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLm1pbiA9IHRoaXMuZ3RlLCB0aGlzLm1heCA9IHRoaXMubHRlO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpXG4gICAgICB0cnkge1xuICAgICAgICBlLmRhdGEgPSBCaWdJbnQoZS5kYXRhKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5iaWdpbnQpXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGUpO1xuICAgIGxldCByO1xuICAgIGNvbnN0IG4gPSBuZXcgd3IoKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIGkua2luZCA9PT0gXCJtaW5cIiA/IChpLmluY2x1c2l2ZSA/IGUuZGF0YSA8IGkudmFsdWUgOiBlLmRhdGEgPD0gaS52YWx1ZSkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS50b29fc21hbGwsXG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogaS5pbmNsdXNpdmUsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIG4uZGlydHkoKSkgOiBpLmtpbmQgPT09IFwibWF4XCIgPyAoaS5pbmNsdXNpdmUgPyBlLmRhdGEgPiBpLnZhbHVlIDogZS5kYXRhID49IGkudmFsdWUpICYmIChyID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgciksIGhlKHIsIHtcbiAgICAgICAgY29kZTogYWUudG9vX2JpZyxcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgbWF4aW11bTogaS52YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBpLmluY2x1c2l2ZSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIgPyBlLmRhdGEgJSBpLnZhbHVlICE9PSBCaWdJbnQoMCkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgIG11bHRpcGxlT2Y6IGkudmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIG4uZGlydHkoKSkgOiBaZS5hc3NlcnROZXZlcihpKTtcbiAgICByZXR1cm4geyBzdGF0dXM6IG4udmFsdWUsIHZhbHVlOiBlLmRhdGEgfTtcbiAgfVxuICBfZ2V0SW52YWxpZElucHV0KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgIGV4cGVjdGVkOiBtZS5iaWdpbnQsXG4gICAgICByZWNlaXZlZDogdC5wYXJzZWRUeXBlXG4gICAgfSksIFJlO1xuICB9XG4gIGd0ZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITAsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBndChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITEsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBsdGUoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICEwLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgbHQoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICExLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgc2V0TGltaXQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiBuZXcgSm4oe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbXG4gICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBlLFxuICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgIGluY2x1c2l2ZTogcixcbiAgICAgICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhuKVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IEpuKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgcG9zaXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgIGluY2x1c2l2ZTogITEsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIG5lZ2F0aXZlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICBpbmNsdXNpdmU6ICExLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KTtcbiAgfVxuICBub25wb3NpdGl2ZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgbm9ubmVnYXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIG11bHRpcGxlT2YoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgIHZhbHVlOiBlLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcodClcbiAgICB9KTtcbiAgfVxuICBnZXQgbWluVmFsdWUoKSB7XG4gICAgbGV0IGUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgdC5raW5kID09PSBcIm1pblwiICYmIChlID09PSBudWxsIHx8IHQudmFsdWUgPiBlKSAmJiAoZSA9IHQudmFsdWUpO1xuICAgIHJldHVybiBlO1xuICB9XG4gIGdldCBtYXhWYWx1ZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpXG4gICAgICB0LmtpbmQgPT09IFwibWF4XCIgJiYgKGUgPT09IG51bGwgfHwgdC52YWx1ZSA8IGUpICYmIChlID0gdC52YWx1ZSk7XG4gICAgcmV0dXJuIGU7XG4gIH1cbn1cbkpuLmNyZWF0ZSA9IChzKSA9PiBuZXcgSm4oe1xuICBjaGVja3M6IFtdLFxuICB0eXBlTmFtZToga2UuWm9kQmlnSW50LFxuICBjb2VyY2U6IChzID09IG51bGwgPyB2b2lkIDAgOiBzLmNvZXJjZSkgPz8gITEsXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIEhsIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9kZWYuY29lcmNlICYmIChlLmRhdGEgPSAhIWUuZGF0YSksIHRoaXMuX2dldFR5cGUoZSkgIT09IG1lLmJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLmJvb2xlYW4sXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cbkhsLmNyZWF0ZSA9IChzKSA9PiBuZXcgSGwoe1xuICB0eXBlTmFtZToga2UuWm9kQm9vbGVhbixcbiAgY29lcmNlOiAocyA9PSBudWxsID8gdm9pZCAwIDogcy5jb2VyY2UpIHx8ICExLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBUbyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSAmJiAoZS5kYXRhID0gbmV3IERhdGUoZS5kYXRhKSksIHRoaXMuX2dldFR5cGUoZSkgIT09IG1lLmRhdGUpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShpLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLmRhdGUsXG4gICAgICAgIHJlY2VpdmVkOiBpLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgaWYgKE51bWJlci5pc05hTihlLmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgY29uc3QgaSA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO1xuICAgICAgcmV0dXJuIGhlKGksIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9kYXRlXG4gICAgICB9KSwgUmU7XG4gICAgfVxuICAgIGNvbnN0IHIgPSBuZXcgd3IoKTtcbiAgICBsZXQgbjtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIGkua2luZCA9PT0gXCJtaW5cIiA/IGUuZGF0YS5nZXRUaW1lKCkgPCBpLnZhbHVlICYmIChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2UsXG4gICAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgbWluaW11bTogaS52YWx1ZSxcbiAgICAgICAgdHlwZTogXCJkYXRlXCJcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcIm1heFwiID8gZS5kYXRhLmdldFRpbWUoKSA+IGkudmFsdWUgJiYgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICBjb2RlOiBhZS50b29fYmlnLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2UsXG4gICAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgbWF4aW11bTogaS52YWx1ZSxcbiAgICAgICAgdHlwZTogXCJkYXRlXCJcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogWmUuYXNzZXJ0TmV2ZXIoaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogci52YWx1ZSxcbiAgICAgIHZhbHVlOiBuZXcgRGF0ZShlLmRhdGEuZ2V0VGltZSgpKVxuICAgIH07XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IFRvKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgbWluKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtaW5cIixcbiAgICAgIHZhbHVlOiBlLmdldFRpbWUoKSxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpXG4gICAgfSk7XG4gIH1cbiAgbWF4KGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIHZhbHVlOiBlLmdldFRpbWUoKSxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpXG4gICAgfSk7XG4gIH1cbiAgZ2V0IG1pbkRhdGUoKSB7XG4gICAgbGV0IGUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgdC5raW5kID09PSBcIm1pblwiICYmIChlID09PSBudWxsIHx8IHQudmFsdWUgPiBlKSAmJiAoZSA9IHQudmFsdWUpO1xuICAgIHJldHVybiBlICE9IG51bGwgPyBuZXcgRGF0ZShlKSA6IG51bGw7XG4gIH1cbiAgZ2V0IG1heERhdGUoKSB7XG4gICAgbGV0IGUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgdC5raW5kID09PSBcIm1heFwiICYmIChlID09PSBudWxsIHx8IHQudmFsdWUgPCBlKSAmJiAoZSA9IHQudmFsdWUpO1xuICAgIHJldHVybiBlICE9IG51bGwgPyBuZXcgRGF0ZShlKSA6IG51bGw7XG4gIH1cbn1cblRvLmNyZWF0ZSA9IChzKSA9PiBuZXcgVG8oe1xuICBjaGVja3M6IFtdLFxuICBjb2VyY2U6IChzID09IG51bGwgPyB2b2lkIDAgOiBzLmNvZXJjZSkgfHwgITEsXG4gIHR5cGVOYW1lOiBrZS5ab2REYXRlLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBRdSBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUuc3ltYm9sKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS5zeW1ib2wsXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cblF1LmNyZWF0ZSA9IChzKSA9PiBuZXcgUXUoe1xuICB0eXBlTmFtZToga2UuWm9kU3ltYm9sLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBxbCBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUudW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS51bmRlZmluZWQsXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cbnFsLmNyZWF0ZSA9IChzKSA9PiBuZXcgcWwoe1xuICB0eXBlTmFtZToga2UuWm9kVW5kZWZpbmVkLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBXbCBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUubnVsbCkge1xuICAgICAgY29uc3QgciA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO1xuICAgICAgcmV0dXJuIGhlKHIsIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF90eXBlLFxuICAgICAgICBleHBlY3RlZDogbWUubnVsbCxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxufVxuV2wuY3JlYXRlID0gKHMpID0+IG5ldyBXbCh7XG4gIHR5cGVOYW1lOiBrZS5ab2ROdWxsLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBlZCBleHRlbmRzIFllIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5fYW55ID0gITA7XG4gIH1cbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxufVxuZWQuY3JlYXRlID0gKHMpID0+IG5ldyBlZCh7XG4gIHR5cGVOYW1lOiBrZS5ab2RBbnksXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIHRkIGV4dGVuZHMgWWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLl91bmtub3duID0gITA7XG4gIH1cbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxufVxudGQuY3JlYXRlID0gKHMpID0+IG5ldyB0ZCh7XG4gIHR5cGVOYW1lOiBrZS5ab2RVbmtub3duLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBQcyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgIGV4cGVjdGVkOiBtZS5uZXZlcixcbiAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGVcbiAgICB9KSwgUmU7XG4gIH1cbn1cblBzLmNyZWF0ZSA9IChzKSA9PiBuZXcgUHMoe1xuICB0eXBlTmFtZToga2UuWm9kTmV2ZXIsXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIHJkIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS51bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnZvaWQsXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cbnJkLmNyZWF0ZSA9IChzKSA9PiBuZXcgcmQoe1xuICB0eXBlTmFtZToga2UuWm9kVm9pZCxcbiAgLi4uVmUocylcbn0pO1xuY2xhc3MgWXIgZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBjdHg6IHQsIHN0YXR1czogciB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLCBuID0gdGhpcy5fZGVmO1xuICAgIGlmICh0LnBhcnNlZFR5cGUgIT09IG1lLmFycmF5KVxuICAgICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF90eXBlLFxuICAgICAgICBleHBlY3RlZDogbWUuYXJyYXksXG4gICAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICBpZiAobi5leGFjdExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbyA9IHQuZGF0YS5sZW5ndGggPiBuLmV4YWN0TGVuZ3RoLnZhbHVlLCBhID0gdC5kYXRhLmxlbmd0aCA8IG4uZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAobyB8fCBhKSAmJiAoaGUodCwge1xuICAgICAgICBjb2RlOiBvID8gYWUudG9vX2JpZyA6IGFlLnRvb19zbWFsbCxcbiAgICAgICAgbWluaW11bTogYSA/IG4uZXhhY3RMZW5ndGgudmFsdWUgOiB2b2lkIDAsXG4gICAgICAgIG1heGltdW06IG8gPyBuLmV4YWN0TGVuZ3RoLnZhbHVlIDogdm9pZCAwLFxuICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICAgIGV4YWN0OiAhMCxcbiAgICAgICAgbWVzc2FnZTogbi5leGFjdExlbmd0aC5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKTtcbiAgICB9XG4gICAgaWYgKG4ubWluTGVuZ3RoICE9PSBudWxsICYmIHQuZGF0YS5sZW5ndGggPCBuLm1pbkxlbmd0aC52YWx1ZSAmJiAoaGUodCwge1xuICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgbWluaW11bTogbi5taW5MZW5ndGgudmFsdWUsXG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgZXhhY3Q6ICExLFxuICAgICAgbWVzc2FnZTogbi5taW5MZW5ndGgubWVzc2FnZVxuICAgIH0pLCByLmRpcnR5KCkpLCBuLm1heExlbmd0aCAhPT0gbnVsbCAmJiB0LmRhdGEubGVuZ3RoID4gbi5tYXhMZW5ndGgudmFsdWUgJiYgKGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLnRvb19iaWcsXG4gICAgICBtYXhpbXVtOiBuLm1heExlbmd0aC52YWx1ZSxcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICBleGFjdDogITEsXG4gICAgICBtZXNzYWdlOiBuLm1heExlbmd0aC5tZXNzYWdlXG4gICAgfSksIHIuZGlydHkoKSksIHQuY29tbW9uLmFzeW5jKVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsuLi50LmRhdGFdLm1hcCgobywgYSkgPT4gbi50eXBlLl9wYXJzZUFzeW5jKG5ldyBEcyh0LCBvLCB0LnBhdGgsIGEpKSkpLnRoZW4oKG8pID0+IHdyLm1lcmdlQXJyYXkociwgbykpO1xuICAgIGNvbnN0IGkgPSBbLi4udC5kYXRhXS5tYXAoKG8sIGEpID0+IG4udHlwZS5fcGFyc2VTeW5jKG5ldyBEcyh0LCBvLCB0LnBhdGgsIGEpKSk7XG4gICAgcmV0dXJuIHdyLm1lcmdlQXJyYXkociwgaSk7XG4gIH1cbiAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICB9XG4gIG1pbihlLCB0KSB7XG4gICAgcmV0dXJuIG5ldyBZcih7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IGUsIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpIH1cbiAgICB9KTtcbiAgfVxuICBtYXgoZSwgdCkge1xuICAgIHJldHVybiBuZXcgWXIoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgbWF4TGVuZ3RoOiB7IHZhbHVlOiBlLCBtZXNzYWdlOiBFZS50b1N0cmluZyh0KSB9XG4gICAgfSk7XG4gIH1cbiAgbGVuZ3RoKGUsIHQpIHtcbiAgICByZXR1cm4gbmV3IFlyKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGV4YWN0TGVuZ3RoOiB7IHZhbHVlOiBlLCBtZXNzYWdlOiBFZS50b1N0cmluZyh0KSB9XG4gICAgfSk7XG4gIH1cbiAgbm9uZW1wdHkoZSkge1xuICAgIHJldHVybiB0aGlzLm1pbigxLCBlKTtcbiAgfVxufVxuWXIuY3JlYXRlID0gKHMsIGUpID0+IG5ldyBZcih7XG4gIHR5cGU6IHMsXG4gIG1pbkxlbmd0aDogbnVsbCxcbiAgbWF4TGVuZ3RoOiBudWxsLFxuICBleGFjdExlbmd0aDogbnVsbCxcbiAgdHlwZU5hbWU6IGtlLlpvZEFycmF5LFxuICAuLi5WZShlKVxufSk7XG5mdW5jdGlvbiBtbihzKSB7XG4gIGlmIChzIGluc3RhbmNlb2YgJHQpIHtcbiAgICBjb25zdCBlID0ge307XG4gICAgZm9yIChjb25zdCB0IGluIHMuc2hhcGUpIHtcbiAgICAgIGNvbnN0IHIgPSBzLnNoYXBlW3RdO1xuICAgICAgZVt0XSA9IGZzLmNyZWF0ZShtbihyKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4ucy5fZGVmLFxuICAgICAgc2hhcGU6ICgpID0+IGVcbiAgICB9KTtcbiAgfSBlbHNlIHJldHVybiBzIGluc3RhbmNlb2YgWXIgPyBuZXcgWXIoe1xuICAgIC4uLnMuX2RlZixcbiAgICB0eXBlOiBtbihzLmVsZW1lbnQpXG4gIH0pIDogcyBpbnN0YW5jZW9mIGZzID8gZnMuY3JlYXRlKG1uKHMudW53cmFwKCkpKSA6IHMgaW5zdGFuY2VvZiBacyA/IFpzLmNyZWF0ZShtbihzLnVud3JhcCgpKSkgOiBzIGluc3RhbmNlb2YgV3MgPyBXcy5jcmVhdGUocy5pdGVtcy5tYXAoKGUpID0+IG1uKGUpKSkgOiBzO1xufVxuY2xhc3MgJHQgZXh0ZW5kcyBZZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuX2NhY2hlZCA9IG51bGwsIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaCwgdGhpcy5hdWdtZW50ID0gdGhpcy5leHRlbmQ7XG4gIH1cbiAgX2dldENhY2hlZCgpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICBjb25zdCBlID0gdGhpcy5fZGVmLnNoYXBlKCksIHQgPSBaZS5vYmplY3RLZXlzKGUpO1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWQgPSB7IHNoYXBlOiBlLCBrZXlzOiB0IH0sIHRoaXMuX2NhY2hlZDtcbiAgfVxuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5vYmplY3QpIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShjLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm9iamVjdCxcbiAgICAgICAgcmVjZWl2ZWQ6IGMucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXR1czogciwgY3R4OiBuIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksIHsgc2hhcGU6IGksIGtleXM6IG8gfSA9IHRoaXMuX2dldENhY2hlZCgpLCBhID0gW107XG4gICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgUHMgJiYgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKVxuICAgICAgZm9yIChjb25zdCBjIGluIG4uZGF0YSlcbiAgICAgICAgby5pbmNsdWRlcyhjKSB8fCBhLnB1c2goYyk7XG4gICAgY29uc3QgbCA9IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiBvKSB7XG4gICAgICBjb25zdCB1ID0gaVtjXSwgZCA9IG4uZGF0YVtjXTtcbiAgICAgIGwucHVzaCh7XG4gICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGMgfSxcbiAgICAgICAgdmFsdWU6IHUuX3BhcnNlKG5ldyBEcyhuLCBkLCBuLnBhdGgsIGMpKSxcbiAgICAgICAgYWx3YXlzU2V0OiBjIGluIG4uZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBQcykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuX2RlZi51bmtub3duS2V5cztcbiAgICAgIGlmIChjID09PSBcInBhc3N0aHJvdWdoXCIpXG4gICAgICAgIGZvciAoY29uc3QgdSBvZiBhKVxuICAgICAgICAgIGwucHVzaCh7XG4gICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiB1IH0sXG4gICAgICAgICAgICB2YWx1ZTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IG4uZGF0YVt1XSB9XG4gICAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmIChjID09PSBcInN0cmljdFwiKVxuICAgICAgICBhLmxlbmd0aCA+IDAgJiYgKGhlKG4sIHtcbiAgICAgICAgICBjb2RlOiBhZS51bnJlY29nbml6ZWRfa2V5cyxcbiAgICAgICAgICBrZXlzOiBhXG4gICAgICAgIH0pLCByLmRpcnR5KCkpO1xuICAgICAgZWxzZSBpZiAoYyAhPT0gXCJzdHJpcFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5fZGVmLmNhdGNoYWxsO1xuICAgICAgZm9yIChjb25zdCB1IG9mIGEpIHtcbiAgICAgICAgY29uc3QgZCA9IG4uZGF0YVt1XTtcbiAgICAgICAgbC5wdXNoKHtcbiAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiB1IH0sXG4gICAgICAgICAgdmFsdWU6IGMuX3BhcnNlKFxuICAgICAgICAgICAgbmV3IERzKG4sIGQsIG4ucGF0aCwgdSlcbiAgICAgICAgICAgIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhbHdheXNTZXQ6IHUgaW4gbi5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbi5jb21tb24uYXN5bmMgPyBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdSBvZiBsKSB7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCB1LmtleSwgaCA9IGF3YWl0IHUudmFsdWU7XG4gICAgICAgIGMucHVzaCh7XG4gICAgICAgICAga2V5OiBkLFxuICAgICAgICAgIHZhbHVlOiBoLFxuICAgICAgICAgIGFsd2F5c1NldDogdS5hbHdheXNTZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KS50aGVuKChjKSA9PiB3ci5tZXJnZU9iamVjdFN5bmMociwgYykpIDogd3IubWVyZ2VPYmplY3RTeW5jKHIsIGwpO1xuICB9XG4gIGdldCBzaGFwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7XG4gIH1cbiAgc3RyaWN0KGUpIHtcbiAgICByZXR1cm4gRWUuZXJyVG9PYmosIG5ldyAkdCh7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgIC4uLmUgIT09IHZvaWQgMCA/IHtcbiAgICAgICAgZXJyb3JNYXA6ICh0LCByKSA9PiB7XG4gICAgICAgICAgdmFyIGksIG87XG4gICAgICAgICAgY29uc3QgbiA9ICgobyA9IChpID0gdGhpcy5fZGVmKS5lcnJvck1hcCkgPT0gbnVsbCA/IHZvaWQgMCA6IG8uY2FsbChpLCB0LCByKS5tZXNzYWdlKSA/PyByLmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICByZXR1cm4gdC5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIgPyB7XG4gICAgICAgICAgICBtZXNzYWdlOiBFZS5lcnJUb09iaihlKS5tZXNzYWdlID8/IG5cbiAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgbWVzc2FnZTogblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gOiB7fVxuICAgIH0pO1xuICB9XG4gIHN0cmlwKCkge1xuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIlxuICAgIH0pO1xuICB9XG4gIHBhc3N0aHJvdWdoKCkge1xuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIlxuICAgIH0pO1xuICB9XG4gIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgLy8gICA8RGVmIGV4dGVuZHMgWm9kT2JqZWN0RGVmPihkZWY6IERlZikgPT5cbiAgLy8gICA8QXVnbWVudGF0aW9uIGV4dGVuZHMgWm9kUmF3U2hhcGU+KFxuICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgLy8gICApOiBab2RPYmplY3Q8XG4gIC8vICAgICBleHRlbmRTaGFwZTxSZXR1cm5UeXBlPERlZltcInNoYXBlXCJdPiwgQXVnbWVudGF0aW9uPixcbiAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAvLyAgICAgRGVmW1wiY2F0Y2hhbGxcIl1cbiAgLy8gICA+ID0+IHtcbiAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgLy8gICAgICAgLi4uZGVmLFxuICAvLyAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgLy8gICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gIC8vICAgICAgIH0pLFxuICAvLyAgICAgfSkgYXMgYW55O1xuICAvLyAgIH07XG4gIGV4dGVuZChlKSB7XG4gICAgcmV0dXJuIG5ldyAkdCh7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgIC4uLmVcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW9yIHRvIHpvZEAxLjAuMTIgdGhlcmUgd2FzIGEgYnVnIGluIHRoZVxuICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2VcbiAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAqL1xuICBtZXJnZShlKSB7XG4gICAgcmV0dXJuIG5ldyAkdCh7XG4gICAgICB1bmtub3duS2V5czogZS5fZGVmLnVua25vd25LZXlzLFxuICAgICAgY2F0Y2hhbGw6IGUuX2RlZi5jYXRjaGFsbCxcbiAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLi4uZS5fZGVmLnNoYXBlKClcbiAgICAgIH0pLFxuICAgICAgdHlwZU5hbWU6IGtlLlpvZE9iamVjdFxuICAgIH0pO1xuICB9XG4gIC8vIG1lcmdlPFxuICAvLyAgIEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0LFxuICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gIC8vICAgTmV3T3V0cHV0IGV4dGVuZHMge1xuICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gIC8vICAgICAgID8gT3V0cHV0W2tdXG4gIC8vICAgICAgIDogbmV2ZXI7XG4gIC8vICAgfSxcbiAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHtcbiAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9pbnB1dFwiXVxuICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBJbnB1dFxuICAvLyAgICAgICA/IElucHV0W2tdXG4gIC8vICAgICAgIDogbmV2ZXI7XG4gIC8vICAgfVxuICAvLyA+KFxuICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gIC8vICk6IFpvZE9iamVjdDxcbiAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl0sXG4gIC8vICAgTmV3T3V0cHV0LFxuICAvLyAgIE5ld0lucHV0XG4gIC8vID4ge1xuICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgLy8gICB9KSBhcyBhbnk7XG4gIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgLy8gfVxuICBzZXRLZXkoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLmF1Z21lbnQoeyBbZV06IHQgfSk7XG4gIH1cbiAgLy8gbWVyZ2U8SW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3Q+KFxuICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1tcIl9zaGFwZVwiXSwgVW5rbm93bktleXMsIENhdGNoYWxsPiA9IChtZXJnaW5nKSA9PiB7XG4gIC8vIFpvZE9iamVjdDxcbiAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl1cbiAgLy8gPiB7XG4gIC8vICAgLy8gY29uc3QgbWVyZ2VkU2hhcGUgPSBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKFxuICAvLyAgIC8vICAgdGhpcy5fZGVmLnNoYXBlKCksXG4gIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAvLyAgIC8vICk7XG4gIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAvLyAgICAgc2hhcGU6ICgpID0+XG4gIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAvLyAgIH0pIGFzIGFueTtcbiAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAvLyB9XG4gIGNhdGNoYWxsKGUpIHtcbiAgICByZXR1cm4gbmV3ICR0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNhdGNoYWxsOiBlXG4gICAgfSk7XG4gIH1cbiAgcGljayhlKSB7XG4gICAgY29uc3QgdCA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiBaZS5vYmplY3RLZXlzKGUpKVxuICAgICAgZVtyXSAmJiB0aGlzLnNoYXBlW3JdICYmICh0W3JdID0gdGhpcy5zaGFwZVtyXSk7XG4gICAgcmV0dXJuIG5ldyAkdCh7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICBzaGFwZTogKCkgPT4gdFxuICAgIH0pO1xuICB9XG4gIG9taXQoZSkge1xuICAgIGNvbnN0IHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgWmUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSlcbiAgICAgIGVbcl0gfHwgKHRbcl0gPSB0aGlzLnNoYXBlW3JdKTtcbiAgICByZXR1cm4gbmV3ICR0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIHNoYXBlOiAoKSA9PiB0XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBkZWVwUGFydGlhbCgpIHtcbiAgICByZXR1cm4gbW4odGhpcyk7XG4gIH1cbiAgcGFydGlhbChlKSB7XG4gICAgY29uc3QgdCA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiBaZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5zaGFwZVtyXTtcbiAgICAgIGUgJiYgIWVbcl0gPyB0W3JdID0gbiA6IHRbcl0gPSBuLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgc2hhcGU6ICgpID0+IHRcbiAgICB9KTtcbiAgfVxuICByZXF1aXJlZChlKSB7XG4gICAgY29uc3QgdCA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiBaZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKVxuICAgICAgaWYgKGUgJiYgIWVbcl0pXG4gICAgICAgIHRbcl0gPSB0aGlzLnNoYXBlW3JdO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5zaGFwZVtyXTtcbiAgICAgICAgZm9yICg7IGkgaW5zdGFuY2VvZiBmczsgKVxuICAgICAgICAgIGkgPSBpLl9kZWYuaW5uZXJUeXBlO1xuICAgICAgICB0W3JdID0gaTtcbiAgICAgIH1cbiAgICByZXR1cm4gbmV3ICR0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIHNoYXBlOiAoKSA9PiB0XG4gICAgfSk7XG4gIH1cbiAga2V5b2YoKSB7XG4gICAgcmV0dXJuIE5mKFplLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICB9XG59XG4kdC5jcmVhdGUgPSAocywgZSkgPT4gbmV3ICR0KHtcbiAgc2hhcGU6ICgpID0+IHMsXG4gIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gIGNhdGNoYWxsOiBQcy5jcmVhdGUoKSxcbiAgdHlwZU5hbWU6IGtlLlpvZE9iamVjdCxcbiAgLi4uVmUoZSlcbn0pO1xuJHQuc3RyaWN0Q3JlYXRlID0gKHMsIGUpID0+IG5ldyAkdCh7XG4gIHNoYXBlOiAoKSA9PiBzLFxuICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgY2F0Y2hhbGw6IFBzLmNyZWF0ZSgpLFxuICB0eXBlTmFtZToga2UuWm9kT2JqZWN0LFxuICAuLi5WZShlKVxufSk7XG4kdC5sYXp5Y3JlYXRlID0gKHMsIGUpID0+IG5ldyAkdCh7XG4gIHNoYXBlOiBzLFxuICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICBjYXRjaGFsbDogUHMuY3JlYXRlKCksXG4gIHR5cGVOYW1lOiBrZS5ab2RPYmplY3QsXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIHdvIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgY3R4OiB0IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksIHIgPSB0aGlzLl9kZWYub3B0aW9ucztcbiAgICBmdW5jdGlvbiBuKGkpIHtcbiAgICAgIGZvciAoY29uc3QgYSBvZiBpKVxuICAgICAgICBpZiAoYS5yZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgcmV0dXJuIGEucmVzdWx0O1xuICAgICAgZm9yIChjb25zdCBhIG9mIGkpXG4gICAgICAgIGlmIChhLnJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICByZXR1cm4gdC5jb21tb24uaXNzdWVzLnB1c2goLi4uYS5jdHguY29tbW9uLmlzc3VlcyksIGEucmVzdWx0O1xuICAgICAgY29uc3QgbyA9IGkubWFwKChhKSA9PiBuZXcgcHMoYS5jdHguY29tbW9uLmlzc3VlcykpO1xuICAgICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF91bmlvbixcbiAgICAgICAgdW5pb25FcnJvcnM6IG9cbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgaWYgKHQuY29tbW9uLmFzeW5jKVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHIubWFwKGFzeW5jIChpKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB7XG4gICAgICAgICAgLi4udCxcbiAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgIC4uLnQuY29tbW9uLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFyZW50OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdWx0OiBhd2FpdCBpLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgIGRhdGE6IHQuZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogb1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGN0eDogb1xuICAgICAgICB9O1xuICAgICAgfSkpLnRoZW4obik7XG4gICAge1xuICAgICAgbGV0IGk7XG4gICAgICBjb25zdCBvID0gW107XG4gICAgICBmb3IgKGNvbnN0IGwgb2Ygcikge1xuICAgICAgICBjb25zdCBjID0ge1xuICAgICAgICAgIC4uLnQsXG4gICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAuLi50LmNvbW1vbixcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICB9LCB1ID0gbC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICBkYXRhOiB0LmRhdGEsXG4gICAgICAgICAgcGF0aDogdC5wYXRoLFxuICAgICAgICAgIHBhcmVudDogY1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHUuc3RhdHVzID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgcmV0dXJuIHU7XG4gICAgICAgIHUuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWkgJiYgKGkgPSB7IHJlc3VsdDogdSwgY3R4OiBjIH0pLCBjLmNvbW1vbi5pc3N1ZXMubGVuZ3RoICYmIG8ucHVzaChjLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGkpXG4gICAgICAgIHJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5pLmN0eC5jb21tb24uaXNzdWVzKSwgaS5yZXN1bHQ7XG4gICAgICBjb25zdCBhID0gby5tYXAoKGwpID0+IG5ldyBwcyhsKSk7XG4gICAgICByZXR1cm4gaGUodCwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICB1bmlvbkVycm9yczogYVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gIH1cbn1cbndvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgd28oe1xuICBvcHRpb25zOiBzLFxuICB0eXBlTmFtZToga2UuWm9kVW5pb24sXG4gIC4uLlZlKGUpXG59KTtcbmNvbnN0IG9zID0gKHMpID0+IHMgaW5zdGFuY2VvZiBZbCA/IG9zKHMuc2NoZW1hKSA6IHMgaW5zdGFuY2VvZiBZcyA/IG9zKHMuaW5uZXJUeXBlKCkpIDogcyBpbnN0YW5jZW9mIElvID8gW3MudmFsdWVdIDogcyBpbnN0YW5jZW9mIHpzID8gcy5vcHRpb25zIDogcyBpbnN0YW5jZW9mIFpsID8gWmUub2JqZWN0VmFsdWVzKHMuZW51bSkgOiBzIGluc3RhbmNlb2YgUm8gPyBvcyhzLl9kZWYuaW5uZXJUeXBlKSA6IHMgaW5zdGFuY2VvZiBxbCA/IFt2b2lkIDBdIDogcyBpbnN0YW5jZW9mIFdsID8gW251bGxdIDogcyBpbnN0YW5jZW9mIGZzID8gW3ZvaWQgMCwgLi4ub3Mocy51bndyYXAoKSldIDogcyBpbnN0YW5jZW9mIFpzID8gW251bGwsIC4uLm9zKHMudW53cmFwKCkpXSA6IHMgaW5zdGFuY2VvZiBVZiB8fCBzIGluc3RhbmNlb2YgQ28gPyBvcyhzLnVud3JhcCgpKSA6IHMgaW5zdGFuY2VvZiBMbyA/IG9zKHMuX2RlZi5pbm5lclR5cGUpIDogW107XG5jbGFzcyBVYyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IGN0eDogdCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO1xuICAgIGlmICh0LnBhcnNlZFR5cGUgIT09IG1lLm9iamVjdClcbiAgICAgIHJldHVybiBoZSh0LCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm9iamVjdCxcbiAgICAgICAgcmVjZWl2ZWQ6IHQucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGNvbnN0IHIgPSB0aGlzLmRpc2NyaW1pbmF0b3IsIG4gPSB0LmRhdGFbcl0sIGkgPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KG4pO1xuICAgIHJldHVybiBpID8gdC5jb21tb24uYXN5bmMgPyBpLl9wYXJzZUFzeW5jKHtcbiAgICAgIGRhdGE6IHQuZGF0YSxcbiAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgIHBhcmVudDogdFxuICAgIH0pIDogaS5fcGFyc2VTeW5jKHtcbiAgICAgIGRhdGE6IHQuZGF0YSxcbiAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgIHBhcmVudDogdFxuICAgIH0pIDogKGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgIG9wdGlvbnM6IEFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSksXG4gICAgICBwYXRoOiBbcl1cbiAgICB9KSwgUmUpO1xuICB9XG4gIGdldCBkaXNjcmltaW5hdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gIH1cbiAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zTWFwO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24gc2NoZW1hLiBJdHMgYmVoYXZpb3VyIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBub3JtYWwgei51bmlvbigpIGNvbnN0cnVjdG9yLlxuICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAqIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSB1bmlvbi5cbiAgICogQHBhcmFtIGRpc2NyaW1pbmF0b3IgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHlcbiAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgaSBvZiB0KSB7XG4gICAgICBjb25zdCBvID0gb3MoaS5zaGFwZVtlXSk7XG4gICAgICBpZiAoIW8ubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxcYCR7ZX1cXGAgY291bGQgbm90IGJlIGV4dHJhY3RlZCBmcm9tIGFsbCBzY2hlbWEgb3B0aW9uc2ApO1xuICAgICAgZm9yIChjb25zdCBhIG9mIG8pIHtcbiAgICAgICAgaWYgKG4uaGFzKGEpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzY3JpbWluYXRvciBwcm9wZXJ0eSAke1N0cmluZyhlKX0gaGFzIGR1cGxpY2F0ZSB2YWx1ZSAke1N0cmluZyhhKX1gKTtcbiAgICAgICAgbi5zZXQoYSwgaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWMoe1xuICAgICAgdHlwZU5hbWU6IGtlLlpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICAgIGRpc2NyaW1pbmF0b3I6IGUsXG4gICAgICBvcHRpb25zOiB0LFxuICAgICAgb3B0aW9uc01hcDogbixcbiAgICAgIC4uLlZlKHIpXG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHpsKHMsIGUpIHtcbiAgY29uc3QgdCA9IHdzKHMpLCByID0gd3MoZSk7XG4gIGlmIChzID09PSBlKVxuICAgIHJldHVybiB7IHZhbGlkOiAhMCwgZGF0YTogcyB9O1xuICBpZiAodCA9PT0gbWUub2JqZWN0ICYmIHIgPT09IG1lLm9iamVjdCkge1xuICAgIGNvbnN0IG4gPSBaZS5vYmplY3RLZXlzKGUpLCBpID0gWmUub2JqZWN0S2V5cyhzKS5maWx0ZXIoKGEpID0+IG4uaW5kZXhPZihhKSAhPT0gLTEpLCBvID0geyAuLi5zLCAuLi5lIH07XG4gICAgZm9yIChjb25zdCBhIG9mIGkpIHtcbiAgICAgIGNvbnN0IGwgPSB6bChzW2FdLCBlW2FdKTtcbiAgICAgIGlmICghbC52YWxpZClcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6ICExIH07XG4gICAgICBvW2FdID0gbC5kYXRhO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWxpZDogITAsIGRhdGE6IG8gfTtcbiAgfSBlbHNlIGlmICh0ID09PSBtZS5hcnJheSAmJiByID09PSBtZS5hcnJheSkge1xuICAgIGlmIChzLmxlbmd0aCAhPT0gZS5sZW5ndGgpXG4gICAgICByZXR1cm4geyB2YWxpZDogITEgfTtcbiAgICBjb25zdCBuID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gc1tpXSwgYSA9IGVbaV0sIGwgPSB6bChvLCBhKTtcbiAgICAgIGlmICghbC52YWxpZClcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6ICExIH07XG4gICAgICBuLnB1c2gobC5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsaWQ6ICEwLCBkYXRhOiBuIH07XG4gIH0gZWxzZSByZXR1cm4gdCA9PT0gbWUuZGF0ZSAmJiByID09PSBtZS5kYXRlICYmICtzID09ICtlID8geyB2YWxpZDogITAsIGRhdGE6IHMgfSA6IHsgdmFsaWQ6ICExIH07XG59XG5jbGFzcyBBbyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IHN0YXR1czogdCwgY3R4OiByIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksIG4gPSAoaSwgbykgPT4ge1xuICAgICAgaWYgKFp1KGkpIHx8IFp1KG8pKVxuICAgICAgICByZXR1cm4gUmU7XG4gICAgICBjb25zdCBhID0gemwoaS52YWx1ZSwgby52YWx1ZSk7XG4gICAgICByZXR1cm4gYS52YWxpZCA/ICgoWHUoaSkgfHwgWHUobykpICYmIHQuZGlydHkoKSwgeyBzdGF0dXM6IHQudmFsdWUsIHZhbHVlOiBhLmRhdGEgfSkgOiAoaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1xuICAgICAgfSksIFJlKTtcbiAgICB9O1xuICAgIHJldHVybiByLmNvbW1vbi5hc3luYyA/IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgIHBhcmVudDogclxuICAgICAgfSksXG4gICAgICB0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe1xuICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgICAgcGFyZW50OiByXG4gICAgICB9KVxuICAgIF0pLnRoZW4oKFtpLCBvXSkgPT4gbihpLCBvKSkgOiBuKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoe1xuICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgcGF0aDogci5wYXRoLFxuICAgICAgcGFyZW50OiByXG4gICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtcbiAgICAgIGRhdGE6IHIuZGF0YSxcbiAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgIHBhcmVudDogclxuICAgIH0pKTtcbiAgfVxufVxuQW8uY3JlYXRlID0gKHMsIGUsIHQpID0+IG5ldyBBbyh7XG4gIGxlZnQ6IHMsXG4gIHJpZ2h0OiBlLFxuICB0eXBlTmFtZToga2UuWm9kSW50ZXJzZWN0aW9uLFxuICAuLi5WZSh0KVxufSk7XG5jbGFzcyBXcyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IHN0YXR1czogdCwgY3R4OiByIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgaWYgKHIucGFyc2VkVHlwZSAhPT0gbWUuYXJyYXkpXG4gICAgICByZXR1cm4gaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS5hcnJheSxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGlmIChyLmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmLml0ZW1zLmxlbmd0aClcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLnRvb19zbWFsbCxcbiAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgICAgZXhhY3Q6ICExLFxuICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgIH0pLCBSZTtcbiAgICAhdGhpcy5fZGVmLnJlc3QgJiYgci5kYXRhLmxlbmd0aCA+IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGggJiYgKGhlKHIsIHtcbiAgICAgIGNvZGU6IGFlLnRvb19iaWcsXG4gICAgICBtYXhpbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIGV4YWN0OiAhMSxcbiAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgIH0pLCB0LmRpcnR5KCkpO1xuICAgIGNvbnN0IGkgPSBbLi4uci5kYXRhXS5tYXAoKG8sIGEpID0+IHtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLl9kZWYuaXRlbXNbYV0gfHwgdGhpcy5fZGVmLnJlc3Q7XG4gICAgICByZXR1cm4gbCA/IGwuX3BhcnNlKG5ldyBEcyhyLCBvLCByLnBhdGgsIGEpKSA6IG51bGw7XG4gICAgfSkuZmlsdGVyKChvKSA9PiAhIW8pO1xuICAgIHJldHVybiByLmNvbW1vbi5hc3luYyA/IFByb21pc2UuYWxsKGkpLnRoZW4oKG8pID0+IHdyLm1lcmdlQXJyYXkodCwgbykpIDogd3IubWVyZ2VBcnJheSh0LCBpKTtcbiAgfVxuICBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pdGVtcztcbiAgfVxuICByZXN0KGUpIHtcbiAgICByZXR1cm4gbmV3IFdzKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIHJlc3Q6IGVcbiAgICB9KTtcbiAgfVxufVxuV3MuY3JlYXRlID0gKHMsIGUpID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pXCIpO1xuICByZXR1cm4gbmV3IFdzKHtcbiAgICBpdGVtczogcyxcbiAgICB0eXBlTmFtZToga2UuWm9kVHVwbGUsXG4gICAgcmVzdDogbnVsbCxcbiAgICAuLi5WZShlKVxuICB9KTtcbn07XG5jbGFzcyBzZCBleHRlbmRzIFllIHtcbiAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gIH1cbiAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBzdGF0dXM6IHQsIGN0eDogciB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO1xuICAgIGlmIChyLnBhcnNlZFR5cGUgIT09IG1lLm1hcClcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm1hcCxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGNvbnN0IG4gPSB0aGlzLl9kZWYua2V5VHlwZSwgaSA9IHRoaXMuX2RlZi52YWx1ZVR5cGUsIG8gPSBbLi4uci5kYXRhLmVudHJpZXMoKV0ubWFwKChbYSwgbF0sIGMpID0+ICh7XG4gICAgICBrZXk6IG4uX3BhcnNlKG5ldyBEcyhyLCBhLCByLnBhdGgsIFtjLCBcImtleVwiXSkpLFxuICAgICAgdmFsdWU6IGkuX3BhcnNlKG5ldyBEcyhyLCBsLCByLnBhdGgsIFtjLCBcInZhbHVlXCJdKSlcbiAgICB9KSk7XG4gICAgaWYgKHIuY29tbW9uLmFzeW5jKSB7XG4gICAgICBjb25zdCBhID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIG8pIHtcbiAgICAgICAgICBjb25zdCBjID0gYXdhaXQgbC5rZXksIHUgPSBhd2FpdCBsLnZhbHVlO1xuICAgICAgICAgIGlmIChjLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICAgIChjLnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHUuc3RhdHVzID09PSBcImRpcnR5XCIpICYmIHQuZGlydHkoKSwgYS5zZXQoYy52YWx1ZSwgdS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYSB9O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgZm9yIChjb25zdCBsIG9mIG8pIHtcbiAgICAgICAgY29uc3QgYyA9IGwua2V5LCB1ID0gbC52YWx1ZTtcbiAgICAgICAgaWYgKGMuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB1LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICAoYy5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB1LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSAmJiB0LmRpcnR5KCksIGEuc2V0KGMudmFsdWUsIHUudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYSB9O1xuICAgIH1cbiAgfVxufVxuc2QuY3JlYXRlID0gKHMsIGUsIHQpID0+IG5ldyBzZCh7XG4gIHZhbHVlVHlwZTogZSxcbiAga2V5VHlwZTogcyxcbiAgdHlwZU5hbWU6IGtlLlpvZE1hcCxcbiAgLi4uVmUodClcbn0pO1xuY2xhc3MgUW4gZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBzdGF0dXM6IHQsIGN0eDogciB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO1xuICAgIGlmIChyLnBhcnNlZFR5cGUgIT09IG1lLnNldClcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnNldCxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGNvbnN0IG4gPSB0aGlzLl9kZWY7XG4gICAgbi5taW5TaXplICE9PSBudWxsICYmIHIuZGF0YS5zaXplIDwgbi5taW5TaXplLnZhbHVlICYmIChoZShyLCB7XG4gICAgICBjb2RlOiBhZS50b29fc21hbGwsXG4gICAgICBtaW5pbXVtOiBuLm1pblNpemUudmFsdWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIGV4YWN0OiAhMSxcbiAgICAgIG1lc3NhZ2U6IG4ubWluU2l6ZS5tZXNzYWdlXG4gICAgfSksIHQuZGlydHkoKSksIG4ubWF4U2l6ZSAhPT0gbnVsbCAmJiByLmRhdGEuc2l6ZSA+IG4ubWF4U2l6ZS52YWx1ZSAmJiAoaGUociwge1xuICAgICAgY29kZTogYWUudG9vX2JpZyxcbiAgICAgIG1heGltdW06IG4ubWF4U2l6ZS52YWx1ZSxcbiAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgZXhhY3Q6ICExLFxuICAgICAgbWVzc2FnZTogbi5tYXhTaXplLm1lc3NhZ2VcbiAgICB9KSwgdC5kaXJ0eSgpKTtcbiAgICBjb25zdCBpID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICBmdW5jdGlvbiBvKGwpIHtcbiAgICAgIGNvbnN0IGMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgZm9yIChjb25zdCB1IG9mIGwpIHtcbiAgICAgICAgaWYgKHUuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICByZXR1cm4gUmU7XG4gICAgICAgIHUuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgdC5kaXJ0eSgpLCBjLmFkZCh1LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN0YXR1czogdC52YWx1ZSwgdmFsdWU6IGMgfTtcbiAgICB9XG4gICAgY29uc3QgYSA9IFsuLi5yLmRhdGEudmFsdWVzKCldLm1hcCgobCwgYykgPT4gaS5fcGFyc2UobmV3IERzKHIsIGwsIHIucGF0aCwgYykpKTtcbiAgICByZXR1cm4gci5jb21tb24uYXN5bmMgPyBQcm9taXNlLmFsbChhKS50aGVuKChsKSA9PiBvKGwpKSA6IG8oYSk7XG4gIH1cbiAgbWluKGUsIHQpIHtcbiAgICByZXR1cm4gbmV3IFFuKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIG1pblNpemU6IHsgdmFsdWU6IGUsIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpIH1cbiAgICB9KTtcbiAgfVxuICBtYXgoZSwgdCkge1xuICAgIHJldHVybiBuZXcgUW4oe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgbWF4U2l6ZTogeyB2YWx1ZTogZSwgbWVzc2FnZTogRWUudG9TdHJpbmcodCkgfVxuICAgIH0pO1xuICB9XG4gIHNpemUoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLm1pbihlLCB0KS5tYXgoZSwgdCk7XG4gIH1cbiAgbm9uZW1wdHkoZSkge1xuICAgIHJldHVybiB0aGlzLm1pbigxLCBlKTtcbiAgfVxufVxuUW4uY3JlYXRlID0gKHMsIGUpID0+IG5ldyBRbih7XG4gIHZhbHVlVHlwZTogcyxcbiAgbWluU2l6ZTogbnVsbCxcbiAgbWF4U2l6ZTogbnVsbCxcbiAgdHlwZU5hbWU6IGtlLlpvZFNldCxcbiAgLi4uVmUoZSlcbn0pO1xuY2xhc3MgWWwgZXh0ZW5kcyBZZSB7XG4gIGdldCBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgfVxuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgY3R4OiB0IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKS5fcGFyc2UoeyBkYXRhOiB0LmRhdGEsIHBhdGg6IHQucGF0aCwgcGFyZW50OiB0IH0pO1xuICB9XG59XG5ZbC5jcmVhdGUgPSAocywgZSkgPT4gbmV3IFlsKHtcbiAgZ2V0dGVyOiBzLFxuICB0eXBlTmFtZToga2UuWm9kTGF6eSxcbiAgLi4uVmUoZSlcbn0pO1xuY2xhc3MgSW8gZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgaWYgKGUuZGF0YSAhPT0gdGhpcy5fZGVmLnZhbHVlKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUodCwge1xuICAgICAgICByZWNlaXZlZDogdC5kYXRhLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX2xpdGVyYWwsXG4gICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBlLmRhdGEgfTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZTtcbiAgfVxufVxuSW8uY3JlYXRlID0gKHMsIGUpID0+IG5ldyBJbyh7XG4gIHZhbHVlOiBzLFxuICB0eXBlTmFtZToga2UuWm9kTGl0ZXJhbCxcbiAgLi4uVmUoZSlcbn0pO1xuZnVuY3Rpb24gTmYocywgZSkge1xuICByZXR1cm4gbmV3IHpzKHtcbiAgICB2YWx1ZXM6IHMsXG4gICAgdHlwZU5hbWU6IGtlLlpvZEVudW0sXG4gICAgLi4uVmUoZSlcbiAgfSk7XG59XG5jbGFzcyB6cyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodHlwZW9mIGUuZGF0YSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSksIHIgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IFplLmpvaW5WYWx1ZXMociksXG4gICAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGUsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2FjaGUgfHwgKHRoaXMuX2NhY2hlID0gbmV3IFNldCh0aGlzLl9kZWYudmFsdWVzKSksICF0aGlzLl9jYWNoZS5oYXMoZS5kYXRhKSkge1xuICAgICAgY29uc3QgdCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpLCByID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgIHJldHVybiBoZSh0LCB7XG4gICAgICAgIHJlY2VpdmVkOiB0LmRhdGEsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgb3B0aW9uczogclxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgfVxuICBnZXQgZW51bSgpIHtcbiAgICBjb25zdCBlID0ge307XG4gICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpXG4gICAgICBlW3RdID0gdDtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgVmFsdWVzKCkge1xuICAgIGNvbnN0IGUgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLnZhbHVlcylcbiAgICAgIGVbdF0gPSB0O1xuICAgIHJldHVybiBlO1xuICB9XG4gIGdldCBFbnVtKCkge1xuICAgIGNvbnN0IGUgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLnZhbHVlcylcbiAgICAgIGVbdF0gPSB0O1xuICAgIHJldHVybiBlO1xuICB9XG4gIGV4dHJhY3QoZSwgdCA9IHRoaXMuX2RlZikge1xuICAgIHJldHVybiB6cy5jcmVhdGUoZSwge1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgLi4udFxuICAgIH0pO1xuICB9XG4gIGV4Y2x1ZGUoZSwgdCA9IHRoaXMuX2RlZikge1xuICAgIHJldHVybiB6cy5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcigocikgPT4gIWUuaW5jbHVkZXMocikpLCB7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAuLi50XG4gICAgfSk7XG4gIH1cbn1cbnpzLmNyZWF0ZSA9IE5mO1xuY2xhc3MgWmwgZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgdCA9IFplLmdldFZhbGlkRW51bVZhbHVlcyh0aGlzLl9kZWYudmFsdWVzKSwgciA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO1xuICAgIGlmIChyLnBhcnNlZFR5cGUgIT09IG1lLnN0cmluZyAmJiByLnBhcnNlZFR5cGUgIT09IG1lLm51bWJlcikge1xuICAgICAgY29uc3QgbiA9IFplLm9iamVjdFZhbHVlcyh0KTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGV4cGVjdGVkOiBaZS5qb2luVmFsdWVzKG4pLFxuICAgICAgICByZWNlaXZlZDogci5wYXJzZWRUeXBlLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhY2hlIHx8ICh0aGlzLl9jYWNoZSA9IG5ldyBTZXQoWmUuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSksICF0aGlzLl9jYWNoZS5oYXMoZS5kYXRhKSkge1xuICAgICAgY29uc3QgbiA9IFplLm9iamVjdFZhbHVlcyh0KTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIHJlY2VpdmVkOiByLmRhdGEsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgb3B0aW9uczogblxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxuICBnZXQgZW51bSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgfVxufVxuWmwuY3JlYXRlID0gKHMsIGUpID0+IG5ldyBabCh7XG4gIHZhbHVlczogcyxcbiAgdHlwZU5hbWU6IGtlLlpvZE5hdGl2ZUVudW0sXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIF9vIGV4dGVuZHMgWWUge1xuICB1bndyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBjdHg6IHQgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtcbiAgICBpZiAodC5wYXJzZWRUeXBlICE9PSBtZS5wcm9taXNlICYmIHQuY29tbW9uLmFzeW5jID09PSAhMSlcbiAgICAgIHJldHVybiBoZSh0LCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnByb21pc2UsXG4gICAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICBjb25zdCByID0gdC5wYXJzZWRUeXBlID09PSBtZS5wcm9taXNlID8gdC5kYXRhIDogUHJvbWlzZS5yZXNvbHZlKHQuZGF0YSk7XG4gICAgcmV0dXJuIFJyKHIudGhlbigobikgPT4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhuLCB7XG4gICAgICBwYXRoOiB0LnBhdGgsXG4gICAgICBlcnJvck1hcDogdC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwXG4gICAgfSkpKTtcbiAgfVxufVxuX28uY3JlYXRlID0gKHMsIGUpID0+IG5ldyBfbyh7XG4gIHR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2RQcm9taXNlLFxuICAuLi5WZShlKVxufSk7XG5jbGFzcyBZcyBleHRlbmRzIFllIHtcbiAgaW5uZXJUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hO1xuICB9XG4gIHNvdXJjZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0ga2UuWm9kRWZmZWN0cyA/IHRoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpIDogdGhpcy5fZGVmLnNjaGVtYTtcbiAgfVxuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgc3RhdHVzOiB0LCBjdHg6IHIgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSwgbiA9IHRoaXMuX2RlZi5lZmZlY3QgfHwgbnVsbCwgaSA9IHtcbiAgICAgIGFkZElzc3VlOiAobykgPT4ge1xuICAgICAgICBoZShyLCBvKSwgby5mYXRhbCA/IHQuYWJvcnQoKSA6IHQuZGlydHkoKTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHIucGF0aDtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpLmFkZElzc3VlID0gaS5hZGRJc3N1ZS5iaW5kKGkpLCBuLnR5cGUgPT09IFwicHJlcHJvY2Vzc1wiKSB7XG4gICAgICBjb25zdCBvID0gbi50cmFuc2Zvcm0oci5kYXRhLCBpKTtcbiAgICAgIGlmIChyLmNvbW1vbi5hc3luYylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShvKS50aGVuKGFzeW5jIChhKSA9PiB7XG4gICAgICAgICAgaWYgKHQudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICAgIGNvbnN0IGwgPSBhd2FpdCB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgIGRhdGE6IGEsXG4gICAgICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IHJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiID8gUmUgOiBsLnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHQudmFsdWUgPT09IFwiZGlydHlcIiA/IFduKGwudmFsdWUpIDogbDtcbiAgICAgICAgfSk7XG4gICAgICB7XG4gICAgICAgIGlmICh0LnZhbHVlID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICByZXR1cm4gUmU7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgIGRhdGE6IG8sXG4gICAgICAgICAgcGF0aDogci5wYXRoLFxuICAgICAgICAgIHBhcmVudDogclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGEuc3RhdHVzID09PSBcImFib3J0ZWRcIiA/IFJlIDogYS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB0LnZhbHVlID09PSBcImRpcnR5XCIgPyBXbihhLnZhbHVlKSA6IGE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuLnR5cGUgPT09IFwicmVmaW5lbWVudFwiKSB7XG4gICAgICBjb25zdCBvID0gKGEpID0+IHtcbiAgICAgICAgY29uc3QgbCA9IG4ucmVmaW5lbWVudChhLCBpKTtcbiAgICAgICAgaWYgKHIuY29tbW9uLmFzeW5jKVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobCk7XG4gICAgICAgIGlmIChsIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9O1xuICAgICAgaWYgKHIuY29tbW9uLmFzeW5jID09PSAhMSkge1xuICAgICAgICBjb25zdCBhID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgICAgcGF0aDogci5wYXRoLFxuICAgICAgICAgIHBhcmVudDogclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGEuc3RhdHVzID09PSBcImFib3J0ZWRcIiA/IFJlIDogKGEuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgdC5kaXJ0eSgpLCBvKGEudmFsdWUpLCB7IHN0YXR1czogdC52YWx1ZSwgdmFsdWU6IGEudmFsdWUgfSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoeyBkYXRhOiByLmRhdGEsIHBhdGg6IHIucGF0aCwgcGFyZW50OiByIH0pLnRoZW4oKGEpID0+IGEuc3RhdHVzID09PSBcImFib3J0ZWRcIiA/IFJlIDogKGEuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgdC5kaXJ0eSgpLCBvKGEudmFsdWUpLnRoZW4oKCkgPT4gKHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYS52YWx1ZSB9KSkpKTtcbiAgICB9XG4gICAgaWYgKG4udHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIilcbiAgICAgIGlmIChyLmNvbW1vbi5hc3luYyA9PT0gITEpIHtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgICAgICBwYXJlbnQ6IHJcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghTG4obykpXG4gICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICBjb25zdCBhID0gbi50cmFuc2Zvcm0oby52YWx1ZSwgaSk7XG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYSB9O1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogci5kYXRhLCBwYXRoOiByLnBhdGgsIHBhcmVudDogciB9KS50aGVuKChvKSA9PiBMbihvKSA/IFByb21pc2UucmVzb2x2ZShuLnRyYW5zZm9ybShvLnZhbHVlLCBpKSkudGhlbigoYSkgPT4gKHtcbiAgICAgICAgICBzdGF0dXM6IHQudmFsdWUsXG4gICAgICAgICAgdmFsdWU6IGFcbiAgICAgICAgfSkpIDogUmUpO1xuICAgIFplLmFzc2VydE5ldmVyKG4pO1xuICB9XG59XG5Zcy5jcmVhdGUgPSAocywgZSwgdCkgPT4gbmV3IFlzKHtcbiAgc2NoZW1hOiBzLFxuICB0eXBlTmFtZToga2UuWm9kRWZmZWN0cyxcbiAgZWZmZWN0OiBlLFxuICAuLi5WZSh0KVxufSk7XG5Zcy5jcmVhdGVXaXRoUHJlcHJvY2VzcyA9IChzLCBlLCB0KSA9PiBuZXcgWXMoe1xuICBzY2hlbWE6IGUsXG4gIGVmZmVjdDogeyB0eXBlOiBcInByZXByb2Nlc3NcIiwgdHJhbnNmb3JtOiBzIH0sXG4gIHR5cGVOYW1lOiBrZS5ab2RFZmZlY3RzLFxuICAuLi5WZSh0KVxufSk7XG5jbGFzcyBmcyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VHlwZShlKSA9PT0gbWUudW5kZWZpbmVkID8gUnIodm9pZCAwKSA6IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpO1xuICB9XG4gIHVud3JhcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgfVxufVxuZnMuY3JlYXRlID0gKHMsIGUpID0+IG5ldyBmcyh7XG4gIGlubmVyVHlwZTogcyxcbiAgdHlwZU5hbWU6IGtlLlpvZE9wdGlvbmFsLFxuICAuLi5WZShlKVxufSk7XG5jbGFzcyBacyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VHlwZShlKSA9PT0gbWUubnVsbCA/IFJyKG51bGwpIDogdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoZSk7XG4gIH1cbiAgdW53cmFwKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICB9XG59XG5acy5jcmVhdGUgPSAocywgZSkgPT4gbmV3IFpzKHtcbiAgaW5uZXJUeXBlOiBzLFxuICB0eXBlTmFtZToga2UuWm9kTnVsbGFibGUsXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIFJvIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgY3R4OiB0IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgbGV0IHIgPSB0LmRhdGE7XG4gICAgcmV0dXJuIHQucGFyc2VkVHlwZSA9PT0gbWUudW5kZWZpbmVkICYmIChyID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpKSwgdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgZGF0YTogcixcbiAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgIHBhcmVudDogdFxuICAgIH0pO1xuICB9XG4gIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gIH1cbn1cblJvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgUm8oe1xuICBpbm5lclR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2REZWZhdWx0LFxuICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBlLmRlZmF1bHQgPT0gXCJmdW5jdGlvblwiID8gZS5kZWZhdWx0IDogKCkgPT4gZS5kZWZhdWx0LFxuICAuLi5WZShlKVxufSk7XG5jbGFzcyBMbyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IGN0eDogdCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLCByID0ge1xuICAgICAgLi4udCxcbiAgICAgIGNvbW1vbjoge1xuICAgICAgICAuLi50LmNvbW1vbixcbiAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgfVxuICAgIH0sIG4gPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICBkYXRhOiByLmRhdGEsXG4gICAgICBwYXRoOiByLnBhdGgsXG4gICAgICBwYXJlbnQ6IHtcbiAgICAgICAgLi4uclxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBibyhuKSA/IG4udGhlbigoaSkgPT4gKHtcbiAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgdmFsdWU6IGkuc3RhdHVzID09PSBcInZhbGlkXCIgPyBpLnZhbHVlIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBwcyhyLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dDogci5kYXRhXG4gICAgICB9KVxuICAgIH0pKSA6IHtcbiAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgdmFsdWU6IG4uc3RhdHVzID09PSBcInZhbGlkXCIgPyBuLnZhbHVlIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBwcyhyLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dDogci5kYXRhXG4gICAgICB9KVxuICAgIH07XG4gIH1cbiAgcmVtb3ZlQ2F0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gIH1cbn1cbkxvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgTG8oe1xuICBpbm5lclR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2RDYXRjaCxcbiAgY2F0Y2hWYWx1ZTogdHlwZW9mIGUuY2F0Y2ggPT0gXCJmdW5jdGlvblwiID8gZS5jYXRjaCA6ICgpID0+IGUuY2F0Y2gsXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIG5kIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5uYW4pIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm5hbixcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGUuZGF0YSB9O1xuICB9XG59XG5uZC5jcmVhdGUgPSAocykgPT4gbmV3IG5kKHtcbiAgdHlwZU5hbWU6IGtlLlpvZE5hTixcbiAgLi4uVmUocylcbn0pO1xuY2xhc3MgVWYgZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBjdHg6IHQgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSwgciA9IHQuZGF0YTtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHtcbiAgICAgIGRhdGE6IHIsXG4gICAgICBwYXRoOiB0LnBhdGgsXG4gICAgICBwYXJlbnQ6IHRcbiAgICB9KTtcbiAgfVxuICB1bndyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICB9XG59XG5jbGFzcyAkYyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IHN0YXR1czogdCwgY3R4OiByIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgaWYgKHIuY29tbW9uLmFzeW5jKVxuICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBhd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgIGRhdGE6IHIuZGF0YSxcbiAgICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgICAgcGFyZW50OiByXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiID8gUmUgOiBpLnN0YXR1cyA9PT0gXCJkaXJ0eVwiID8gKHQuZGlydHkoKSwgV24oaS52YWx1ZSkpIDogdGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgZGF0YTogaS52YWx1ZSxcbiAgICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgICAgcGFyZW50OiByXG4gICAgICAgIH0pO1xuICAgICAgfSkoKTtcbiAgICB7XG4gICAgICBjb25zdCBuID0gdGhpcy5fZGVmLmluLl9wYXJzZVN5bmMoe1xuICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgICAgcGFyZW50OiByXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgPyBSZSA6IG4uc3RhdHVzID09PSBcImRpcnR5XCIgPyAodC5kaXJ0eSgpLCB7XG4gICAgICAgIHN0YXR1czogXCJkaXJ0eVwiLFxuICAgICAgICB2YWx1ZTogbi52YWx1ZVxuICAgICAgfSkgOiB0aGlzLl9kZWYub3V0Ll9wYXJzZVN5bmMoe1xuICAgICAgICBkYXRhOiBuLnZhbHVlLFxuICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgIHBhcmVudDogclxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBjcmVhdGUoZSwgdCkge1xuICAgIHJldHVybiBuZXcgJGMoe1xuICAgICAgaW46IGUsXG4gICAgICBvdXQ6IHQsXG4gICAgICB0eXBlTmFtZToga2UuWm9kUGlwZWxpbmVcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgQ28gZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpLCByID0gKG4pID0+IChMbihuKSAmJiAobi52YWx1ZSA9IE9iamVjdC5mcmVlemUobi52YWx1ZSkpLCBuKTtcbiAgICByZXR1cm4gYm8odCkgPyB0LnRoZW4oKG4pID0+IHIobikpIDogcih0KTtcbiAgfVxuICB1bndyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gIH1cbn1cbkNvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgQ28oe1xuICBpbm5lclR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2RSZWFkb25seSxcbiAgLi4uVmUoZSlcbn0pO1xudmFyIGtlO1xuKGZ1bmN0aW9uKHMpIHtcbiAgcy5ab2RTdHJpbmcgPSBcIlpvZFN0cmluZ1wiLCBzLlpvZE51bWJlciA9IFwiWm9kTnVtYmVyXCIsIHMuWm9kTmFOID0gXCJab2ROYU5cIiwgcy5ab2RCaWdJbnQgPSBcIlpvZEJpZ0ludFwiLCBzLlpvZEJvb2xlYW4gPSBcIlpvZEJvb2xlYW5cIiwgcy5ab2REYXRlID0gXCJab2REYXRlXCIsIHMuWm9kU3ltYm9sID0gXCJab2RTeW1ib2xcIiwgcy5ab2RVbmRlZmluZWQgPSBcIlpvZFVuZGVmaW5lZFwiLCBzLlpvZE51bGwgPSBcIlpvZE51bGxcIiwgcy5ab2RBbnkgPSBcIlpvZEFueVwiLCBzLlpvZFVua25vd24gPSBcIlpvZFVua25vd25cIiwgcy5ab2ROZXZlciA9IFwiWm9kTmV2ZXJcIiwgcy5ab2RWb2lkID0gXCJab2RWb2lkXCIsIHMuWm9kQXJyYXkgPSBcIlpvZEFycmF5XCIsIHMuWm9kT2JqZWN0ID0gXCJab2RPYmplY3RcIiwgcy5ab2RVbmlvbiA9IFwiWm9kVW5pb25cIiwgcy5ab2REaXNjcmltaW5hdGVkVW5pb24gPSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCBzLlpvZEludGVyc2VjdGlvbiA9IFwiWm9kSW50ZXJzZWN0aW9uXCIsIHMuWm9kVHVwbGUgPSBcIlpvZFR1cGxlXCIsIHMuWm9kUmVjb3JkID0gXCJab2RSZWNvcmRcIiwgcy5ab2RNYXAgPSBcIlpvZE1hcFwiLCBzLlpvZFNldCA9IFwiWm9kU2V0XCIsIHMuWm9kRnVuY3Rpb24gPSBcIlpvZEZ1bmN0aW9uXCIsIHMuWm9kTGF6eSA9IFwiWm9kTGF6eVwiLCBzLlpvZExpdGVyYWwgPSBcIlpvZExpdGVyYWxcIiwgcy5ab2RFbnVtID0gXCJab2RFbnVtXCIsIHMuWm9kRWZmZWN0cyA9IFwiWm9kRWZmZWN0c1wiLCBzLlpvZE5hdGl2ZUVudW0gPSBcIlpvZE5hdGl2ZUVudW1cIiwgcy5ab2RPcHRpb25hbCA9IFwiWm9kT3B0aW9uYWxcIiwgcy5ab2ROdWxsYWJsZSA9IFwiWm9kTnVsbGFibGVcIiwgcy5ab2REZWZhdWx0ID0gXCJab2REZWZhdWx0XCIsIHMuWm9kQ2F0Y2ggPSBcIlpvZENhdGNoXCIsIHMuWm9kUHJvbWlzZSA9IFwiWm9kUHJvbWlzZVwiLCBzLlpvZEJyYW5kZWQgPSBcIlpvZEJyYW5kZWRcIiwgcy5ab2RQaXBlbGluZSA9IFwiWm9kUGlwZWxpbmVcIiwgcy5ab2RSZWFkb25seSA9IFwiWm9kUmVhZG9ubHlcIjtcbn0pKGtlIHx8IChrZSA9IHt9KSk7XG5jb25zdCB4dCA9IFJzLmNyZWF0ZSwgJGYgPSBDbi5jcmVhdGUsIFFtID0gSGwuY3JlYXRlO1xuUHMuY3JlYXRlO1xuY29uc3QgS3MgPSBZci5jcmVhdGUsIEp0ID0gJHQuY3JlYXRlLCBrbyA9IHdvLmNyZWF0ZSwgR2YgPSBVYy5jcmVhdGU7XG5Bby5jcmVhdGU7XG5Xcy5jcmVhdGU7XG5jb25zdCBpciA9IElvLmNyZWF0ZSwgR2MgPSB6cy5jcmVhdGU7XG5fby5jcmVhdGU7XG5mcy5jcmVhdGU7XG5acy5jcmVhdGU7XG5jb25zdCBlMSA9IC9bQCMkJV4mKis9L1xcXFx8fsKrwrtdLywgdDEgPSAvKCF7Mix9fFxcP3syLH18LXsyLH0pLywgcjEgPSAvW1xcdXsxRjMwMH0tXFx1ezFGOUZGfV18W1xcdXsyNzAyfS1cXHV7MjdCMH1dfFtcXHV7MjYwMH0tXFx1ezI2RkZ9XXxbXFx1ezJCMDB9LVxcdXsyQkZGfV0vdSwgJG4gPSAoeyBtYXg6IHMsIG5vU3BhY2VzOiBlIH0gPSB7fSkgPT4gKGUgPyB4dCgpLm1heChzID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkucmVnZXgoL15cXFMqJC8sIFwiU3BhY2VzIGFyZSBub3QgYWxsb3dlZFwiKSA6IHh0KCkubWF4KHMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSkucmVmaW5lKChyKSA9PiAhcjEudGVzdChyKSwge1xuICBtZXNzYWdlOiBcIkVtb2ppcyBhbmQgc3ltYm9scyBhcmUgbm90IGFsbG93ZWRcIlxufSkucmVmaW5lKChyKSA9PiAhZTEudGVzdChyKSwge1xuICBtZXNzYWdlOiBcIlNwZWNpYWwgY2hhcmFjdGVycyAoQCwgIywgJCwgJSwgXiwgJiwgKiwgKywgPSwgLywgXFxcXCwgfCwgfiwgwqssIMK7KSBhcmUgbm90IGFsbG93ZWRcIlxufSkucmVmaW5lKChyKSA9PiAhdDEudGVzdChyKSwge1xuICBtZXNzYWdlOiBcIlJlcGVhdGVkIHB1bmN0dWF0aW9ucyAoISEsID8/LCAtLSkgYXJlIG5vdCBhbGxvd2VkXCJcbn0pLCBvciA9IHh0KCkudXJsKCkuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIsIHsgbWVzc2FnZTogXCJNdXN0IGJlIGFuIGh0dHBzIHVybFwiIH0pLm1heCgxMDI0KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiIFwiKSwge1xuICBtZXNzYWdlOiBcIlVSTCBtdXN0IG5vdCBjb250YWluIHNwYWNlc1wiXG59KS5yZWZpbmUoKHMpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlID0gbmV3IFVSTChzKS5ob3N0bmFtZTtcbiAgICByZXR1cm4gIShlID09PSBcImxvY2FsaG9zdFwiIHx8IGUuZW5kc1dpdGgoXCIubG9jYWxob3N0XCIpIHx8IC9eKFxcZHsxLDN9XFwuKXszfVxcZHsxLDN9JC8udGVzdChlKSB8fCBlLnN0YXJ0c1dpdGgoXCJbXCIpICYmIGUuZW5kc1dpdGgoXCJdXCIpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICExO1xuICB9XG59LCB7XG4gIG1lc3NhZ2U6IFwiVVJMIG11c3Qgbm90IHVzZSBJUCBhZGRyZXNzZXMgb3IgbG9jYWxob3N0XCJcbn0pLCBWYyA9IHh0KCkubWF4KDMyKSwgVmYgPSB4dCgpLm1heCgzMiksIHMxID0gL15bLWEtejAtOV17Myw4fTpbLV9hLXpBLVowLTldezEsMzJ9XFwvKD86Wy1hLXowLTldezMsOH06Wy0uJWEtekEtWjAtOV17MSwxMjh9KD86XFwvWy0uJWEtekEtWjAtOV17MSw3OH0pP3xuYXRpdmUpJC8sIG4xID0geHQoKS5yZWdleChzMSwgeyBtZXNzYWdlOiBcIkludmFsaWQgQ0FJUC0xOSBhc3NldCBJRFwiIH0pLCBqYyA9IHh0KCkucmVnZXgoL14jKFswLTlBLUZdezN9fFswLTlBLUZdezZ9KSQvaSwge1xuICBtZXNzYWdlOiBcIkludmFsaWQgaGV4IGNvbG9yIGNvZGUuIEl0IHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0ICNSUkdHQkIgb3IgI1JHQi5cIlxufSksIGkxID0gL14oPyEuKlxcLlxcLikoW2EtekEtWjAtOV0oW2EtekEtWjAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVpdezIsfSQvLCBvMSA9IHh0KCkubWF4KDEwMjQpLnJlZ2V4KGkxLCB7XG4gIG1lc3NhZ2U6IFwiTXVzdCBiZSBhIHZhbGlkIGRvbWFpbiBuYW1lIChlLmcuLCBleGFtcGxlLmNvbSwgc3ViLmV4YW1wbGUuY29tKVwiXG59KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiOi8vXCIpLCB7XG4gIG1lc3NhZ2U6IFwiRG9tYWluIG11c3Qgbm90IGluY2x1ZGUgcHJvdG9jb2wgKGh0dHA6Ly8sIGh0dHBzOi8vLCBldGMuKVwiXG59KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiL1wiKSwge1xuICBtZXNzYWdlOiBcIkRvbWFpbiBtdXN0IG5vdCBpbmNsdWRlIHBhdGggc2VwYXJhdG9yc1wiXG59KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiQFwiKSwge1xuICBtZXNzYWdlOiBcIkRvbWFpbiBtdXN0IG5vdCBpbmNsdWRlIEAgc3ltYm9sXCJcbn0pLnJlZmluZSgocykgPT4gIXMuaW5jbHVkZXMoXCI6XCIpLCB7XG4gIG1lc3NhZ2U6IFwiRG9tYWluIG11c3Qgbm90IGluY2x1ZGUgcG9ydCBudW1iZXJzXCJcbn0pLCBhMSA9IGtvKFtpcihcIjE6MVwiKSwgaXIoXCIzOjJcIildKSwgbDEgPSBKdCh7XG4gIGhlYWRlcjogeHQoKSxcbiAgcGF5bG9hZDogeHQoKSxcbiAgc2lnbmF0dXJlOiB4dCgpXG59KTtcbkp0KHtcbiAgZmlkOiAkZigpLFxuICB0eXBlOiBpcihcImFwcF9rZXlcIiksXG4gIGtleTogeHQoKS5zdGFydHNXaXRoKFwiMHhcIilcbn0pO1xuY29uc3QgYzEgPSBKdCh7XG4gIHR5cGU6IGlyKFwibGF1bmNoX2ZyYW1lXCIpLFxuICBuYW1lOiBWYyxcbiAgdXJsOiBvci5vcHRpb25hbCgpLFxuICBzcGxhc2hJbWFnZVVybDogb3Iub3B0aW9uYWwoKSxcbiAgc3BsYXNoQmFja2dyb3VuZENvbG9yOiBqYy5vcHRpb25hbCgpXG59KSwgdTEgPSBKdCh7XG4gIHR5cGU6IGlyKFwibGF1bmNoX21pbmlhcHBcIiksXG4gIG5hbWU6IFZjLFxuICB1cmw6IG9yLm9wdGlvbmFsKCksXG4gIHNwbGFzaEltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICBzcGxhc2hCYWNrZ3JvdW5kQ29sb3I6IGpjLm9wdGlvbmFsKClcbn0pLCBkMSA9IEp0KHtcbiAgdHlwZTogaXIoXCJ2aWV3X3Rva2VuXCIpLFxuICB0b2tlbjogbjFcbn0pLCBoMSA9IEdmKFwidHlwZVwiLCBbXG4gIHUxLFxuICBkMSxcbiAgLy8gUmVtb3ZlIGFmdGVyIGNvbXBhdGliaWxpdHkgcGVyaW9kXG4gIGMxXG5dKSwgZjEgPSBKdCh7XG4gIHRpdGxlOiBWZixcbiAgYWN0aW9uOiBoMVxufSk7XG5KdCh7XG4gIHZlcnNpb246IGtvKFt4dCgpLCAkZigpXSkudHJhbnNmb3JtKChzKSA9PiBTdHJpbmcocykpLnBpcGUoa28oW2lyKFwibmV4dFwiKSwgaXIoXCIxXCIpXSkpLFxuICBpbWFnZVVybDogb3IsXG4gIGFzcGVjdFJhdGlvOiBhMS5vcHRpb25hbCgpLFxuICBidXR0b246IGYxXG59KTtcbmNvbnN0IGpmID0gSnQoe1xuICB1cmw6IHh0KCksXG4gIHRva2VuOiB4dCgpXG59KTtcbkp0KHtcbiAgbm90aWZpY2F0aW9uSWQ6IHh0KCkubWF4KDEyOCksXG4gIHRpdGxlOiB4dCgpLm1heCgzMiksXG4gIGJvZHk6IHh0KCkubWF4KDEyOCksXG4gIHRhcmdldFVybDogb3IsXG4gIHRva2VuczogeHQoKS5hcnJheSgpLm1heCgxMDApXG59KTtcbkp0KHtcbiAgcmVzdWx0OiBKdCh7XG4gICAgc3VjY2Vzc2Z1bFRva2VuczogS3MoeHQoKSksXG4gICAgaW52YWxpZFRva2VuczogS3MoeHQoKSksXG4gICAgcmF0ZUxpbWl0ZWRUb2tlbnM6IEtzKHh0KCkpXG4gIH0pXG59KTtcbmNvbnN0IGcxID0gSnQoe1xuICBldmVudDogaXIoXCJtaW5pYXBwX2FkZGVkXCIpLFxuICBub3RpZmljYXRpb25EZXRhaWxzOiBqZi5vcHRpb25hbCgpXG59KSwgcDEgPSBKdCh7XG4gIGV2ZW50OiBpcihcIm1pbmlhcHBfcmVtb3ZlZFwiKVxufSksIG0xID0gSnQoe1xuICBldmVudDogaXIoXCJub3RpZmljYXRpb25zX2VuYWJsZWRcIiksXG4gIG5vdGlmaWNhdGlvbkRldGFpbHM6IGpmLnJlcXVpcmVkKClcbn0pLCB5MSA9IEp0KHtcbiAgZXZlbnQ6IGlyKFwibm90aWZpY2F0aW9uc19kaXNhYmxlZFwiKVxufSk7XG5HZihcImV2ZW50XCIsIFtcbiAgZzEsXG4gIHAxLFxuICBtMSxcbiAgeTFcbl0pO1xuY29uc3QgdjEgPSBbXG4gIFwid2FsbGV0LmdldEV0aGVyZXVtUHJvdmlkZXJcIixcbiAgXCJ3YWxsZXQuZ2V0U29sYW5hUHJvdmlkZXJcIixcbiAgXCJhY3Rpb25zLnJlYWR5XCIsXG4gIFwiYWN0aW9ucy5vcGVuVXJsXCIsXG4gIFwiYWN0aW9ucy5jbG9zZVwiLFxuICBcImFjdGlvbnMuc2V0UHJpbWFyeUJ1dHRvblwiLFxuICBcImFjdGlvbnMuYWRkTWluaUFwcFwiLFxuICBcImFjdGlvbnMuc2lnbkluXCIsXG4gIFwiYWN0aW9ucy52aWV3Q2FzdFwiLFxuICBcImFjdGlvbnMudmlld1Byb2ZpbGVcIixcbiAgXCJhY3Rpb25zLmNvbXBvc2VDYXN0XCIsXG4gIFwiYWN0aW9ucy52aWV3VG9rZW5cIixcbiAgXCJhY3Rpb25zLnNlbmRUb2tlblwiLFxuICBcImFjdGlvbnMuc3dhcFRva2VuXCIsXG4gIFwiYWN0aW9ucy5vcGVuTWluaUFwcFwiLFxuICBcImFjdGlvbnMucmVxdWVzdENhbWVyYUFuZE1pY3JvcGhvbmVBY2Nlc3NcIixcbiAgXCJleHBlcmltZW50YWwuc2lnbk1hbmlmZXN0XCIsXG4gIFwiaGFwdGljcy5pbXBhY3RPY2N1cnJlZFwiLFxuICBcImhhcHRpY3Mubm90aWZpY2F0aW9uT2NjdXJyZWRcIixcbiAgXCJoYXB0aWNzLnNlbGVjdGlvbkNoYW5nZWRcIixcbiAgXCJiYWNrXCJcbl0sIEUxID0gW1xuICBcImdhbWVzXCIsXG4gIFwic29jaWFsXCIsXG4gIFwiZmluYW5jZVwiLFxuICBcInV0aWxpdHlcIixcbiAgXCJwcm9kdWN0aXZpdHlcIixcbiAgXCJoZWFsdGgtZml0bmVzc1wiLFxuICBcIm5ld3MtbWVkaWFcIixcbiAgXCJtdXNpY1wiLFxuICBcInNob3BwaW5nXCIsXG4gIFwiZWR1Y2F0aW9uXCIsXG4gIFwiZGV2ZWxvcGVyLXRvb2xzXCIsXG4gIFwiZW50ZXJ0YWlubWVudFwiLFxuICBcImFydC1jcmVhdGl2aXR5XCJcbl0sIHgxID0gR2MoRTEpLCBTMSA9IGtvKFtcbiAgaXIoXCIwLjAuMFwiKSxcbiAgaXIoXCIwLjAuMVwiKSxcbiAgaXIoXCIxXCIpLFxuICBpcihcIm5leHRcIilcbl0pLCBiMSA9ICRuKHsgbWF4OiAzMCB9KSwgVDEgPSAkbih7IG1heDogMTcwIH0pLCB3MSA9IEtzKG9yKS5tYXgoMyksIEExID0gS3MoJG4oeyBtYXg6IDIwLCBub1NwYWNlczogITAgfSkpLm1heCg1KSwgSTEgPSAkbih7IG1heDogMzAgfSksIF8xID0gJG4oeyBtYXg6IDMwIH0pLCBSMSA9ICRuKHsgbWF4OiAxMDAgfSksIEwxID0gUW0oKSwgQzEgPSBbXG4gIFwiZWlwMTU1OjFcIixcbiAgLy8gRXRoZXJldW0gbWFpbm5ldFxuICBcImVpcDE1NTo4NDUzXCIsXG4gIC8vIEJhc2UgbWFpbm5ldFxuICBcImVpcDE1NTo0MjE2MVwiLFxuICAvLyBBcmJpdHJ1bSBPbmVcbiAgXCJlaXAxNTU6NDIxNjE0XCIsXG4gIC8vIEFyYml0cnVtIFNlcG9saWFcbiAgXCJlaXAxNTU6ODQ1MzJcIixcbiAgLy8gQmFzZSBTZXBvbGlhXG4gIFwiZWlwMTU1OjY2NjY2NjY2NlwiLFxuICAvLyBEZWdlblxuICBcImVpcDE1NToxMDBcIixcbiAgLy8gR25vc2lzXG4gIFwiZWlwMTU1OjEwXCIsXG4gIC8vIE9wdGltaXNtXG4gIFwiZWlwMTU1OjExMTU1NDIwXCIsXG4gIC8vIE9wdGltaXNtIFNlcG9saWFcbiAgXCJlaXAxNTU6MTM3XCIsXG4gIC8vIFBvbHlnb25cbiAgXCJlaXAxNTU6MTExNTUxMTFcIixcbiAgLy8gRXRoZXJldW0gU2Vwb2xpYVxuICBcImVpcDE1NTo3Nzc3Nzc3XCIsXG4gIC8vIFpvcmFcbiAgXCJlaXAxNTU6MTMwXCIsXG4gIC8vIFVuaWNoYWluXG4gIFwiZWlwMTU1OjEwMTQzXCIsXG4gIC8vIE1vbmFkIHRlc3RuZXRcbiAgXCJlaXAxNTU6NDIyMjBcIixcbiAgLy8gQ2Vsb1xuICBcInNvbGFuYTo1ZXlrdDRVc0Z2OFA4TkpkVFJFcFkxdnpxS3FaS3ZkcFwiXG4gIC8vIFNvbGFuYVxuXTtcbmZ1bmN0aW9uIEtmKHMpIHtcbiAgY29uc3QgZSA9IG5ldyBTZXQocyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGUpO1xufVxuY29uc3QgazEgPSBLcyhHYyhDMSkpLnRyYW5zZm9ybShLZiksIEQxID0gS3MoR2ModjEpKS50cmFuc2Zvcm0oS2YpLCBpZCA9IEp0KHtcbiAgLy8gMC4wLjAgYW5kIDAuMC4xIGFyZSBub3QgdGVjaG5pY2FsbHkgcGFydCBvZiB0aGUgc3BlYyBidXQga2VwdCBmb3JcbiAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIG5leHQgc2hvdWxkIGFsd2F5cyByZXNvbHZlIHRvIHRoZSBtb3N0IHJlY2VudFxuICAvLyBzY2hlbWEgdmVyc2lvbi5cbiAgdmVyc2lvbjogUzEsXG4gIG5hbWU6IFZjLFxuICBpY29uVXJsOiBvcixcbiAgaG9tZVVybDogb3IsXG4gIC8qKiBkZXByZWNhdGVkLCBzZXQgb2dJbWFnZVVybCBpbnN0ZWFkICovXG4gIGltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICAvKiogZGVwcmVjYXRlZCwgd2lsbCByZWx5IG9uIGZjOmZyYW1lL2ZjOm1pbmlhcHAgbWV0YSB0YWcgKi9cbiAgYnV0dG9uVGl0bGU6IFZmLm9wdGlvbmFsKCksXG4gIHNwbGFzaEltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICBzcGxhc2hCYWNrZ3JvdW5kQ29sb3I6IGpjLm9wdGlvbmFsKCksXG4gIHdlYmhvb2tVcmw6IG9yLm9wdGlvbmFsKCksXG4gIC8qKiBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYXJjYXN0ZXJ4eXovbWluaWFwcHMvZGlzY3Vzc2lvbnMvMTkxICovXG4gIHN1YnRpdGxlOiBiMS5vcHRpb25hbCgpLFxuICBkZXNjcmlwdGlvbjogVDEub3B0aW9uYWwoKSxcbiAgc2NyZWVuc2hvdFVybHM6IHcxLm9wdGlvbmFsKCksXG4gIHByaW1hcnlDYXRlZ29yeTogeDEub3B0aW9uYWwoKSxcbiAgdGFnczogQTEub3B0aW9uYWwoKSxcbiAgaGVyb0ltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICB0YWdsaW5lOiBJMS5vcHRpb25hbCgpLFxuICBvZ1RpdGxlOiBfMS5vcHRpb25hbCgpLFxuICBvZ0Rlc2NyaXB0aW9uOiBSMS5vcHRpb25hbCgpLFxuICBvZ0ltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICAvKiogc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmFyY2FzdGVyeHl6L21pbmlhcHBzL2Rpc2N1c3Npb25zLzIwNCAqL1xuICBub2luZGV4OiBMMS5vcHRpb25hbCgpLFxuICAvKiogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXJjYXN0ZXJ4eXovbWluaWFwcHMvZGlzY3Vzc2lvbnMvMjU2ICovXG4gIHJlcXVpcmVkQ2hhaW5zOiBrMS5vcHRpb25hbCgpLFxuICByZXF1aXJlZENhcGFiaWxpdGllczogRDEub3B0aW9uYWwoKSxcbiAgLyoqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFyY2FzdGVyeHl6L21pbmlhcHBzL2Rpc2N1c3Npb25zLzE1OCAqL1xuICAvKiogRG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIG9uY2UgdGhpcyBmZWF0dXJlIGlzIGZpbmFsaXplZC4gKi9cbiAgY2FzdFNoYXJlVXJsOiBvci5vcHRpb25hbCgpLFxuICAvKiogQ2Fub25pY2FsIGRvbWFpbiBmb3IgdGhlIG1pbmlhcHAgYXBwbGljYXRpb24gKi9cbiAgY2Fub25pY2FsRG9tYWluOiBvMS5vcHRpb25hbCgpXG59KS5yZWZpbmUoKHMpID0+IHtcbiAgaWYgKHMuY2FzdFNoYXJlVXJsID09PSB2b2lkIDApXG4gICAgcmV0dXJuICEwO1xuICB0cnkge1xuICAgIGNvbnN0IGUgPSBuZXcgVVJMKHMuaG9tZVVybCkuaG9zdG5hbWUsIHQgPSBuZXcgVVJMKHMuY2FzdFNoYXJlVXJsKS5ob3N0bmFtZTtcbiAgICByZXR1cm4gZSA9PT0gdDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICExO1xuICB9XG59LCB7XG4gIG1lc3NhZ2U6IFwiY2FzdFNoYXJlVXJsIG11c3QgaGF2ZSB0aGUgc2FtZSBkb21haW4gYXMgaG9tZVVybFwiLFxuICBwYXRoOiBbXCJjYXN0U2hhcmVVcmxcIl1cbn0pO1xuSnQoe1xuICBhY2NvdW50QXNzb2NpYXRpb246IGwxLFxuICBtaW5pYXBwOiBpZC5vcHRpb25hbCgpLFxuICAvLyBTdXBwb3J0IGJvdGggJ2ZyYW1lJyBhbmQgJ21pbmlhcHAnIGR1cmluZyB0cmFuc2l0aW9uIHBlcmlvZFxuICBmcmFtZTogaWQub3B0aW9uYWwoKVxufSkucmVmaW5lKChzKSA9PiBzLmZyYW1lICYmIHMubWluaWFwcCA/IEpTT04uc3RyaW5naWZ5KHMuZnJhbWUpID09PSBKU09OLnN0cmluZ2lmeShzLm1pbmlhcHApIDogITAsIHtcbiAgbWVzc2FnZTogJ0lmIGJvdGggXCJmcmFtZVwiIGFuZCBcIm1pbmlhcHBcIiBhcmUgcHJvdmlkZWQsIHRoZXkgbXVzdCBiZSBpZGVudGljYWwnLFxuICBwYXRoOiBbXCJmcmFtZVwiLCBcIm1pbmlhcHBcIl1cbn0pLnRyYW5zZm9ybSgocykgPT4gKHtcbiAgLi4ucyxcbiAgZnJhbWU6IHMuZnJhbWUgPz8gcy5taW5pYXBwXG59KSk7XG52YXIgR2EgPSB7fSwgSG4gPSB7fSwgb2Q7XG5mdW5jdGlvbiBQMSgpIHtcbiAgaWYgKG9kKSByZXR1cm4gSG47XG4gIG9kID0gMSwgSG4uYnl0ZUxlbmd0aCA9IGEsIEhuLnRvQnl0ZUFycmF5ID0gYywgSG4uZnJvbUJ5dGVBcnJheSA9IGg7XG4gIGZvciAodmFyIHMgPSBbXSwgZSA9IFtdLCB0ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPCBcInVcIiA/IFVpbnQ4QXJyYXkgOiBBcnJheSwgciA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLCBuID0gMCwgaSA9IHIubGVuZ3RoOyBuIDwgaTsgKytuKVxuICAgIHNbbl0gPSByW25dLCBlW3IuY2hhckNvZGVBdChuKV0gPSBuO1xuICBlWzQ1XSA9IDYyLCBlWzk1XSA9IDYzO1xuICBmdW5jdGlvbiBvKGYpIHtcbiAgICB2YXIgcCA9IGYubGVuZ3RoO1xuICAgIGlmIChwICUgNCA+IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XCIpO1xuICAgIHZhciB5ID0gZi5pbmRleE9mKFwiPVwiKTtcbiAgICB5ID09PSAtMSAmJiAoeSA9IHApO1xuICAgIHZhciBFID0geSA9PT0gcCA/IDAgOiA0IC0geSAlIDQ7XG4gICAgcmV0dXJuIFt5LCBFXTtcbiAgfVxuICBmdW5jdGlvbiBhKGYpIHtcbiAgICB2YXIgcCA9IG8oZiksIHkgPSBwWzBdLCBFID0gcFsxXTtcbiAgICByZXR1cm4gKHkgKyBFKSAqIDMgLyA0IC0gRTtcbiAgfVxuICBmdW5jdGlvbiBsKGYsIHAsIHkpIHtcbiAgICByZXR1cm4gKHAgKyB5KSAqIDMgLyA0IC0geTtcbiAgfVxuICBmdW5jdGlvbiBjKGYpIHtcbiAgICB2YXIgcCwgeSA9IG8oZiksIEUgPSB5WzBdLCBiID0geVsxXSwgUiA9IG5ldyB0KGwoZiwgRSwgYikpLCBBID0gMCwgRiA9IGIgPiAwID8gRSAtIDQgOiBFLCBNO1xuICAgIGZvciAoTSA9IDA7IE0gPCBGOyBNICs9IDQpXG4gICAgICBwID0gZVtmLmNoYXJDb2RlQXQoTSldIDw8IDE4IHwgZVtmLmNoYXJDb2RlQXQoTSArIDEpXSA8PCAxMiB8IGVbZi5jaGFyQ29kZUF0KE0gKyAyKV0gPDwgNiB8IGVbZi5jaGFyQ29kZUF0KE0gKyAzKV0sIFJbQSsrXSA9IHAgPj4gMTYgJiAyNTUsIFJbQSsrXSA9IHAgPj4gOCAmIDI1NSwgUltBKytdID0gcCAmIDI1NTtcbiAgICByZXR1cm4gYiA9PT0gMiAmJiAocCA9IGVbZi5jaGFyQ29kZUF0KE0pXSA8PCAyIHwgZVtmLmNoYXJDb2RlQXQoTSArIDEpXSA+PiA0LCBSW0ErK10gPSBwICYgMjU1KSwgYiA9PT0gMSAmJiAocCA9IGVbZi5jaGFyQ29kZUF0KE0pXSA8PCAxMCB8IGVbZi5jaGFyQ29kZUF0KE0gKyAxKV0gPDwgNCB8IGVbZi5jaGFyQ29kZUF0KE0gKyAyKV0gPj4gMiwgUltBKytdID0gcCA+PiA4ICYgMjU1LCBSW0ErK10gPSBwICYgMjU1KSwgUjtcbiAgfVxuICBmdW5jdGlvbiB1KGYpIHtcbiAgICByZXR1cm4gc1tmID4+IDE4ICYgNjNdICsgc1tmID4+IDEyICYgNjNdICsgc1tmID4+IDYgJiA2M10gKyBzW2YgJiA2M107XG4gIH1cbiAgZnVuY3Rpb24gZChmLCBwLCB5KSB7XG4gICAgZm9yICh2YXIgRSwgYiA9IFtdLCBSID0gcDsgUiA8IHk7IFIgKz0gMylcbiAgICAgIEUgPSAoZltSXSA8PCAxNiAmIDE2NzExNjgwKSArIChmW1IgKyAxXSA8PCA4ICYgNjUyODApICsgKGZbUiArIDJdICYgMjU1KSwgYi5wdXNoKHUoRSkpO1xuICAgIHJldHVybiBiLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gaChmKSB7XG4gICAgZm9yICh2YXIgcCwgeSA9IGYubGVuZ3RoLCBFID0geSAlIDMsIGIgPSBbXSwgUiA9IDE2MzgzLCBBID0gMCwgRiA9IHkgLSBFOyBBIDwgRjsgQSArPSBSKVxuICAgICAgYi5wdXNoKGQoZiwgQSwgQSArIFIgPiBGID8gRiA6IEEgKyBSKSk7XG4gICAgcmV0dXJuIEUgPT09IDEgPyAocCA9IGZbeSAtIDFdLCBiLnB1c2goXG4gICAgICBzW3AgPj4gMl0gKyBzW3AgPDwgNCAmIDYzXSArIFwiPT1cIlxuICAgICkpIDogRSA9PT0gMiAmJiAocCA9IChmW3kgLSAyXSA8PCA4KSArIGZbeSAtIDFdLCBiLnB1c2goXG4gICAgICBzW3AgPj4gMTBdICsgc1twID4+IDQgJiA2M10gKyBzW3AgPDwgMiAmIDYzXSArIFwiPVwiXG4gICAgKSksIGIuam9pbihcIlwiKTtcbiAgfVxuICByZXR1cm4gSG47XG59XG52YXIgTWkgPSB7fTtcbi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG52YXIgYWQ7XG5mdW5jdGlvbiBNMSgpIHtcbiAgcmV0dXJuIGFkIHx8IChhZCA9IDEsIE1pLnJlYWQgPSBmdW5jdGlvbihzLCBlLCB0LCByLCBuKSB7XG4gICAgdmFyIGksIG8sIGEgPSBuICogOCAtIHIgLSAxLCBsID0gKDEgPDwgYSkgLSAxLCBjID0gbCA+PiAxLCB1ID0gLTcsIGQgPSB0ID8gbiAtIDEgOiAwLCBoID0gdCA/IC0xIDogMSwgZiA9IHNbZSArIGRdO1xuICAgIGZvciAoZCArPSBoLCBpID0gZiAmICgxIDw8IC11KSAtIDEsIGYgPj49IC11LCB1ICs9IGE7IHUgPiAwOyBpID0gaSAqIDI1NiArIHNbZSArIGRdLCBkICs9IGgsIHUgLT0gOClcbiAgICAgIDtcbiAgICBmb3IgKG8gPSBpICYgKDEgPDwgLXUpIC0gMSwgaSA+Pj0gLXUsIHUgKz0gcjsgdSA+IDA7IG8gPSBvICogMjU2ICsgc1tlICsgZF0sIGQgKz0gaCwgdSAtPSA4KVxuICAgICAgO1xuICAgIGlmIChpID09PSAwKVxuICAgICAgaSA9IDEgLSBjO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGkgPT09IGwpXG4gICAgICAgIHJldHVybiBvID8gTmFOIDogKGYgPyAtMSA6IDEpICogKDEgLyAwKTtcbiAgICAgIG8gPSBvICsgTWF0aC5wb3coMiwgciksIGkgPSBpIC0gYztcbiAgICB9XG4gICAgcmV0dXJuIChmID8gLTEgOiAxKSAqIG8gKiBNYXRoLnBvdygyLCBpIC0gcik7XG4gIH0sIE1pLndyaXRlID0gZnVuY3Rpb24ocywgZSwgdCwgciwgbiwgaSkge1xuICAgIHZhciBvLCBhLCBsLCBjID0gaSAqIDggLSBuIC0gMSwgdSA9ICgxIDw8IGMpIC0gMSwgZCA9IHUgPj4gMSwgaCA9IG4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwLCBmID0gciA/IDAgOiBpIC0gMSwgcCA9IHIgPyAxIDogLTEsIHkgPSBlIDwgMCB8fCBlID09PSAwICYmIDEgLyBlIDwgMCA/IDEgOiAwO1xuICAgIGZvciAoZSA9IE1hdGguYWJzKGUpLCBpc05hTihlKSB8fCBlID09PSAxIC8gMCA/IChhID0gaXNOYU4oZSkgPyAxIDogMCwgbyA9IHUpIDogKG8gPSBNYXRoLmZsb29yKE1hdGgubG9nKGUpIC8gTWF0aC5MTjIpLCBlICogKGwgPSBNYXRoLnBvdygyLCAtbykpIDwgMSAmJiAoby0tLCBsICo9IDIpLCBvICsgZCA+PSAxID8gZSArPSBoIC8gbCA6IGUgKz0gaCAqIE1hdGgucG93KDIsIDEgLSBkKSwgZSAqIGwgPj0gMiAmJiAobysrLCBsIC89IDIpLCBvICsgZCA+PSB1ID8gKGEgPSAwLCBvID0gdSkgOiBvICsgZCA+PSAxID8gKGEgPSAoZSAqIGwgLSAxKSAqIE1hdGgucG93KDIsIG4pLCBvID0gbyArIGQpIDogKGEgPSBlICogTWF0aC5wb3coMiwgZCAtIDEpICogTWF0aC5wb3coMiwgbiksIG8gPSAwKSk7IG4gPj0gODsgc1t0ICsgZl0gPSBhICYgMjU1LCBmICs9IHAsIGEgLz0gMjU2LCBuIC09IDgpXG4gICAgICA7XG4gICAgZm9yIChvID0gbyA8PCBuIHwgYSwgYyArPSBuOyBjID4gMDsgc1t0ICsgZl0gPSBvICYgMjU1LCBmICs9IHAsIG8gLz0gMjU2LCBjIC09IDgpXG4gICAgICA7XG4gICAgc1t0ICsgZiAtIHBdIHw9IHkgKiAxMjg7XG4gIH0pLCBNaTtcbn1cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xudmFyIGxkO1xuZnVuY3Rpb24gS2MoKSB7XG4gIHJldHVybiBsZCB8fCAobGQgPSAxLCAoZnVuY3Rpb24ocykge1xuICAgIGNvbnN0IGUgPSBQMSgpLCB0ID0gTTEoKSwgciA9IHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuZm9yID09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbC5mb3IoXCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbVwiKSA6IG51bGw7XG4gICAgcy5CdWZmZXIgPSBhLCBzLlNsb3dCdWZmZXIgPSBSLCBzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTA7XG4gICAgY29uc3QgbiA9IDIxNDc0ODM2NDc7XG4gICAgcy5rTWF4TGVuZ3RoID0gbiwgYS5UWVBFRF9BUlJBWV9TVVBQT1JUID0gaSgpLCAhYS5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlIDwgXCJ1XCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT0gXCJmdW5jdGlvblwiICYmIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LlwiXG4gICAgKTtcbiAgICBmdW5jdGlvbiBpKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgQiA9IG5ldyBVaW50OEFycmF5KDEpLCBTID0geyBmb286IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiA0MjtcbiAgICAgICAgfSB9O1xuICAgICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKFMsIFVpbnQ4QXJyYXkucHJvdG90eXBlKSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKEIsIFMpLCBCLmZvbygpID09PSA0MjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSwgXCJwYXJlbnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoYS5pc0J1ZmZlcih0aGlzKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSwgXCJvZmZzZXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoYS5pc0J1ZmZlcih0aGlzKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIG8oQikge1xuICAgICAgaWYgKEIgPiBuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIEIgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7XG4gICAgICBjb25zdCBTID0gbmV3IFVpbnQ4QXJyYXkoQik7XG4gICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKFMsIGEucHJvdG90eXBlKSwgUztcbiAgICB9XG4gICAgZnVuY3Rpb24gYShCLCBTLCBUKSB7XG4gICAgICBpZiAodHlwZW9mIEIgPT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAodHlwZW9mIFMgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBkKEIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGwoQiwgUywgVCk7XG4gICAgfVxuICAgIGEucG9vbFNpemUgPSA4MTkyO1xuICAgIGZ1bmN0aW9uIGwoQiwgUywgVCkge1xuICAgICAgaWYgKHR5cGVvZiBCID09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBoKEIsIFMpO1xuICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhCKSlcbiAgICAgICAgcmV0dXJuIHAoQik7XG4gICAgICBpZiAoQiA9PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIgKyB0eXBlb2YgQlxuICAgICAgICApO1xuICAgICAgaWYgKGR0KEIsIEFycmF5QnVmZmVyKSB8fCBCICYmIGR0KEIuYnVmZmVyLCBBcnJheUJ1ZmZlcikgfHwgdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIDwgXCJ1XCIgJiYgKGR0KEIsIFNoYXJlZEFycmF5QnVmZmVyKSB8fCBCICYmIGR0KEIuYnVmZmVyLCBTaGFyZWRBcnJheUJ1ZmZlcikpKVxuICAgICAgICByZXR1cm4geShCLCBTLCBUKTtcbiAgICAgIGlmICh0eXBlb2YgQiA9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IEcgPSBCLnZhbHVlT2YgJiYgQi52YWx1ZU9mKCk7XG4gICAgICBpZiAoRyAhPSBudWxsICYmIEcgIT09IEIpXG4gICAgICAgIHJldHVybiBhLmZyb20oRywgUywgVCk7XG4gICAgICBjb25zdCBaID0gRShCKTtcbiAgICAgIGlmIChaKSByZXR1cm4gWjtcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sIDwgXCJ1XCIgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiYgdHlwZW9mIEJbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBhLmZyb20oQltTeW1ib2wudG9QcmltaXRpdmVdKFwic3RyaW5nXCIpLCBTLCBUKTtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIgKyB0eXBlb2YgQlxuICAgICAgKTtcbiAgICB9XG4gICAgYS5mcm9tID0gZnVuY3Rpb24oQiwgUywgVCkge1xuICAgICAgcmV0dXJuIGwoQiwgUywgVCk7XG4gICAgfSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKGEucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSksIE9iamVjdC5zZXRQcm90b3R5cGVPZihhLCBVaW50OEFycmF5KTtcbiAgICBmdW5jdGlvbiBjKEIpIHtcbiAgICAgIGlmICh0eXBlb2YgQiAhPSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7XG4gICAgICBpZiAoQiA8IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgQiArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdShCLCBTLCBUKSB7XG4gICAgICByZXR1cm4gYyhCKSwgQiA8PSAwID8gbyhCKSA6IFMgIT09IHZvaWQgMCA/IHR5cGVvZiBUID09IFwic3RyaW5nXCIgPyBvKEIpLmZpbGwoUywgVCkgOiBvKEIpLmZpbGwoUykgOiBvKEIpO1xuICAgIH1cbiAgICBhLmFsbG9jID0gZnVuY3Rpb24oQiwgUywgVCkge1xuICAgICAgcmV0dXJuIHUoQiwgUywgVCk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkKEIpIHtcbiAgICAgIHJldHVybiBjKEIpLCBvKEIgPCAwID8gMCA6IGIoQikgfCAwKTtcbiAgICB9XG4gICAgYS5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKEIpIHtcbiAgICAgIHJldHVybiBkKEIpO1xuICAgIH0sIGEuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24oQikge1xuICAgICAgcmV0dXJuIGQoQik7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBoKEIsIFMpIHtcbiAgICAgIGlmICgodHlwZW9mIFMgIT0gXCJzdHJpbmdcIiB8fCBTID09PSBcIlwiKSAmJiAoUyA9IFwidXRmOFwiKSwgIWEuaXNFbmNvZGluZyhTKSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiICsgUyk7XG4gICAgICBjb25zdCBUID0gQShCLCBTKSB8IDA7XG4gICAgICBsZXQgRyA9IG8oVCk7XG4gICAgICBjb25zdCBaID0gRy53cml0ZShCLCBTKTtcbiAgICAgIHJldHVybiBaICE9PSBUICYmIChHID0gRy5zbGljZSgwLCBaKSksIEc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGYoQikge1xuICAgICAgY29uc3QgUyA9IEIubGVuZ3RoIDwgMCA/IDAgOiBiKEIubGVuZ3RoKSB8IDAsIFQgPSBvKFMpO1xuICAgICAgZm9yIChsZXQgRyA9IDA7IEcgPCBTOyBHICs9IDEpXG4gICAgICAgIFRbR10gPSBCW0ddICYgMjU1O1xuICAgICAgcmV0dXJuIFQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHAoQikge1xuICAgICAgaWYgKGR0KEIsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IFMgPSBuZXcgVWludDhBcnJheShCKTtcbiAgICAgICAgcmV0dXJuIHkoUy5idWZmZXIsIFMuYnl0ZU9mZnNldCwgUy5ieXRlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmKEIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB5KEIsIFMsIFQpIHtcbiAgICAgIGlmIChTIDwgMCB8fCBCLmJ5dGVMZW5ndGggPCBTKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtcbiAgICAgIGlmIChCLmJ5dGVMZW5ndGggPCBTICsgKFQgfHwgMCkpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO1xuICAgICAgbGV0IEc7XG4gICAgICByZXR1cm4gUyA9PT0gdm9pZCAwICYmIFQgPT09IHZvaWQgMCA/IEcgPSBuZXcgVWludDhBcnJheShCKSA6IFQgPT09IHZvaWQgMCA/IEcgPSBuZXcgVWludDhBcnJheShCLCBTKSA6IEcgPSBuZXcgVWludDhBcnJheShCLCBTLCBUKSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKEcsIGEucHJvdG90eXBlKSwgRztcbiAgICB9XG4gICAgZnVuY3Rpb24gRShCKSB7XG4gICAgICBpZiAoYS5pc0J1ZmZlcihCKSkge1xuICAgICAgICBjb25zdCBTID0gYihCLmxlbmd0aCkgfCAwLCBUID0gbyhTKTtcbiAgICAgICAgcmV0dXJuIFQubGVuZ3RoID09PSAwIHx8IEIuY29weShULCAwLCAwLCBTKSwgVDtcbiAgICAgIH1cbiAgICAgIGlmIChCLmxlbmd0aCAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gdHlwZW9mIEIubGVuZ3RoICE9IFwibnVtYmVyXCIgfHwgSmUoQi5sZW5ndGgpID8gbygwKSA6IGYoQik7XG4gICAgICBpZiAoQi50eXBlID09PSBcIkJ1ZmZlclwiICYmIEFycmF5LmlzQXJyYXkoQi5kYXRhKSlcbiAgICAgICAgcmV0dXJuIGYoQi5kYXRhKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYihCKSB7XG4gICAgICBpZiAoQiA+PSBuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHhcIiArIG4udG9TdHJpbmcoMTYpICsgXCIgYnl0ZXNcIik7XG4gICAgICByZXR1cm4gQiB8IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFIoQikge1xuICAgICAgcmV0dXJuICtCICE9IEIgJiYgKEIgPSAwKSwgYS5hbGxvYygrQik7XG4gICAgfVxuICAgIGEuaXNCdWZmZXIgPSBmdW5jdGlvbihTKSB7XG4gICAgICByZXR1cm4gUyAhPSBudWxsICYmIFMuX2lzQnVmZmVyID09PSAhMCAmJiBTICE9PSBhLnByb3RvdHlwZTtcbiAgICB9LCBhLmNvbXBhcmUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBpZiAoZHQoUywgVWludDhBcnJheSkgJiYgKFMgPSBhLmZyb20oUywgUy5vZmZzZXQsIFMuYnl0ZUxlbmd0aCkpLCBkdChULCBVaW50OEFycmF5KSAmJiAoVCA9IGEuZnJvbShULCBULm9mZnNldCwgVC5ieXRlTGVuZ3RoKSksICFhLmlzQnVmZmVyKFMpIHx8ICFhLmlzQnVmZmVyKFQpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgICAgICApO1xuICAgICAgaWYgKFMgPT09IFQpIHJldHVybiAwO1xuICAgICAgbGV0IEcgPSBTLmxlbmd0aCwgWiA9IFQubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgUSA9IDAsIHNlID0gTWF0aC5taW4oRywgWik7IFEgPCBzZTsgKytRKVxuICAgICAgICBpZiAoU1tRXSAhPT0gVFtRXSkge1xuICAgICAgICAgIEcgPSBTW1FdLCBaID0gVFtRXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIEcgPCBaID8gLTEgOiBaIDwgRyA/IDEgOiAwO1xuICAgIH0sIGEuaXNFbmNvZGluZyA9IGZ1bmN0aW9uKFMpIHtcbiAgICAgIHN3aXRjaCAoU3RyaW5nKFMpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICBjYXNlIFwidXRmOFwiOlxuICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgY2FzZSBcImFzY2lpXCI6XG4gICAgICAgIGNhc2UgXCJsYXRpbjFcIjpcbiAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgIGNhc2UgXCJ1Y3MyXCI6XG4gICAgICAgIGNhc2UgXCJ1Y3MtMlwiOlxuICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxuICAgICAgICBjYXNlIFwidXRmLTE2bGVcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgIH0sIGEuY29uY2F0ID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KFMpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGEuYWxsb2MoMCk7XG4gICAgICBsZXQgRztcbiAgICAgIGlmIChUID09PSB2b2lkIDApXG4gICAgICAgIGZvciAoVCA9IDAsIEcgPSAwOyBHIDwgUy5sZW5ndGg7ICsrRylcbiAgICAgICAgICBUICs9IFNbR10ubGVuZ3RoO1xuICAgICAgY29uc3QgWiA9IGEuYWxsb2NVbnNhZmUoVCk7XG4gICAgICBsZXQgUSA9IDA7XG4gICAgICBmb3IgKEcgPSAwOyBHIDwgUy5sZW5ndGg7ICsrRykge1xuICAgICAgICBsZXQgc2UgPSBTW0ddO1xuICAgICAgICBpZiAoZHQoc2UsIFVpbnQ4QXJyYXkpKVxuICAgICAgICAgIFEgKyBzZS5sZW5ndGggPiBaLmxlbmd0aCA/IChhLmlzQnVmZmVyKHNlKSB8fCAoc2UgPSBhLmZyb20oc2UpKSwgc2UuY29weShaLCBRKSkgOiBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICAgIFosXG4gICAgICAgICAgICBzZSxcbiAgICAgICAgICAgIFFcbiAgICAgICAgICApO1xuICAgICAgICBlbHNlIGlmIChhLmlzQnVmZmVyKHNlKSlcbiAgICAgICAgICBzZS5jb3B5KFosIFEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7XG4gICAgICAgIFEgKz0gc2UubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFo7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBBKEIsIFMpIHtcbiAgICAgIGlmIChhLmlzQnVmZmVyKEIpKVxuICAgICAgICByZXR1cm4gQi5sZW5ndGg7XG4gICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KEIpIHx8IGR0KEIsIEFycmF5QnVmZmVyKSlcbiAgICAgICAgcmV0dXJuIEIuYnl0ZUxlbmd0aDtcbiAgICAgIGlmICh0eXBlb2YgQiAhPSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIEJcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IFQgPSBCLmxlbmd0aCwgRyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gITA7XG4gICAgICBpZiAoIUcgJiYgVCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICBsZXQgWiA9ICExO1xuICAgICAgZm9yICg7IDsgKVxuICAgICAgICBzd2l0Y2ggKFMpIHtcbiAgICAgICAgICBjYXNlIFwiYXNjaWlcIjpcbiAgICAgICAgICBjYXNlIFwibGF0aW4xXCI6XG4gICAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxuICAgICAgICAgICAgcmV0dXJuIFQ7XG4gICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgICAgIHJldHVybiBiZShCKS5sZW5ndGg7XG4gICAgICAgICAgY2FzZSBcInVjczJcIjpcbiAgICAgICAgICBjYXNlIFwidWNzLTJcIjpcbiAgICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxuICAgICAgICAgIGNhc2UgXCJ1dGYtMTZsZVwiOlxuICAgICAgICAgICAgcmV0dXJuIFQgKiAyO1xuICAgICAgICAgIGNhc2UgXCJoZXhcIjpcbiAgICAgICAgICAgIHJldHVybiBUID4+PiAxO1xuICAgICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIHJldHVybiB3ZShCKS5sZW5ndGg7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChaKVxuICAgICAgICAgICAgICByZXR1cm4gRyA/IC0xIDogYmUoQikubGVuZ3RoO1xuICAgICAgICAgICAgUyA9IChcIlwiICsgUykudG9Mb3dlckNhc2UoKSwgWiA9ICEwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGEuYnl0ZUxlbmd0aCA9IEE7XG4gICAgZnVuY3Rpb24gRihCLCBTLCBUKSB7XG4gICAgICBsZXQgRyA9ICExO1xuICAgICAgaWYgKChTID09PSB2b2lkIDAgfHwgUyA8IDApICYmIChTID0gMCksIFMgPiB0aGlzLmxlbmd0aCB8fCAoKFQgPT09IHZvaWQgMCB8fCBUID4gdGhpcy5sZW5ndGgpICYmIChUID0gdGhpcy5sZW5ndGgpLCBUIDw9IDApIHx8IChUID4+Pj0gMCwgUyA+Pj49IDAsIFQgPD0gUykpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgZm9yIChCIHx8IChCID0gXCJ1dGY4XCIpOyA7IClcbiAgICAgICAgc3dpdGNoIChCKSB7XG4gICAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICAgICAgcmV0dXJuIFUodGhpcywgUywgVCk7XG4gICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgICAgIHJldHVybiBnKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGNhc2UgXCJhc2NpaVwiOlxuICAgICAgICAgICAgcmV0dXJuIEQodGhpcywgUywgVCk7XG4gICAgICAgICAgY2FzZSBcImxhdGluMVwiOlxuICAgICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICAgIHJldHVybiBPKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIHJldHVybiBfKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGNhc2UgXCJ1Y3MyXCI6XG4gICAgICAgICAgY2FzZSBcInVjcy0yXCI6XG4gICAgICAgICAgY2FzZSBcInV0ZjE2bGVcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLTE2bGVcIjpcbiAgICAgICAgICAgIHJldHVybiBWKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoRykgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiICsgQik7XG4gICAgICAgICAgICBCID0gKEIgKyBcIlwiKS50b0xvd2VyQ2FzZSgpLCBHID0gITA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYS5wcm90b3R5cGUuX2lzQnVmZmVyID0gITA7XG4gICAgZnVuY3Rpb24gTShCLCBTLCBUKSB7XG4gICAgICBjb25zdCBHID0gQltTXTtcbiAgICAgIEJbU10gPSBCW1RdLCBCW1RdID0gRztcbiAgICB9XG4gICAgYS5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBTID0gdGhpcy5sZW5ndGg7XG4gICAgICBpZiAoUyAlIDIgIT09IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHNcIik7XG4gICAgICBmb3IgKGxldCBUID0gMDsgVCA8IFM7IFQgKz0gMilcbiAgICAgICAgTSh0aGlzLCBULCBUICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBhLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IFMgPSB0aGlzLmxlbmd0aDtcbiAgICAgIGlmIChTICUgNCAhPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0c1wiKTtcbiAgICAgIGZvciAobGV0IFQgPSAwOyBUIDwgUzsgVCArPSA0KVxuICAgICAgICBNKHRoaXMsIFQsIFQgKyAzKSwgTSh0aGlzLCBUICsgMSwgVCArIDIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBTID0gdGhpcy5sZW5ndGg7XG4gICAgICBpZiAoUyAlIDggIT09IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHNcIik7XG4gICAgICBmb3IgKGxldCBUID0gMDsgVCA8IFM7IFQgKz0gOClcbiAgICAgICAgTSh0aGlzLCBULCBUICsgNyksIE0odGhpcywgVCArIDEsIFQgKyA2KSwgTSh0aGlzLCBUICsgMiwgVCArIDUpLCBNKHRoaXMsIFQgKyAzLCBUICsgNCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgUyA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIFMgPT09IDAgPyBcIlwiIDogYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IGcodGhpcywgMCwgUykgOiBGLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSwgYS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBhLnByb3RvdHlwZS50b1N0cmluZywgYS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24oUykge1xuICAgICAgaWYgKCFhLmlzQnVmZmVyKFMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtcbiAgICAgIHJldHVybiB0aGlzID09PSBTID8gITAgOiBhLmNvbXBhcmUodGhpcywgUykgPT09IDA7XG4gICAgfSwgYS5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgbGV0IFMgPSBcIlwiO1xuICAgICAgY29uc3QgVCA9IHMuSU5TUEVDVF9NQVhfQllURVM7XG4gICAgICByZXR1cm4gUyA9IHRoaXMudG9TdHJpbmcoXCJoZXhcIiwgMCwgVCkucmVwbGFjZSgvKC57Mn0pL2csIFwiJDEgXCIpLnRyaW0oKSwgdGhpcy5sZW5ndGggPiBUICYmIChTICs9IFwiIC4uLiBcIiksIFwiPEJ1ZmZlciBcIiArIFMgKyBcIj5cIjtcbiAgICB9LCByICYmIChhLnByb3RvdHlwZVtyXSA9IGEucHJvdG90eXBlLmluc3BlY3QpLCBhLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24oUywgVCwgRywgWiwgUSkge1xuICAgICAgaWYgKGR0KFMsIFVpbnQ4QXJyYXkpICYmIChTID0gYS5mcm9tKFMsIFMub2Zmc2V0LCBTLmJ5dGVMZW5ndGgpKSwgIWEuaXNCdWZmZXIoUykpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBTXG4gICAgICAgICk7XG4gICAgICBpZiAoVCA9PT0gdm9pZCAwICYmIChUID0gMCksIEcgPT09IHZvaWQgMCAmJiAoRyA9IFMgPyBTLmxlbmd0aCA6IDApLCBaID09PSB2b2lkIDAgJiYgKFogPSAwKSwgUSA9PT0gdm9pZCAwICYmIChRID0gdGhpcy5sZW5ndGgpLCBUIDwgMCB8fCBHID4gUy5sZW5ndGggfHwgWiA8IDAgfHwgUSA+IHRoaXMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBpbmRleFwiKTtcbiAgICAgIGlmIChaID49IFEgJiYgVCA+PSBHKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGlmIChaID49IFEpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmIChUID49IEcpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgaWYgKFQgPj4+PSAwLCBHID4+Pj0gMCwgWiA+Pj49IDAsIFEgPj4+PSAwLCB0aGlzID09PSBTKSByZXR1cm4gMDtcbiAgICAgIGxldCBzZSA9IFEgLSBaLCBVZSA9IEcgLSBUO1xuICAgICAgY29uc3QgUGUgPSBNYXRoLm1pbihzZSwgVWUpLCBMZSA9IHRoaXMuc2xpY2UoWiwgUSksIGN0ID0gUy5zbGljZShULCBHKTtcbiAgICAgIGZvciAobGV0IEFlID0gMDsgQWUgPCBQZTsgKytBZSlcbiAgICAgICAgaWYgKExlW0FlXSAhPT0gY3RbQWVdKSB7XG4gICAgICAgICAgc2UgPSBMZVtBZV0sIFVlID0gY3RbQWVdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gc2UgPCBVZSA/IC0xIDogVWUgPCBzZSA/IDEgOiAwO1xuICAgIH07XG4gICAgZnVuY3Rpb24gSChCLCBTLCBULCBHLCBaKSB7XG4gICAgICBpZiAoQi5sZW5ndGggPT09IDApIHJldHVybiAtMTtcbiAgICAgIGlmICh0eXBlb2YgVCA9PSBcInN0cmluZ1wiID8gKEcgPSBULCBUID0gMCkgOiBUID4gMjE0NzQ4MzY0NyA/IFQgPSAyMTQ3NDgzNjQ3IDogVCA8IC0yMTQ3NDgzNjQ4ICYmIChUID0gLTIxNDc0ODM2NDgpLCBUID0gK1QsIEplKFQpICYmIChUID0gWiA/IDAgOiBCLmxlbmd0aCAtIDEpLCBUIDwgMCAmJiAoVCA9IEIubGVuZ3RoICsgVCksIFQgPj0gQi5sZW5ndGgpIHtcbiAgICAgICAgaWYgKFopIHJldHVybiAtMTtcbiAgICAgICAgVCA9IEIubGVuZ3RoIC0gMTtcbiAgICAgIH0gZWxzZSBpZiAoVCA8IDApXG4gICAgICAgIGlmIChaKSBUID0gMDtcbiAgICAgICAgZWxzZSByZXR1cm4gLTE7XG4gICAgICBpZiAodHlwZW9mIFMgPT0gXCJzdHJpbmdcIiAmJiAoUyA9IGEuZnJvbShTLCBHKSksIGEuaXNCdWZmZXIoUykpXG4gICAgICAgIHJldHVybiBTLmxlbmd0aCA9PT0gMCA/IC0xIDogSyhCLCBTLCBULCBHLCBaKTtcbiAgICAgIGlmICh0eXBlb2YgUyA9PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gUyA9IFMgJiAyNTUsIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09IFwiZnVuY3Rpb25cIiA/IFogPyBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoQiwgUywgVCkgOiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKEIsIFMsIFQpIDogSyhCLCBbU10sIFQsIEcsIFopO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlclwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSyhCLCBTLCBULCBHLCBaKSB7XG4gICAgICBsZXQgUSA9IDEsIHNlID0gQi5sZW5ndGgsIFVlID0gUy5sZW5ndGg7XG4gICAgICBpZiAoRyAhPT0gdm9pZCAwICYmIChHID0gU3RyaW5nKEcpLnRvTG93ZXJDYXNlKCksIEcgPT09IFwidWNzMlwiIHx8IEcgPT09IFwidWNzLTJcIiB8fCBHID09PSBcInV0ZjE2bGVcIiB8fCBHID09PSBcInV0Zi0xNmxlXCIpKSB7XG4gICAgICAgIGlmIChCLmxlbmd0aCA8IDIgfHwgUy5sZW5ndGggPCAyKVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgUSA9IDIsIHNlIC89IDIsIFVlIC89IDIsIFQgLz0gMjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIFBlKGN0LCBBZSkge1xuICAgICAgICByZXR1cm4gUSA9PT0gMSA/IGN0W0FlXSA6IGN0LnJlYWRVSW50MTZCRShBZSAqIFEpO1xuICAgICAgfVxuICAgICAgbGV0IExlO1xuICAgICAgaWYgKFopIHtcbiAgICAgICAgbGV0IGN0ID0gLTE7XG4gICAgICAgIGZvciAoTGUgPSBUOyBMZSA8IHNlOyBMZSsrKVxuICAgICAgICAgIGlmIChQZShCLCBMZSkgPT09IFBlKFMsIGN0ID09PSAtMSA/IDAgOiBMZSAtIGN0KSkge1xuICAgICAgICAgICAgaWYgKGN0ID09PSAtMSAmJiAoY3QgPSBMZSksIExlIC0gY3QgKyAxID09PSBVZSkgcmV0dXJuIGN0ICogUTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGN0ICE9PSAtMSAmJiAoTGUgLT0gTGUgLSBjdCksIGN0ID0gLTE7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZm9yIChUICsgVWUgPiBzZSAmJiAoVCA9IHNlIC0gVWUpLCBMZSA9IFQ7IExlID49IDA7IExlLS0pIHtcbiAgICAgICAgICBsZXQgY3QgPSAhMDtcbiAgICAgICAgICBmb3IgKGxldCBBZSA9IDA7IEFlIDwgVWU7IEFlKyspXG4gICAgICAgICAgICBpZiAoUGUoQiwgTGUgKyBBZSkgIT09IFBlKFMsIEFlKSkge1xuICAgICAgICAgICAgICBjdCA9ICExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3QpIHJldHVybiBMZTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiB0aGlzLmluZGV4T2YoUywgVCwgRykgIT09IC0xO1xuICAgIH0sIGEucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gSCh0aGlzLCBTLCBULCBHLCAhMCk7XG4gICAgfSwgYS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gSCh0aGlzLCBTLCBULCBHLCAhMSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBqKEIsIFMsIFQsIEcpIHtcbiAgICAgIFQgPSBOdW1iZXIoVCkgfHwgMDtcbiAgICAgIGNvbnN0IFogPSBCLmxlbmd0aCAtIFQ7XG4gICAgICBHID8gKEcgPSBOdW1iZXIoRyksIEcgPiBaICYmIChHID0gWikpIDogRyA9IFo7XG4gICAgICBjb25zdCBRID0gUy5sZW5ndGg7XG4gICAgICBHID4gUSAvIDIgJiYgKEcgPSBRIC8gMik7XG4gICAgICBsZXQgc2U7XG4gICAgICBmb3IgKHNlID0gMDsgc2UgPCBHOyArK3NlKSB7XG4gICAgICAgIGNvbnN0IFVlID0gcGFyc2VJbnQoUy5zdWJzdHIoc2UgKiAyLCAyKSwgMTYpO1xuICAgICAgICBpZiAoSmUoVWUpKSByZXR1cm4gc2U7XG4gICAgICAgIEJbVCArIHNlXSA9IFVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBDKEIsIFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBOZShiZShTLCBCLmxlbmd0aCAtIFQpLCBCLCBULCBHKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gayhCLCBTLCBULCBHKSB7XG4gICAgICByZXR1cm4gTmUoRmUoUyksIEIsIFQsIEcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiAkKEIsIFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBOZSh3ZShTKSwgQiwgVCwgRyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFcoQiwgUywgVCwgRykge1xuICAgICAgcmV0dXJuIE5lKFhlKFMsIEIubGVuZ3RoIC0gVCksIEIsIFQsIEcpO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmIChUID09PSB2b2lkIDApXG4gICAgICAgIFogPSBcInV0ZjhcIiwgRyA9IHRoaXMubGVuZ3RoLCBUID0gMDtcbiAgICAgIGVsc2UgaWYgKEcgPT09IHZvaWQgMCAmJiB0eXBlb2YgVCA9PSBcInN0cmluZ1wiKVxuICAgICAgICBaID0gVCwgRyA9IHRoaXMubGVuZ3RoLCBUID0gMDtcbiAgICAgIGVsc2UgaWYgKGlzRmluaXRlKFQpKVxuICAgICAgICBUID0gVCA+Pj4gMCwgaXNGaW5pdGUoRykgPyAoRyA9IEcgPj4+IDAsIFogPT09IHZvaWQgMCAmJiAoWiA9IFwidXRmOFwiKSkgOiAoWiA9IEcsIEcgPSB2b2lkIDApO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFwiXG4gICAgICAgICk7XG4gICAgICBjb25zdCBRID0gdGhpcy5sZW5ndGggLSBUO1xuICAgICAgaWYgKChHID09PSB2b2lkIDAgfHwgRyA+IFEpICYmIChHID0gUSksIFMubGVuZ3RoID4gMCAmJiAoRyA8IDAgfHwgVCA8IDApIHx8IFQgPiB0aGlzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKTtcbiAgICAgIFogfHwgKFogPSBcInV0ZjhcIik7XG4gICAgICBsZXQgc2UgPSAhMTtcbiAgICAgIGZvciAoOyA7IClcbiAgICAgICAgc3dpdGNoIChaKSB7XG4gICAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICAgICAgcmV0dXJuIGoodGhpcywgUywgVCwgRyk7XG4gICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgICAgIHJldHVybiBDKHRoaXMsIFMsIFQsIEcpO1xuICAgICAgICAgIGNhc2UgXCJhc2NpaVwiOlxuICAgICAgICAgIGNhc2UgXCJsYXRpbjFcIjpcbiAgICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgICByZXR1cm4gayh0aGlzLCBTLCBULCBHKTtcbiAgICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICByZXR1cm4gJCh0aGlzLCBTLCBULCBHKTtcbiAgICAgICAgICBjYXNlIFwidWNzMlwiOlxuICAgICAgICAgIGNhc2UgXCJ1Y3MtMlwiOlxuICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XG4gICAgICAgICAgY2FzZSBcInV0Zi0xNmxlXCI6XG4gICAgICAgICAgICByZXR1cm4gVyh0aGlzLCBTLCBULCBHKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIgKyBaKTtcbiAgICAgICAgICAgIFogPSAoXCJcIiArIFopLnRvTG93ZXJDYXNlKCksIHNlID0gITA7XG4gICAgICAgIH1cbiAgICB9LCBhLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiQnVmZmVyXCIsXG4gICAgICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICAgICAgfTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIF8oQiwgUywgVCkge1xuICAgICAgcmV0dXJuIFMgPT09IDAgJiYgVCA9PT0gQi5sZW5ndGggPyBlLmZyb21CeXRlQXJyYXkoQikgOiBlLmZyb21CeXRlQXJyYXkoQi5zbGljZShTLCBUKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGcoQiwgUywgVCkge1xuICAgICAgVCA9IE1hdGgubWluKEIubGVuZ3RoLCBUKTtcbiAgICAgIGNvbnN0IEcgPSBbXTtcbiAgICAgIGxldCBaID0gUztcbiAgICAgIGZvciAoOyBaIDwgVDsgKSB7XG4gICAgICAgIGNvbnN0IFEgPSBCW1pdO1xuICAgICAgICBsZXQgc2UgPSBudWxsLCBVZSA9IFEgPiAyMzkgPyA0IDogUSA+IDIyMyA/IDMgOiBRID4gMTkxID8gMiA6IDE7XG4gICAgICAgIGlmIChaICsgVWUgPD0gVCkge1xuICAgICAgICAgIGxldCBQZSwgTGUsIGN0LCBBZTtcbiAgICAgICAgICBzd2l0Y2ggKFVlKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIFEgPCAxMjggJiYgKHNlID0gUSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBQZSA9IEJbWiArIDFdLCAoUGUgJiAxOTIpID09PSAxMjggJiYgKEFlID0gKFEgJiAzMSkgPDwgNiB8IFBlICYgNjMsIEFlID4gMTI3ICYmIChzZSA9IEFlKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBQZSA9IEJbWiArIDFdLCBMZSA9IEJbWiArIDJdLCAoUGUgJiAxOTIpID09PSAxMjggJiYgKExlICYgMTkyKSA9PT0gMTI4ICYmIChBZSA9IChRICYgMTUpIDw8IDEyIHwgKFBlICYgNjMpIDw8IDYgfCBMZSAmIDYzLCBBZSA+IDIwNDcgJiYgKEFlIDwgNTUyOTYgfHwgQWUgPiA1NzM0MykgJiYgKHNlID0gQWUpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIFBlID0gQltaICsgMV0sIExlID0gQltaICsgMl0sIGN0ID0gQltaICsgM10sIChQZSAmIDE5MikgPT09IDEyOCAmJiAoTGUgJiAxOTIpID09PSAxMjggJiYgKGN0ICYgMTkyKSA9PT0gMTI4ICYmIChBZSA9IChRICYgMTUpIDw8IDE4IHwgKFBlICYgNjMpIDw8IDEyIHwgKExlICYgNjMpIDw8IDYgfCBjdCAmIDYzLCBBZSA+IDY1NTM1ICYmIEFlIDwgMTExNDExMiAmJiAoc2UgPSBBZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZSA9PT0gbnVsbCA/IChzZSA9IDY1NTMzLCBVZSA9IDEpIDogc2UgPiA2NTUzNSAmJiAoc2UgLT0gNjU1MzYsIEcucHVzaChzZSA+Pj4gMTAgJiAxMDIzIHwgNTUyOTYpLCBzZSA9IDU2MzIwIHwgc2UgJiAxMDIzKSwgRy5wdXNoKHNlKSwgWiArPSBVZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3KEcpO1xuICAgIH1cbiAgICBjb25zdCB4ID0gNDA5NjtcbiAgICBmdW5jdGlvbiB3KEIpIHtcbiAgICAgIGNvbnN0IFMgPSBCLmxlbmd0aDtcbiAgICAgIGlmIChTIDw9IHgpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgQik7XG4gICAgICBsZXQgVCA9IFwiXCIsIEcgPSAwO1xuICAgICAgZm9yICg7IEcgPCBTOyApXG4gICAgICAgIFQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgICAgICBTdHJpbmcsXG4gICAgICAgICAgQi5zbGljZShHLCBHICs9IHgpXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gVDtcbiAgICB9XG4gICAgZnVuY3Rpb24gRChCLCBTLCBUKSB7XG4gICAgICBsZXQgRyA9IFwiXCI7XG4gICAgICBUID0gTWF0aC5taW4oQi5sZW5ndGgsIFQpO1xuICAgICAgZm9yIChsZXQgWiA9IFM7IFogPCBUOyArK1opXG4gICAgICAgIEcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShCW1pdICYgMTI3KTtcbiAgICAgIHJldHVybiBHO1xuICAgIH1cbiAgICBmdW5jdGlvbiBPKEIsIFMsIFQpIHtcbiAgICAgIGxldCBHID0gXCJcIjtcbiAgICAgIFQgPSBNYXRoLm1pbihCLmxlbmd0aCwgVCk7XG4gICAgICBmb3IgKGxldCBaID0gUzsgWiA8IFQ7ICsrWilcbiAgICAgICAgRyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEJbWl0pO1xuICAgICAgcmV0dXJuIEc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFUoQiwgUywgVCkge1xuICAgICAgY29uc3QgRyA9IEIubGVuZ3RoO1xuICAgICAgKCFTIHx8IFMgPCAwKSAmJiAoUyA9IDApLCAoIVQgfHwgVCA8IDAgfHwgVCA+IEcpICYmIChUID0gRyk7XG4gICAgICBsZXQgWiA9IFwiXCI7XG4gICAgICBmb3IgKGxldCBRID0gUzsgUSA8IFQ7ICsrUSlcbiAgICAgICAgWiArPSBRZVtCW1FdXTtcbiAgICAgIHJldHVybiBaO1xuICAgIH1cbiAgICBmdW5jdGlvbiBWKEIsIFMsIFQpIHtcbiAgICAgIGNvbnN0IEcgPSBCLnNsaWNlKFMsIFQpO1xuICAgICAgbGV0IFogPSBcIlwiO1xuICAgICAgZm9yIChsZXQgUSA9IDA7IFEgPCBHLmxlbmd0aCAtIDE7IFEgKz0gMilcbiAgICAgICAgWiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEdbUV0gKyBHW1EgKyAxXSAqIDI1Nik7XG4gICAgICByZXR1cm4gWjtcbiAgICB9XG4gICAgYS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBjb25zdCBHID0gdGhpcy5sZW5ndGg7XG4gICAgICBTID0gfn5TLCBUID0gVCA9PT0gdm9pZCAwID8gRyA6IH5+VCwgUyA8IDAgPyAoUyArPSBHLCBTIDwgMCAmJiAoUyA9IDApKSA6IFMgPiBHICYmIChTID0gRyksIFQgPCAwID8gKFQgKz0gRywgVCA8IDAgJiYgKFQgPSAwKSkgOiBUID4gRyAmJiAoVCA9IEcpLCBUIDwgUyAmJiAoVCA9IFMpO1xuICAgICAgY29uc3QgWiA9IHRoaXMuc3ViYXJyYXkoUywgVCk7XG4gICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKFosIGEucHJvdG90eXBlKSwgWjtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIEwoQiwgUywgVCkge1xuICAgICAgaWYgKEIgJSAxICE9PSAwIHx8IEIgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm9mZnNldCBpcyBub3QgdWludFwiKTtcbiAgICAgIGlmIChCICsgUyA+IFQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aFwiKTtcbiAgICB9XG4gICAgYS5wcm90b3R5cGUucmVhZFVpbnRMRSA9IGEucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCA9IFQgPj4+IDAsIEcgfHwgTChTLCBULCB0aGlzLmxlbmd0aCk7XG4gICAgICBsZXQgWiA9IHRoaXNbU10sIFEgPSAxLCBzZSA9IDA7XG4gICAgICBmb3IgKDsgKytzZSA8IFQgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICBaICs9IHRoaXNbUyArIHNlXSAqIFE7XG4gICAgICByZXR1cm4gWjtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkVWludEJFID0gYS5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBUID0gVCA+Pj4gMCwgRyB8fCBMKFMsIFQsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGxldCBaID0gdGhpc1tTICsgLS1UXSwgUSA9IDE7XG4gICAgICBmb3IgKDsgVCA+IDAgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICBaICs9IHRoaXNbUyArIC0tVF0gKiBRO1xuICAgICAgcmV0dXJuIFo7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZFVpbnQ4ID0gYS5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgMSwgdGhpcy5sZW5ndGgpLCB0aGlzW1NdO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRVaW50MTZMRSA9IGEucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDIsIHRoaXMubGVuZ3RoKSwgdGhpc1tTXSB8IHRoaXNbUyArIDFdIDw8IDg7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZFVpbnQxNkJFID0gYS5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgMiwgdGhpcy5sZW5ndGgpLCB0aGlzW1NdIDw8IDggfCB0aGlzW1MgKyAxXTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkVWludDMyTEUgPSBhLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICByZXR1cm4gUyA9IFMgPj4+IDAsIFQgfHwgTChTLCA0LCB0aGlzLmxlbmd0aCksICh0aGlzW1NdIHwgdGhpc1tTICsgMV0gPDwgOCB8IHRoaXNbUyArIDJdIDw8IDE2KSArIHRoaXNbUyArIDNdICogMTY3NzcyMTY7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZFVpbnQzMkJFID0gYS5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgNCwgdGhpcy5sZW5ndGgpLCB0aGlzW1NdICogMTY3NzcyMTYgKyAodGhpc1tTICsgMV0gPDwgMTYgfCB0aGlzW1MgKyAyXSA8PCA4IHwgdGhpc1tTICsgM10pO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRCaWdVSW50NjRMRSA9IGl0KGZ1bmN0aW9uKFMpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBfZShTLCBcIm9mZnNldFwiKTtcbiAgICAgIGNvbnN0IFQgPSB0aGlzW1NdLCBHID0gdGhpc1tTICsgN107XG4gICAgICAoVCA9PT0gdm9pZCAwIHx8IEcgPT09IHZvaWQgMCkgJiYgeGUoUywgdGhpcy5sZW5ndGggLSA4KTtcbiAgICAgIGNvbnN0IFogPSBUICsgdGhpc1srK1NdICogMiAqKiA4ICsgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogMjQsIFEgPSB0aGlzWysrU10gKyB0aGlzWysrU10gKiAyICoqIDggKyB0aGlzWysrU10gKiAyICoqIDE2ICsgRyAqIDIgKiogMjQ7XG4gICAgICByZXR1cm4gQmlnSW50KFopICsgKEJpZ0ludChRKSA8PCBCaWdJbnQoMzIpKTtcbiAgICB9KSwgYS5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFID0gaXQoZnVuY3Rpb24oUykge1xuICAgICAgUyA9IFMgPj4+IDAsIF9lKFMsIFwib2Zmc2V0XCIpO1xuICAgICAgY29uc3QgVCA9IHRoaXNbU10sIEcgPSB0aGlzW1MgKyA3XTtcbiAgICAgIChUID09PSB2b2lkIDAgfHwgRyA9PT0gdm9pZCAwKSAmJiB4ZShTLCB0aGlzLmxlbmd0aCAtIDgpO1xuICAgICAgY29uc3QgWiA9IFQgKiAyICoqIDI0ICsgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogOCArIHRoaXNbKytTXSwgUSA9IHRoaXNbKytTXSAqIDIgKiogMjQgKyB0aGlzWysrU10gKiAyICoqIDE2ICsgdGhpc1srK1NdICogMiAqKiA4ICsgRztcbiAgICAgIHJldHVybiAoQmlnSW50KFopIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KFEpO1xuICAgIH0pLCBhLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCA9IFQgPj4+IDAsIEcgfHwgTChTLCBULCB0aGlzLmxlbmd0aCk7XG4gICAgICBsZXQgWiA9IHRoaXNbU10sIFEgPSAxLCBzZSA9IDA7XG4gICAgICBmb3IgKDsgKytzZSA8IFQgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICBaICs9IHRoaXNbUyArIHNlXSAqIFE7XG4gICAgICByZXR1cm4gUSAqPSAxMjgsIFogPj0gUSAmJiAoWiAtPSBNYXRoLnBvdygyLCA4ICogVCkpLCBaO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBUID0gVCA+Pj4gMCwgRyB8fCBMKFMsIFQsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGxldCBaID0gVCwgUSA9IDEsIHNlID0gdGhpc1tTICsgLS1aXTtcbiAgICAgIGZvciAoOyBaID4gMCAmJiAoUSAqPSAyNTYpOyApXG4gICAgICAgIHNlICs9IHRoaXNbUyArIC0tWl0gKiBRO1xuICAgICAgcmV0dXJuIFEgKj0gMTI4LCBzZSA+PSBRICYmIChzZSAtPSBNYXRoLnBvdygyLCA4ICogVCkpLCBzZTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDEsIHRoaXMubGVuZ3RoKSwgdGhpc1tTXSAmIDEyOCA/ICgyNTUgLSB0aGlzW1NdICsgMSkgKiAtMSA6IHRoaXNbU107XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IEcgPSB0aGlzW1NdIHwgdGhpc1tTICsgMV0gPDwgODtcbiAgICAgIHJldHVybiBHICYgMzI3NjggPyBHIHwgNDI5NDkwMTc2MCA6IEc7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IEcgPSB0aGlzW1MgKyAxXSB8IHRoaXNbU10gPDwgODtcbiAgICAgIHJldHVybiBHICYgMzI3NjggPyBHIHwgNDI5NDkwMTc2MCA6IEc7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICByZXR1cm4gUyA9IFMgPj4+IDAsIFQgfHwgTChTLCA0LCB0aGlzLmxlbmd0aCksIHRoaXNbU10gfCB0aGlzW1MgKyAxXSA8PCA4IHwgdGhpc1tTICsgMl0gPDwgMTYgfCB0aGlzW1MgKyAzXSA8PCAyNDtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDQsIHRoaXMubGVuZ3RoKSwgdGhpc1tTXSA8PCAyNCB8IHRoaXNbUyArIDFdIDw8IDE2IHwgdGhpc1tTICsgMl0gPDwgOCB8IHRoaXNbUyArIDNdO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRCaWdJbnQ2NExFID0gaXQoZnVuY3Rpb24oUykge1xuICAgICAgUyA9IFMgPj4+IDAsIF9lKFMsIFwib2Zmc2V0XCIpO1xuICAgICAgY29uc3QgVCA9IHRoaXNbU10sIEcgPSB0aGlzW1MgKyA3XTtcbiAgICAgIChUID09PSB2b2lkIDAgfHwgRyA9PT0gdm9pZCAwKSAmJiB4ZShTLCB0aGlzLmxlbmd0aCAtIDgpO1xuICAgICAgY29uc3QgWiA9IHRoaXNbUyArIDRdICsgdGhpc1tTICsgNV0gKiAyICoqIDggKyB0aGlzW1MgKyA2XSAqIDIgKiogMTYgKyAoRyA8PCAyNCk7XG4gICAgICByZXR1cm4gKEJpZ0ludChaKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChUICsgdGhpc1srK1NdICogMiAqKiA4ICsgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogMjQpO1xuICAgIH0pLCBhLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRSA9IGl0KGZ1bmN0aW9uKFMpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBfZShTLCBcIm9mZnNldFwiKTtcbiAgICAgIGNvbnN0IFQgPSB0aGlzW1NdLCBHID0gdGhpc1tTICsgN107XG4gICAgICAoVCA9PT0gdm9pZCAwIHx8IEcgPT09IHZvaWQgMCkgJiYgeGUoUywgdGhpcy5sZW5ndGggLSA4KTtcbiAgICAgIGNvbnN0IFogPSAoVCA8PCAyNCkgKyAvLyBPdmVyZmxvd1xuICAgICAgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogOCArIHRoaXNbKytTXTtcbiAgICAgIHJldHVybiAoQmlnSW50KFopIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KHRoaXNbKytTXSAqIDIgKiogMjQgKyB0aGlzWysrU10gKiAyICoqIDE2ICsgdGhpc1srK1NdICogMiAqKiA4ICsgRyk7XG4gICAgfSksIGEucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgNCwgdGhpcy5sZW5ndGgpLCB0LnJlYWQodGhpcywgUywgITAsIDIzLCA0KTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDQsIHRoaXMubGVuZ3RoKSwgdC5yZWFkKHRoaXMsIFMsICExLCAyMywgNCk7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgOCwgdGhpcy5sZW5ndGgpLCB0LnJlYWQodGhpcywgUywgITAsIDUyLCA4KTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICByZXR1cm4gUyA9IFMgPj4+IDAsIFQgfHwgTChTLCA4LCB0aGlzLmxlbmd0aCksIHQucmVhZCh0aGlzLCBTLCAhMSwgNTIsIDgpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbShCLCBTLCBULCBHLCBaLCBRKSB7XG4gICAgICBpZiAoIWEuaXNCdWZmZXIoQikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgICAgaWYgKFMgPiBaIHx8IFMgPCBRKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtcbiAgICAgIGlmIChUICsgRyA+IEIubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICB9XG4gICAgYS5wcm90b3R5cGUud3JpdGVVaW50TEUgPSBhLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmIChTID0gK1MsIFQgPSBUID4+PiAwLCBHID0gRyA+Pj4gMCwgIVopIHtcbiAgICAgICAgY29uc3QgVWUgPSBNYXRoLnBvdygyLCA4ICogRykgLSAxO1xuICAgICAgICBtKHRoaXMsIFMsIFQsIEcsIFVlLCAwKTtcbiAgICAgIH1cbiAgICAgIGxldCBRID0gMSwgc2UgPSAwO1xuICAgICAgZm9yICh0aGlzW1RdID0gUyAmIDI1NTsgKytzZSA8IEcgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICB0aGlzW1QgKyBzZV0gPSBTIC8gUSAmIDI1NTtcbiAgICAgIHJldHVybiBUICsgRztcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9IGEucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24oUywgVCwgRywgWikge1xuICAgICAgaWYgKFMgPSArUywgVCA9IFQgPj4+IDAsIEcgPSBHID4+PiAwLCAhWikge1xuICAgICAgICBjb25zdCBVZSA9IE1hdGgucG93KDIsIDggKiBHKSAtIDE7XG4gICAgICAgIG0odGhpcywgUywgVCwgRywgVWUsIDApO1xuICAgICAgfVxuICAgICAgbGV0IFEgPSBHIC0gMSwgc2UgPSAxO1xuICAgICAgZm9yICh0aGlzW1QgKyBRXSA9IFMgJiAyNTU7IC0tUSA+PSAwICYmIChzZSAqPSAyNTYpOyApXG4gICAgICAgIHRoaXNbVCArIFFdID0gUyAvIHNlICYgMjU1O1xuICAgICAgcmV0dXJuIFQgKyBHO1xuICAgIH0sIGEucHJvdG90eXBlLndyaXRlVWludDggPSBhLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCAxLCAyNTUsIDApLCB0aGlzW1RdID0gUyAmIDI1NSwgVCArIDE7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9IGEucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDIsIDY1NTM1LCAwKSwgdGhpc1tUXSA9IFMgJiAyNTUsIHRoaXNbVCArIDFdID0gUyA+Pj4gOCwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVVaW50MTZCRSA9IGEucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDIsIDY1NTM1LCAwKSwgdGhpc1tUXSA9IFMgPj4+IDgsIHRoaXNbVCArIDFdID0gUyAmIDI1NSwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9IGEucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDQsIDQyOTQ5NjcyOTUsIDApLCB0aGlzW1QgKyAzXSA9IFMgPj4+IDI0LCB0aGlzW1QgKyAyXSA9IFMgPj4+IDE2LCB0aGlzW1QgKyAxXSA9IFMgPj4+IDgsIHRoaXNbVF0gPSBTICYgMjU1LCBUICsgNDtcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFID0gYS5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBTID0gK1MsIFQgPSBUID4+PiAwLCBHIHx8IG0odGhpcywgUywgVCwgNCwgNDI5NDk2NzI5NSwgMCksIHRoaXNbVF0gPSBTID4+PiAyNCwgdGhpc1tUICsgMV0gPSBTID4+PiAxNiwgdGhpc1tUICsgMl0gPSBTID4+PiA4LCB0aGlzW1QgKyAzXSA9IFMgJiAyNTUsIFQgKyA0O1xuICAgIH07XG4gICAgZnVuY3Rpb24gdihCLCBTLCBULCBHLCBaKSB7XG4gICAgICB6ZShTLCBHLCBaLCBCLCBULCA3KTtcbiAgICAgIGxldCBRID0gTnVtYmVyKFMgJiBCaWdJbnQoNDI5NDk2NzI5NSkpO1xuICAgICAgQltUKytdID0gUSwgUSA9IFEgPj4gOCwgQltUKytdID0gUSwgUSA9IFEgPj4gOCwgQltUKytdID0gUSwgUSA9IFEgPj4gOCwgQltUKytdID0gUTtcbiAgICAgIGxldCBzZSA9IE51bWJlcihTID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoNDI5NDk2NzI5NSkpO1xuICAgICAgcmV0dXJuIEJbVCsrXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCsrXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCsrXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCsrXSA9IHNlLCBUO1xuICAgIH1cbiAgICBmdW5jdGlvbiBQKEIsIFMsIFQsIEcsIFopIHtcbiAgICAgIHplKFMsIEcsIFosIEIsIFQsIDcpO1xuICAgICAgbGV0IFEgPSBOdW1iZXIoUyAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7XG4gICAgICBCW1QgKyA3XSA9IFEsIFEgPSBRID4+IDgsIEJbVCArIDZdID0gUSwgUSA9IFEgPj4gOCwgQltUICsgNV0gPSBRLCBRID0gUSA+PiA4LCBCW1QgKyA0XSA9IFE7XG4gICAgICBsZXQgc2UgPSBOdW1iZXIoUyA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDQyOTQ5NjcyOTUpKTtcbiAgICAgIHJldHVybiBCW1QgKyAzXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCArIDJdID0gc2UsIHNlID0gc2UgPj4gOCwgQltUICsgMV0gPSBzZSwgc2UgPSBzZSA+PiA4LCBCW1RdID0gc2UsIFQgKyA4O1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFID0gaXQoZnVuY3Rpb24oUywgVCA9IDApIHtcbiAgICAgIHJldHVybiB2KHRoaXMsIFMsIFQsIEJpZ0ludCgwKSwgQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmXCIpKTtcbiAgICB9KSwgYS5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSA9IGl0KGZ1bmN0aW9uKFMsIFQgPSAwKSB7XG4gICAgICByZXR1cm4gUCh0aGlzLCBTLCBULCBCaWdJbnQoMCksIEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSk7XG4gICAgfSksIGEucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbihTLCBULCBHLCBaKSB7XG4gICAgICBpZiAoUyA9ICtTLCBUID0gVCA+Pj4gMCwgIVopIHtcbiAgICAgICAgY29uc3QgUGUgPSBNYXRoLnBvdygyLCA4ICogRyAtIDEpO1xuICAgICAgICBtKHRoaXMsIFMsIFQsIEcsIFBlIC0gMSwgLVBlKTtcbiAgICAgIH1cbiAgICAgIGxldCBRID0gMCwgc2UgPSAxLCBVZSA9IDA7XG4gICAgICBmb3IgKHRoaXNbVF0gPSBTICYgMjU1OyArK1EgPCBHICYmIChzZSAqPSAyNTYpOyApXG4gICAgICAgIFMgPCAwICYmIFVlID09PSAwICYmIHRoaXNbVCArIFEgLSAxXSAhPT0gMCAmJiAoVWUgPSAxKSwgdGhpc1tUICsgUV0gPSAoUyAvIHNlID4+IDApIC0gVWUgJiAyNTU7XG4gICAgICByZXR1cm4gVCArIEc7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmIChTID0gK1MsIFQgPSBUID4+PiAwLCAhWikge1xuICAgICAgICBjb25zdCBQZSA9IE1hdGgucG93KDIsIDggKiBHIC0gMSk7XG4gICAgICAgIG0odGhpcywgUywgVCwgRywgUGUgLSAxLCAtUGUpO1xuICAgICAgfVxuICAgICAgbGV0IFEgPSBHIC0gMSwgc2UgPSAxLCBVZSA9IDA7XG4gICAgICBmb3IgKHRoaXNbVCArIFFdID0gUyAmIDI1NTsgLS1RID49IDAgJiYgKHNlICo9IDI1Nik7IClcbiAgICAgICAgUyA8IDAgJiYgVWUgPT09IDAgJiYgdGhpc1tUICsgUSArIDFdICE9PSAwICYmIChVZSA9IDEpLCB0aGlzW1QgKyBRXSA9IChTIC8gc2UgPj4gMCkgLSBVZSAmIDI1NTtcbiAgICAgIHJldHVybiBUICsgRztcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDEsIDEyNywgLTEyOCksIFMgPCAwICYmIChTID0gMjU1ICsgUyArIDEpLCB0aGlzW1RdID0gUyAmIDI1NSwgVCArIDE7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCAyLCAzMjc2NywgLTMyNzY4KSwgdGhpc1tUXSA9IFMgJiAyNTUsIHRoaXNbVCArIDFdID0gUyA+Pj4gOCwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCAyLCAzMjc2NywgLTMyNzY4KSwgdGhpc1tUXSA9IFMgPj4+IDgsIHRoaXNbVCArIDFdID0gUyAmIDI1NSwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCA0LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OCksIHRoaXNbVF0gPSBTICYgMjU1LCB0aGlzW1QgKyAxXSA9IFMgPj4+IDgsIHRoaXNbVCArIDJdID0gUyA+Pj4gMTYsIHRoaXNbVCArIDNdID0gUyA+Pj4gMjQsIFQgKyA0O1xuICAgIH0sIGEucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBTID0gK1MsIFQgPSBUID4+PiAwLCBHIHx8IG0odGhpcywgUywgVCwgNCwgMjE0NzQ4MzY0NywgLTIxNDc0ODM2NDgpLCBTIDwgMCAmJiAoUyA9IDQyOTQ5NjcyOTUgKyBTICsgMSksIHRoaXNbVF0gPSBTID4+PiAyNCwgdGhpc1tUICsgMV0gPSBTID4+PiAxNiwgdGhpc1tUICsgMl0gPSBTID4+PiA4LCB0aGlzW1QgKyAzXSA9IFMgJiAyNTUsIFQgKyA0O1xuICAgIH0sIGEucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRSA9IGl0KGZ1bmN0aW9uKFMsIFQgPSAwKSB7XG4gICAgICByZXR1cm4gdih0aGlzLCBTLCBULCAtQmlnSW50KFwiMHg4MDAwMDAwMDAwMDAwMDAwXCIpLCBCaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZcIikpO1xuICAgIH0pLCBhLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUgPSBpdChmdW5jdGlvbihTLCBUID0gMCkge1xuICAgICAgcmV0dXJuIFAodGhpcywgUywgVCwgLUJpZ0ludChcIjB4ODAwMDAwMDAwMDAwMDAwMFwiKSwgQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBOKEIsIFMsIFQsIEcsIFosIFEpIHtcbiAgICAgIGlmIChUICsgRyA+IEIubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICAgIGlmIChUIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFkoQiwgUywgVCwgRywgWikge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIFogfHwgTihCLCBTLCBULCA0KSwgdC53cml0ZShCLCBTLCBULCBHLCAyMywgNCksIFQgKyA0O1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gWSh0aGlzLCBTLCBULCAhMCwgRyk7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFkodGhpcywgUywgVCwgITEsIEcpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZWUoQiwgUywgVCwgRywgWikge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIFogfHwgTihCLCBTLCBULCA4KSwgdC53cml0ZShCLCBTLCBULCBHLCA1MiwgOCksIFQgKyA4O1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIGVlKHRoaXMsIFMsIFQsICEwLCBHKTtcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIGVlKHRoaXMsIFMsIFQsICExLCBHKTtcbiAgICB9LCBhLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oUywgVCwgRywgWikge1xuICAgICAgaWYgKCFhLmlzQnVmZmVyKFMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyXCIpO1xuICAgICAgaWYgKEcgfHwgKEcgPSAwKSwgIVogJiYgWiAhPT0gMCAmJiAoWiA9IHRoaXMubGVuZ3RoKSwgVCA+PSBTLmxlbmd0aCAmJiAoVCA9IFMubGVuZ3RoKSwgVCB8fCAoVCA9IDApLCBaID4gMCAmJiBaIDwgRyAmJiAoWiA9IEcpLCBaID09PSBHIHx8IFMubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgIGlmIChUIDwgMClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzXCIpO1xuICAgICAgaWYgKEcgPCAwIHx8IEcgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgaWYgKFogPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzXCIpO1xuICAgICAgWiA+IHRoaXMubGVuZ3RoICYmIChaID0gdGhpcy5sZW5ndGgpLCBTLmxlbmd0aCAtIFQgPCBaIC0gRyAmJiAoWiA9IFMubGVuZ3RoIC0gVCArIEcpO1xuICAgICAgY29uc3QgUSA9IFogLSBHO1xuICAgICAgcmV0dXJuIHRoaXMgPT09IFMgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb3B5V2l0aGluKFQsIEcsIFopIDogVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgIFMsXG4gICAgICAgIHRoaXMuc3ViYXJyYXkoRywgWiksXG4gICAgICAgIFRcbiAgICAgICksIFE7XG4gICAgfSwgYS5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmICh0eXBlb2YgUyA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgVCA9PSBcInN0cmluZ1wiID8gKFogPSBULCBUID0gMCwgRyA9IHRoaXMubGVuZ3RoKSA6IHR5cGVvZiBHID09IFwic3RyaW5nXCIgJiYgKFogPSBHLCBHID0gdGhpcy5sZW5ndGgpLCBaICE9PSB2b2lkIDAgJiYgdHlwZW9mIFogIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBaID09IFwic3RyaW5nXCIgJiYgIWEuaXNFbmNvZGluZyhaKSlcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIgKyBaKTtcbiAgICAgICAgaWYgKFMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3Qgc2UgPSBTLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgKFogPT09IFwidXRmOFwiICYmIHNlIDwgMTI4IHx8IFogPT09IFwibGF0aW4xXCIpICYmIChTID0gc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgdHlwZW9mIFMgPT0gXCJudW1iZXJcIiA/IFMgPSBTICYgMjU1IDogdHlwZW9mIFMgPT0gXCJib29sZWFuXCIgJiYgKFMgPSBOdW1iZXIoUykpO1xuICAgICAgaWYgKFQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgVCB8fCB0aGlzLmxlbmd0aCA8IEcpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiT3V0IG9mIHJhbmdlIGluZGV4XCIpO1xuICAgICAgaWYgKEcgPD0gVClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICBUID0gVCA+Pj4gMCwgRyA9IEcgPT09IHZvaWQgMCA/IHRoaXMubGVuZ3RoIDogRyA+Pj4gMCwgUyB8fCAoUyA9IDApO1xuICAgICAgbGV0IFE7XG4gICAgICBpZiAodHlwZW9mIFMgPT0gXCJudW1iZXJcIilcbiAgICAgICAgZm9yIChRID0gVDsgUSA8IEc7ICsrUSlcbiAgICAgICAgICB0aGlzW1FdID0gUztcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZSA9IGEuaXNCdWZmZXIoUykgPyBTIDogYS5mcm9tKFMsIFopLCBVZSA9IHNlLmxlbmd0aDtcbiAgICAgICAgaWYgKFVlID09PSAwKVxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBTICsgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpO1xuICAgICAgICBmb3IgKFEgPSAwOyBRIDwgRyAtIFQ7ICsrUSlcbiAgICAgICAgICB0aGlzW1EgKyBUXSA9IHNlW1EgJSBVZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGNvbnN0IGllID0ge307XG4gICAgZnVuY3Rpb24gbGUoQiwgUywgVCkge1xuICAgICAgaWVbQl0gPSBjbGFzcyBleHRlbmRzIFQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBzdXBlcigpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJtZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBTLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgICAgfSksIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7Qn1dYCwgdGhpcy5zdGFjaywgZGVsZXRlIHRoaXMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29kZSgpIHtcbiAgICAgICAgICByZXR1cm4gQjtcbiAgICAgICAgfVxuICAgICAgICBzZXQgY29kZShaKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgICAgICB2YWx1ZTogWixcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske0J9XTogJHt0aGlzLm1lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgbGUoXG4gICAgICBcIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EU1wiLFxuICAgICAgZnVuY3Rpb24oQikge1xuICAgICAgICByZXR1cm4gQiA/IGAke0J9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2AgOiBcIkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHNcIjtcbiAgICAgIH0sXG4gICAgICBSYW5nZUVycm9yXG4gICAgKSwgbGUoXG4gICAgICBcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsXG4gICAgICBmdW5jdGlvbihCLCBTKSB7XG4gICAgICAgIHJldHVybiBgVGhlIFwiJHtCfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgU31gO1xuICAgICAgfSxcbiAgICAgIFR5cGVFcnJvclxuICAgICksIGxlKFxuICAgICAgXCJFUlJfT1VUX09GX1JBTkdFXCIsXG4gICAgICBmdW5jdGlvbihCLCBTLCBUKSB7XG4gICAgICAgIGxldCBHID0gYFRoZSB2YWx1ZSBvZiBcIiR7Qn1cIiBpcyBvdXQgb2YgcmFuZ2UuYCwgWiA9IFQ7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKFQpICYmIE1hdGguYWJzKFQpID4gMiAqKiAzMiA/IFogPSBUZShTdHJpbmcoVCkpIDogdHlwZW9mIFQgPT0gXCJiaWdpbnRcIiAmJiAoWiA9IFN0cmluZyhUKSwgKFQgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCBUIDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpICYmIChaID0gVGUoWikpLCBaICs9IFwiblwiKSwgRyArPSBgIEl0IG11c3QgYmUgJHtTfS4gUmVjZWl2ZWQgJHtafWAsIEc7XG4gICAgICB9LFxuICAgICAgUmFuZ2VFcnJvclxuICAgICk7XG4gICAgZnVuY3Rpb24gVGUoQikge1xuICAgICAgbGV0IFMgPSBcIlwiLCBUID0gQi5sZW5ndGg7XG4gICAgICBjb25zdCBHID0gQlswXSA9PT0gXCItXCIgPyAxIDogMDtcbiAgICAgIGZvciAoOyBUID49IEcgKyA0OyBUIC09IDMpXG4gICAgICAgIFMgPSBgXyR7Qi5zbGljZShUIC0gMywgVCl9JHtTfWA7XG4gICAgICByZXR1cm4gYCR7Qi5zbGljZSgwLCBUKX0ke1N9YDtcbiAgICB9XG4gICAgZnVuY3Rpb24gRGUoQiwgUywgVCkge1xuICAgICAgX2UoUywgXCJvZmZzZXRcIiksIChCW1NdID09PSB2b2lkIDAgfHwgQltTICsgVF0gPT09IHZvaWQgMCkgJiYgeGUoUywgQi5sZW5ndGggLSAoVCArIDEpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gemUoQiwgUywgVCwgRywgWiwgUSkge1xuICAgICAgaWYgKEIgPiBUIHx8IEIgPCBTKSB7XG4gICAgICAgIGNvbnN0IHNlID0gdHlwZW9mIFMgPT0gXCJiaWdpbnRcIiA/IFwiblwiIDogXCJcIjtcbiAgICAgICAgbGV0IFVlO1xuICAgICAgICB0aHJvdyBTID09PSAwIHx8IFMgPT09IEJpZ0ludCgwKSA/IFVlID0gYD49IDAke3NlfSBhbmQgPCAyJHtzZX0gKiogJHsoUSArIDEpICogOH0ke3NlfWAgOiBVZSA9IGA+PSAtKDIke3NlfSAqKiAkeyhRICsgMSkgKiA4IC0gMX0ke3NlfSkgYW5kIDwgMiAqKiAkeyhRICsgMSkgKiA4IC0gMX0ke3NlfWAsIG5ldyBpZS5FUlJfT1VUX09GX1JBTkdFKFwidmFsdWVcIiwgVWUsIEIpO1xuICAgICAgfVxuICAgICAgRGUoRywgWiwgUSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIF9lKEIsIFMpIHtcbiAgICAgIGlmICh0eXBlb2YgQiAhPSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgaWUuRVJSX0lOVkFMSURfQVJHX1RZUEUoUywgXCJudW1iZXJcIiwgQik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHhlKEIsIFMsIFQpIHtcbiAgICAgIHRocm93IE1hdGguZmxvb3IoQikgIT09IEIgPyAoX2UoQiwgVCksIG5ldyBpZS5FUlJfT1VUX09GX1JBTkdFKFwib2Zmc2V0XCIsIFwiYW4gaW50ZWdlclwiLCBCKSkgOiBTIDwgMCA/IG5ldyBpZS5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKSA6IG5ldyBpZS5FUlJfT1VUX09GX1JBTkdFKFxuICAgICAgICBcIm9mZnNldFwiLFxuICAgICAgICBgPj0gMCBhbmQgPD0gJHtTfWAsXG4gICAgICAgIEJcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IEJlID0gL1teKy8wLTlBLVphLXotX10vZztcbiAgICBmdW5jdGlvbiB5ZShCKSB7XG4gICAgICBpZiAoQiA9IEIuc3BsaXQoXCI9XCIpWzBdLCBCID0gQi50cmltKCkucmVwbGFjZShCZSwgXCJcIiksIEIubGVuZ3RoIDwgMikgcmV0dXJuIFwiXCI7XG4gICAgICBmb3IgKDsgQi5sZW5ndGggJSA0ICE9PSAwOyApXG4gICAgICAgIEIgPSBCICsgXCI9XCI7XG4gICAgICByZXR1cm4gQjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmUoQiwgUykge1xuICAgICAgUyA9IFMgfHwgMSAvIDA7XG4gICAgICBsZXQgVDtcbiAgICAgIGNvbnN0IEcgPSBCLmxlbmd0aDtcbiAgICAgIGxldCBaID0gbnVsbDtcbiAgICAgIGNvbnN0IFEgPSBbXTtcbiAgICAgIGZvciAobGV0IHNlID0gMDsgc2UgPCBHOyArK3NlKSB7XG4gICAgICAgIGlmIChUID0gQi5jaGFyQ29kZUF0KHNlKSwgVCA+IDU1Mjk1ICYmIFQgPCA1NzM0NCkge1xuICAgICAgICAgIGlmICghWikge1xuICAgICAgICAgICAgaWYgKFQgPiA1NjMxOSkge1xuICAgICAgICAgICAgICAoUyAtPSAzKSA+IC0xICYmIFEucHVzaCgyMzksIDE5MSwgMTg5KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlICsgMSA9PT0gRykge1xuICAgICAgICAgICAgICAoUyAtPSAzKSA+IC0xICYmIFEucHVzaCgyMzksIDE5MSwgMTg5KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBaID0gVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoVCA8IDU2MzIwKSB7XG4gICAgICAgICAgICAoUyAtPSAzKSA+IC0xICYmIFEucHVzaCgyMzksIDE5MSwgMTg5KSwgWiA9IFQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgVCA9IChaIC0gNTUyOTYgPDwgMTAgfCBUIC0gNTYzMjApICsgNjU1MzY7XG4gICAgICAgIH0gZWxzZSBaICYmIChTIC09IDMpID4gLTEgJiYgUS5wdXNoKDIzOSwgMTkxLCAxODkpO1xuICAgICAgICBpZiAoWiA9IG51bGwsIFQgPCAxMjgpIHtcbiAgICAgICAgICBpZiAoKFMgLT0gMSkgPCAwKSBicmVhaztcbiAgICAgICAgICBRLnB1c2goVCk7XG4gICAgICAgIH0gZWxzZSBpZiAoVCA8IDIwNDgpIHtcbiAgICAgICAgICBpZiAoKFMgLT0gMikgPCAwKSBicmVhaztcbiAgICAgICAgICBRLnB1c2goXG4gICAgICAgICAgICBUID4+IDYgfCAxOTIsXG4gICAgICAgICAgICBUICYgNjMgfCAxMjhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFQgPCA2NTUzNikge1xuICAgICAgICAgIGlmICgoUyAtPSAzKSA8IDApIGJyZWFrO1xuICAgICAgICAgIFEucHVzaChcbiAgICAgICAgICAgIFQgPj4gMTIgfCAyMjQsXG4gICAgICAgICAgICBUID4+IDYgJiA2MyB8IDEyOCxcbiAgICAgICAgICAgIFQgJiA2MyB8IDEyOFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoVCA8IDExMTQxMTIpIHtcbiAgICAgICAgICBpZiAoKFMgLT0gNCkgPCAwKSBicmVhaztcbiAgICAgICAgICBRLnB1c2goXG4gICAgICAgICAgICBUID4+IDE4IHwgMjQwLFxuICAgICAgICAgICAgVCA+PiAxMiAmIDYzIHwgMTI4LFxuICAgICAgICAgICAgVCA+PiA2ICYgNjMgfCAxMjgsXG4gICAgICAgICAgICBUICYgNjMgfCAxMjhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gUTtcbiAgICB9XG4gICAgZnVuY3Rpb24gRmUoQikge1xuICAgICAgY29uc3QgUyA9IFtdO1xuICAgICAgZm9yIChsZXQgVCA9IDA7IFQgPCBCLmxlbmd0aDsgKytUKVxuICAgICAgICBTLnB1c2goQi5jaGFyQ29kZUF0KFQpICYgMjU1KTtcbiAgICAgIHJldHVybiBTO1xuICAgIH1cbiAgICBmdW5jdGlvbiBYZShCLCBTKSB7XG4gICAgICBsZXQgVCwgRywgWjtcbiAgICAgIGNvbnN0IFEgPSBbXTtcbiAgICAgIGZvciAobGV0IHNlID0gMDsgc2UgPCBCLmxlbmd0aCAmJiAhKChTIC09IDIpIDwgMCk7ICsrc2UpXG4gICAgICAgIFQgPSBCLmNoYXJDb2RlQXQoc2UpLCBHID0gVCA+PiA4LCBaID0gVCAlIDI1NiwgUS5wdXNoKFopLCBRLnB1c2goRyk7XG4gICAgICByZXR1cm4gUTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2UoQikge1xuICAgICAgcmV0dXJuIGUudG9CeXRlQXJyYXkoeWUoQikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBOZShCLCBTLCBULCBHKSB7XG4gICAgICBsZXQgWjtcbiAgICAgIGZvciAoWiA9IDA7IFogPCBHICYmICEoWiArIFQgPj0gUy5sZW5ndGggfHwgWiA+PSBCLmxlbmd0aCk7ICsrWilcbiAgICAgICAgU1taICsgVF0gPSBCW1pdO1xuICAgICAgcmV0dXJuIFo7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGR0KEIsIFMpIHtcbiAgICAgIHJldHVybiBCIGluc3RhbmNlb2YgUyB8fCBCICE9IG51bGwgJiYgQi5jb25zdHJ1Y3RvciAhPSBudWxsICYmIEIuY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIEIuY29uc3RydWN0b3IubmFtZSA9PT0gUy5uYW1lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBKZShCKSB7XG4gICAgICByZXR1cm4gQiAhPT0gQjtcbiAgICB9XG4gICAgY29uc3QgUWUgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBCID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCIsIFMgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgIGZvciAobGV0IFQgPSAwOyBUIDwgMTY7ICsrVCkge1xuICAgICAgICBjb25zdCBHID0gVCAqIDE2O1xuICAgICAgICBmb3IgKGxldCBaID0gMDsgWiA8IDE2OyArK1opXG4gICAgICAgICAgU1tHICsgWl0gPSBCW1RdICsgQltaXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTO1xuICAgIH0pKCk7XG4gICAgZnVuY3Rpb24gaXQoQikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBCaWdJbnQgPiBcInVcIiA/IGplIDogQjtcbiAgICB9XG4gICAgZnVuY3Rpb24gamUoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gIH0pKEdhKSksIEdhO1xufVxudmFyIEhlID0gS2MoKTtcbmNvbnN0IGxuID0gdHlwZW9mIGdsb2JhbFRoaXMgPT0gXCJvYmplY3RcIiAmJiBcImNyeXB0b1wiIGluIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzLmNyeXB0byA6IHZvaWQgMDtcbi8qISBub2JsZS1oYXNoZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmZ1bmN0aW9uIElpKHMpIHtcbiAgcmV0dXJuIHMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IEFycmF5QnVmZmVyLmlzVmlldyhzKSAmJiBzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVWludDhBcnJheVwiO1xufVxuZnVuY3Rpb24gWGwocykge1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHMpIHx8IHMgPCAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcInBvc2l0aXZlIGludGVnZXIgZXhwZWN0ZWQsIGdvdCBcIiArIHMpO1xufVxuZnVuY3Rpb24gUXMocywgLi4uZSkge1xuICBpZiAoIUlpKHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVpbnQ4QXJyYXkgZXhwZWN0ZWRcIik7XG4gIGlmIChlLmxlbmd0aCA+IDAgJiYgIWUuaW5jbHVkZXMocy5sZW5ndGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoIFwiICsgZSArIFwiLCBnb3QgbGVuZ3RoPVwiICsgcy5sZW5ndGgpO1xufVxuZnVuY3Rpb24gSGYocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBzLmNyZWF0ZSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSGFzaCBzaG91bGQgYmUgd3JhcHBlZCBieSB1dGlscy5jcmVhdGVIYXNoZXJcIik7XG4gIFhsKHMub3V0cHV0TGVuKSwgWGwocy5ibG9ja0xlbik7XG59XG5mdW5jdGlvbiBEbyhzLCBlID0gITApIHtcbiAgaWYgKHMuZGVzdHJveWVkKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkXCIpO1xuICBpZiAoZSAmJiBzLmZpbmlzaGVkKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkhhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWRcIik7XG59XG5mdW5jdGlvbiBPMShzLCBlKSB7XG4gIFFzKHMpO1xuICBjb25zdCB0ID0gZS5vdXRwdXRMZW47XG4gIGlmIChzLmxlbmd0aCA8IHQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgXCIgKyB0KTtcbn1cbmZ1bmN0aW9uIGtuKC4uLnMpIHtcbiAgZm9yIChsZXQgZSA9IDA7IGUgPCBzLmxlbmd0aDsgZSsrKVxuICAgIHNbZV0uZmlsbCgwKTtcbn1cbmZ1bmN0aW9uIFZhKHMpIHtcbiAgcmV0dXJuIG5ldyBEYXRhVmlldyhzLmJ1ZmZlciwgcy5ieXRlT2Zmc2V0LCBzLmJ5dGVMZW5ndGgpO1xufVxuZnVuY3Rpb24gTnIocywgZSkge1xuICByZXR1cm4gcyA8PCAzMiAtIGUgfCBzID4+PiBlO1xufVxuY29uc3QgcWYgPSAvKiBAdHMtaWdub3JlICovIHR5cGVvZiBVaW50OEFycmF5LmZyb20oW10pLnRvSGV4ID09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgVWludDhBcnJheS5mcm9tSGV4ID09IFwiZnVuY3Rpb25cIiwgQjEgPSAvKiBAX19QVVJFX18gKi8gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChzLCBlKSA9PiBlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpO1xuZnVuY3Rpb24gSHMocykge1xuICBpZiAoUXMocyksIHFmKVxuICAgIHJldHVybiBzLnRvSGV4KCk7XG4gIGxldCBlID0gXCJcIjtcbiAgZm9yIChsZXQgdCA9IDA7IHQgPCBzLmxlbmd0aDsgdCsrKVxuICAgIGUgKz0gQjFbc1t0XV07XG4gIHJldHVybiBlO1xufVxuY29uc3QgcnMgPSB7IF8wOiA0OCwgXzk6IDU3LCBBOiA2NSwgRjogNzAsIGE6IDk3LCBmOiAxMDIgfTtcbmZ1bmN0aW9uIGNkKHMpIHtcbiAgaWYgKHMgPj0gcnMuXzAgJiYgcyA8PSBycy5fOSlcbiAgICByZXR1cm4gcyAtIHJzLl8wO1xuICBpZiAocyA+PSBycy5BICYmIHMgPD0gcnMuRilcbiAgICByZXR1cm4gcyAtIChycy5BIC0gMTApO1xuICBpZiAocyA+PSBycy5hICYmIHMgPD0gcnMuZilcbiAgICByZXR1cm4gcyAtIChycy5hIC0gMTApO1xufVxuZnVuY3Rpb24gUG8ocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgXCIgKyB0eXBlb2Ygcyk7XG4gIGlmIChxZilcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tSGV4KHMpO1xuICBjb25zdCBlID0gcy5sZW5ndGgsIHQgPSBlIC8gMjtcbiAgaWYgKGUgJSAyKVxuICAgIHRocm93IG5ldyBFcnJvcihcImhleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCB1bnBhZGRlZCBoZXggb2YgbGVuZ3RoIFwiICsgZSk7XG4gIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheSh0KTtcbiAgZm9yIChsZXQgbiA9IDAsIGkgPSAwOyBuIDwgdDsgbisrLCBpICs9IDIpIHtcbiAgICBjb25zdCBvID0gY2Qocy5jaGFyQ29kZUF0KGkpKSwgYSA9IGNkKHMuY2hhckNvZGVBdChpICsgMSkpO1xuICAgIGlmIChvID09PSB2b2lkIDAgfHwgYSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBsID0gc1tpXSArIHNbaSArIDFdO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3Qgbm9uLWhleCBjaGFyYWN0ZXIgXCInICsgbCArICdcIiBhdCBpbmRleCAnICsgaSk7XG4gICAgfVxuICAgIHJbbl0gPSBvICogMTYgKyBhO1xuICB9XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gRjEocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmcgZXhwZWN0ZWRcIik7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocykpO1xufVxuZnVuY3Rpb24gSGMocykge1xuICByZXR1cm4gdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiAmJiAocyA9IEYxKHMpKSwgUXMocyksIHM7XG59XG5mdW5jdGlvbiBLciguLi5zKSB7XG4gIGxldCBlID0gMDtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCBzLmxlbmd0aDsgcisrKSB7XG4gICAgY29uc3QgbiA9IHNbcl07XG4gICAgUXMobiksIGUgKz0gbi5sZW5ndGg7XG4gIH1cbiAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KGUpO1xuICBmb3IgKGxldCByID0gMCwgbiA9IDA7IHIgPCBzLmxlbmd0aDsgcisrKSB7XG4gICAgY29uc3QgaSA9IHNbcl07XG4gICAgdC5zZXQoaSwgbiksIG4gKz0gaS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5jbGFzcyBXZiB7XG59XG5mdW5jdGlvbiB6ZihzKSB7XG4gIGNvbnN0IGUgPSAocikgPT4gcygpLnVwZGF0ZShIYyhyKSkuZGlnZXN0KCksIHQgPSBzKCk7XG4gIHJldHVybiBlLm91dHB1dExlbiA9IHQub3V0cHV0TGVuLCBlLmJsb2NrTGVuID0gdC5ibG9ja0xlbiwgZS5jcmVhdGUgPSAoKSA9PiBzKCksIGU7XG59XG5mdW5jdGlvbiBxYyhzID0gMzIpIHtcbiAgaWYgKGxuICYmIHR5cGVvZiBsbi5nZXRSYW5kb21WYWx1ZXMgPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiBsbi5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkocykpO1xuICBpZiAobG4gJiYgdHlwZW9mIGxuLnJhbmRvbUJ5dGVzID09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGxuLnJhbmRvbUJ5dGVzKHMpKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWRcIik7XG59XG5mdW5jdGlvbiBOMShzLCBlLCB0LCByKSB7XG4gIGlmICh0eXBlb2Ygcy5zZXRCaWdVaW50NjQgPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiBzLnNldEJpZ1VpbnQ2NChlLCB0LCByKTtcbiAgY29uc3QgbiA9IEJpZ0ludCgzMiksIGkgPSBCaWdJbnQoNDI5NDk2NzI5NSksIG8gPSBOdW1iZXIodCA+PiBuICYgaSksIGEgPSBOdW1iZXIodCAmIGkpLCBsID0gciA/IDQgOiAwLCBjID0gciA/IDAgOiA0O1xuICBzLnNldFVpbnQzMihlICsgbCwgbywgciksIHMuc2V0VWludDMyKGUgKyBjLCBhLCByKTtcbn1cbmZ1bmN0aW9uIFUxKHMsIGUsIHQpIHtcbiAgcmV0dXJuIHMgJiBlIF4gfnMgJiB0O1xufVxuZnVuY3Rpb24gJDEocywgZSwgdCkge1xuICByZXR1cm4gcyAmIGUgXiBzICYgdCBeIGUgJiB0O1xufVxuY2xhc3MgWWYgZXh0ZW5kcyBXZiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICBzdXBlcigpLCB0aGlzLmZpbmlzaGVkID0gITEsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5wb3MgPSAwLCB0aGlzLmRlc3Ryb3llZCA9ICExLCB0aGlzLmJsb2NrTGVuID0gZSwgdGhpcy5vdXRwdXRMZW4gPSB0LCB0aGlzLnBhZE9mZnNldCA9IHIsIHRoaXMuaXNMRSA9IG4sIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZSksIHRoaXMudmlldyA9IFZhKHRoaXMuYnVmZmVyKTtcbiAgfVxuICB1cGRhdGUoZSkge1xuICAgIERvKHRoaXMpLCBlID0gSGMoZSksIFFzKGUpO1xuICAgIGNvbnN0IHsgdmlldzogdCwgYnVmZmVyOiByLCBibG9ja0xlbjogbiB9ID0gdGhpcywgaSA9IGUubGVuZ3RoO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgaTsgKSB7XG4gICAgICBjb25zdCBhID0gTWF0aC5taW4obiAtIHRoaXMucG9zLCBpIC0gbyk7XG4gICAgICBpZiAoYSA9PT0gbikge1xuICAgICAgICBjb25zdCBsID0gVmEoZSk7XG4gICAgICAgIGZvciAoOyBuIDw9IGkgLSBvOyBvICs9IG4pXG4gICAgICAgICAgdGhpcy5wcm9jZXNzKGwsIG8pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHIuc2V0KGUuc3ViYXJyYXkobywgbyArIGEpLCB0aGlzLnBvcyksIHRoaXMucG9zICs9IGEsIG8gKz0gYSwgdGhpcy5wb3MgPT09IG4gJiYgKHRoaXMucHJvY2Vzcyh0LCAwKSwgdGhpcy5wb3MgPSAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoICs9IGUubGVuZ3RoLCB0aGlzLnJvdW5kQ2xlYW4oKSwgdGhpcztcbiAgfVxuICBkaWdlc3RJbnRvKGUpIHtcbiAgICBEbyh0aGlzKSwgTzEoZSwgdGhpcyksIHRoaXMuZmluaXNoZWQgPSAhMDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogdCwgdmlldzogciwgYmxvY2tMZW46IG4sIGlzTEU6IGkgfSA9IHRoaXM7XG4gICAgbGV0IHsgcG9zOiBvIH0gPSB0aGlzO1xuICAgIHRbbysrXSA9IDEyOCwga24odGhpcy5idWZmZXIuc3ViYXJyYXkobykpLCB0aGlzLnBhZE9mZnNldCA+IG4gLSBvICYmICh0aGlzLnByb2Nlc3MociwgMCksIG8gPSAwKTtcbiAgICBmb3IgKGxldCBkID0gbzsgZCA8IG47IGQrKylcbiAgICAgIHRbZF0gPSAwO1xuICAgIE4xKHIsIG4gLSA4LCBCaWdJbnQodGhpcy5sZW5ndGggKiA4KSwgaSksIHRoaXMucHJvY2VzcyhyLCAwKTtcbiAgICBjb25zdCBhID0gVmEoZSksIGwgPSB0aGlzLm91dHB1dExlbjtcbiAgICBpZiAobCAlIDQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJfc2hhMjogb3V0cHV0TGVuIHNob3VsZCBiZSBhbGlnbmVkIHRvIDMyYml0XCIpO1xuICAgIGNvbnN0IGMgPSBsIC8gNCwgdSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKGMgPiB1Lmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIl9zaGEyOiBvdXRwdXRMZW4gYmlnZ2VyIHRoYW4gc3RhdGVcIik7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjOyBkKyspXG4gICAgICBhLnNldFVpbnQzMig0ICogZCwgdVtkXSwgaSk7XG4gIH1cbiAgZGlnZXN0KCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBlLCBvdXRwdXRMZW46IHQgfSA9IHRoaXM7XG4gICAgdGhpcy5kaWdlc3RJbnRvKGUpO1xuICAgIGNvbnN0IHIgPSBlLnNsaWNlKDAsIHQpO1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3koKSwgcjtcbiAgfVxuICBfY2xvbmVJbnRvKGUpIHtcbiAgICBlIHx8IChlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKSksIGUuc2V0KC4uLnRoaXMuZ2V0KCkpO1xuICAgIGNvbnN0IHsgYmxvY2tMZW46IHQsIGJ1ZmZlcjogciwgbGVuZ3RoOiBuLCBmaW5pc2hlZDogaSwgZGVzdHJveWVkOiBvLCBwb3M6IGEgfSA9IHRoaXM7XG4gICAgcmV0dXJuIGUuZGVzdHJveWVkID0gbywgZS5maW5pc2hlZCA9IGksIGUubGVuZ3RoID0gbiwgZS5wb3MgPSBhLCBuICUgdCAmJiBlLmJ1ZmZlci5zZXQociksIGU7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb25lSW50bygpO1xuICB9XG59XG5jb25zdCBtcyA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgMTc3OTAzMzcwMyxcbiAgMzE0NDEzNDI3NyxcbiAgMTAxMzkwNDI0MixcbiAgMjc3MzQ4MDc2MixcbiAgMTM1OTg5MzExOSxcbiAgMjYwMDgyMjkyNCxcbiAgNTI4NzM0NjM1LFxuICAxNTQxNDU5MjI1XG5dKSwgUXQgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDE3NzkwMzM3MDMsXG4gIDQwODkyMzU3MjAsXG4gIDMxNDQxMzQyNzcsXG4gIDIyMjc4NzM1OTUsXG4gIDEwMTM5MDQyNDIsXG4gIDQyNzExNzU3MjMsXG4gIDI3NzM0ODA3NjIsXG4gIDE1OTU3NTAxMjksXG4gIDEzNTk4OTMxMTksXG4gIDI5MTc1NjUxMzcsXG4gIDI2MDA4MjI5MjQsXG4gIDcyNTUxMTE5OSxcbiAgNTI4NzM0NjM1LFxuICA0MjE1Mzg5NTQ3LFxuICAxNTQxNDU5MjI1LFxuICAzMjcwMzMyMDlcbl0pLCBPaSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMiAqKiAzMiAtIDEpLCB1ZCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMzIpO1xuZnVuY3Rpb24gRzEocywgZSA9ICExKSB7XG4gIHJldHVybiBlID8geyBoOiBOdW1iZXIocyAmIE9pKSwgbDogTnVtYmVyKHMgPj4gdWQgJiBPaSkgfSA6IHsgaDogTnVtYmVyKHMgPj4gdWQgJiBPaSkgfCAwLCBsOiBOdW1iZXIocyAmIE9pKSB8IDAgfTtcbn1cbmZ1bmN0aW9uIFYxKHMsIGUgPSAhMSkge1xuICBjb25zdCB0ID0gcy5sZW5ndGg7XG4gIGxldCByID0gbmV3IFVpbnQzMkFycmF5KHQpLCBuID0gbmV3IFVpbnQzMkFycmF5KHQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykge1xuICAgIGNvbnN0IHsgaDogbywgbDogYSB9ID0gRzEoc1tpXSwgZSk7XG4gICAgW3JbaV0sIG5baV1dID0gW28sIGFdO1xuICB9XG4gIHJldHVybiBbciwgbl07XG59XG5jb25zdCBkZCA9IChzLCBlLCB0KSA9PiBzID4+PiB0LCBoZCA9IChzLCBlLCB0KSA9PiBzIDw8IDMyIC0gdCB8IGUgPj4+IHQsIGNuID0gKHMsIGUsIHQpID0+IHMgPj4+IHQgfCBlIDw8IDMyIC0gdCwgdW4gPSAocywgZSwgdCkgPT4gcyA8PCAzMiAtIHQgfCBlID4+PiB0LCBCaSA9IChzLCBlLCB0KSA9PiBzIDw8IDY0IC0gdCB8IGUgPj4+IHQgLSAzMiwgRmkgPSAocywgZSwgdCkgPT4gcyA+Pj4gdCAtIDMyIHwgZSA8PCA2NCAtIHQ7XG5mdW5jdGlvbiBzcyhzLCBlLCB0LCByKSB7XG4gIGNvbnN0IG4gPSAoZSA+Pj4gMCkgKyAociA+Pj4gMCk7XG4gIHJldHVybiB7IGg6IHMgKyB0ICsgKG4gLyAyICoqIDMyIHwgMCkgfCAwLCBsOiBuIHwgMCB9O1xufVxuY29uc3QgajEgPSAocywgZSwgdCkgPT4gKHMgPj4+IDApICsgKGUgPj4+IDApICsgKHQgPj4+IDApLCBLMSA9IChzLCBlLCB0LCByKSA9PiBlICsgdCArIHIgKyAocyAvIDIgKiogMzIgfCAwKSB8IDAsIEgxID0gKHMsIGUsIHQsIHIpID0+IChzID4+PiAwKSArIChlID4+PiAwKSArICh0ID4+PiAwKSArIChyID4+PiAwKSwgcTEgPSAocywgZSwgdCwgciwgbikgPT4gZSArIHQgKyByICsgbiArIChzIC8gMiAqKiAzMiB8IDApIHwgMCwgVzEgPSAocywgZSwgdCwgciwgbikgPT4gKHMgPj4+IDApICsgKGUgPj4+IDApICsgKHQgPj4+IDApICsgKHIgPj4+IDApICsgKG4gPj4+IDApLCB6MSA9IChzLCBlLCB0LCByLCBuLCBpKSA9PiBlICsgdCArIHIgKyBuICsgaSArIChzIC8gMiAqKiAzMiB8IDApIHwgMCwgWTEgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDExMTYzNTI0MDgsXG4gIDE4OTk0NDc0NDEsXG4gIDMwNDkzMjM0NzEsXG4gIDM5MjEwMDk1NzMsXG4gIDk2MTk4NzE2MyxcbiAgMTUwODk3MDk5MyxcbiAgMjQ1MzYzNTc0OCxcbiAgMjg3MDc2MzIyMSxcbiAgMzYyNDM4MTA4MCxcbiAgMzEwNTk4NDAxLFxuICA2MDcyMjUyNzgsXG4gIDE0MjY4ODE5ODcsXG4gIDE5MjUwNzgzODgsXG4gIDIxNjIwNzgyMDYsXG4gIDI2MTQ4ODgxMDMsXG4gIDMyNDgyMjI1ODAsXG4gIDM4MzUzOTA0MDEsXG4gIDQwMjIyMjQ3NzQsXG4gIDI2NDM0NzA3OCxcbiAgNjA0ODA3NjI4LFxuICA3NzAyNTU5ODMsXG4gIDEyNDkxNTAxMjIsXG4gIDE1NTUwODE2OTIsXG4gIDE5OTYwNjQ5ODYsXG4gIDI1NTQyMjA4ODIsXG4gIDI4MjE4MzQzNDksXG4gIDI5NTI5OTY4MDgsXG4gIDMyMTAzMTM2NzEsXG4gIDMzMzY1NzE4OTEsXG4gIDM1ODQ1Mjg3MTEsXG4gIDExMzkyNjk5MyxcbiAgMzM4MjQxODk1LFxuICA2NjYzMDcyMDUsXG4gIDc3MzUyOTkxMixcbiAgMTI5NDc1NzM3MixcbiAgMTM5NjE4MjI5MSxcbiAgMTY5NTE4MzcwMCxcbiAgMTk4NjY2MTA1MSxcbiAgMjE3NzAyNjM1MCxcbiAgMjQ1Njk1NjAzNyxcbiAgMjczMDQ4NTkyMSxcbiAgMjgyMDMwMjQxMSxcbiAgMzI1OTczMDgwMCxcbiAgMzM0NTc2NDc3MSxcbiAgMzUxNjA2NTgxNyxcbiAgMzYwMDM1MjgwNCxcbiAgNDA5NDU3MTkwOSxcbiAgMjc1NDIzMzQ0LFxuICA0MzAyMjc3MzQsXG4gIDUwNjk0ODYxNixcbiAgNjU5MDYwNTU2LFxuICA4ODM5OTc4NzcsXG4gIDk1ODEzOTU3MSxcbiAgMTMyMjgyMjIxOCxcbiAgMTUzNzAwMjA2MyxcbiAgMTc0Nzg3Mzc3OSxcbiAgMTk1NTU2MjIyMixcbiAgMjAyNDEwNDgxNSxcbiAgMjIyNzczMDQ1MixcbiAgMjM2MTg1MjQyNCxcbiAgMjQyODQzNjQ3NCxcbiAgMjc1NjczNDE4NyxcbiAgMzIwNDAzMTQ3OSxcbiAgMzMyOTMyNTI5OFxuXSksIHlzID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg2NCk7XG5jbGFzcyBaMSBleHRlbmRzIFlmIHtcbiAgY29uc3RydWN0b3IoZSA9IDMyKSB7XG4gICAgc3VwZXIoNjQsIGUsIDgsICExKSwgdGhpcy5BID0gbXNbMF0gfCAwLCB0aGlzLkIgPSBtc1sxXSB8IDAsIHRoaXMuQyA9IG1zWzJdIHwgMCwgdGhpcy5EID0gbXNbM10gfCAwLCB0aGlzLkUgPSBtc1s0XSB8IDAsIHRoaXMuRiA9IG1zWzVdIHwgMCwgdGhpcy5HID0gbXNbNl0gfCAwLCB0aGlzLkggPSBtc1s3XSB8IDA7XG4gIH1cbiAgZ2V0KCkge1xuICAgIGNvbnN0IHsgQTogZSwgQjogdCwgQzogciwgRDogbiwgRTogaSwgRjogbywgRzogYSwgSDogbCB9ID0gdGhpcztcbiAgICByZXR1cm4gW2UsIHQsIHIsIG4sIGksIG8sIGEsIGxdO1xuICB9XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBzZXQoZSwgdCwgciwgbiwgaSwgbywgYSwgbCkge1xuICAgIHRoaXMuQSA9IGUgfCAwLCB0aGlzLkIgPSB0IHwgMCwgdGhpcy5DID0gciB8IDAsIHRoaXMuRCA9IG4gfCAwLCB0aGlzLkUgPSBpIHwgMCwgdGhpcy5GID0gbyB8IDAsIHRoaXMuRyA9IGEgfCAwLCB0aGlzLkggPSBsIHwgMDtcbiAgfVxuICBwcm9jZXNzKGUsIHQpIHtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IDE2OyBkKyssIHQgKz0gNClcbiAgICAgIHlzW2RdID0gZS5nZXRVaW50MzIodCwgITEpO1xuICAgIGZvciAobGV0IGQgPSAxNjsgZCA8IDY0OyBkKyspIHtcbiAgICAgIGNvbnN0IGggPSB5c1tkIC0gMTVdLCBmID0geXNbZCAtIDJdLCBwID0gTnIoaCwgNykgXiBOcihoLCAxOCkgXiBoID4+PiAzLCB5ID0gTnIoZiwgMTcpIF4gTnIoZiwgMTkpIF4gZiA+Pj4gMTA7XG4gICAgICB5c1tkXSA9IHkgKyB5c1tkIC0gN10gKyBwICsgeXNbZCAtIDE2XSB8IDA7XG4gICAgfVxuICAgIGxldCB7IEE6IHIsIEI6IG4sIEM6IGksIEQ6IG8sIEU6IGEsIEY6IGwsIEc6IGMsIEg6IHUgfSA9IHRoaXM7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCA2NDsgZCsrKSB7XG4gICAgICBjb25zdCBoID0gTnIoYSwgNikgXiBOcihhLCAxMSkgXiBOcihhLCAyNSksIGYgPSB1ICsgaCArIFUxKGEsIGwsIGMpICsgWTFbZF0gKyB5c1tkXSB8IDAsIHkgPSAoTnIociwgMikgXiBOcihyLCAxMykgXiBOcihyLCAyMikpICsgJDEociwgbiwgaSkgfCAwO1xuICAgICAgdSA9IGMsIGMgPSBsLCBsID0gYSwgYSA9IG8gKyBmIHwgMCwgbyA9IGksIGkgPSBuLCBuID0gciwgciA9IGYgKyB5IHwgMDtcbiAgICB9XG4gICAgciA9IHIgKyB0aGlzLkEgfCAwLCBuID0gbiArIHRoaXMuQiB8IDAsIGkgPSBpICsgdGhpcy5DIHwgMCwgbyA9IG8gKyB0aGlzLkQgfCAwLCBhID0gYSArIHRoaXMuRSB8IDAsIGwgPSBsICsgdGhpcy5GIHwgMCwgYyA9IGMgKyB0aGlzLkcgfCAwLCB1ID0gdSArIHRoaXMuSCB8IDAsIHRoaXMuc2V0KHIsIG4sIGksIG8sIGEsIGwsIGMsIHUpO1xuICB9XG4gIHJvdW5kQ2xlYW4oKSB7XG4gICAga24oeXMpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCksIGtuKHRoaXMuYnVmZmVyKTtcbiAgfVxufVxuY29uc3QgWmYgPSBWMShbXG4gIFwiMHg0MjhhMmY5OGQ3MjhhZTIyXCIsXG4gIFwiMHg3MTM3NDQ5MTIzZWY2NWNkXCIsXG4gIFwiMHhiNWMwZmJjZmVjNGQzYjJmXCIsXG4gIFwiMHhlOWI1ZGJhNTgxODlkYmJjXCIsXG4gIFwiMHgzOTU2YzI1YmYzNDhiNTM4XCIsXG4gIFwiMHg1OWYxMTFmMWI2MDVkMDE5XCIsXG4gIFwiMHg5MjNmODJhNGFmMTk0ZjliXCIsXG4gIFwiMHhhYjFjNWVkNWRhNmQ4MTE4XCIsXG4gIFwiMHhkODA3YWE5OGEzMDMwMjQyXCIsXG4gIFwiMHgxMjgzNWIwMTQ1NzA2ZmJlXCIsXG4gIFwiMHgyNDMxODViZTRlZTRiMjhjXCIsXG4gIFwiMHg1NTBjN2RjM2Q1ZmZiNGUyXCIsXG4gIFwiMHg3MmJlNWQ3NGYyN2I4OTZmXCIsXG4gIFwiMHg4MGRlYjFmZTNiMTY5NmIxXCIsXG4gIFwiMHg5YmRjMDZhNzI1YzcxMjM1XCIsXG4gIFwiMHhjMTliZjE3NGNmNjkyNjk0XCIsXG4gIFwiMHhlNDliNjljMTllZjE0YWQyXCIsXG4gIFwiMHhlZmJlNDc4NjM4NGYyNWUzXCIsXG4gIFwiMHgwZmMxOWRjNjhiOGNkNWI1XCIsXG4gIFwiMHgyNDBjYTFjYzc3YWM5YzY1XCIsXG4gIFwiMHgyZGU5MmM2ZjU5MmIwMjc1XCIsXG4gIFwiMHg0YTc0ODRhYTZlYTZlNDgzXCIsXG4gIFwiMHg1Y2IwYTlkY2JkNDFmYmQ0XCIsXG4gIFwiMHg3NmY5ODhkYTgzMTE1M2I1XCIsXG4gIFwiMHg5ODNlNTE1MmVlNjZkZmFiXCIsXG4gIFwiMHhhODMxYzY2ZDJkYjQzMjEwXCIsXG4gIFwiMHhiMDAzMjdjODk4ZmIyMTNmXCIsXG4gIFwiMHhiZjU5N2ZjN2JlZWYwZWU0XCIsXG4gIFwiMHhjNmUwMGJmMzNkYTg4ZmMyXCIsXG4gIFwiMHhkNWE3OTE0NzkzMGFhNzI1XCIsXG4gIFwiMHgwNmNhNjM1MWUwMDM4MjZmXCIsXG4gIFwiMHgxNDI5Mjk2NzBhMGU2ZTcwXCIsXG4gIFwiMHgyN2I3MGE4NTQ2ZDIyZmZjXCIsXG4gIFwiMHgyZTFiMjEzODVjMjZjOTI2XCIsXG4gIFwiMHg0ZDJjNmRmYzVhYzQyYWVkXCIsXG4gIFwiMHg1MzM4MGQxMzlkOTViM2RmXCIsXG4gIFwiMHg2NTBhNzM1NDhiYWY2M2RlXCIsXG4gIFwiMHg3NjZhMGFiYjNjNzdiMmE4XCIsXG4gIFwiMHg4MWMyYzkyZTQ3ZWRhZWU2XCIsXG4gIFwiMHg5MjcyMmM4NTE0ODIzNTNiXCIsXG4gIFwiMHhhMmJmZThhMTRjZjEwMzY0XCIsXG4gIFwiMHhhODFhNjY0YmJjNDIzMDAxXCIsXG4gIFwiMHhjMjRiOGI3MGQwZjg5NzkxXCIsXG4gIFwiMHhjNzZjNTFhMzA2NTRiZTMwXCIsXG4gIFwiMHhkMTkyZTgxOWQ2ZWY1MjE4XCIsXG4gIFwiMHhkNjk5MDYyNDU1NjVhOTEwXCIsXG4gIFwiMHhmNDBlMzU4NTU3NzEyMDJhXCIsXG4gIFwiMHgxMDZhYTA3MDMyYmJkMWI4XCIsXG4gIFwiMHgxOWE0YzExNmI4ZDJkMGM4XCIsXG4gIFwiMHgxZTM3NmMwODUxNDFhYjUzXCIsXG4gIFwiMHgyNzQ4Nzc0Y2RmOGVlYjk5XCIsXG4gIFwiMHgzNGIwYmNiNWUxOWI0OGE4XCIsXG4gIFwiMHgzOTFjMGNiM2M1Yzk1YTYzXCIsXG4gIFwiMHg0ZWQ4YWE0YWUzNDE4YWNiXCIsXG4gIFwiMHg1YjljY2E0Zjc3NjNlMzczXCIsXG4gIFwiMHg2ODJlNmZmM2Q2YjJiOGEzXCIsXG4gIFwiMHg3NDhmODJlZTVkZWZiMmZjXCIsXG4gIFwiMHg3OGE1NjM2ZjQzMTcyZjYwXCIsXG4gIFwiMHg4NGM4NzgxNGExZjBhYjcyXCIsXG4gIFwiMHg4Y2M3MDIwODFhNjQzOWVjXCIsXG4gIFwiMHg5MGJlZmZmYTIzNjMxZTI4XCIsXG4gIFwiMHhhNDUwNmNlYmRlODJiZGU5XCIsXG4gIFwiMHhiZWY5YTNmN2IyYzY3OTE1XCIsXG4gIFwiMHhjNjcxNzhmMmUzNzI1MzJiXCIsXG4gIFwiMHhjYTI3M2VjZWVhMjY2MTljXCIsXG4gIFwiMHhkMTg2YjhjNzIxYzBjMjA3XCIsXG4gIFwiMHhlYWRhN2RkNmNkZTBlYjFlXCIsXG4gIFwiMHhmNTdkNGY3ZmVlNmVkMTc4XCIsXG4gIFwiMHgwNmYwNjdhYTcyMTc2ZmJhXCIsXG4gIFwiMHgwYTYzN2RjNWEyYzg5OGE2XCIsXG4gIFwiMHgxMTNmOTgwNGJlZjkwZGFlXCIsXG4gIFwiMHgxYjcxMGIzNTEzMWM0NzFiXCIsXG4gIFwiMHgyOGRiNzdmNTIzMDQ3ZDg0XCIsXG4gIFwiMHgzMmNhYWI3YjQwYzcyNDkzXCIsXG4gIFwiMHgzYzllYmUwYTE1YzliZWJjXCIsXG4gIFwiMHg0MzFkNjdjNDljMTAwZDRjXCIsXG4gIFwiMHg0Y2M1ZDRiZWNiM2U0MmI2XCIsXG4gIFwiMHg1OTdmMjk5Y2ZjNjU3ZTJhXCIsXG4gIFwiMHg1ZmNiNmZhYjNhZDZmYWVjXCIsXG4gIFwiMHg2YzQ0MTk4YzRhNDc1ODE3XCJcbl0ubWFwKChzKSA9PiBCaWdJbnQocykpKSwgWDEgPSBaZlswXSwgSjEgPSBaZlsxXSwgdnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDgwKSwgRXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDgwKTtcbmNsYXNzIFExIGV4dGVuZHMgWWYge1xuICBjb25zdHJ1Y3RvcihlID0gNjQpIHtcbiAgICBzdXBlcigxMjgsIGUsIDE2LCAhMSksIHRoaXMuQWggPSBRdFswXSB8IDAsIHRoaXMuQWwgPSBRdFsxXSB8IDAsIHRoaXMuQmggPSBRdFsyXSB8IDAsIHRoaXMuQmwgPSBRdFszXSB8IDAsIHRoaXMuQ2ggPSBRdFs0XSB8IDAsIHRoaXMuQ2wgPSBRdFs1XSB8IDAsIHRoaXMuRGggPSBRdFs2XSB8IDAsIHRoaXMuRGwgPSBRdFs3XSB8IDAsIHRoaXMuRWggPSBRdFs4XSB8IDAsIHRoaXMuRWwgPSBRdFs5XSB8IDAsIHRoaXMuRmggPSBRdFsxMF0gfCAwLCB0aGlzLkZsID0gUXRbMTFdIHwgMCwgdGhpcy5HaCA9IFF0WzEyXSB8IDAsIHRoaXMuR2wgPSBRdFsxM10gfCAwLCB0aGlzLkhoID0gUXRbMTRdIHwgMCwgdGhpcy5IbCA9IFF0WzE1XSB8IDA7XG4gIH1cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGdldCgpIHtcbiAgICBjb25zdCB7IEFoOiBlLCBBbDogdCwgQmg6IHIsIEJsOiBuLCBDaDogaSwgQ2w6IG8sIERoOiBhLCBEbDogbCwgRWg6IGMsIEVsOiB1LCBGaDogZCwgRmw6IGgsIEdoOiBmLCBHbDogcCwgSGg6IHksIEhsOiBFIH0gPSB0aGlzO1xuICAgIHJldHVybiBbZSwgdCwgciwgbiwgaSwgbywgYSwgbCwgYywgdSwgZCwgaCwgZiwgcCwgeSwgRV07XG4gIH1cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHNldChlLCB0LCByLCBuLCBpLCBvLCBhLCBsLCBjLCB1LCBkLCBoLCBmLCBwLCB5LCBFKSB7XG4gICAgdGhpcy5BaCA9IGUgfCAwLCB0aGlzLkFsID0gdCB8IDAsIHRoaXMuQmggPSByIHwgMCwgdGhpcy5CbCA9IG4gfCAwLCB0aGlzLkNoID0gaSB8IDAsIHRoaXMuQ2wgPSBvIHwgMCwgdGhpcy5EaCA9IGEgfCAwLCB0aGlzLkRsID0gbCB8IDAsIHRoaXMuRWggPSBjIHwgMCwgdGhpcy5FbCA9IHUgfCAwLCB0aGlzLkZoID0gZCB8IDAsIHRoaXMuRmwgPSBoIHwgMCwgdGhpcy5HaCA9IGYgfCAwLCB0aGlzLkdsID0gcCB8IDAsIHRoaXMuSGggPSB5IHwgMCwgdGhpcy5IbCA9IEUgfCAwO1xuICB9XG4gIHByb2Nlc3MoZSwgdCkge1xuICAgIGZvciAobGV0IEEgPSAwOyBBIDwgMTY7IEErKywgdCArPSA0KVxuICAgICAgdnNbQV0gPSBlLmdldFVpbnQzMih0KSwgRXNbQV0gPSBlLmdldFVpbnQzMih0ICs9IDQpO1xuICAgIGZvciAobGV0IEEgPSAxNjsgQSA8IDgwOyBBKyspIHtcbiAgICAgIGNvbnN0IEYgPSB2c1tBIC0gMTVdIHwgMCwgTSA9IEVzW0EgLSAxNV0gfCAwLCBIID0gY24oRiwgTSwgMSkgXiBjbihGLCBNLCA4KSBeIGRkKEYsIE0sIDcpLCBLID0gdW4oRiwgTSwgMSkgXiB1bihGLCBNLCA4KSBeIGhkKEYsIE0sIDcpLCBqID0gdnNbQSAtIDJdIHwgMCwgQyA9IEVzW0EgLSAyXSB8IDAsIGsgPSBjbihqLCBDLCAxOSkgXiBCaShqLCBDLCA2MSkgXiBkZChqLCBDLCA2KSwgJCA9IHVuKGosIEMsIDE5KSBeIEZpKGosIEMsIDYxKSBeIGhkKGosIEMsIDYpLCBXID0gSDEoSywgJCwgRXNbQSAtIDddLCBFc1tBIC0gMTZdKSwgXyA9IHExKFcsIEgsIGssIHZzW0EgLSA3XSwgdnNbQSAtIDE2XSk7XG4gICAgICB2c1tBXSA9IF8gfCAwLCBFc1tBXSA9IFcgfCAwO1xuICAgIH1cbiAgICBsZXQgeyBBaDogciwgQWw6IG4sIEJoOiBpLCBCbDogbywgQ2g6IGEsIENsOiBsLCBEaDogYywgRGw6IHUsIEVoOiBkLCBFbDogaCwgRmg6IGYsIEZsOiBwLCBHaDogeSwgR2w6IEUsIEhoOiBiLCBIbDogUiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBBID0gMDsgQSA8IDgwOyBBKyspIHtcbiAgICAgIGNvbnN0IEYgPSBjbihkLCBoLCAxNCkgXiBjbihkLCBoLCAxOCkgXiBCaShkLCBoLCA0MSksIE0gPSB1bihkLCBoLCAxNCkgXiB1bihkLCBoLCAxOCkgXiBGaShkLCBoLCA0MSksIEggPSBkICYgZiBeIH5kICYgeSwgSyA9IGggJiBwIF4gfmggJiBFLCBqID0gVzEoUiwgTSwgSywgSjFbQV0sIEVzW0FdKSwgQyA9IHoxKGosIGIsIEYsIEgsIFgxW0FdLCB2c1tBXSksIGsgPSBqIHwgMCwgJCA9IGNuKHIsIG4sIDI4KSBeIEJpKHIsIG4sIDM0KSBeIEJpKHIsIG4sIDM5KSwgVyA9IHVuKHIsIG4sIDI4KSBeIEZpKHIsIG4sIDM0KSBeIEZpKHIsIG4sIDM5KSwgXyA9IHIgJiBpIF4gciAmIGEgXiBpICYgYSwgZyA9IG4gJiBvIF4gbiAmIGwgXiBvICYgbDtcbiAgICAgIGIgPSB5IHwgMCwgUiA9IEUgfCAwLCB5ID0gZiB8IDAsIEUgPSBwIHwgMCwgZiA9IGQgfCAwLCBwID0gaCB8IDAsIHsgaDogZCwgbDogaCB9ID0gc3MoYyB8IDAsIHUgfCAwLCBDIHwgMCwgayB8IDApLCBjID0gYSB8IDAsIHUgPSBsIHwgMCwgYSA9IGkgfCAwLCBsID0gbyB8IDAsIGkgPSByIHwgMCwgbyA9IG4gfCAwO1xuICAgICAgY29uc3QgeCA9IGoxKGssIFcsIGcpO1xuICAgICAgciA9IEsxKHgsIEMsICQsIF8pLCBuID0geCB8IDA7XG4gICAgfVxuICAgICh7IGg6IHIsIGw6IG4gfSA9IHNzKHRoaXMuQWggfCAwLCB0aGlzLkFsIHwgMCwgciB8IDAsIG4gfCAwKSksIHsgaDogaSwgbDogbyB9ID0gc3ModGhpcy5CaCB8IDAsIHRoaXMuQmwgfCAwLCBpIHwgMCwgbyB8IDApLCB7IGg6IGEsIGwgfSA9IHNzKHRoaXMuQ2ggfCAwLCB0aGlzLkNsIHwgMCwgYSB8IDAsIGwgfCAwKSwgeyBoOiBjLCBsOiB1IH0gPSBzcyh0aGlzLkRoIHwgMCwgdGhpcy5EbCB8IDAsIGMgfCAwLCB1IHwgMCksIHsgaDogZCwgbDogaCB9ID0gc3ModGhpcy5FaCB8IDAsIHRoaXMuRWwgfCAwLCBkIHwgMCwgaCB8IDApLCB7IGg6IGYsIGw6IHAgfSA9IHNzKHRoaXMuRmggfCAwLCB0aGlzLkZsIHwgMCwgZiB8IDAsIHAgfCAwKSwgeyBoOiB5LCBsOiBFIH0gPSBzcyh0aGlzLkdoIHwgMCwgdGhpcy5HbCB8IDAsIHkgfCAwLCBFIHwgMCksIHsgaDogYiwgbDogUiB9ID0gc3ModGhpcy5IaCB8IDAsIHRoaXMuSGwgfCAwLCBiIHwgMCwgUiB8IDApLCB0aGlzLnNldChyLCBuLCBpLCBvLCBhLCBsLCBjLCB1LCBkLCBoLCBmLCBwLCB5LCBFLCBiLCBSKTtcbiAgfVxuICByb3VuZENsZWFuKCkge1xuICAgIGtuKHZzLCBFcyk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBrbih0aGlzLmJ1ZmZlciksIHRoaXMuc2V0KDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICB9XG59XG5jb25zdCBYZiA9IC8qIEBfX1BVUkVfXyAqLyB6ZigoKSA9PiBuZXcgWjEoKSksIGV5ID0gLyogQF9fUFVSRV9fICovIHpmKCgpID0+IG5ldyBRMSgpKTtcbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IFdjID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgwKSwgSmwgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDEpO1xuZnVuY3Rpb24gWHMocywgZSA9IFwiXCIpIHtcbiAgaWYgKHR5cGVvZiBzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgY29uc3QgdCA9IGUgJiYgYFwiJHtlfVwiYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IodCArIFwiZXhwZWN0ZWQgYm9vbGVhbiwgZ290IHR5cGU9XCIgKyB0eXBlb2Ygcyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBPcihzLCBlLCB0ID0gXCJcIikge1xuICBjb25zdCByID0gSWkocyksIG4gPSBzID09IG51bGwgPyB2b2lkIDAgOiBzLmxlbmd0aCwgaSA9IGUgIT09IHZvaWQgMDtcbiAgaWYgKCFyIHx8IGkgJiYgbiAhPT0gZSkge1xuICAgIGNvbnN0IG8gPSB0ICYmIGBcIiR7dH1cIiBgLCBhID0gaSA/IGAgb2YgbGVuZ3RoICR7ZX1gIDogXCJcIiwgbCA9IHIgPyBgbGVuZ3RoPSR7bn1gIDogYHR5cGU9JHt0eXBlb2Ygc31gO1xuICAgIHRocm93IG5ldyBFcnJvcihvICsgXCJleHBlY3RlZCBVaW50OEFycmF5XCIgKyBhICsgXCIsIGdvdCBcIiArIGwpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gTmkocykge1xuICBjb25zdCBlID0gcy50b1N0cmluZygxNik7XG4gIHJldHVybiBlLmxlbmd0aCAmIDEgPyBcIjBcIiArIGUgOiBlO1xufVxuZnVuY3Rpb24gSmYocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgXCIgKyB0eXBlb2Ygcyk7XG4gIHJldHVybiBzID09PSBcIlwiID8gV2MgOiBCaWdJbnQoXCIweFwiICsgcyk7XG59XG5mdW5jdGlvbiBsYShzKSB7XG4gIHJldHVybiBKZihIcyhzKSk7XG59XG5mdW5jdGlvbiBlaShzKSB7XG4gIHJldHVybiBRcyhzKSwgSmYoSHMoVWludDhBcnJheS5mcm9tKHMpLnJldmVyc2UoKSkpO1xufVxuZnVuY3Rpb24gemMocywgZSkge1xuICByZXR1cm4gUG8ocy50b1N0cmluZygxNikucGFkU3RhcnQoZSAqIDIsIFwiMFwiKSk7XG59XG5mdW5jdGlvbiBRZihzLCBlKSB7XG4gIHJldHVybiB6YyhzLCBlKS5yZXZlcnNlKCk7XG59XG5mdW5jdGlvbiBFdChzLCBlLCB0KSB7XG4gIGxldCByO1xuICBpZiAodHlwZW9mIGUgPT0gXCJzdHJpbmdcIilcbiAgICB0cnkge1xuICAgICAgciA9IFBvKGUpO1xuICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihzICsgXCIgbXVzdCBiZSBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXksIGNhdXNlOiBcIiArIGkpO1xuICAgIH1cbiAgZWxzZSBpZiAoSWkoZSkpXG4gICAgciA9IFVpbnQ4QXJyYXkuZnJvbShlKTtcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvcihzICsgXCIgbXVzdCBiZSBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXlcIik7XG4gIGNvbnN0IG4gPSByLmxlbmd0aDtcbiAgaWYgKHR5cGVvZiB0ID09IFwibnVtYmVyXCIgJiYgbiAhPT0gdClcbiAgICB0aHJvdyBuZXcgRXJyb3IocyArIFwiIG9mIGxlbmd0aCBcIiArIHQgKyBcIiBleHBlY3RlZCwgZ290IFwiICsgbik7XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gZmQocykge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHMpO1xufVxuY29uc3QgamEgPSAocykgPT4gdHlwZW9mIHMgPT0gXCJiaWdpbnRcIiAmJiBXYyA8PSBzO1xuZnVuY3Rpb24gdHkocywgZSwgdCkge1xuICByZXR1cm4gamEocykgJiYgamEoZSkgJiYgamEodCkgJiYgZSA8PSBzICYmIHMgPCB0O1xufVxuZnVuY3Rpb24gUWwocywgZSwgdCwgcikge1xuICBpZiAoIXR5KGUsIHQsIHIpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbGlkIFwiICsgcyArIFwiOiBcIiArIHQgKyBcIiA8PSBuIDwgXCIgKyByICsgXCIsIGdvdCBcIiArIGUpO1xufVxuZnVuY3Rpb24gZTAocykge1xuICBsZXQgZTtcbiAgZm9yIChlID0gMDsgcyA+IFdjOyBzID4+PSBKbCwgZSArPSAxKVxuICAgIDtcbiAgcmV0dXJuIGU7XG59XG5jb25zdCBfaSA9IChzKSA9PiAoSmwgPDwgQmlnSW50KHMpKSAtIEpsO1xuZnVuY3Rpb24gcnkocywgZSwgdCkge1xuICBpZiAodHlwZW9mIHMgIT0gXCJudW1iZXJcIiB8fCBzIDwgMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoYXNoTGVuIG11c3QgYmUgYSBudW1iZXJcIik7XG4gIGlmICh0eXBlb2YgZSAhPSBcIm51bWJlclwiIHx8IGUgPCAyKVxuICAgIHRocm93IG5ldyBFcnJvcihcInFCeXRlTGVuIG11c3QgYmUgYSBudW1iZXJcIik7XG4gIGlmICh0eXBlb2YgdCAhPSBcImZ1bmN0aW9uXCIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaG1hY0ZuIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgY29uc3QgciA9IChmKSA9PiBuZXcgVWludDhBcnJheShmKSwgbiA9IChmKSA9PiBVaW50OEFycmF5Lm9mKGYpO1xuICBsZXQgaSA9IHIocyksIG8gPSByKHMpLCBhID0gMDtcbiAgY29uc3QgbCA9ICgpID0+IHtcbiAgICBpLmZpbGwoMSksIG8uZmlsbCgwKSwgYSA9IDA7XG4gIH0sIGMgPSAoLi4uZikgPT4gdChvLCBpLCAuLi5mKSwgdSA9IChmID0gcigwKSkgPT4ge1xuICAgIG8gPSBjKG4oMCksIGYpLCBpID0gYygpLCBmLmxlbmd0aCAhPT0gMCAmJiAobyA9IGMobigxKSwgZiksIGkgPSBjKCkpO1xuICB9LCBkID0gKCkgPT4ge1xuICAgIGlmIChhKysgPj0gMWUzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZHJiZzogdHJpZWQgMTAwMCB2YWx1ZXNcIik7XG4gICAgbGV0IGYgPSAwO1xuICAgIGNvbnN0IHAgPSBbXTtcbiAgICBmb3IgKDsgZiA8IGU7ICkge1xuICAgICAgaSA9IGMoKTtcbiAgICAgIGNvbnN0IHkgPSBpLnNsaWNlKCk7XG4gICAgICBwLnB1c2goeSksIGYgKz0gaS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBLciguLi5wKTtcbiAgfTtcbiAgcmV0dXJuIChmLCBwKSA9PiB7XG4gICAgbCgpLCB1KGYpO1xuICAgIGxldCB5O1xuICAgIGZvciAoOyAhKHkgPSBwKGQoKSkpOyApXG4gICAgICB1KCk7XG4gICAgcmV0dXJuIGwoKSwgeTtcbiAgfTtcbn1cbmZ1bmN0aW9uIFJpKHMsIGUsIHQgPSB7fSkge1xuICBpZiAoIXMgfHwgdHlwZW9mIHMgIT0gXCJvYmplY3RcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCB2YWxpZCBvcHRpb25zIG9iamVjdFwiKTtcbiAgZnVuY3Rpb24gcihuLCBpLCBvKSB7XG4gICAgY29uc3QgYSA9IHNbbl07XG4gICAgaWYgKG8gJiYgYSA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGwgPSB0eXBlb2YgYTtcbiAgICBpZiAobCAhPT0gaSB8fCBhID09PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwYXJhbSBcIiR7bn1cIiBpcyBpbnZhbGlkOiBleHBlY3RlZCAke2l9LCBnb3QgJHtsfWApO1xuICB9XG4gIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtuLCBpXSkgPT4gcihuLCBpLCAhMSkpLCBPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKChbbiwgaV0pID0+IHIobiwgaSwgITApKTtcbn1cbmZ1bmN0aW9uIE1vKHMpIHtcbiAgY29uc3QgZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gKHQsIC4uLnIpID0+IHtcbiAgICBjb25zdCBuID0gZS5nZXQodCk7XG4gICAgaWYgKG4gIT09IHZvaWQgMClcbiAgICAgIHJldHVybiBuO1xuICAgIGNvbnN0IGkgPSBzKHQsIC4uLnIpO1xuICAgIHJldHVybiBlLnNldCh0LCBpKSwgaTtcbiAgfTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IGdyID0gQmlnSW50KDApLCBYdCA9IEJpZ0ludCgxKSwgR3MgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDIpLCB0MCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMyksIHIwID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCg0KSwgczAgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDUpLCBzeSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoNyksIG4wID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCg4KSwgbnkgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDkpLCBpMCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMTYpO1xuZnVuY3Rpb24gR3QocywgZSkge1xuICBjb25zdCB0ID0gcyAlIGU7XG4gIHJldHVybiB0ID49IGdyID8gdCA6IGUgKyB0O1xufVxuZnVuY3Rpb24gdnQocywgZSwgdCkge1xuICBsZXQgciA9IHM7XG4gIGZvciAoOyBlLS0gPiBncjsgKVxuICAgIHIgKj0gciwgciAlPSB0O1xuICByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIGdkKHMsIGUpIHtcbiAgaWYgKHMgPT09IGdyKVxuICAgIHRocm93IG5ldyBFcnJvcihcImludmVydDogZXhwZWN0ZWQgbm9uLXplcm8gbnVtYmVyXCIpO1xuICBpZiAoZSA8PSBncilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZlcnQ6IGV4cGVjdGVkIHBvc2l0aXZlIG1vZHVsdXMsIGdvdCBcIiArIGUpO1xuICBsZXQgdCA9IEd0KHMsIGUpLCByID0gZSwgbiA9IGdyLCBpID0gWHQ7XG4gIGZvciAoOyB0ICE9PSBncjsgKSB7XG4gICAgY29uc3QgYSA9IHIgLyB0LCBsID0gciAlIHQsIGMgPSBuIC0gaSAqIGE7XG4gICAgciA9IHQsIHQgPSBsLCBuID0gaSwgaSA9IGM7XG4gIH1cbiAgaWYgKHIgIT09IFh0KVxuICAgIHRocm93IG5ldyBFcnJvcihcImludmVydDogZG9lcyBub3QgZXhpc3RcIik7XG4gIHJldHVybiBHdChuLCBlKTtcbn1cbmZ1bmN0aW9uIFljKHMsIGUsIHQpIHtcbiAgaWYgKCFzLmVxbChzLnNxcihlKSwgdCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3RcIik7XG59XG5mdW5jdGlvbiBvMChzLCBlKSB7XG4gIGNvbnN0IHQgPSAocy5PUkRFUiArIFh0KSAvIHIwLCByID0gcy5wb3coZSwgdCk7XG4gIHJldHVybiBZYyhzLCByLCBlKSwgcjtcbn1cbmZ1bmN0aW9uIGl5KHMsIGUpIHtcbiAgY29uc3QgdCA9IChzLk9SREVSIC0gczApIC8gbjAsIHIgPSBzLm11bChlLCBHcyksIG4gPSBzLnBvdyhyLCB0KSwgaSA9IHMubXVsKGUsIG4pLCBvID0gcy5tdWwocy5tdWwoaSwgR3MpLCBuKSwgYSA9IHMubXVsKGksIHMuc3ViKG8sIHMuT05FKSk7XG4gIHJldHVybiBZYyhzLCBhLCBlKSwgYTtcbn1cbmZ1bmN0aW9uIG95KHMpIHtcbiAgY29uc3QgZSA9IGVuKHMpLCB0ID0gYTAocyksIHIgPSB0KGUsIGUubmVnKGUuT05FKSksIG4gPSB0KGUsIHIpLCBpID0gdChlLCBlLm5lZyhyKSksIG8gPSAocyArIHN5KSAvIGkwO1xuICByZXR1cm4gKGEsIGwpID0+IHtcbiAgICBsZXQgYyA9IGEucG93KGwsIG8pLCB1ID0gYS5tdWwoYywgcik7XG4gICAgY29uc3QgZCA9IGEubXVsKGMsIG4pLCBoID0gYS5tdWwoYywgaSksIGYgPSBhLmVxbChhLnNxcih1KSwgbCksIHAgPSBhLmVxbChhLnNxcihkKSwgbCk7XG4gICAgYyA9IGEuY21vdihjLCB1LCBmKSwgdSA9IGEuY21vdihoLCBkLCBwKTtcbiAgICBjb25zdCB5ID0gYS5lcWwoYS5zcXIodSksIGwpLCBFID0gYS5jbW92KGMsIHUsIHkpO1xuICAgIHJldHVybiBZYyhhLCBFLCBsKSwgRTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGEwKHMpIHtcbiAgaWYgKHMgPCB0MClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzcXJ0IGlzIG5vdCBkZWZpbmVkIGZvciBzbWFsbCBmaWVsZFwiKTtcbiAgbGV0IGUgPSBzIC0gWHQsIHQgPSAwO1xuICBmb3IgKDsgZSAlIEdzID09PSBncjsgKVxuICAgIGUgLz0gR3MsIHQrKztcbiAgbGV0IHIgPSBHcztcbiAgY29uc3QgbiA9IGVuKHMpO1xuICBmb3IgKDsgcGQobiwgcikgPT09IDE7IClcbiAgICBpZiAocisrID4gMWUzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3Q6IHByb2JhYmx5IG5vbi1wcmltZSBQXCIpO1xuICBpZiAodCA9PT0gMSlcbiAgICByZXR1cm4gbzA7XG4gIGxldCBpID0gbi5wb3cociwgZSk7XG4gIGNvbnN0IG8gPSAoZSArIFh0KSAvIEdzO1xuICByZXR1cm4gZnVuY3Rpb24obCwgYykge1xuICAgIGlmIChsLmlzMChjKSlcbiAgICAgIHJldHVybiBjO1xuICAgIGlmIChwZChsLCBjKSAhPT0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHNxdWFyZSByb290XCIpO1xuICAgIGxldCB1ID0gdCwgZCA9IGwubXVsKGwuT05FLCBpKSwgaCA9IGwucG93KGMsIGUpLCBmID0gbC5wb3coYywgbyk7XG4gICAgZm9yICg7ICFsLmVxbChoLCBsLk9ORSk7ICkge1xuICAgICAgaWYgKGwuaXMwKGgpKVxuICAgICAgICByZXR1cm4gbC5aRVJPO1xuICAgICAgbGV0IHAgPSAxLCB5ID0gbC5zcXIoaCk7XG4gICAgICBmb3IgKDsgIWwuZXFsKHksIGwuT05FKTsgKVxuICAgICAgICBpZiAocCsrLCB5ID0gbC5zcXIoeSksIHAgPT09IHUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3RcIik7XG4gICAgICBjb25zdCBFID0gWHQgPDwgQmlnSW50KHUgLSBwIC0gMSksIGIgPSBsLnBvdyhkLCBFKTtcbiAgICAgIHUgPSBwLCBkID0gbC5zcXIoYiksIGggPSBsLm11bChoLCBkKSwgZiA9IGwubXVsKGYsIGIpO1xuICAgIH1cbiAgICByZXR1cm4gZjtcbiAgfTtcbn1cbmZ1bmN0aW9uIGF5KHMpIHtcbiAgcmV0dXJuIHMgJSByMCA9PT0gdDAgPyBvMCA6IHMgJSBuMCA9PT0gczAgPyBpeSA6IHMgJSBpMCA9PT0gbnkgPyBveShzKSA6IGEwKHMpO1xufVxuY29uc3QgbHkgPSAocywgZSkgPT4gKEd0KHMsIGUpICYgWHQpID09PSBYdCwgY3kgPSBbXG4gIFwiY3JlYXRlXCIsXG4gIFwiaXNWYWxpZFwiLFxuICBcImlzMFwiLFxuICBcIm5lZ1wiLFxuICBcImludlwiLFxuICBcInNxcnRcIixcbiAgXCJzcXJcIixcbiAgXCJlcWxcIixcbiAgXCJhZGRcIixcbiAgXCJzdWJcIixcbiAgXCJtdWxcIixcbiAgXCJwb3dcIixcbiAgXCJkaXZcIixcbiAgXCJhZGROXCIsXG4gIFwic3ViTlwiLFxuICBcIm11bE5cIixcbiAgXCJzcXJOXCJcbl07XG5mdW5jdGlvbiB1eShzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgT1JERVI6IFwiYmlnaW50XCIsXG4gICAgTUFTSzogXCJiaWdpbnRcIixcbiAgICBCWVRFUzogXCJudW1iZXJcIixcbiAgICBCSVRTOiBcIm51bWJlclwiXG4gIH0sIHQgPSBjeS5yZWR1Y2UoKHIsIG4pID0+IChyW25dID0gXCJmdW5jdGlvblwiLCByKSwgZSk7XG4gIHJldHVybiBSaShzLCB0KSwgcztcbn1cbmZ1bmN0aW9uIGR5KHMsIGUsIHQpIHtcbiAgaWYgKHQgPCBncilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGV4cG9uZW50LCBuZWdhdGl2ZXMgdW5zdXBwb3J0ZWRcIik7XG4gIGlmICh0ID09PSBncilcbiAgICByZXR1cm4gcy5PTkU7XG4gIGlmICh0ID09PSBYdClcbiAgICByZXR1cm4gZTtcbiAgbGV0IHIgPSBzLk9ORSwgbiA9IGU7XG4gIGZvciAoOyB0ID4gZ3I7IClcbiAgICB0ICYgWHQgJiYgKHIgPSBzLm11bChyLCBuKSksIG4gPSBzLnNxcihuKSwgdCA+Pj0gWHQ7XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gbDAocywgZSwgdCA9ICExKSB7XG4gIGNvbnN0IHIgPSBuZXcgQXJyYXkoZS5sZW5ndGgpLmZpbGwodCA/IHMuWkVSTyA6IHZvaWQgMCksIG4gPSBlLnJlZHVjZSgobywgYSwgbCkgPT4gcy5pczAoYSkgPyBvIDogKHJbbF0gPSBvLCBzLm11bChvLCBhKSksIHMuT05FKSwgaSA9IHMuaW52KG4pO1xuICByZXR1cm4gZS5yZWR1Y2VSaWdodCgobywgYSwgbCkgPT4gcy5pczAoYSkgPyBvIDogKHJbbF0gPSBzLm11bChvLCByW2xdKSwgcy5tdWwobywgYSkpLCBpKSwgcjtcbn1cbmZ1bmN0aW9uIHBkKHMsIGUpIHtcbiAgY29uc3QgdCA9IChzLk9SREVSIC0gWHQpIC8gR3MsIHIgPSBzLnBvdyhlLCB0KSwgbiA9IHMuZXFsKHIsIHMuT05FKSwgaSA9IHMuZXFsKHIsIHMuWkVSTyksIG8gPSBzLmVxbChyLCBzLm5lZyhzLk9ORSkpO1xuICBpZiAoIW4gJiYgIWkgJiYgIW8pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBMZWdlbmRyZSBzeW1ib2wgcmVzdWx0XCIpO1xuICByZXR1cm4gbiA/IDEgOiBpID8gMCA6IC0xO1xufVxuZnVuY3Rpb24gYzAocywgZSkge1xuICBlICE9PSB2b2lkIDAgJiYgWGwoZSk7XG4gIGNvbnN0IHQgPSBlICE9PSB2b2lkIDAgPyBlIDogcy50b1N0cmluZygyKS5sZW5ndGgsIHIgPSBNYXRoLmNlaWwodCAvIDgpO1xuICByZXR1cm4geyBuQml0TGVuZ3RoOiB0LCBuQnl0ZUxlbmd0aDogciB9O1xufVxuZnVuY3Rpb24gZW4ocywgZSwgdCA9ICExLCByID0ge30pIHtcbiAgaWYgKHMgPD0gZ3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgPiAwLCBnb3QgXCIgKyBzKTtcbiAgbGV0IG4sIGksIG8gPSAhMSwgYTtcbiAgaWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgZSAhPSBudWxsKSB7XG4gICAgaWYgKHIuc3FydCB8fCB0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHNwZWNpZnkgb3B0cyBpbiB0d28gYXJndW1lbnRzXCIpO1xuICAgIGNvbnN0IGggPSBlO1xuICAgIGguQklUUyAmJiAobiA9IGguQklUUyksIGguc3FydCAmJiAoaSA9IGguc3FydCksIHR5cGVvZiBoLmlzTEUgPT0gXCJib29sZWFuXCIgJiYgKHQgPSBoLmlzTEUpLCB0eXBlb2YgaC5tb2RGcm9tQnl0ZXMgPT0gXCJib29sZWFuXCIgJiYgKG8gPSBoLm1vZEZyb21CeXRlcyksIGEgPSBoLmFsbG93ZWRMZW5ndGhzO1xuICB9IGVsc2VcbiAgICB0eXBlb2YgZSA9PSBcIm51bWJlclwiICYmIChuID0gZSksIHIuc3FydCAmJiAoaSA9IHIuc3FydCk7XG4gIGNvbnN0IHsgbkJpdExlbmd0aDogbCwgbkJ5dGVMZW5ndGg6IGMgfSA9IGMwKHMsIG4pO1xuICBpZiAoYyA+IDIwNDgpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgb2YgPD0gMjA0OCBieXRlc1wiKTtcbiAgbGV0IHU7XG4gIGNvbnN0IGQgPSBPYmplY3QuZnJlZXplKHtcbiAgICBPUkRFUjogcyxcbiAgICBpc0xFOiB0LFxuICAgIEJJVFM6IGwsXG4gICAgQllURVM6IGMsXG4gICAgTUFTSzogX2kobCksXG4gICAgWkVSTzogZ3IsXG4gICAgT05FOiBYdCxcbiAgICBhbGxvd2VkTGVuZ3RoczogYSxcbiAgICBjcmVhdGU6IChoKSA9PiBHdChoLCBzKSxcbiAgICBpc1ZhbGlkOiAoaCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoICE9IFwiYmlnaW50XCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZmllbGQgZWxlbWVudDogZXhwZWN0ZWQgYmlnaW50LCBnb3QgXCIgKyB0eXBlb2YgaCk7XG4gICAgICByZXR1cm4gZ3IgPD0gaCAmJiBoIDwgcztcbiAgICB9LFxuICAgIGlzMDogKGgpID0+IGggPT09IGdyLFxuICAgIC8vIGlzIHZhbGlkIGFuZCBpbnZlcnRpYmxlXG4gICAgaXNWYWxpZE5vdDA6IChoKSA9PiAhZC5pczAoaCkgJiYgZC5pc1ZhbGlkKGgpLFxuICAgIGlzT2RkOiAoaCkgPT4gKGggJiBYdCkgPT09IFh0LFxuICAgIG5lZzogKGgpID0+IEd0KC1oLCBzKSxcbiAgICBlcWw6IChoLCBmKSA9PiBoID09PSBmLFxuICAgIHNxcjogKGgpID0+IEd0KGggKiBoLCBzKSxcbiAgICBhZGQ6IChoLCBmKSA9PiBHdChoICsgZiwgcyksXG4gICAgc3ViOiAoaCwgZikgPT4gR3QoaCAtIGYsIHMpLFxuICAgIG11bDogKGgsIGYpID0+IEd0KGggKiBmLCBzKSxcbiAgICBwb3c6IChoLCBmKSA9PiBkeShkLCBoLCBmKSxcbiAgICBkaXY6IChoLCBmKSA9PiBHdChoICogZ2QoZiwgcyksIHMpLFxuICAgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBkb2Vzbid0IG5vcm1hbGl6ZVxuICAgIHNxck46IChoKSA9PiBoICogaCxcbiAgICBhZGROOiAoaCwgZikgPT4gaCArIGYsXG4gICAgc3ViTjogKGgsIGYpID0+IGggLSBmLFxuICAgIG11bE46IChoLCBmKSA9PiBoICogZixcbiAgICBpbnY6IChoKSA9PiBnZChoLCBzKSxcbiAgICBzcXJ0OiBpIHx8ICgoaCkgPT4gKHUgfHwgKHUgPSBheShzKSksIHUoZCwgaCkpKSxcbiAgICB0b0J5dGVzOiAoaCkgPT4gdCA/IFFmKGgsIGMpIDogemMoaCwgYyksXG4gICAgZnJvbUJ5dGVzOiAoaCwgZiA9ICEwKSA9PiB7XG4gICAgICBpZiAoYSkge1xuICAgICAgICBpZiAoIWEuaW5jbHVkZXMoaC5sZW5ndGgpIHx8IGgubGVuZ3RoID4gYylcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZC5mcm9tQnl0ZXM6IGV4cGVjdGVkIFwiICsgYSArIFwiIGJ5dGVzLCBnb3QgXCIgKyBoLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBuZXcgVWludDhBcnJheShjKTtcbiAgICAgICAgeS5zZXQoaCwgdCA/IDAgOiB5Lmxlbmd0aCAtIGgubGVuZ3RoKSwgaCA9IHk7XG4gICAgICB9XG4gICAgICBpZiAoaC5sZW5ndGggIT09IGMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkLmZyb21CeXRlczogZXhwZWN0ZWQgXCIgKyBjICsgXCIgYnl0ZXMsIGdvdCBcIiArIGgubGVuZ3RoKTtcbiAgICAgIGxldCBwID0gdCA/IGVpKGgpIDogbGEoaCk7XG4gICAgICBpZiAobyAmJiAocCA9IEd0KHAsIHMpKSwgIWYgJiYgIWQuaXNWYWxpZChwKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWVsZCBlbGVtZW50OiBvdXRzaWRlIG9mIHJhbmdlIDAuLk9SREVSXCIpO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSxcbiAgICAvLyBUT0RPOiB3ZSBkb24ndCBuZWVkIGl0IGhlcmUsIG1vdmUgb3V0IHRvIHNlcGFyYXRlIGZuXG4gICAgaW52ZXJ0QmF0Y2g6IChoKSA9PiBsMChkLCBoKSxcbiAgICAvLyBXZSBjYW4ndCBtb3ZlIHRoaXMgb3V0IGJlY2F1c2UgRnA2LCBGcDEyIGltcGxlbWVudCBpdFxuICAgIC8vIGFuZCBpdCdzIHVuY2xlYXIgd2hhdCB0byByZXR1cm4gaW4gdGhlcmUuXG4gICAgY21vdjogKGgsIGYsIHApID0+IHAgPyBmIDogaFxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoZCk7XG59XG5mdW5jdGlvbiB1MChzKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcImJpZ2ludFwiKVxuICAgIHRocm93IG5ldyBFcnJvcihcImZpZWxkIG9yZGVyIG11c3QgYmUgYmlnaW50XCIpO1xuICBjb25zdCBlID0gcy50b1N0cmluZygyKS5sZW5ndGg7XG4gIHJldHVybiBNYXRoLmNlaWwoZSAvIDgpO1xufVxuZnVuY3Rpb24gZDAocykge1xuICBjb25zdCBlID0gdTAocyk7XG4gIHJldHVybiBlICsgTWF0aC5jZWlsKGUgLyAyKTtcbn1cbmZ1bmN0aW9uIGh5KHMsIGUsIHQgPSAhMSkge1xuICBjb25zdCByID0gcy5sZW5ndGgsIG4gPSB1MChlKSwgaSA9IGQwKGUpO1xuICBpZiAociA8IDE2IHx8IHIgPCBpIHx8IHIgPiAxMDI0KVxuICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIFwiICsgaSArIFwiLTEwMjQgYnl0ZXMgb2YgaW5wdXQsIGdvdCBcIiArIHIpO1xuICBjb25zdCBvID0gdCA/IGVpKHMpIDogbGEocyksIGEgPSBHdChvLCBlIC0gWHQpICsgWHQ7XG4gIHJldHVybiB0ID8gUWYoYSwgbikgOiB6YyhhLCBuKTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IERuID0gQmlnSW50KDApLCBWcyA9IEJpZ0ludCgxKTtcbmZ1bmN0aW9uIE9vKHMsIGUpIHtcbiAgY29uc3QgdCA9IGUubmVnYXRlKCk7XG4gIHJldHVybiBzID8gdCA6IGU7XG59XG5mdW5jdGlvbiBqcyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBsMChzLkZwLCBlLm1hcCgocikgPT4gci5aKSk7XG4gIHJldHVybiBlLm1hcCgociwgbikgPT4gcy5mcm9tQWZmaW5lKHIudG9BZmZpbmUodFtuXSkpKTtcbn1cbmZ1bmN0aW9uIGgwKHMsIGUpIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihzKSB8fCBzIDw9IDAgfHwgcyA+IGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB3aW5kb3cgc2l6ZSwgZXhwZWN0ZWQgWzEuLlwiICsgZSArIFwiXSwgZ290IFc9XCIgKyBzKTtcbn1cbmZ1bmN0aW9uIEthKHMsIGUpIHtcbiAgaDAocywgZSk7XG4gIGNvbnN0IHQgPSBNYXRoLmNlaWwoZSAvIHMpICsgMSwgciA9IDIgKiogKHMgLSAxKSwgbiA9IDIgKiogcywgaSA9IF9pKHMpLCBvID0gQmlnSW50KHMpO1xuICByZXR1cm4geyB3aW5kb3dzOiB0LCB3aW5kb3dTaXplOiByLCBtYXNrOiBpLCBtYXhOdW1iZXI6IG4sIHNoaWZ0Qnk6IG8gfTtcbn1cbmZ1bmN0aW9uIG1kKHMsIGUsIHQpIHtcbiAgY29uc3QgeyB3aW5kb3dTaXplOiByLCBtYXNrOiBuLCBtYXhOdW1iZXI6IGksIHNoaWZ0Qnk6IG8gfSA9IHQ7XG4gIGxldCBhID0gTnVtYmVyKHMgJiBuKSwgbCA9IHMgPj4gbztcbiAgYSA+IHIgJiYgKGEgLT0gaSwgbCArPSBWcyk7XG4gIGNvbnN0IGMgPSBlICogciwgdSA9IGMgKyBNYXRoLmFicyhhKSAtIDEsIGQgPSBhID09PSAwLCBoID0gYSA8IDAsIGYgPSBlICUgMiAhPT0gMDtcbiAgcmV0dXJuIHsgbmV4dE46IGwsIG9mZnNldDogdSwgaXNaZXJvOiBkLCBpc05lZzogaCwgaXNOZWdGOiBmLCBvZmZzZXRGOiBjIH07XG59XG5mdW5jdGlvbiBmeShzLCBlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheSBleHBlY3RlZFwiKTtcbiAgcy5mb3JFYWNoKCh0LCByKSA9PiB7XG4gICAgaWYgKCEodCBpbnN0YW5jZW9mIGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBwb2ludCBhdCBpbmRleCBcIiArIHIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGd5KHMsIGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5IG9mIHNjYWxhcnMgZXhwZWN0ZWRcIik7XG4gIHMuZm9yRWFjaCgodCwgcikgPT4ge1xuICAgIGlmICghZS5pc1ZhbGlkKHQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBzY2FsYXIgYXQgaW5kZXggXCIgKyByKTtcbiAgfSk7XG59XG5jb25zdCBIYSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBmMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gcWEocykge1xuICByZXR1cm4gZjAuZ2V0KHMpIHx8IDE7XG59XG5mdW5jdGlvbiB5ZChzKSB7XG4gIGlmIChzICE9PSBEbilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHdOQUZcIik7XG59XG5jbGFzcyBnMCB7XG4gIC8vIFBhcmFtZXRyaXplZCB3aXRoIGEgZ2l2ZW4gUG9pbnQgY2xhc3MgKG5vdCBpbmRpdmlkdWFsIHBvaW50KVxuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5CQVNFID0gZS5CQVNFLCB0aGlzLlpFUk8gPSBlLlpFUk8sIHRoaXMuRm4gPSBlLkZuLCB0aGlzLmJpdHMgPSB0O1xuICB9XG4gIC8vIG5vbi1jb25zdCB0aW1lIG11bHRpcGxpY2F0aW9uIGxhZGRlclxuICBfdW5zYWZlTGFkZGVyKGUsIHQsIHIgPSB0aGlzLlpFUk8pIHtcbiAgICBsZXQgbiA9IGU7XG4gICAgZm9yICg7IHQgPiBEbjsgKVxuICAgICAgdCAmIFZzICYmIChyID0gci5hZGQobikpLCBuID0gbi5kb3VibGUoKSwgdCA+Pj0gVnM7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB3TkFGIHByZWNvbXB1dGF0aW9uIHdpbmRvdy4gVXNlZCBmb3IgY2FjaGluZy5cbiAgICogRGVmYXVsdCB3aW5kb3cgc2l6ZSBpcyBzZXQgYnkgYHV0aWxzLnByZWNvbXB1dGUoKWAgYW5kIGlzIGVxdWFsIHRvIDguXG4gICAqIE51bWJlciBvZiBwcmVjb21wdXRlZCBwb2ludHMgZGVwZW5kcyBvbiB0aGUgY3VydmUgc2l6ZTpcbiAgICogMl4o8J2RiuKIkjEpICogKE1hdGguY2VpbCjwnZGbIC8g8J2RiikgKyAxKSwgd2hlcmU6XG4gICAqIC0g8J2RiiBpcyB0aGUgd2luZG93IHNpemVcbiAgICogLSDwnZGbIGlzIHRoZSBiaXRsZW5ndGggb2YgdGhlIGN1cnZlIG9yZGVyLlxuICAgKiBGb3IgYSAyNTYtYml0IGN1cnZlIGFuZCB3aW5kb3cgc2l6ZSA4LCB0aGUgbnVtYmVyIG9mIHByZWNvbXB1dGVkIHBvaW50cyBpcyAxMjggKiAzMyA9IDQyMjQuXG4gICAqIEBwYXJhbSBwb2ludCBQb2ludCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gVyB3aW5kb3cgc2l6ZVxuICAgKiBAcmV0dXJucyBwcmVjb21wdXRlZCBwb2ludCB0YWJsZXMgZmxhdHRlbmVkIHRvIGEgc2luZ2xlIGFycmF5XG4gICAqL1xuICBwcmVjb21wdXRlV2luZG93KGUsIHQpIHtcbiAgICBjb25zdCB7IHdpbmRvd3M6IHIsIHdpbmRvd1NpemU6IG4gfSA9IEthKHQsIHRoaXMuYml0cyksIGkgPSBbXTtcbiAgICBsZXQgbyA9IGUsIGEgPSBvO1xuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcjsgbCsrKSB7XG4gICAgICBhID0gbywgaS5wdXNoKGEpO1xuICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCBuOyBjKyspXG4gICAgICAgIGEgPSBhLmFkZChvKSwgaS5wdXNoKGEpO1xuICAgICAgbyA9IGEuZG91YmxlKCk7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9XG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGVjIG11bHRpcGxpY2F0aW9uIHVzaW5nIHByZWNvbXB1dGVkIHRhYmxlcyBhbmQgdy1hcnkgbm9uLWFkamFjZW50IGZvcm0uXG4gICAqIE1vcmUgY29tcGFjdCBpbXBsZW1lbnRhdGlvbjpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9ub2JsZS1zZWNwMjU2azEvYmxvYi80N2NiMTY2OWI2ZTUwNmFkNjZiMzVmZTdkNzYxMzJhZTk3NDY1ZGEyL2luZGV4LnRzI0w1MDItTDU0MVxuICAgKiBAcmV0dXJucyByZWFsIGFuZCBmYWtlIChmb3IgY29uc3QtdGltZSkgcG9pbnRzXG4gICAqL1xuICB3TkFGKGUsIHQsIHIpIHtcbiAgICBpZiAoIXRoaXMuRm4uaXNWYWxpZChyKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2NhbGFyXCIpO1xuICAgIGxldCBuID0gdGhpcy5aRVJPLCBpID0gdGhpcy5CQVNFO1xuICAgIGNvbnN0IG8gPSBLYShlLCB0aGlzLmJpdHMpO1xuICAgIGZvciAobGV0IGEgPSAwOyBhIDwgby53aW5kb3dzOyBhKyspIHtcbiAgICAgIGNvbnN0IHsgbmV4dE46IGwsIG9mZnNldDogYywgaXNaZXJvOiB1LCBpc05lZzogZCwgaXNOZWdGOiBoLCBvZmZzZXRGOiBmIH0gPSBtZChyLCBhLCBvKTtcbiAgICAgIHIgPSBsLCB1ID8gaSA9IGkuYWRkKE9vKGgsIHRbZl0pKSA6IG4gPSBuLmFkZChPbyhkLCB0W2NdKSk7XG4gICAgfVxuICAgIHJldHVybiB5ZChyKSwgeyBwOiBuLCBmOiBpIH07XG4gIH1cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgZWMgdW5zYWZlIChub24gY29uc3QtdGltZSkgbXVsdGlwbGljYXRpb24gdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGFuZCB3LWFyeSBub24tYWRqYWNlbnQgZm9ybS5cbiAgICogQHBhcmFtIGFjYyBhY2N1bXVsYXRvciBwb2ludCB0byBhZGQgcmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uXG4gICAqIEByZXR1cm5zIHBvaW50XG4gICAqL1xuICB3TkFGVW5zYWZlKGUsIHQsIHIsIG4gPSB0aGlzLlpFUk8pIHtcbiAgICBjb25zdCBpID0gS2EoZSwgdGhpcy5iaXRzKTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IGkud2luZG93cyAmJiByICE9PSBEbjsgbysrKSB7XG4gICAgICBjb25zdCB7IG5leHROOiBhLCBvZmZzZXQ6IGwsIGlzWmVybzogYywgaXNOZWc6IHUgfSA9IG1kKHIsIG8sIGkpO1xuICAgICAgaWYgKHIgPSBhLCAhYykge1xuICAgICAgICBjb25zdCBkID0gdFtsXTtcbiAgICAgICAgbiA9IG4uYWRkKHUgPyBkLm5lZ2F0ZSgpIDogZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5ZChyKSwgbjtcbiAgfVxuICBnZXRQcmVjb21wdXRlcyhlLCB0LCByKSB7XG4gICAgbGV0IG4gPSBIYS5nZXQodCk7XG4gICAgcmV0dXJuIG4gfHwgKG4gPSB0aGlzLnByZWNvbXB1dGVXaW5kb3codCwgZSksIGUgIT09IDEgJiYgKHR5cGVvZiByID09IFwiZnVuY3Rpb25cIiAmJiAobiA9IHIobikpLCBIYS5zZXQodCwgbikpKSwgbjtcbiAgfVxuICBjYWNoZWQoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBxYShlKTtcbiAgICByZXR1cm4gdGhpcy53TkFGKG4sIHRoaXMuZ2V0UHJlY29tcHV0ZXMobiwgZSwgciksIHQpO1xuICB9XG4gIHVuc2FmZShlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHFhKGUpO1xuICAgIHJldHVybiBpID09PSAxID8gdGhpcy5fdW5zYWZlTGFkZGVyKGUsIHQsIG4pIDogdGhpcy53TkFGVW5zYWZlKGksIHRoaXMuZ2V0UHJlY29tcHV0ZXMoaSwgZSwgciksIHQsIG4pO1xuICB9XG4gIC8vIFdlIGNhbGN1bGF0ZSBwcmVjb21wdXRlcyBmb3IgZWxsaXB0aWMgY3VydmUgcG9pbnQgbXVsdGlwbGljYXRpb25cbiAgLy8gdXNpbmcgd2luZG93ZWQgbWV0aG9kLiBUaGlzIHNwZWNpZmllcyB3aW5kb3cgc2l6ZSBhbmRcbiAgLy8gc3RvcmVzIHByZWNvbXB1dGVkIHZhbHVlcy4gVXN1YWxseSBvbmx5IGJhc2UgcG9pbnQgd291bGQgYmUgcHJlY29tcHV0ZWQuXG4gIGNyZWF0ZUNhY2hlKGUsIHQpIHtcbiAgICBoMCh0LCB0aGlzLmJpdHMpLCBmMC5zZXQoZSwgdCksIEhhLmRlbGV0ZShlKTtcbiAgfVxuICBoYXNDYWNoZShlKSB7XG4gICAgcmV0dXJuIHFhKGUpICE9PSAxO1xuICB9XG59XG5mdW5jdGlvbiBweShzLCBlLCB0LCByKSB7XG4gIGxldCBuID0gZSwgaSA9IHMuWkVSTywgbyA9IHMuWkVSTztcbiAgZm9yICg7IHQgPiBEbiB8fCByID4gRG47IClcbiAgICB0ICYgVnMgJiYgKGkgPSBpLmFkZChuKSksIHIgJiBWcyAmJiAobyA9IG8uYWRkKG4pKSwgbiA9IG4uZG91YmxlKCksIHQgPj49IFZzLCByID4+PSBWcztcbiAgcmV0dXJuIHsgcDE6IGksIHAyOiBvIH07XG59XG5mdW5jdGlvbiBwMChzLCBlLCB0LCByKSB7XG4gIGZ5KHQsIHMpLCBneShyLCBlKTtcbiAgY29uc3QgbiA9IHQubGVuZ3RoLCBpID0gci5sZW5ndGg7XG4gIGlmIChuICE9PSBpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5cyBvZiBwb2ludHMgYW5kIHNjYWxhcnMgbXVzdCBoYXZlIGVxdWFsIGxlbmd0aFwiKTtcbiAgY29uc3QgbyA9IHMuWkVSTywgYSA9IGUwKEJpZ0ludChuKSk7XG4gIGxldCBsID0gMTtcbiAgYSA+IDEyID8gbCA9IGEgLSAzIDogYSA+IDQgPyBsID0gYSAtIDIgOiBhID4gMCAmJiAobCA9IDIpO1xuICBjb25zdCBjID0gX2kobCksIHUgPSBuZXcgQXJyYXkoTnVtYmVyKGMpICsgMSkuZmlsbChvKSwgZCA9IE1hdGguZmxvb3IoKGUuQklUUyAtIDEpIC8gbCkgKiBsO1xuICBsZXQgaCA9IG87XG4gIGZvciAobGV0IGYgPSBkOyBmID49IDA7IGYgLT0gbCkge1xuICAgIHUuZmlsbChvKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGk7IHkrKykge1xuICAgICAgY29uc3QgRSA9IHJbeV0sIGIgPSBOdW1iZXIoRSA+PiBCaWdJbnQoZikgJiBjKTtcbiAgICAgIHVbYl0gPSB1W2JdLmFkZCh0W3ldKTtcbiAgICB9XG4gICAgbGV0IHAgPSBvO1xuICAgIGZvciAobGV0IHkgPSB1Lmxlbmd0aCAtIDEsIEUgPSBvOyB5ID4gMDsgeS0tKVxuICAgICAgRSA9IEUuYWRkKHVbeV0pLCBwID0gcC5hZGQoRSk7XG4gICAgaWYgKGggPSBoLmFkZChwKSwgZiAhPT0gMClcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgbDsgeSsrKVxuICAgICAgICBoID0gaC5kb3VibGUoKTtcbiAgfVxuICByZXR1cm4gaDtcbn1cbmZ1bmN0aW9uIHZkKHMsIGUsIHQpIHtcbiAgaWYgKGUpIHtcbiAgICBpZiAoZS5PUkRFUiAhPT0gcylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkLk9SREVSIG11c3QgbWF0Y2ggb3JkZXI6IEZwID09IHAsIEZuID09IG5cIik7XG4gICAgcmV0dXJuIHV5KGUpLCBlO1xuICB9IGVsc2VcbiAgICByZXR1cm4gZW4ocywgeyBpc0xFOiB0IH0pO1xufVxuZnVuY3Rpb24gbTAocywgZSwgdCA9IHt9LCByKSB7XG4gIGlmIChyID09PSB2b2lkIDAgJiYgKHIgPSBzID09PSBcImVkd2FyZHNcIiksICFlIHx8IHR5cGVvZiBlICE9IFwib2JqZWN0XCIpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB2YWxpZCAke3N9IENVUlZFIG9iamVjdGApO1xuICBmb3IgKGNvbnN0IGwgb2YgW1wicFwiLCBcIm5cIiwgXCJoXCJdKSB7XG4gICAgY29uc3QgYyA9IGVbbF07XG4gICAgaWYgKCEodHlwZW9mIGMgPT0gXCJiaWdpbnRcIiAmJiBjID4gRG4pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDVVJWRS4ke2x9IG11c3QgYmUgcG9zaXRpdmUgYmlnaW50YCk7XG4gIH1cbiAgY29uc3QgbiA9IHZkKGUucCwgdC5GcCwgciksIGkgPSB2ZChlLm4sIHQuRm4sIHIpLCBhID0gW1wiR3hcIiwgXCJHeVwiLCBcImFcIiwgcyA9PT0gXCJ3ZWllcnN0cmFzc1wiID8gXCJiXCIgOiBcImRcIl07XG4gIGZvciAoY29uc3QgbCBvZiBhKVxuICAgIGlmICghbi5pc1ZhbGlkKGVbbF0pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDVVJWRS4ke2x9IG11c3QgYmUgdmFsaWQgZmllbGQgZWxlbWVudCBvZiBDVVJWRS5GcGApO1xuICByZXR1cm4gZSA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmFzc2lnbih7fSwgZSkpLCB7IENVUlZFOiBlLCBGcDogbiwgRm46IGkgfTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IHhzID0gQmlnSW50KDApLCB6dCA9IEJpZ0ludCgxKSwgV2EgPSBCaWdJbnQoMiksIG15ID0gQmlnSW50KDgpO1xuZnVuY3Rpb24geXkocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gcy5zcXIodCksIGkgPSBzLnNxcihyKSwgbyA9IHMuYWRkKHMubXVsKGUuYSwgbiksIGkpLCBhID0gcy5hZGQocy5PTkUsIHMubXVsKGUuZCwgcy5tdWwobiwgaSkpKTtcbiAgcmV0dXJuIHMuZXFsKG8sIGEpO1xufVxuZnVuY3Rpb24gdnkocywgZSA9IHt9KSB7XG4gIGNvbnN0IHQgPSBtMChcImVkd2FyZHNcIiwgcywgZSwgZS5GcEZuTEUpLCB7IEZwOiByLCBGbjogbiB9ID0gdDtcbiAgbGV0IGkgPSB0LkNVUlZFO1xuICBjb25zdCB7IGg6IG8gfSA9IGk7XG4gIFJpKGUsIHt9LCB7IHV2UmF0aW86IFwiZnVuY3Rpb25cIiB9KTtcbiAgY29uc3QgYSA9IFdhIDw8IEJpZ0ludChuLkJZVEVTICogOCkgLSB6dCwgbCA9IChFKSA9PiByLmNyZWF0ZShFKSwgYyA9IGUudXZSYXRpbyB8fCAoKEUsIGIpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogITAsIHZhbHVlOiByLnNxcnQoci5kaXYoRSwgYikpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiAhMSwgdmFsdWU6IHhzIH07XG4gICAgfVxuICB9KTtcbiAgaWYgKCF5eShyLCBpLCBpLkd4LCBpLkd5KSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgY3VydmUgcGFyYW1zOiBnZW5lcmF0b3IgcG9pbnRcIik7XG4gIGZ1bmN0aW9uIHUoRSwgYiwgUiA9ICExKSB7XG4gICAgY29uc3QgQSA9IFIgPyB6dCA6IHhzO1xuICAgIHJldHVybiBRbChcImNvb3JkaW5hdGUgXCIgKyBFLCBiLCBBLCBhKSwgYjtcbiAgfVxuICBmdW5jdGlvbiBkKEUpIHtcbiAgICBpZiAoIShFIGluc3RhbmNlb2YgcCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHRlbmRlZFBvaW50IGV4cGVjdGVkXCIpO1xuICB9XG4gIGNvbnN0IGggPSBNbygoRSwgYikgPT4ge1xuICAgIGNvbnN0IHsgWDogUiwgWTogQSwgWjogRiB9ID0gRSwgTSA9IEUuaXMwKCk7XG4gICAgYiA9PSBudWxsICYmIChiID0gTSA/IG15IDogci5pbnYoRikpO1xuICAgIGNvbnN0IEggPSBsKFIgKiBiKSwgSyA9IGwoQSAqIGIpLCBqID0gci5tdWwoRiwgYik7XG4gICAgaWYgKE0pXG4gICAgICByZXR1cm4geyB4OiB4cywgeTogenQgfTtcbiAgICBpZiAoaiAhPT0genQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZaIHdhcyBpbnZhbGlkXCIpO1xuICAgIHJldHVybiB7IHg6IEgsIHk6IEsgfTtcbiAgfSksIGYgPSBNbygoRSkgPT4ge1xuICAgIGNvbnN0IHsgYTogYiwgZDogUiB9ID0gaTtcbiAgICBpZiAoRS5pczAoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogWkVST1wiKTtcbiAgICBjb25zdCB7IFg6IEEsIFk6IEYsIFo6IE0sIFQ6IEggfSA9IEUsIEsgPSBsKEEgKiBBKSwgaiA9IGwoRiAqIEYpLCBDID0gbChNICogTSksIGsgPSBsKEMgKiBDKSwgJCA9IGwoSyAqIGIpLCBXID0gbChDICogbCgkICsgaikpLCBfID0gbChrICsgbChSICogbChLICogaikpKTtcbiAgICBpZiAoVyAhPT0gXylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogZXF1YXRpb24gbGVmdCAhPSByaWdodCAoMSlcIik7XG4gICAgY29uc3QgZyA9IGwoQSAqIEYpLCB4ID0gbChNICogSCk7XG4gICAgaWYgKGcgIT09IHgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHQgKDIpXCIpO1xuICAgIHJldHVybiAhMDtcbiAgfSk7XG4gIGNsYXNzIHAge1xuICAgIGNvbnN0cnVjdG9yKGIsIFIsIEEsIEYpIHtcbiAgICAgIHRoaXMuWCA9IHUoXCJ4XCIsIGIpLCB0aGlzLlkgPSB1KFwieVwiLCBSKSwgdGhpcy5aID0gdShcInpcIiwgQSwgITApLCB0aGlzLlQgPSB1KFwidFwiLCBGKSwgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIENVUlZFKCkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tQWZmaW5lKGIpIHtcbiAgICAgIGlmIChiIGluc3RhbmNlb2YgcClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXh0ZW5kZWQgcG9pbnQgbm90IGFsbG93ZWRcIik7XG4gICAgICBjb25zdCB7IHg6IFIsIHk6IEEgfSA9IGIgfHwge307XG4gICAgICByZXR1cm4gdShcInhcIiwgUiksIHUoXCJ5XCIsIEEpLCBuZXcgcChSLCBBLCB6dCwgbChSICogQSkpO1xuICAgIH1cbiAgICAvLyBVc2VzIGFsZ28gZnJvbSBSRkM4MDMyIDUuMS4zLlxuICAgIHN0YXRpYyBmcm9tQnl0ZXMoYiwgUiA9ICExKSB7XG4gICAgICBjb25zdCBBID0gci5CWVRFUywgeyBhOiBGLCBkOiBNIH0gPSBpO1xuICAgICAgYiA9IGZkKE9yKGIsIEEsIFwicG9pbnRcIikpLCBYcyhSLCBcInppcDIxNVwiKTtcbiAgICAgIGNvbnN0IEggPSBmZChiKSwgSyA9IGJbQSAtIDFdO1xuICAgICAgSFtBIC0gMV0gPSBLICYgLTEyOTtcbiAgICAgIGNvbnN0IGogPSBlaShIKSwgQyA9IFIgPyBhIDogci5PUkRFUjtcbiAgICAgIFFsKFwicG9pbnQueVwiLCBqLCB4cywgQyk7XG4gICAgICBjb25zdCBrID0gbChqICogaiksICQgPSBsKGsgLSB6dCksIFcgPSBsKE0gKiBrIC0gRik7XG4gICAgICBsZXQgeyBpc1ZhbGlkOiBfLCB2YWx1ZTogZyB9ID0gYygkLCBXKTtcbiAgICAgIGlmICghXylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHBvaW50OiBpbnZhbGlkIHkgY29vcmRpbmF0ZVwiKTtcbiAgICAgIGNvbnN0IHggPSAoZyAmIHp0KSA9PT0genQsIHcgPSAoSyAmIDEyOCkgIT09IDA7XG4gICAgICBpZiAoIVIgJiYgZyA9PT0geHMgJiYgdylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHBvaW50OiB4PTAgYW5kIHhfMD0xXCIpO1xuICAgICAgcmV0dXJuIHcgIT09IHggJiYgKGcgPSBsKC1nKSksIHAuZnJvbUFmZmluZSh7IHg6IGcsIHk6IGogfSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tSGV4KGIsIFIgPSAhMSkge1xuICAgICAgcmV0dXJuIHAuZnJvbUJ5dGVzKEV0KFwicG9pbnRcIiwgYiksIFIpO1xuICAgIH1cbiAgICBnZXQgeCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueDtcbiAgICB9XG4gICAgZ2V0IHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0FmZmluZSgpLnk7XG4gICAgfVxuICAgIHByZWNvbXB1dGUoYiA9IDgsIFIgPSAhMCkge1xuICAgICAgcmV0dXJuIHkuY3JlYXRlQ2FjaGUodGhpcywgYiksIFIgfHwgdGhpcy5tdWx0aXBseShXYSksIHRoaXM7XG4gICAgfVxuICAgIC8vIFVzZWZ1bCBpbiBmcm9tQWZmaW5lKCkgLSBub3QgZm9yIGZyb21CeXRlcygpLCB3aGljaCBhbHdheXMgY3JlYXRlZCB2YWxpZCBwb2ludHMuXG4gICAgYXNzZXJ0VmFsaWRpdHkoKSB7XG4gICAgICBmKHRoaXMpO1xuICAgIH1cbiAgICAvLyBDb21wYXJlIG9uZSBwb2ludCB0byBhbm90aGVyLlxuICAgIGVxdWFscyhiKSB7XG4gICAgICBkKGIpO1xuICAgICAgY29uc3QgeyBYOiBSLCBZOiBBLCBaOiBGIH0gPSB0aGlzLCB7IFg6IE0sIFk6IEgsIFo6IEsgfSA9IGIsIGogPSBsKFIgKiBLKSwgQyA9IGwoTSAqIEYpLCBrID0gbChBICogSyksICQgPSBsKEggKiBGKTtcbiAgICAgIHJldHVybiBqID09PSBDICYmIGsgPT09ICQ7XG4gICAgfVxuICAgIGlzMCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVxdWFscyhwLlpFUk8pO1xuICAgIH1cbiAgICBuZWdhdGUoKSB7XG4gICAgICByZXR1cm4gbmV3IHAobCgtdGhpcy5YKSwgdGhpcy5ZLCB0aGlzLlosIGwoLXRoaXMuVCkpO1xuICAgIH1cbiAgICAvLyBGYXN0IGFsZ28gZm9yIGRvdWJsaW5nIEV4dGVuZGVkIFBvaW50LlxuICAgIC8vIGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQuaHRtbCNkb3VibGluZy1kYmwtMjAwOC1od2NkXG4gICAgLy8gQ29zdDogNE0gKyA0UyArIDEqYSArIDZhZGQgKyAxKjIuXG4gICAgZG91YmxlKCkge1xuICAgICAgY29uc3QgeyBhOiBiIH0gPSBpLCB7IFg6IFIsIFk6IEEsIFo6IEYgfSA9IHRoaXMsIE0gPSBsKFIgKiBSKSwgSCA9IGwoQSAqIEEpLCBLID0gbChXYSAqIGwoRiAqIEYpKSwgaiA9IGwoYiAqIE0pLCBDID0gUiArIEEsIGsgPSBsKGwoQyAqIEMpIC0gTSAtIEgpLCAkID0gaiArIEgsIFcgPSAkIC0gSywgXyA9IGogLSBILCBnID0gbChrICogVyksIHggPSBsKCQgKiBfKSwgdyA9IGwoayAqIF8pLCBEID0gbChXICogJCk7XG4gICAgICByZXR1cm4gbmV3IHAoZywgeCwgRCwgdyk7XG4gICAgfVxuICAgIC8vIEZhc3QgYWxnbyBmb3IgYWRkaW5nIDIgRXh0ZW5kZWQgUG9pbnRzLlxuICAgIC8vIGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQuaHRtbCNhZGRpdGlvbi1hZGQtMjAwOC1od2NkXG4gICAgLy8gQ29zdDogOU0gKyAxKmEgKyAxKmQgKyA3YWRkLlxuICAgIGFkZChiKSB7XG4gICAgICBkKGIpO1xuICAgICAgY29uc3QgeyBhOiBSLCBkOiBBIH0gPSBpLCB7IFg6IEYsIFk6IE0sIFo6IEgsIFQ6IEsgfSA9IHRoaXMsIHsgWDogaiwgWTogQywgWjogaywgVDogJCB9ID0gYiwgVyA9IGwoRiAqIGopLCBfID0gbChNICogQyksIGcgPSBsKEsgKiBBICogJCksIHggPSBsKEggKiBrKSwgdyA9IGwoKEYgKyBNKSAqIChqICsgQykgLSBXIC0gXyksIEQgPSB4IC0gZywgTyA9IHggKyBnLCBVID0gbChfIC0gUiAqIFcpLCBWID0gbCh3ICogRCksIEwgPSBsKE8gKiBVKSwgbSA9IGwodyAqIFUpLCB2ID0gbChEICogTyk7XG4gICAgICByZXR1cm4gbmV3IHAoViwgTCwgdiwgbSk7XG4gICAgfVxuICAgIHN1YnRyYWN0KGIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZChiLm5lZ2F0ZSgpKTtcbiAgICB9XG4gICAgLy8gQ29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi5cbiAgICBtdWx0aXBseShiKSB7XG4gICAgICBpZiAoIW4uaXNWYWxpZE5vdDAoYikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2NhbGFyOiBleHBlY3RlZCAxIDw9IHNjIDwgY3VydmUublwiKTtcbiAgICAgIGNvbnN0IHsgcDogUiwgZjogQSB9ID0geS5jYWNoZWQodGhpcywgYiwgKEYpID0+IGpzKHAsIEYpKTtcbiAgICAgIHJldHVybiBqcyhwLCBbUiwgQV0pWzBdO1xuICAgIH1cbiAgICAvLyBOb24tY29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi4gVXNlcyBkb3VibGUtYW5kLWFkZCBhbGdvcml0aG0uXG4gICAgLy8gSXQncyBmYXN0ZXIsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGRvbid0IGNhcmUgYWJvdXRcbiAgICAvLyBhbiBleHBvc2VkIHByaXZhdGUga2V5IGUuZy4gc2lnIHZlcmlmaWNhdGlvbi5cbiAgICAvLyBEb2VzIE5PVCBhbGxvdyBzY2FsYXJzIGhpZ2hlciB0aGFuIENVUlZFLm4uXG4gICAgLy8gQWNjZXB0cyBvcHRpb25hbCBhY2N1bXVsYXRvciB0byBtZXJnZSB3aXRoIG11bHRpcGx5IChpbXBvcnRhbnQgZm9yIHNwYXJzZSBzY2FsYXJzKVxuICAgIG11bHRpcGx5VW5zYWZlKGIsIFIgPSBwLlpFUk8pIHtcbiAgICAgIGlmICghbi5pc1ZhbGlkKGIpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNjYWxhcjogZXhwZWN0ZWQgMCA8PSBzYyA8IGN1cnZlLm5cIik7XG4gICAgICByZXR1cm4gYiA9PT0geHMgPyBwLlpFUk8gOiB0aGlzLmlzMCgpIHx8IGIgPT09IHp0ID8gdGhpcyA6IHkudW5zYWZlKHRoaXMsIGIsIChBKSA9PiBqcyhwLCBBKSwgUik7XG4gICAgfVxuICAgIC8vIENoZWNrcyBpZiBwb2ludCBpcyBvZiBzbWFsbCBvcmRlci5cbiAgICAvLyBJZiB5b3UgYWRkIHNvbWV0aGluZyB0byBzbWFsbCBvcmRlciBwb2ludCwgeW91IHdpbGwgaGF2ZSBcImRpcnR5XCJcbiAgICAvLyBwb2ludCB3aXRoIHRvcnNpb24gY29tcG9uZW50LlxuICAgIC8vIE11bHRpcGxpZXMgcG9pbnQgYnkgY29mYWN0b3IgYW5kIGNoZWNrcyBpZiB0aGUgcmVzdWx0IGlzIDAuXG4gICAgaXNTbWFsbE9yZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlVbnNhZmUobykuaXMwKCk7XG4gICAgfVxuICAgIC8vIE11bHRpcGxpZXMgcG9pbnQgYnkgY3VydmUgb3JkZXIgYW5kIGNoZWNrcyBpZiB0aGUgcmVzdWx0IGlzIDAuXG4gICAgLy8gUmV0dXJucyBgZmFsc2VgIGlzIHRoZSBwb2ludCBpcyBkaXJ0eS5cbiAgICBpc1RvcnNpb25GcmVlKCkge1xuICAgICAgcmV0dXJuIHkudW5zYWZlKHRoaXMsIGkubikuaXMwKCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnRzIEV4dGVuZGVkIHBvaW50IHRvIGRlZmF1bHQgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgIC8vIENhbiBhY2NlcHQgcHJlY29tcHV0ZWQgWl4tMSAtIGZvciBleGFtcGxlLCBmcm9tIGludmVydEJhdGNoLlxuICAgIHRvQWZmaW5lKGIpIHtcbiAgICAgIHJldHVybiBoKHRoaXMsIGIpO1xuICAgIH1cbiAgICBjbGVhckNvZmFjdG9yKCkge1xuICAgICAgcmV0dXJuIG8gPT09IHp0ID8gdGhpcyA6IHRoaXMubXVsdGlwbHlVbnNhZmUobyk7XG4gICAgfVxuICAgIHRvQnl0ZXMoKSB7XG4gICAgICBjb25zdCB7IHg6IGIsIHk6IFIgfSA9IHRoaXMudG9BZmZpbmUoKSwgQSA9IHIudG9CeXRlcyhSKTtcbiAgICAgIHJldHVybiBBW0EubGVuZ3RoIC0gMV0gfD0gYiAmIHp0ID8gMTI4IDogMCwgQTtcbiAgICB9XG4gICAgdG9IZXgoKSB7XG4gICAgICByZXR1cm4gSHModGhpcy50b0J5dGVzKCkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBgPFBvaW50ICR7dGhpcy5pczAoKSA/IFwiWkVST1wiIDogdGhpcy50b0hleCgpfT5gO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBnZXQgZXgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5YO1xuICAgIH1cbiAgICBnZXQgZXkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ZO1xuICAgIH1cbiAgICBnZXQgZXooKSB7XG4gICAgICByZXR1cm4gdGhpcy5aO1xuICAgIH1cbiAgICBnZXQgZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5UO1xuICAgIH1cbiAgICBzdGF0aWMgbm9ybWFsaXplWihiKSB7XG4gICAgICByZXR1cm4ganMocCwgYik7XG4gICAgfVxuICAgIHN0YXRpYyBtc20oYiwgUikge1xuICAgICAgcmV0dXJuIHAwKHAsIG4sIGIsIFIpO1xuICAgIH1cbiAgICBfc2V0V2luZG93U2l6ZShiKSB7XG4gICAgICB0aGlzLnByZWNvbXB1dGUoYik7XG4gICAgfVxuICAgIHRvUmF3Qnl0ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0J5dGVzKCk7XG4gICAgfVxuICB9XG4gIHAuQkFTRSA9IG5ldyBwKGkuR3gsIGkuR3ksIHp0LCBsKGkuR3ggKiBpLkd5KSksIHAuWkVSTyA9IG5ldyBwKHhzLCB6dCwgenQsIHhzKSwgcC5GcCA9IHIsIHAuRm4gPSBuO1xuICBjb25zdCB5ID0gbmV3IGcwKHAsIG4uQklUUyk7XG4gIHJldHVybiBwLkJBU0UucHJlY29tcHV0ZSg4KSwgcDtcbn1cbmZ1bmN0aW9uIEV5KHMsIGUsIHQgPSB7fSkge1xuICBpZiAodHlwZW9mIGUgIT0gXCJmdW5jdGlvblwiKVxuICAgIHRocm93IG5ldyBFcnJvcignXCJoYXNoXCIgZnVuY3Rpb24gcGFyYW0gaXMgcmVxdWlyZWQnKTtcbiAgUmkodCwge30sIHtcbiAgICBhZGp1c3RTY2FsYXJCeXRlczogXCJmdW5jdGlvblwiLFxuICAgIHJhbmRvbUJ5dGVzOiBcImZ1bmN0aW9uXCIsXG4gICAgZG9tYWluOiBcImZ1bmN0aW9uXCIsXG4gICAgcHJlaGFzaDogXCJmdW5jdGlvblwiLFxuICAgIG1hcFRvQ3VydmU6IFwiZnVuY3Rpb25cIlxuICB9KTtcbiAgY29uc3QgeyBwcmVoYXNoOiByIH0gPSB0LCB7IEJBU0U6IG4sIEZwOiBpLCBGbjogbyB9ID0gcywgYSA9IHQucmFuZG9tQnl0ZXMgfHwgcWMsIGwgPSB0LmFkanVzdFNjYWxhckJ5dGVzIHx8ICgoQykgPT4gQyksIGMgPSB0LmRvbWFpbiB8fCAoKEMsIGssICQpID0+IHtcbiAgICBpZiAoWHMoJCwgXCJwaGZsYWdcIiksIGsubGVuZ3RoIHx8ICQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0cy9wcmUtaGFzaCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICByZXR1cm4gQztcbiAgfSk7XG4gIGZ1bmN0aW9uIHUoQykge1xuICAgIHJldHVybiBvLmNyZWF0ZShlaShDKSk7XG4gIH1cbiAgZnVuY3Rpb24gZChDKSB7XG4gICAgY29uc3QgayA9IEEuc2VjcmV0S2V5O1xuICAgIEMgPSBFdChcInByaXZhdGUga2V5XCIsIEMsIGspO1xuICAgIGNvbnN0ICQgPSBFdChcImhhc2hlZCBwcml2YXRlIGtleVwiLCBlKEMpLCAyICogayksIFcgPSBsKCQuc2xpY2UoMCwgaykpLCBfID0gJC5zbGljZShrLCAyICogayksIGcgPSB1KFcpO1xuICAgIHJldHVybiB7IGhlYWQ6IFcsIHByZWZpeDogXywgc2NhbGFyOiBnIH07XG4gIH1cbiAgZnVuY3Rpb24gaChDKSB7XG4gICAgY29uc3QgeyBoZWFkOiBrLCBwcmVmaXg6ICQsIHNjYWxhcjogVyB9ID0gZChDKSwgXyA9IG4ubXVsdGlwbHkoVyksIGcgPSBfLnRvQnl0ZXMoKTtcbiAgICByZXR1cm4geyBoZWFkOiBrLCBwcmVmaXg6ICQsIHNjYWxhcjogVywgcG9pbnQ6IF8sIHBvaW50Qnl0ZXM6IGcgfTtcbiAgfVxuICBmdW5jdGlvbiBmKEMpIHtcbiAgICByZXR1cm4gaChDKS5wb2ludEJ5dGVzO1xuICB9XG4gIGZ1bmN0aW9uIHAoQyA9IFVpbnQ4QXJyYXkub2YoKSwgLi4uaykge1xuICAgIGNvbnN0ICQgPSBLciguLi5rKTtcbiAgICByZXR1cm4gdShlKGMoJCwgRXQoXCJjb250ZXh0XCIsIEMpLCAhIXIpKSk7XG4gIH1cbiAgZnVuY3Rpb24geShDLCBrLCAkID0ge30pIHtcbiAgICBDID0gRXQoXCJtZXNzYWdlXCIsIEMpLCByICYmIChDID0gcihDKSk7XG4gICAgY29uc3QgeyBwcmVmaXg6IFcsIHNjYWxhcjogXywgcG9pbnRCeXRlczogZyB9ID0gaChrKSwgeCA9IHAoJC5jb250ZXh0LCBXLCBDKSwgdyA9IG4ubXVsdGlwbHkoeCkudG9CeXRlcygpLCBEID0gcCgkLmNvbnRleHQsIHcsIGcsIEMpLCBPID0gby5jcmVhdGUoeCArIEQgKiBfKTtcbiAgICBpZiAoIW8uaXNWYWxpZChPKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNpZ24gZmFpbGVkOiBpbnZhbGlkIHNcIik7XG4gICAgY29uc3QgVSA9IEtyKHcsIG8udG9CeXRlcyhPKSk7XG4gICAgcmV0dXJuIE9yKFUsIEEuc2lnbmF0dXJlLCBcInJlc3VsdFwiKTtcbiAgfVxuICBjb25zdCBFID0geyB6aXAyMTU6ICEwIH07XG4gIGZ1bmN0aW9uIGIoQywgaywgJCwgVyA9IEUpIHtcbiAgICBjb25zdCB7IGNvbnRleHQ6IF8sIHppcDIxNTogZyB9ID0gVywgeCA9IEEuc2lnbmF0dXJlO1xuICAgIEMgPSBFdChcInNpZ25hdHVyZVwiLCBDLCB4KSwgayA9IEV0KFwibWVzc2FnZVwiLCBrKSwgJCA9IEV0KFwicHVibGljS2V5XCIsICQsIEEucHVibGljS2V5KSwgZyAhPT0gdm9pZCAwICYmIFhzKGcsIFwiemlwMjE1XCIpLCByICYmIChrID0gcihrKSk7XG4gICAgY29uc3QgdyA9IHggLyAyLCBEID0gQy5zdWJhcnJheSgwLCB3KSwgTyA9IGVpKEMuc3ViYXJyYXkodywgeCkpO1xuICAgIGxldCBVLCBWLCBMO1xuICAgIHRyeSB7XG4gICAgICBVID0gcy5mcm9tQnl0ZXMoJCwgZyksIFYgPSBzLmZyb21CeXRlcyhELCBnKSwgTCA9IG4ubXVsdGlwbHlVbnNhZmUoTyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGlmICghZyAmJiBVLmlzU21hbGxPcmRlcigpKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IG0gPSBwKF8sIFYudG9CeXRlcygpLCBVLnRvQnl0ZXMoKSwgayk7XG4gICAgcmV0dXJuIFYuYWRkKFUubXVsdGlwbHlVbnNhZmUobSkpLnN1YnRyYWN0KEwpLmNsZWFyQ29mYWN0b3IoKS5pczAoKTtcbiAgfVxuICBjb25zdCBSID0gaS5CWVRFUywgQSA9IHtcbiAgICBzZWNyZXRLZXk6IFIsXG4gICAgcHVibGljS2V5OiBSLFxuICAgIHNpZ25hdHVyZTogMiAqIFIsXG4gICAgc2VlZDogUlxuICB9O1xuICBmdW5jdGlvbiBGKEMgPSBhKEEuc2VlZCkpIHtcbiAgICByZXR1cm4gT3IoQywgQS5zZWVkLCBcInNlZWRcIik7XG4gIH1cbiAgZnVuY3Rpb24gTShDKSB7XG4gICAgY29uc3QgayA9IGoucmFuZG9tU2VjcmV0S2V5KEMpO1xuICAgIHJldHVybiB7IHNlY3JldEtleTogaywgcHVibGljS2V5OiBmKGspIH07XG4gIH1cbiAgZnVuY3Rpb24gSChDKSB7XG4gICAgcmV0dXJuIElpKEMpICYmIEMubGVuZ3RoID09PSBvLkJZVEVTO1xuICB9XG4gIGZ1bmN0aW9uIEsoQywgaykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFzLmZyb21CeXRlcyhDLCBrKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaiA9IHtcbiAgICBnZXRFeHRlbmRlZFB1YmxpY0tleTogaCxcbiAgICByYW5kb21TZWNyZXRLZXk6IEYsXG4gICAgaXNWYWxpZFNlY3JldEtleTogSCxcbiAgICBpc1ZhbGlkUHVibGljS2V5OiBLLFxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGVkIHB1YmxpYyBrZXkgdG8geCBwdWJsaWMga2V5LiBVc2VzIGZvcm11bGE6XG4gICAgICogLSBlZDI1NTE5OlxuICAgICAqICAgLSBgKHUsIHYpID0gKCgxK3kpLygxLXkpLCBzcXJ0KC00ODY2NjQpKnUveClgXG4gICAgICogICAtIGAoeCwgeSkgPSAoc3FydCgtNDg2NjY0KSp1L3YsICh1LTEpLyh1KzEpKWBcbiAgICAgKiAtIGVkNDQ4OlxuICAgICAqICAgLSBgKHUsIHYpID0gKCh5LTEpLyh5KzEpLCBzcXJ0KDE1NjMyNCkqdS94KWBcbiAgICAgKiAgIC0gYCh4LCB5KSA9IChzcXJ0KDE1NjMyNCkqdS92LCAoMSt1KS8oMS11KSlgXG4gICAgICovXG4gICAgdG9Nb250Z29tZXJ5KEMpIHtcbiAgICAgIGNvbnN0IHsgeTogayB9ID0gcy5mcm9tQnl0ZXMoQyksICQgPSBBLnB1YmxpY0tleSwgVyA9ICQgPT09IDMyO1xuICAgICAgaWYgKCFXICYmICQgIT09IDU3KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IGRlZmluZWQgZm9yIDI1NTE5IGFuZCA0NDhcIik7XG4gICAgICBjb25zdCBfID0gVyA/IGkuZGl2KHp0ICsgaywgenQgLSBrKSA6IGkuZGl2KGsgLSB6dCwgayArIHp0KTtcbiAgICAgIHJldHVybiBpLnRvQnl0ZXMoXyk7XG4gICAgfSxcbiAgICB0b01vbnRnb21lcnlTZWNyZXQoQykge1xuICAgICAgY29uc3QgayA9IEEuc2VjcmV0S2V5O1xuICAgICAgT3IoQywgayk7XG4gICAgICBjb25zdCAkID0gZShDLnN1YmFycmF5KDAsIGspKTtcbiAgICAgIHJldHVybiBsKCQpLnN1YmFycmF5KDAsIGspO1xuICAgIH0sXG4gICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgcmFuZG9tUHJpdmF0ZUtleTogRixcbiAgICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgICBwcmVjb21wdXRlKEMgPSA4LCBrID0gcy5CQVNFKSB7XG4gICAgICByZXR1cm4gay5wcmVjb21wdXRlKEMsICExKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBrZXlnZW46IE0sXG4gICAgZ2V0UHVibGljS2V5OiBmLFxuICAgIHNpZ246IHksXG4gICAgdmVyaWZ5OiBiLFxuICAgIHV0aWxzOiBqLFxuICAgIFBvaW50OiBzLFxuICAgIGxlbmd0aHM6IEFcbiAgfSk7XG59XG5mdW5jdGlvbiB4eShzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgYTogcy5hLFxuICAgIGQ6IHMuZCxcbiAgICBwOiBzLkZwLk9SREVSLFxuICAgIG46IHMubixcbiAgICBoOiBzLmgsXG4gICAgR3g6IHMuR3gsXG4gICAgR3k6IHMuR3lcbiAgfSwgdCA9IHMuRnAsIHIgPSBlbihlLm4sIHMubkJpdExlbmd0aCwgITApLCBuID0geyBGcDogdCwgRm46IHIsIHV2UmF0aW86IHMudXZSYXRpbyB9LCBpID0ge1xuICAgIHJhbmRvbUJ5dGVzOiBzLnJhbmRvbUJ5dGVzLFxuICAgIGFkanVzdFNjYWxhckJ5dGVzOiBzLmFkanVzdFNjYWxhckJ5dGVzLFxuICAgIGRvbWFpbjogcy5kb21haW4sXG4gICAgcHJlaGFzaDogcy5wcmVoYXNoLFxuICAgIG1hcFRvQ3VydmU6IHMubWFwVG9DdXJ2ZVxuICB9O1xuICByZXR1cm4geyBDVVJWRTogZSwgY3VydmVPcHRzOiBuLCBoYXNoOiBzLmhhc2gsIGVkZHNhT3B0czogaSB9O1xufVxuZnVuY3Rpb24gU3kocywgZSkge1xuICBjb25zdCB0ID0gZS5Qb2ludDtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGUsIHtcbiAgICBFeHRlbmRlZFBvaW50OiB0LFxuICAgIENVUlZFOiBzLFxuICAgIG5CaXRMZW5ndGg6IHQuRm4uQklUUyxcbiAgICBuQnl0ZUxlbmd0aDogdC5Gbi5CWVRFU1xuICB9KTtcbn1cbmZ1bmN0aW9uIGJ5KHMpIHtcbiAgY29uc3QgeyBDVVJWRTogZSwgY3VydmVPcHRzOiB0LCBoYXNoOiByLCBlZGRzYU9wdHM6IG4gfSA9IHh5KHMpLCBpID0gdnkoZSwgdCksIG8gPSBFeShpLCByLCBuKTtcbiAgcmV0dXJuIFN5KHMsIG8pO1xufVxuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuY29uc3QgVHkgPSBCaWdJbnQoMSksIEVkID0gQmlnSW50KDIpO1xuQmlnSW50KDMpO1xuY29uc3Qgd3kgPSBCaWdJbnQoNSksIEF5ID0gQmlnSW50KDgpLCBaYyA9IEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlZFwiKSwgeTAgPSB7XG4gIHA6IFpjLFxuICBuOiBCaWdJbnQoXCIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTRkZWY5ZGVhMmY3OWNkNjU4MTI2MzFhNWNmNWQzZWRcIiksXG4gIGg6IEF5LFxuICBhOiBCaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWNcIiksXG4gIGQ6IEJpZ0ludChcIjB4NTIwMzZjZWUyYjZmZmU3MzhjYzc0MDc5Nzc3OWU4OTgwMDcwMGE0ZDQxNDFkOGFiNzVlYjRkY2ExMzU5NzhhM1wiKSxcbiAgR3g6IEJpZ0ludChcIjB4MjE2OTM2ZDNjZDZlNTNmZWMwYTRlMjMxZmRkNmRjNWM2OTJjYzc2MDk1MjVhN2IyYzk1NjJkNjA4ZjI1ZDUxYVwiKSxcbiAgR3k6IEJpZ0ludChcIjB4NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY1OFwiKVxufTtcbmZ1bmN0aW9uIEl5KHMpIHtcbiAgY29uc3QgZSA9IEJpZ0ludCgxMCksIHQgPSBCaWdJbnQoMjApLCByID0gQmlnSW50KDQwKSwgbiA9IEJpZ0ludCg4MCksIGkgPSBaYywgYSA9IHMgKiBzICUgaSAqIHMgJSBpLCBsID0gdnQoYSwgRWQsIGkpICogYSAlIGksIGMgPSB2dChsLCBUeSwgaSkgKiBzICUgaSwgdSA9IHZ0KGMsIHd5LCBpKSAqIGMgJSBpLCBkID0gdnQodSwgZSwgaSkgKiB1ICUgaSwgaCA9IHZ0KGQsIHQsIGkpICogZCAlIGksIGYgPSB2dChoLCByLCBpKSAqIGggJSBpLCBwID0gdnQoZiwgbiwgaSkgKiBmICUgaSwgeSA9IHZ0KHAsIG4sIGkpICogZiAlIGksIEUgPSB2dCh5LCBlLCBpKSAqIHUgJSBpO1xuICByZXR1cm4geyBwb3dfcF81Xzg6IHZ0KEUsIEVkLCBpKSAqIHMgJSBpLCBiMjogYSB9O1xufVxuZnVuY3Rpb24gX3kocykge1xuICByZXR1cm4gc1swXSAmPSAyNDgsIHNbMzFdICY9IDEyNywgc1szMV0gfD0gNjQsIHM7XG59XG5jb25zdCB4ZCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoXCIxOTY4MTE2MTM3NjcwNzUwNTk1NjgwNzA3OTMwNDk4ODU0MjAxNTQ0NjA2NjUxNTkyMzg5MDE2Mjc0NDAyMTA3MzEyMzgyOTc4NDc1MlwiKTtcbmZ1bmN0aW9uIFJ5KHMsIGUpIHtcbiAgY29uc3QgdCA9IFpjLCByID0gR3QoZSAqIGUgKiBlLCB0KSwgbiA9IEd0KHIgKiByICogZSwgdCksIGkgPSBJeShzICogbikucG93X3BfNV84O1xuICBsZXQgbyA9IEd0KHMgKiByICogaSwgdCk7XG4gIGNvbnN0IGEgPSBHdChlICogbyAqIG8sIHQpLCBsID0gbywgYyA9IEd0KG8gKiB4ZCwgdCksIHUgPSBhID09PSBzLCBkID0gYSA9PT0gR3QoLXMsIHQpLCBoID0gYSA9PT0gR3QoLXMgKiB4ZCwgdCk7XG4gIHJldHVybiB1ICYmIChvID0gbCksIChkIHx8IGgpICYmIChvID0gYyksIGx5KG8sIHQpICYmIChvID0gR3QoLW8sIHQpKSwgeyBpc1ZhbGlkOiB1IHx8IGQsIHZhbHVlOiBvIH07XG59XG5jb25zdCBMeSA9IGVuKHkwLnAsIHsgaXNMRTogITAgfSksIEN5ID0ge1xuICAuLi55MCxcbiAgRnA6IEx5LFxuICBoYXNoOiBleSxcbiAgYWRqdXN0U2NhbGFyQnl0ZXM6IF95LFxuICAvLyBkb20yXG4gIC8vIFJhdGlvIG9mIHUgdG8gdi4gQWxsb3dzIHVzIHRvIGNvbWJpbmUgaW52ZXJzaW9uIGFuZCBzcXVhcmUgcm9vdC4gVXNlcyBhbGdvIGZyb20gUkZDODAzMiA1LjEuMy5cbiAgLy8gQ29uc3RhbnQtdGltZSwgdS/iiJp2XG4gIHV2UmF0aW86IFJ5XG59LCBMaSA9IGJ5KEN5KTtcbnZhciBjbyA9IHsgZXhwb3J0czoge30gfTtcbmNvbnN0IGt5ID0ge30sIER5ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5mcmVlemUoLyogQF9fUFVSRV9fICovIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZGVmYXVsdDoga3lcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogXCJNb2R1bGVcIiB9KSksIFB5ID0gLyogQF9fUFVSRV9fICovIE5jKER5KTtcbnZhciBNeSA9IGNvLmV4cG9ydHMsIFNkO1xuZnVuY3Rpb24gdjAoKSB7XG4gIHJldHVybiBTZCB8fCAoU2QgPSAxLCAoZnVuY3Rpb24ocykge1xuICAgIChmdW5jdGlvbihlLCB0KSB7XG4gICAgICBmdW5jdGlvbiByKF8sIGcpIHtcbiAgICAgICAgaWYgKCFfKSB0aHJvdyBuZXcgRXJyb3IoZyB8fCBcIkFzc2VydGlvbiBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBuKF8sIGcpIHtcbiAgICAgICAgXy5zdXBlcl8gPSBnO1xuICAgICAgICB2YXIgeCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB9O1xuICAgICAgICB4LnByb3RvdHlwZSA9IGcucHJvdG90eXBlLCBfLnByb3RvdHlwZSA9IG5ldyB4KCksIF8ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gXztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGkoXywgZywgeCkge1xuICAgICAgICBpZiAoaS5pc0JOKF8pKVxuICAgICAgICAgIHJldHVybiBfO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy53b3JkcyA9IG51bGwsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5yZWQgPSBudWxsLCBfICE9PSBudWxsICYmICgoZyA9PT0gXCJsZVwiIHx8IGcgPT09IFwiYmVcIikgJiYgKHggPSBnLCBnID0gMTApLCB0aGlzLl9pbml0KF8gfHwgMCwgZyB8fCAxMCwgeCB8fCBcImJlXCIpKTtcbiAgICAgIH1cbiAgICAgIHR5cGVvZiBlID09IFwib2JqZWN0XCIgPyBlLmV4cG9ydHMgPSBpIDogdC5CTiA9IGksIGkuQk4gPSBpLCBpLndvcmRTaXplID0gMjY7XG4gICAgICB2YXIgbztcbiAgICAgIHRyeSB7XG4gICAgICAgIHR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB0eXBlb2Ygd2luZG93LkJ1ZmZlciA8IFwidVwiID8gbyA9IHdpbmRvdy5CdWZmZXIgOiBvID0gUHkuQnVmZmVyO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgICBpLmlzQk4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBnIGluc3RhbmNlb2YgaSA/ICEwIDogZyAhPT0gbnVsbCAmJiB0eXBlb2YgZyA9PSBcIm9iamVjdFwiICYmIGcuY29uc3RydWN0b3Iud29yZFNpemUgPT09IGkud29yZFNpemUgJiYgQXJyYXkuaXNBcnJheShnLndvcmRzKTtcbiAgICAgIH0sIGkubWF4ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gZy5jbXAoeCkgPiAwID8gZyA6IHg7XG4gICAgICB9LCBpLm1pbiA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgcmV0dXJuIGcuY21wKHgpIDwgMCA/IGcgOiB4O1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZyA9PSBcIm51bWJlclwiKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKGcsIHgsIHcpO1xuICAgICAgICBpZiAodHlwZW9mIGcgPT0gXCJvYmplY3RcIilcbiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdEFycmF5KGcsIHgsIHcpO1xuICAgICAgICB4ID09PSBcImhleFwiICYmICh4ID0gMTYpLCByKHggPT09ICh4IHwgMCkgJiYgeCA+PSAyICYmIHggPD0gMzYpLCBnID0gZy50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG4gICAgICAgIHZhciBEID0gMDtcbiAgICAgICAgZ1swXSA9PT0gXCItXCIgJiYgKEQrKywgdGhpcy5uZWdhdGl2ZSA9IDEpLCBEIDwgZy5sZW5ndGggJiYgKHggPT09IDE2ID8gdGhpcy5fcGFyc2VIZXgoZywgRCwgdykgOiAodGhpcy5fcGFyc2VCYXNlKGcsIHgsIEQpLCB3ID09PSBcImxlXCIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCB4LCB3KSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2luaXROdW1iZXIgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIGcgPCAwICYmICh0aGlzLm5lZ2F0aXZlID0gMSwgZyA9IC1nKSwgZyA8IDY3MTA4ODY0ID8gKHRoaXMud29yZHMgPSBbZyAmIDY3MTA4ODYzXSwgdGhpcy5sZW5ndGggPSAxKSA6IGcgPCA0NTAzNTk5NjI3MzcwNDk2ID8gKHRoaXMud29yZHMgPSBbXG4gICAgICAgICAgZyAmIDY3MTA4ODYzLFxuICAgICAgICAgIGcgLyA2NzEwODg2NCAmIDY3MTA4ODYzXG4gICAgICAgIF0sIHRoaXMubGVuZ3RoID0gMikgOiAocihnIDwgOTAwNzE5OTI1NDc0MDk5MiksIHRoaXMud29yZHMgPSBbXG4gICAgICAgICAgZyAmIDY3MTA4ODYzLFxuICAgICAgICAgIGcgLyA2NzEwODg2NCAmIDY3MTA4ODYzLFxuICAgICAgICAgIDFcbiAgICAgICAgXSwgdGhpcy5sZW5ndGggPSAzKSwgdyA9PT0gXCJsZVwiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgeCwgdyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICBpZiAocih0eXBlb2YgZy5sZW5ndGggPT0gXCJudW1iZXJcIiksIGcubGVuZ3RoIDw9IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXMud29yZHMgPSBbMF0sIHRoaXMubGVuZ3RoID0gMSwgdGhpcztcbiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoZy5sZW5ndGggLyAzKSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIEQgPSAwOyBEIDwgdGhpcy5sZW5ndGg7IEQrKylcbiAgICAgICAgICB0aGlzLndvcmRzW0RdID0gMDtcbiAgICAgICAgdmFyIE8sIFUsIFYgPSAwO1xuICAgICAgICBpZiAodyA9PT0gXCJiZVwiKVxuICAgICAgICAgIGZvciAoRCA9IGcubGVuZ3RoIC0gMSwgTyA9IDA7IEQgPj0gMDsgRCAtPSAzKVxuICAgICAgICAgICAgVSA9IGdbRF0gfCBnW0QgLSAxXSA8PCA4IHwgZ1tEIC0gMl0gPDwgMTYsIHRoaXMud29yZHNbT10gfD0gVSA8PCBWICYgNjcxMDg4NjMsIHRoaXMud29yZHNbTyArIDFdID0gVSA+Pj4gMjYgLSBWICYgNjcxMDg4NjMsIFYgKz0gMjQsIFYgPj0gMjYgJiYgKFYgLT0gMjYsIE8rKyk7XG4gICAgICAgIGVsc2UgaWYgKHcgPT09IFwibGVcIilcbiAgICAgICAgICBmb3IgKEQgPSAwLCBPID0gMDsgRCA8IGcubGVuZ3RoOyBEICs9IDMpXG4gICAgICAgICAgICBVID0gZ1tEXSB8IGdbRCArIDFdIDw8IDggfCBnW0QgKyAyXSA8PCAxNiwgdGhpcy53b3Jkc1tPXSB8PSBVIDw8IFYgJiA2NzEwODg2MywgdGhpcy53b3Jkc1tPICsgMV0gPSBVID4+PiAyNiAtIFYgJiA2NzEwODg2MywgViArPSAyNCwgViA+PSAyNiAmJiAoViAtPSAyNiwgTysrKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gYShfLCBnKSB7XG4gICAgICAgIHZhciB4ID0gXy5jaGFyQ29kZUF0KGcpO1xuICAgICAgICBpZiAoeCA+PSA0OCAmJiB4IDw9IDU3KVxuICAgICAgICAgIHJldHVybiB4IC0gNDg7XG4gICAgICAgIGlmICh4ID49IDY1ICYmIHggPD0gNzApXG4gICAgICAgICAgcmV0dXJuIHggLSA1NTtcbiAgICAgICAgaWYgKHggPj0gOTcgJiYgeCA8PSAxMDIpXG4gICAgICAgICAgcmV0dXJuIHggLSA4NztcbiAgICAgICAgcighMSwgXCJJbnZhbGlkIGNoYXJhY3RlciBpbiBcIiArIF8pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbChfLCBnLCB4KSB7XG4gICAgICAgIHZhciB3ID0gYShfLCB4KTtcbiAgICAgICAgcmV0dXJuIHggLSAxID49IGcgJiYgKHcgfD0gYShfLCB4IC0gMSkgPDwgNCksIHc7XG4gICAgICB9XG4gICAgICBpLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKChnLmxlbmd0aCAtIHgpIC8gNiksIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBEID0gMDsgRCA8IHRoaXMubGVuZ3RoOyBEKyspXG4gICAgICAgICAgdGhpcy53b3Jkc1tEXSA9IDA7XG4gICAgICAgIHZhciBPID0gMCwgVSA9IDAsIFY7XG4gICAgICAgIGlmICh3ID09PSBcImJlXCIpXG4gICAgICAgICAgZm9yIChEID0gZy5sZW5ndGggLSAxOyBEID49IHg7IEQgLT0gMilcbiAgICAgICAgICAgIFYgPSBsKGcsIHgsIEQpIDw8IE8sIHRoaXMud29yZHNbVV0gfD0gViAmIDY3MTA4ODYzLCBPID49IDE4ID8gKE8gLT0gMTgsIFUgKz0gMSwgdGhpcy53b3Jkc1tVXSB8PSBWID4+PiAyNikgOiBPICs9IDg7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBMID0gZy5sZW5ndGggLSB4O1xuICAgICAgICAgIGZvciAoRCA9IEwgJSAyID09PSAwID8geCArIDEgOiB4OyBEIDwgZy5sZW5ndGg7IEQgKz0gMilcbiAgICAgICAgICAgIFYgPSBsKGcsIHgsIEQpIDw8IE8sIHRoaXMud29yZHNbVV0gfD0gViAmIDY3MTA4ODYzLCBPID49IDE4ID8gKE8gLT0gMTgsIFUgKz0gMSwgdGhpcy53b3Jkc1tVXSB8PSBWID4+PiAyNikgOiBPICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBjKF8sIGcsIHgsIHcpIHtcbiAgICAgICAgZm9yICh2YXIgRCA9IDAsIE8gPSAwLCBVID0gTWF0aC5taW4oXy5sZW5ndGgsIHgpLCBWID0gZzsgViA8IFU7IFYrKykge1xuICAgICAgICAgIHZhciBMID0gXy5jaGFyQ29kZUF0KFYpIC0gNDg7XG4gICAgICAgICAgRCAqPSB3LCBMID49IDQ5ID8gTyA9IEwgLSA0OSArIDEwIDogTCA+PSAxNyA/IE8gPSBMIC0gMTcgKyAxMCA6IE8gPSBMLCByKEwgPj0gMCAmJiBPIDwgdywgXCJJbnZhbGlkIGNoYXJhY3RlclwiKSwgRCArPSBPO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEO1xuICAgICAgfVxuICAgICAgaS5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uKGcsIHgsIHcpIHtcbiAgICAgICAgdGhpcy53b3JkcyA9IFswXSwgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgICBmb3IgKHZhciBEID0gMCwgTyA9IDE7IE8gPD0gNjcxMDg4NjM7IE8gKj0geClcbiAgICAgICAgICBEKys7XG4gICAgICAgIEQtLSwgTyA9IE8gLyB4IHwgMDtcbiAgICAgICAgZm9yICh2YXIgVSA9IGcubGVuZ3RoIC0gdywgViA9IFUgJSBELCBMID0gTWF0aC5taW4oVSwgVSAtIFYpICsgdywgbSA9IDAsIHYgPSB3OyB2IDwgTDsgdiArPSBEKVxuICAgICAgICAgIG0gPSBjKGcsIHYsIHYgKyBELCB4KSwgdGhpcy5pbXVsbihPKSwgdGhpcy53b3Jkc1swXSArIG0gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbSA6IHRoaXMuX2lhZGRuKG0pO1xuICAgICAgICBpZiAoViAhPT0gMCkge1xuICAgICAgICAgIHZhciBQID0gMTtcbiAgICAgICAgICBmb3IgKG0gPSBjKGcsIHYsIGcubGVuZ3RoLCB4KSwgdiA9IDA7IHYgPCBWOyB2KyspXG4gICAgICAgICAgICBQICo9IHg7XG4gICAgICAgICAgdGhpcy5pbXVsbihQKSwgdGhpcy53b3Jkc1swXSArIG0gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbSA6IHRoaXMuX2lhZGRuKG0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oZykge1xuICAgICAgICBnLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmxlbmd0aDsgeCsrKVxuICAgICAgICAgIGcud29yZHNbeF0gPSB0aGlzLndvcmRzW3hdO1xuICAgICAgICBnLmxlbmd0aCA9IHRoaXMubGVuZ3RoLCBnLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZSwgZy5yZWQgPSB0aGlzLnJlZDtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiB1KF8sIGcpIHtcbiAgICAgICAgXy53b3JkcyA9IGcud29yZHMsIF8ubGVuZ3RoID0gZy5sZW5ndGgsIF8ubmVnYXRpdmUgPSBnLm5lZ2F0aXZlLCBfLnJlZCA9IGcucmVkO1xuICAgICAgfVxuICAgICAgaWYgKGkucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24oZykge1xuICAgICAgICB1KGcsIHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGcgPSBuZXcgaShudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weShnKSwgZztcbiAgICAgIH0sIGkucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGZvciAoOyB0aGlzLmxlbmd0aCA8IGc7IClcbiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fc3RyaXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICg7IHRoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDA7IClcbiAgICAgICAgICB0aGlzLmxlbmd0aC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDApLCB0aGlzO1xuICAgICAgfSwgdHlwZW9mIFN5bWJvbCA8IFwidVwiICYmIHR5cGVvZiBTeW1ib2wuZm9yID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpLnByb3RvdHlwZVtTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIildID0gZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgaS5wcm90b3R5cGUuaW5zcGVjdCA9IGQ7XG4gICAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgaS5wcm90b3R5cGUuaW5zcGVjdCA9IGQ7XG4gICAgICBmdW5jdGlvbiBkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucmVkID8gXCI8Qk4tUjogXCIgOiBcIjxCTjogXCIpICsgdGhpcy50b1N0cmluZygxNikgKyBcIj5cIjtcbiAgICAgIH1cbiAgICAgIHZhciBoID0gW1xuICAgICAgICBcIlwiLFxuICAgICAgICBcIjBcIixcbiAgICAgICAgXCIwMFwiLFxuICAgICAgICBcIjAwMFwiLFxuICAgICAgICBcIjAwMDBcIixcbiAgICAgICAgXCIwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIlxuICAgICAgXSwgZiA9IFtcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMjUsXG4gICAgICAgIDE2LFxuICAgICAgICAxMixcbiAgICAgICAgMTEsXG4gICAgICAgIDEwLFxuICAgICAgICA5LFxuICAgICAgICA4LFxuICAgICAgICA4LFxuICAgICAgICA3LFxuICAgICAgICA3LFxuICAgICAgICA3LFxuICAgICAgICA3LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1XG4gICAgICBdLCBwID0gW1xuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAzMzU1NDQzMixcbiAgICAgICAgNDMwNDY3MjEsXG4gICAgICAgIDE2Nzc3MjE2LFxuICAgICAgICA0ODgyODEyNSxcbiAgICAgICAgNjA0NjYxNzYsXG4gICAgICAgIDQwMzUzNjA3LFxuICAgICAgICAxNjc3NzIxNixcbiAgICAgICAgNDMwNDY3MjEsXG4gICAgICAgIDFlNyxcbiAgICAgICAgMTk0ODcxNzEsXG4gICAgICAgIDM1ODMxODA4LFxuICAgICAgICA2Mjc0ODUxNyxcbiAgICAgICAgNzUyOTUzNixcbiAgICAgICAgMTEzOTA2MjUsXG4gICAgICAgIDE2Nzc3MjE2LFxuICAgICAgICAyNDEzNzU2OSxcbiAgICAgICAgMzQwMTIyMjQsXG4gICAgICAgIDQ3MDQ1ODgxLFxuICAgICAgICA2NGU2LFxuICAgICAgICA0MDg0MTAxLFxuICAgICAgICA1MTUzNjMyLFxuICAgICAgICA2NDM2MzQzLFxuICAgICAgICA3OTYyNjI0LFxuICAgICAgICA5NzY1NjI1LFxuICAgICAgICAxMTg4MTM3NixcbiAgICAgICAgMTQzNDg5MDcsXG4gICAgICAgIDE3MjEwMzY4LFxuICAgICAgICAyMDUxMTE0OSxcbiAgICAgICAgMjQzZTUsXG4gICAgICAgIDI4NjI5MTUxLFxuICAgICAgICAzMzU1NDQzMixcbiAgICAgICAgMzkxMzUzOTMsXG4gICAgICAgIDQ1NDM1NDI0LFxuICAgICAgICA1MjUyMTg3NSxcbiAgICAgICAgNjA0NjYxNzZcbiAgICAgIF07XG4gICAgICBpLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgZyA9IGcgfHwgMTAsIHggPSB4IHwgMCB8fCAxO1xuICAgICAgICB2YXIgdztcbiAgICAgICAgaWYgKGcgPT09IDE2IHx8IGcgPT09IFwiaGV4XCIpIHtcbiAgICAgICAgICB3ID0gXCJcIjtcbiAgICAgICAgICBmb3IgKHZhciBEID0gMCwgTyA9IDAsIFUgPSAwOyBVIDwgdGhpcy5sZW5ndGg7IFUrKykge1xuICAgICAgICAgICAgdmFyIFYgPSB0aGlzLndvcmRzW1VdLCBMID0gKChWIDw8IEQgfCBPKSAmIDE2Nzc3MjE1KS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBPID0gViA+Pj4gMjQgLSBEICYgMTY3NzcyMTUsIEQgKz0gMiwgRCA+PSAyNiAmJiAoRCAtPSAyNiwgVS0tKSwgTyAhPT0gMCB8fCBVICE9PSB0aGlzLmxlbmd0aCAtIDEgPyB3ID0gaFs2IC0gTC5sZW5ndGhdICsgTCArIHcgOiB3ID0gTCArIHc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoTyAhPT0gMCAmJiAodyA9IE8udG9TdHJpbmcoMTYpICsgdyk7IHcubGVuZ3RoICUgeCAhPT0gMDsgKVxuICAgICAgICAgICAgdyA9IFwiMFwiICsgdztcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAodyA9IFwiLVwiICsgdyksIHc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGcgPT09IChnIHwgMCkgJiYgZyA+PSAyICYmIGcgPD0gMzYpIHtcbiAgICAgICAgICB2YXIgbSA9IGZbZ10sIHYgPSBwW2ddO1xuICAgICAgICAgIHcgPSBcIlwiO1xuICAgICAgICAgIHZhciBQID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICAgIGZvciAoUC5uZWdhdGl2ZSA9IDA7ICFQLmlzWmVybygpOyApIHtcbiAgICAgICAgICAgIHZhciBOID0gUC5tb2Rybih2KS50b1N0cmluZyhnKTtcbiAgICAgICAgICAgIFAgPSBQLmlkaXZuKHYpLCBQLmlzWmVybygpID8gdyA9IE4gKyB3IDogdyA9IGhbbSAtIE4ubGVuZ3RoXSArIE4gKyB3O1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHRoaXMuaXNaZXJvKCkgJiYgKHcgPSBcIjBcIiArIHcpOyB3Lmxlbmd0aCAlIHggIT09IDA7IClcbiAgICAgICAgICAgIHcgPSBcIjBcIiArIHc7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgKHcgPSBcIi1cIiArIHcpLCB3O1xuICAgICAgICB9XG4gICAgICAgIHIoITEsIFwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNlwiKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gdGhpcy53b3Jkc1swXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAyID8gZyArPSB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAxID8gZyArPSA0NTAzNTk5NjI3MzcwNDk2ICsgdGhpcy53b3Jkc1sxXSAqIDY3MTA4ODY0IDogdGhpcy5sZW5ndGggPiAyICYmIHIoITEsIFwiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzXCIpLCB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWcgOiBnO1xuICAgICAgfSwgaS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2LCAyKTtcbiAgICAgIH0sIG8gJiYgKGkucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShvLCBnLCB4KTtcbiAgICAgIH0pLCBpLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgZywgeCk7XG4gICAgICB9O1xuICAgICAgdmFyIHkgPSBmdW5jdGlvbihnLCB4KSB7XG4gICAgICAgIHJldHVybiBnLmFsbG9jVW5zYWZlID8gZy5hbGxvY1Vuc2FmZSh4KSA6IG5ldyBnKHgpO1xuICAgICAgfTtcbiAgICAgIGkucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICB0aGlzLl9zdHJpcCgpO1xuICAgICAgICB2YXIgRCA9IHRoaXMuYnl0ZUxlbmd0aCgpLCBPID0gdyB8fCBNYXRoLm1heCgxLCBEKTtcbiAgICAgICAgcihEIDw9IE8sIFwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aFwiKSwgcihPID4gMCwgXCJSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDBcIik7XG4gICAgICAgIHZhciBVID0geShnLCBPKSwgViA9IHggPT09IFwibGVcIiA/IFwiTEVcIiA6IFwiQkVcIjtcbiAgICAgICAgcmV0dXJuIHRoaXNbXCJfdG9BcnJheUxpa2VcIiArIFZdKFUsIEQpLCBVO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3RvQXJyYXlMaWtlTEUgPSBmdW5jdGlvbihnLCB4KSB7XG4gICAgICAgIGZvciAodmFyIHcgPSAwLCBEID0gMCwgTyA9IDAsIFUgPSAwOyBPIDwgdGhpcy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgIHZhciBWID0gdGhpcy53b3Jkc1tPXSA8PCBVIHwgRDtcbiAgICAgICAgICBnW3crK10gPSBWICYgMjU1LCB3IDwgZy5sZW5ndGggJiYgKGdbdysrXSA9IFYgPj4gOCAmIDI1NSksIHcgPCBnLmxlbmd0aCAmJiAoZ1t3KytdID0gViA+PiAxNiAmIDI1NSksIFUgPT09IDYgPyAodyA8IGcubGVuZ3RoICYmIChnW3crK10gPSBWID4+IDI0ICYgMjU1KSwgRCA9IDAsIFUgPSAwKSA6IChEID0gViA+Pj4gMjQsIFUgKz0gMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHcgPCBnLmxlbmd0aClcbiAgICAgICAgICBmb3IgKGdbdysrXSA9IEQ7IHcgPCBnLmxlbmd0aDsgKVxuICAgICAgICAgICAgZ1t3KytdID0gMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLl90b0FycmF5TGlrZUJFID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICBmb3IgKHZhciB3ID0gZy5sZW5ndGggLSAxLCBEID0gMCwgTyA9IDAsIFUgPSAwOyBPIDwgdGhpcy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgIHZhciBWID0gdGhpcy53b3Jkc1tPXSA8PCBVIHwgRDtcbiAgICAgICAgICBnW3ctLV0gPSBWICYgMjU1LCB3ID49IDAgJiYgKGdbdy0tXSA9IFYgPj4gOCAmIDI1NSksIHcgPj0gMCAmJiAoZ1t3LS1dID0gViA+PiAxNiAmIDI1NSksIFUgPT09IDYgPyAodyA+PSAwICYmIChnW3ctLV0gPSBWID4+IDI0ICYgMjU1KSwgRCA9IDAsIFUgPSAwKSA6IChEID0gViA+Pj4gMjQsIFUgKz0gMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHcgPj0gMClcbiAgICAgICAgICBmb3IgKGdbdy0tXSA9IEQ7IHcgPj0gMDsgKVxuICAgICAgICAgICAgZ1t3LS1dID0gMDtcbiAgICAgIH0sIE1hdGguY2x6MzIgPyBpLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKGcpO1xuICAgICAgfSA6IGkucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4ID0gZywgdyA9IDA7XG4gICAgICAgIHJldHVybiB4ID49IDQwOTYgJiYgKHcgKz0gMTMsIHggPj4+PSAxMyksIHggPj0gNjQgJiYgKHcgKz0gNywgeCA+Pj49IDcpLCB4ID49IDggJiYgKHcgKz0gNCwgeCA+Pj49IDQpLCB4ID49IDIgJiYgKHcgKz0gMiwgeCA+Pj49IDIpLCB3ICsgeDtcbiAgICAgIH0sIGkucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKGcgPT09IDApIHJldHVybiAyNjtcbiAgICAgICAgdmFyIHggPSBnLCB3ID0gMDtcbiAgICAgICAgcmV0dXJuICh4ICYgODE5MSkgPT09IDAgJiYgKHcgKz0gMTMsIHggPj4+PSAxMyksICh4ICYgMTI3KSA9PT0gMCAmJiAodyArPSA3LCB4ID4+Pj0gNyksICh4ICYgMTUpID09PSAwICYmICh3ICs9IDQsIHggPj4+PSA0KSwgKHggJiAzKSA9PT0gMCAmJiAodyArPSAyLCB4ID4+Pj0gMiksICh4ICYgMSkgPT09IDAgJiYgdysrLCB3O1xuICAgICAgfSwgaS5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdLCB4ID0gdGhpcy5fY291bnRCaXRzKGcpO1xuICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIHg7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gRShfKSB7XG4gICAgICAgIGZvciAodmFyIGcgPSBuZXcgQXJyYXkoXy5iaXRMZW5ndGgoKSksIHggPSAwOyB4IDwgZy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgIHZhciB3ID0geCAvIDI2IHwgMCwgRCA9IHggJSAyNjtcbiAgICAgICAgICBnW3hdID0gXy53b3Jkc1t3XSA+Pj4gRCAmIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGc7XG4gICAgICB9XG4gICAgICBpLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIDA7XG4gICAgICAgIGZvciAodmFyIGcgPSAwLCB4ID0gMDsgeCA8IHRoaXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICB2YXIgdyA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbeF0pO1xuICAgICAgICAgIGlmIChnICs9IHcsIHcgIT09IDI2KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZztcbiAgICAgIH0sIGkucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5hYnMoKS5pbm90bihnKS5pYWRkbigxKSA6IHRoaXMuY2xvbmUoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0bihnIC0gMSkgPyB0aGlzLm5vdG4oZykuaWFkZG4oMSkuaW5lZygpIDogdGhpcy5jbG9uZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzWmVybygpIHx8ICh0aGlzLm5lZ2F0aXZlIF49IDEpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgZm9yICg7IHRoaXMubGVuZ3RoIDwgZy5sZW5ndGg7IClcbiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBnLmxlbmd0aDsgeCsrKVxuICAgICAgICAgIHRoaXMud29yZHNbeF0gPSB0aGlzLndvcmRzW3hdIHwgZy53b3Jkc1t4XTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgZy5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1b3IoZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaW9yKGcpIDogZy5jbG9uZSgpLmlvcih0aGlzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVvcihnKSA6IGcuY2xvbmUoKS5pdW9yKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4O1xuICAgICAgICB0aGlzLmxlbmd0aCA+IGcubGVuZ3RoID8geCA9IGcgOiB4ID0gdGhpcztcbiAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB4Lmxlbmd0aDsgdysrKVxuICAgICAgICAgIHRoaXMud29yZHNbd10gPSB0aGlzLndvcmRzW3ddICYgZy53b3Jkc1t3XTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0geC5sZW5ndGgsIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGcubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdWFuZChnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFuZChnKSA6IGcuY2xvbmUoKS5pYW5kKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVhbmQoZykgOiBnLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHgsIHc7XG4gICAgICAgIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyAoeCA9IHRoaXMsIHcgPSBnKSA6ICh4ID0gZywgdyA9IHRoaXMpO1xuICAgICAgICBmb3IgKHZhciBEID0gMDsgRCA8IHcubGVuZ3RoOyBEKyspXG4gICAgICAgICAgdGhpcy53b3Jkc1tEXSA9IHgud29yZHNbRF0gXiB3LndvcmRzW0RdO1xuICAgICAgICBpZiAodGhpcyAhPT0geClcbiAgICAgICAgICBmb3IgKDsgRCA8IHgubGVuZ3RoOyBEKyspXG4gICAgICAgICAgICB0aGlzLndvcmRzW0RdID0geC53b3Jkc1tEXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0geC5sZW5ndGgsIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGcubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdXhvcihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXhvcihnKSA6IGcuY2xvbmUoKS5peG9yKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXV4b3IoZykgOiBnLmNsb25lKCkuaXV4b3IodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcih0eXBlb2YgZyA9PSBcIm51bWJlclwiICYmIGcgPj0gMCk7XG4gICAgICAgIHZhciB4ID0gTWF0aC5jZWlsKGcgLyAyNikgfCAwLCB3ID0gZyAlIDI2O1xuICAgICAgICB0aGlzLl9leHBhbmQoeCksIHcgPiAwICYmIHgtLTtcbiAgICAgICAgZm9yICh2YXIgRCA9IDA7IEQgPCB4OyBEKyspXG4gICAgICAgICAgdGhpcy53b3Jkc1tEXSA9IH50aGlzLndvcmRzW0RdICYgNjcxMDg4NjM7XG4gICAgICAgIHJldHVybiB3ID4gMCAmJiAodGhpcy53b3Jkc1tEXSA9IH50aGlzLndvcmRzW0RdICYgNjcxMDg4NjMgPj4gMjYgLSB3KSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByKHR5cGVvZiBnID09IFwibnVtYmVyXCIgJiYgZyA+PSAwKTtcbiAgICAgICAgdmFyIHcgPSBnIC8gMjYgfCAwLCBEID0gZyAlIDI2O1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kKHcgKyAxKSwgeCA/IHRoaXMud29yZHNbd10gPSB0aGlzLndvcmRzW3ddIHwgMSA8PCBEIDogdGhpcy53b3Jkc1t3XSA9IHRoaXMud29yZHNbd10gJiB+KDEgPDwgRCksIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeDtcbiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgZy5uZWdhdGl2ZSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHggPSB0aGlzLmlzdWIoZyksIHRoaXMubmVnYXRpdmUgXj0gMSwgdGhpcy5fbm9ybVNpZ24oKTtcbiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgZy5uZWdhdGl2ZSAhPT0gMClcbiAgICAgICAgICByZXR1cm4gZy5uZWdhdGl2ZSA9IDAsIHggPSB0aGlzLmlzdWIoZyksIGcubmVnYXRpdmUgPSAxLCB4Ll9ub3JtU2lnbigpO1xuICAgICAgICB2YXIgdywgRDtcbiAgICAgICAgdGhpcy5sZW5ndGggPiBnLmxlbmd0aCA/ICh3ID0gdGhpcywgRCA9IGcpIDogKHcgPSBnLCBEID0gdGhpcyk7XG4gICAgICAgIGZvciAodmFyIE8gPSAwLCBVID0gMDsgVSA8IEQubGVuZ3RoOyBVKyspXG4gICAgICAgICAgeCA9ICh3LndvcmRzW1VdIHwgMCkgKyAoRC53b3Jkc1tVXSB8IDApICsgTywgdGhpcy53b3Jkc1tVXSA9IHggJiA2NzEwODg2MywgTyA9IHggPj4+IDI2O1xuICAgICAgICBmb3IgKDsgTyAhPT0gMCAmJiBVIDwgdy5sZW5ndGg7IFUrKylcbiAgICAgICAgICB4ID0gKHcud29yZHNbVV0gfCAwKSArIE8sIHRoaXMud29yZHNbVV0gPSB4ICYgNjcxMDg4NjMsIE8gPSB4ID4+PiAyNjtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID0gdy5sZW5ndGgsIE8gIT09IDApXG4gICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBPLCB0aGlzLmxlbmd0aCsrO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB0aGlzKVxuICAgICAgICAgIGZvciAoOyBVIDwgdy5sZW5ndGg7IFUrKylcbiAgICAgICAgICAgIHRoaXMud29yZHNbVV0gPSB3LndvcmRzW1VdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHg7XG4gICAgICAgIHJldHVybiBnLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDAgPyAoZy5uZWdhdGl2ZSA9IDAsIHggPSB0aGlzLnN1YihnKSwgZy5uZWdhdGl2ZSBePSAxLCB4KSA6IGcubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/ICh0aGlzLm5lZ2F0aXZlID0gMCwgeCA9IGcuc3ViKHRoaXMpLCB0aGlzLm5lZ2F0aXZlID0gMSwgeCkgOiB0aGlzLmxlbmd0aCA+IGcubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhZGQoZykgOiBnLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmIChnLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgZy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgICAgdmFyIHggPSB0aGlzLmlhZGQoZyk7XG4gICAgICAgICAgcmV0dXJuIGcubmVnYXRpdmUgPSAxLCB4Ll9ub3JtU2lnbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGQoZyksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLl9ub3JtU2lnbigpO1xuICAgICAgICB2YXIgdyA9IHRoaXMuY21wKGcpO1xuICAgICAgICBpZiAodyA9PT0gMClcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMubGVuZ3RoID0gMSwgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXM7XG4gICAgICAgIHZhciBELCBPO1xuICAgICAgICB3ID4gMCA/IChEID0gdGhpcywgTyA9IGcpIDogKEQgPSBnLCBPID0gdGhpcyk7XG4gICAgICAgIGZvciAodmFyIFUgPSAwLCBWID0gMDsgViA8IE8ubGVuZ3RoOyBWKyspXG4gICAgICAgICAgeCA9IChELndvcmRzW1ZdIHwgMCkgLSAoTy53b3Jkc1tWXSB8IDApICsgVSwgVSA9IHggPj4gMjYsIHRoaXMud29yZHNbVl0gPSB4ICYgNjcxMDg4NjM7XG4gICAgICAgIGZvciAoOyBVICE9PSAwICYmIFYgPCBELmxlbmd0aDsgVisrKVxuICAgICAgICAgIHggPSAoRC53b3Jkc1tWXSB8IDApICsgVSwgVSA9IHggPj4gMjYsIHRoaXMud29yZHNbVl0gPSB4ICYgNjcxMDg4NjM7XG4gICAgICAgIGlmIChVID09PSAwICYmIFYgPCBELmxlbmd0aCAmJiBEICE9PSB0aGlzKVxuICAgICAgICAgIGZvciAoOyBWIDwgRC5sZW5ndGg7IFYrKylcbiAgICAgICAgICAgIHRoaXMud29yZHNbVl0gPSBELndvcmRzW1ZdO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgViksIEQgIT09IHRoaXMgJiYgKHRoaXMubmVnYXRpdmUgPSAxKSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKGcpO1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGIoXywgZywgeCkge1xuICAgICAgICB4Lm5lZ2F0aXZlID0gZy5uZWdhdGl2ZSBeIF8ubmVnYXRpdmU7XG4gICAgICAgIHZhciB3ID0gXy5sZW5ndGggKyBnLmxlbmd0aCB8IDA7XG4gICAgICAgIHgubGVuZ3RoID0gdywgdyA9IHcgLSAxIHwgMDtcbiAgICAgICAgdmFyIEQgPSBfLndvcmRzWzBdIHwgMCwgTyA9IGcud29yZHNbMF0gfCAwLCBVID0gRCAqIE8sIFYgPSBVICYgNjcxMDg4NjMsIEwgPSBVIC8gNjcxMDg4NjQgfCAwO1xuICAgICAgICB4LndvcmRzWzBdID0gVjtcbiAgICAgICAgZm9yICh2YXIgbSA9IDE7IG0gPCB3OyBtKyspIHtcbiAgICAgICAgICBmb3IgKHZhciB2ID0gTCA+Pj4gMjYsIFAgPSBMICYgNjcxMDg4NjMsIE4gPSBNYXRoLm1pbihtLCBnLmxlbmd0aCAtIDEpLCBZID0gTWF0aC5tYXgoMCwgbSAtIF8ubGVuZ3RoICsgMSk7IFkgPD0gTjsgWSsrKSB7XG4gICAgICAgICAgICB2YXIgZWUgPSBtIC0gWSB8IDA7XG4gICAgICAgICAgICBEID0gXy53b3Jkc1tlZV0gfCAwLCBPID0gZy53b3Jkc1tZXSB8IDAsIFUgPSBEICogTyArIFAsIHYgKz0gVSAvIDY3MTA4ODY0IHwgMCwgUCA9IFUgJiA2NzEwODg2MztcbiAgICAgICAgICB9XG4gICAgICAgICAgeC53b3Jkc1ttXSA9IFAgfCAwLCBMID0gdiB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEwgIT09IDAgPyB4LndvcmRzW21dID0gTCB8IDAgOiB4Lmxlbmd0aC0tLCB4Ll9zdHJpcCgpO1xuICAgICAgfVxuICAgICAgdmFyIFIgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIHZhciBEID0gZy53b3JkcywgTyA9IHgud29yZHMsIFUgPSB3LndvcmRzLCBWID0gMCwgTCwgbSwgdiwgUCA9IERbMF0gfCAwLCBOID0gUCAmIDgxOTEsIFkgPSBQID4+PiAxMywgZWUgPSBEWzFdIHwgMCwgaWUgPSBlZSAmIDgxOTEsIGxlID0gZWUgPj4+IDEzLCBUZSA9IERbMl0gfCAwLCBEZSA9IFRlICYgODE5MSwgemUgPSBUZSA+Pj4gMTMsIF9lID0gRFszXSB8IDAsIHhlID0gX2UgJiA4MTkxLCBCZSA9IF9lID4+PiAxMywgeWUgPSBEWzRdIHwgMCwgYmUgPSB5ZSAmIDgxOTEsIEZlID0geWUgPj4+IDEzLCBYZSA9IERbNV0gfCAwLCB3ZSA9IFhlICYgODE5MSwgTmUgPSBYZSA+Pj4gMTMsIGR0ID0gRFs2XSB8IDAsIEplID0gZHQgJiA4MTkxLCBRZSA9IGR0ID4+PiAxMywgaXQgPSBEWzddIHwgMCwgamUgPSBpdCAmIDgxOTEsIEIgPSBpdCA+Pj4gMTMsIFMgPSBEWzhdIHwgMCwgVCA9IFMgJiA4MTkxLCBHID0gUyA+Pj4gMTMsIFogPSBEWzldIHwgMCwgUSA9IFogJiA4MTkxLCBzZSA9IFogPj4+IDEzLCBVZSA9IE9bMF0gfCAwLCBQZSA9IFVlICYgODE5MSwgTGUgPSBVZSA+Pj4gMTMsIGN0ID0gT1sxXSB8IDAsIEFlID0gY3QgJiA4MTkxLCBUdCA9IGN0ID4+PiAxMywgVXUgPSBPWzJdIHwgMCwgd3QgPSBVdSAmIDgxOTEsIEF0ID0gVXUgPj4+IDEzLCAkdSA9IE9bM10gfCAwLCBJdCA9ICR1ICYgODE5MSwgX3QgPSAkdSA+Pj4gMTMsIEd1ID0gT1s0XSB8IDAsIFJ0ID0gR3UgJiA4MTkxLCBMdCA9IEd1ID4+PiAxMywgVnUgPSBPWzVdIHwgMCwgQ3QgPSBWdSAmIDgxOTEsIGt0ID0gVnUgPj4+IDEzLCBqdSA9IE9bNl0gfCAwLCBEdCA9IGp1ICYgODE5MSwgUHQgPSBqdSA+Pj4gMTMsIEt1ID0gT1s3XSB8IDAsIE10ID0gS3UgJiA4MTkxLCBPdCA9IEt1ID4+PiAxMywgSHUgPSBPWzhdIHwgMCwgQnQgPSBIdSAmIDgxOTEsIEZ0ID0gSHUgPj4+IDEzLCBxdSA9IE9bOV0gfCAwLCBOdCA9IHF1ICYgODE5MSwgVXQgPSBxdSA+Pj4gMTM7XG4gICAgICAgIHcubmVnYXRpdmUgPSBnLm5lZ2F0aXZlIF4geC5uZWdhdGl2ZSwgdy5sZW5ndGggPSAxOSwgTCA9IE1hdGguaW11bChOLCBQZSksIG0gPSBNYXRoLmltdWwoTiwgTGUpLCBtID0gbSArIE1hdGguaW11bChZLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKFksIExlKTtcbiAgICAgICAgdmFyIHhhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoeGEgPj4+IDI2KSB8IDAsIHhhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKGllLCBQZSksIG0gPSBNYXRoLmltdWwoaWUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwobGUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwobGUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoTiwgQWUpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgVHQpIHwgMDtcbiAgICAgICAgdmFyIFNhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoU2EgPj4+IDI2KSB8IDAsIFNhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKERlLCBQZSksIG0gPSBNYXRoLmltdWwoRGUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoemUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoemUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoaWUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGllLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChsZSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwobGUsIFR0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKE4sIHd0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE4sIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFksIHd0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFksIEF0KSB8IDA7XG4gICAgICAgIHZhciBiYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKGJhID4+PiAyNikgfCAwLCBiYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bCh4ZSwgUGUpLCBtID0gTWF0aC5pbXVsKHhlLCBMZSksIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKEJlLCBMZSksIEwgPSBMICsgTWF0aC5pbXVsKERlLCBBZSkgfCAwLCBtID0gbSArIE1hdGguaW11bChEZSwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoemUsIEFlKSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKHplLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChpZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoaWUsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGxlLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChsZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoTiwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgX3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgX3QpIHwgMDtcbiAgICAgICAgdmFyIFRhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoVGEgPj4+IDI2KSB8IDAsIFRhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKGJlLCBQZSksIG0gPSBNYXRoLmltdWwoYmUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoRmUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoeGUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHhlLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCZSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoQmUsIFR0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKERlLCB3dCkgfCAwLCBtID0gbSArIE1hdGguaW11bChEZSwgQXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoemUsIHd0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKHplLCBBdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChpZSwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoaWUsIF90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGxlLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChsZSwgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoTiwgUnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgUnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgTHQpIHwgMDtcbiAgICAgICAgdmFyIHdhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAod2EgPj4+IDI2KSB8IDAsIHdhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKHdlLCBQZSksIG0gPSBNYXRoLmltdWwod2UsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoTmUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoTmUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoYmUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGJlLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChGZSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRmUsIFR0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKHhlLCB3dCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh4ZSwgQXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoQmUsIHd0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEJlLCBBdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChEZSwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRGUsIF90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHplLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bCh6ZSwgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoaWUsIFJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGllLCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChsZSwgUnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwobGUsIEx0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKE4sIEN0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE4sIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFksIEN0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFksIGt0KSB8IDA7XG4gICAgICAgIHZhciBBYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKEFhID4+PiAyNikgfCAwLCBBYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChKZSwgUGUpLCBtID0gTWF0aC5pbXVsKEplLCBMZSksIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKFFlLCBMZSksIEwgPSBMICsgTWF0aC5pbXVsKHdlLCBBZSkgfCAwLCBtID0gbSArIE1hdGguaW11bCh3ZSwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTmUsIEFlKSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKE5lLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChiZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoYmUsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEZlLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChGZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoeGUsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHhlLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCZSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoQmUsIF90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKERlLCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChEZSwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoemUsIFJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKHplLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChpZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoaWUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGxlLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChsZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoTiwgRHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgUHQpIHwgMDtcbiAgICAgICAgdmFyIElhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoSWEgPj4+IDI2KSB8IDAsIElhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKGplLCBQZSksIG0gPSBNYXRoLmltdWwoamUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoQiwgUGUpIHwgMCwgdiA9IE1hdGguaW11bChCLCBMZSksIEwgPSBMICsgTWF0aC5pbXVsKEplLCBBZSkgfCAwLCBtID0gbSArIE1hdGguaW11bChKZSwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoUWUsIEFlKSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFFlLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh3ZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwod2UsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE5lLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChOZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoYmUsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGJlLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChGZSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRmUsIF90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKHhlLCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh4ZSwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoQmUsIFJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEJlLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChEZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRGUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHplLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bCh6ZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoaWUsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGllLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChsZSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwobGUsIFB0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKE4sIE10KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE4sIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFksIE10KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFksIE90KSB8IDA7XG4gICAgICAgIHZhciBfYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKF9hID4+PiAyNikgfCAwLCBfYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChULCBQZSksIG0gPSBNYXRoLmltdWwoVCwgTGUpLCBtID0gbSArIE1hdGguaW11bChHLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKEcsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoamUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBBZSkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIF90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIFJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIFB0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGllLCBNdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChpZSwgT3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwobGUsIE10KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKGxlLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChOLCBCdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChZLCBCdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChZLCBGdCkgfCAwO1xuICAgICAgICB2YXIgUmEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChSYSA+Pj4gMjYpIHwgMCwgUmEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgUGUpLCBtID0gTWF0aC5pbXVsKFEsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgQWUpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgVHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIHd0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBBdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBBdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIF90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIFJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgUnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIEx0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBDdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwga3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIEN0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBrdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgRHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIFB0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBEdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwgUHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIE10KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBPdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgTXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIE90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGllLCBCdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChpZSwgRnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwobGUsIEJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKGxlLCBGdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChOLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChZLCBOdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChZLCBVdCkgfCAwO1xuICAgICAgICB2YXIgTGEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChMYSA+Pj4gMjYpIHwgMCwgTGEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgQWUpLCBtID0gTWF0aC5pbXVsKFEsIFR0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIEFlKSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIFR0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgQXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgd3QpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBfdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgUnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIEx0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBSdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgTHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIEN0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBrdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgQ3QpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIGt0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBEdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIER0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBQdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgTXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwgT3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIEJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGllLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChpZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwobGUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKGxlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgQ2EgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChDYSA+Pj4gMjYpIHwgMCwgQ2EgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgd3QpLCBtID0gTWF0aC5pbXVsKFEsIEF0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIHd0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIEF0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgX3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIFJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBSdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIFB0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBNdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgT3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIE10KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIEZ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBCdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwgRnQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIE50KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgTnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIFV0KSB8IDA7XG4gICAgICAgIHZhciBrYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKGthID4+PiAyNikgfCAwLCBrYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChRLCBJdCksIG0gPSBNYXRoLmltdWwoUSwgX3QpLCBtID0gbSArIE1hdGguaW11bChzZSwgSXQpIHwgMCwgdiA9IE1hdGguaW11bChzZSwgX3QpLCBMID0gTCArIE1hdGguaW11bChULCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChULCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChHLCBSdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChHLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChqZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoamUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEIsIEN0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEIsIGt0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKEplLCBEdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChKZSwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoUWUsIER0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFFlLCBQdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh3ZSwgTXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwod2UsIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE5lLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChOZSwgT3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoYmUsIEJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGJlLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChGZSwgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRmUsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKHhlLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh4ZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoQmUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEJlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgRGEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChEYSA+Pj4gMjYpIHwgMCwgRGEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgUnQpLCBtID0gTWF0aC5pbXVsKFEsIEx0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIFJ0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIEx0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwga3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgQ3QpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBEdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBQdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgTXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgT3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIEJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgUGEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChQYSA+Pj4gMjYpIHwgMCwgUGEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgQ3QpLCBtID0gTWF0aC5pbXVsKFEsIGt0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIEN0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIGt0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgRHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgUHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIE10KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBPdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIEZ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBCdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgRnQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIE50KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgTnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIFV0KSB8IDA7XG4gICAgICAgIHZhciBNYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKE1hID4+PiAyNikgfCAwLCBNYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChRLCBEdCksIG0gPSBNYXRoLmltdWwoUSwgUHQpLCBtID0gbSArIE1hdGguaW11bChzZSwgRHQpIHwgMCwgdiA9IE1hdGguaW11bChzZSwgUHQpLCBMID0gTCArIE1hdGguaW11bChULCBNdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChULCBPdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChHLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChHLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChqZSwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoamUsIEZ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEIsIEJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEIsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKEplLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChKZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoUWUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFFlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgT2EgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChPYSA+Pj4gMjYpIHwgMCwgT2EgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgTXQpLCBtID0gTWF0aC5pbXVsKFEsIE90KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIE10KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIE90KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgRnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgRnQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIE50KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBOdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBVdCkgfCAwO1xuICAgICAgICB2YXIgQmEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChCYSA+Pj4gMjYpIHwgMCwgQmEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgQnQpLCBtID0gTWF0aC5pbXVsKFEsIEZ0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIEJ0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIEZ0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgTnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgTnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgVXQpIHwgMDtcbiAgICAgICAgdmFyIEZhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoRmEgPj4+IDI2KSB8IDAsIEZhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKFEsIE50KSwgbSA9IE1hdGguaW11bChRLCBVdCksIG0gPSBtICsgTWF0aC5pbXVsKHNlLCBOdCkgfCAwLCB2ID0gTWF0aC5pbXVsKHNlLCBVdCk7XG4gICAgICAgIHZhciBOYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgcmV0dXJuIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChOYSA+Pj4gMjYpIHwgMCwgTmEgJj0gNjcxMDg4NjMsIFVbMF0gPSB4YSwgVVsxXSA9IFNhLCBVWzJdID0gYmEsIFVbM10gPSBUYSwgVVs0XSA9IHdhLCBVWzVdID0gQWEsIFVbNl0gPSBJYSwgVVs3XSA9IF9hLCBVWzhdID0gUmEsIFVbOV0gPSBMYSwgVVsxMF0gPSBDYSwgVVsxMV0gPSBrYSwgVVsxMl0gPSBEYSwgVVsxM10gPSBQYSwgVVsxNF0gPSBNYSwgVVsxNV0gPSBPYSwgVVsxNl0gPSBCYSwgVVsxN10gPSBGYSwgVVsxOF0gPSBOYSwgViAhPT0gMCAmJiAoVVsxOV0gPSBWLCB3Lmxlbmd0aCsrKSwgdztcbiAgICAgIH07XG4gICAgICBNYXRoLmltdWwgfHwgKFIgPSBiKTtcbiAgICAgIGZ1bmN0aW9uIEEoXywgZywgeCkge1xuICAgICAgICB4Lm5lZ2F0aXZlID0gZy5uZWdhdGl2ZSBeIF8ubmVnYXRpdmUsIHgubGVuZ3RoID0gXy5sZW5ndGggKyBnLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgdyA9IDAsIEQgPSAwLCBPID0gMDsgTyA8IHgubGVuZ3RoIC0gMTsgTysrKSB7XG4gICAgICAgICAgdmFyIFUgPSBEO1xuICAgICAgICAgIEQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIFYgPSB3ICYgNjcxMDg4NjMsIEwgPSBNYXRoLm1pbihPLCBnLmxlbmd0aCAtIDEpLCBtID0gTWF0aC5tYXgoMCwgTyAtIF8ubGVuZ3RoICsgMSk7IG0gPD0gTDsgbSsrKSB7XG4gICAgICAgICAgICB2YXIgdiA9IE8gLSBtLCBQID0gXy53b3Jkc1t2XSB8IDAsIE4gPSBnLndvcmRzW21dIHwgMCwgWSA9IFAgKiBOLCBlZSA9IFkgJiA2NzEwODg2MztcbiAgICAgICAgICAgIFUgPSBVICsgKFkgLyA2NzEwODg2NCB8IDApIHwgMCwgZWUgPSBlZSArIFYgfCAwLCBWID0gZWUgJiA2NzEwODg2MywgVSA9IFUgKyAoZWUgPj4+IDI2KSB8IDAsIEQgKz0gVSA+Pj4gMjYsIFUgJj0gNjcxMDg4NjM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHgud29yZHNbT10gPSBWLCB3ID0gVSwgVSA9IEQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHcgIT09IDAgPyB4LndvcmRzW09dID0gdyA6IHgubGVuZ3RoLS0sIHguX3N0cmlwKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBGKF8sIGcsIHgpIHtcbiAgICAgICAgcmV0dXJuIEEoXywgZywgeCk7XG4gICAgICB9XG4gICAgICBpLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdmFyIHcsIEQgPSB0aGlzLmxlbmd0aCArIGcubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEwICYmIGcubGVuZ3RoID09PSAxMCA/IHcgPSBSKHRoaXMsIGcsIHgpIDogRCA8IDYzID8gdyA9IGIodGhpcywgZywgeCkgOiBEIDwgMTAyNCA/IHcgPSBBKHRoaXMsIGcsIHgpIDogdyA9IEYodGhpcywgZywgeCksIHc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4ID0gbmV3IGkobnVsbCk7XG4gICAgICAgIHJldHVybiB4LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgZy5sZW5ndGgpLCB0aGlzLm11bFRvKGcsIHgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBuZXcgaShudWxsKTtcbiAgICAgICAgcmV0dXJuIHgud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBnLmxlbmd0aCksIEYodGhpcywgZywgeCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKGcsIHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4ID0gZyA8IDA7XG4gICAgICAgIHggJiYgKGcgPSAtZyksIHIodHlwZW9mIGcgPT0gXCJudW1iZXJcIiksIHIoZyA8IDY3MTA4ODY0KTtcbiAgICAgICAgZm9yICh2YXIgdyA9IDAsIEQgPSAwOyBEIDwgdGhpcy5sZW5ndGg7IEQrKykge1xuICAgICAgICAgIHZhciBPID0gKHRoaXMud29yZHNbRF0gfCAwKSAqIGcsIFUgPSAoTyAmIDY3MTA4ODYzKSArICh3ICYgNjcxMDg4NjMpO1xuICAgICAgICAgIHcgPj49IDI2LCB3ICs9IE8gLyA2NzEwODg2NCB8IDAsIHcgKz0gVSA+Pj4gMjYsIHRoaXMud29yZHNbRF0gPSBVICYgNjcxMDg4NjM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHcgIT09IDAgJiYgKHRoaXMud29yZHNbRF0gPSB3LCB0aGlzLmxlbmd0aCsrKSwgdGhpcy5sZW5ndGggPSBnID09PSAwID8gMSA6IHRoaXMubGVuZ3RoLCB4ID8gdGhpcy5pbmVnKCkgOiB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBFKGcpO1xuICAgICAgICBpZiAoeC5sZW5ndGggPT09IDApIHJldHVybiBuZXcgaSgxKTtcbiAgICAgICAgZm9yICh2YXIgdyA9IHRoaXMsIEQgPSAwOyBEIDwgeC5sZW5ndGggJiYgeFtEXSA9PT0gMDsgRCsrLCB3ID0gdy5zcXIoKSlcbiAgICAgICAgICA7XG4gICAgICAgIGlmICgrK0QgPCB4Lmxlbmd0aClcbiAgICAgICAgICBmb3IgKHZhciBPID0gdy5zcXIoKTsgRCA8IHgubGVuZ3RoOyBEKyssIE8gPSBPLnNxcigpKVxuICAgICAgICAgICAgeFtEXSAhPT0gMCAmJiAodyA9IHcubXVsKE8pKTtcbiAgICAgICAgcmV0dXJuIHc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHIodHlwZW9mIGcgPT0gXCJudW1iZXJcIiAmJiBnID49IDApO1xuICAgICAgICB2YXIgeCA9IGcgJSAyNiwgdyA9IChnIC0geCkgLyAyNiwgRCA9IDY3MTA4ODYzID4+PiAyNiAtIHggPDwgMjYgLSB4LCBPO1xuICAgICAgICBpZiAoeCAhPT0gMCkge1xuICAgICAgICAgIHZhciBVID0gMDtcbiAgICAgICAgICBmb3IgKE8gPSAwOyBPIDwgdGhpcy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgICAgdmFyIFYgPSB0aGlzLndvcmRzW09dICYgRCwgTCA9ICh0aGlzLndvcmRzW09dIHwgMCkgLSBWIDw8IHg7XG4gICAgICAgICAgICB0aGlzLndvcmRzW09dID0gTCB8IFUsIFUgPSBWID4+PiAyNiAtIHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIFUgJiYgKHRoaXMud29yZHNbT10gPSBVLCB0aGlzLmxlbmd0aCsrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodyAhPT0gMCkge1xuICAgICAgICAgIGZvciAoTyA9IHRoaXMubGVuZ3RoIC0gMTsgTyA+PSAwOyBPLS0pXG4gICAgICAgICAgICB0aGlzLndvcmRzW08gKyB3XSA9IHRoaXMud29yZHNbT107XG4gICAgICAgICAgZm9yIChPID0gMDsgTyA8IHc7IE8rKylcbiAgICAgICAgICAgIHRoaXMud29yZHNbT10gPSAwO1xuICAgICAgICAgIHRoaXMubGVuZ3RoICs9IHc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCksIHRoaXMuaXVzaGxuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICByKHR5cGVvZiBnID09IFwibnVtYmVyXCIgJiYgZyA+PSAwKTtcbiAgICAgICAgdmFyIEQ7XG4gICAgICAgIHggPyBEID0gKHggLSB4ICUgMjYpIC8gMjYgOiBEID0gMDtcbiAgICAgICAgdmFyIE8gPSBnICUgMjYsIFUgPSBNYXRoLm1pbigoZyAtIE8pIC8gMjYsIHRoaXMubGVuZ3RoKSwgViA9IDY3MTA4ODYzIF4gNjcxMDg4NjMgPj4+IE8gPDwgTywgTCA9IHc7XG4gICAgICAgIGlmIChEIC09IFUsIEQgPSBNYXRoLm1heCgwLCBEKSwgTCkge1xuICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgVTsgbSsrKVxuICAgICAgICAgICAgTC53b3Jkc1ttXSA9IHRoaXMud29yZHNbbV07XG4gICAgICAgICAgTC5sZW5ndGggPSBVO1xuICAgICAgICB9XG4gICAgICAgIGlmIChVICE9PSAwKSBpZiAodGhpcy5sZW5ndGggPiBVKVxuICAgICAgICAgIGZvciAodGhpcy5sZW5ndGggLT0gVSwgbSA9IDA7IG0gPCB0aGlzLmxlbmd0aDsgbSsrKVxuICAgICAgICAgICAgdGhpcy53b3Jkc1ttXSA9IHRoaXMud29yZHNbbSArIFVdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICBmb3IgKG0gPSB0aGlzLmxlbmd0aCAtIDE7IG0gPj0gMCAmJiAodiAhPT0gMCB8fCBtID49IEQpOyBtLS0pIHtcbiAgICAgICAgICB2YXIgUCA9IHRoaXMud29yZHNbbV0gfCAwO1xuICAgICAgICAgIHRoaXMud29yZHNbbV0gPSB2IDw8IDI2IC0gTyB8IFAgPj4+IE8sIHYgPSBQICYgVjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTCAmJiB2ICE9PSAwICYmIChMLndvcmRzW0wubGVuZ3RoKytdID0gdiksIHRoaXMubGVuZ3RoID09PSAwICYmICh0aGlzLndvcmRzWzBdID0gMCwgdGhpcy5sZW5ndGggPSAxKSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNocm4oZywgeCwgdyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByKHR5cGVvZiBnID09IFwibnVtYmVyXCIgJiYgZyA+PSAwKTtcbiAgICAgICAgdmFyIHggPSBnICUgMjYsIHcgPSAoZyAtIHgpIC8gMjYsIEQgPSAxIDw8IHg7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSB3KSByZXR1cm4gITE7XG4gICAgICAgIHZhciBPID0gdGhpcy53b3Jkc1t3XTtcbiAgICAgICAgcmV0dXJuICEhKE8gJiBEKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcih0eXBlb2YgZyA9PSBcIm51bWJlclwiICYmIGcgPj0gMCk7XG4gICAgICAgIHZhciB4ID0gZyAlIDI2LCB3ID0gKGcgLSB4KSAvIDI2O1xuICAgICAgICBpZiAocih0aGlzLm5lZ2F0aXZlID09PSAwLCBcImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVyc1wiKSwgdGhpcy5sZW5ndGggPD0gdylcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHggIT09IDAgJiYgdysrLCB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHcsIHRoaXMubGVuZ3RoKSwgeCAhPT0gMCkge1xuICAgICAgICAgIHZhciBEID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4geCA8PCB4O1xuICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJpcCgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHR5cGVvZiBnID09IFwibnVtYmVyXCIpLCByKGcgPCA2NzEwODg2NCksIGcgPCAwID8gdGhpcy5pc3VibigtZykgOiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8PSBnID8gKHRoaXMud29yZHNbMF0gPSBnIC0gKHRoaXMud29yZHNbMF0gfCAwKSwgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMpIDogKHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlzdWJuKGcpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcykgOiB0aGlzLl9pYWRkbihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSBnO1xuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbeF0gPj0gNjcxMDg4NjQ7IHgrKylcbiAgICAgICAgICB0aGlzLndvcmRzW3hdIC09IDY3MTA4ODY0LCB4ID09PSB0aGlzLmxlbmd0aCAtIDEgPyB0aGlzLndvcmRzW3ggKyAxXSA9IDEgOiB0aGlzLndvcmRzW3ggKyAxXSsrO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgeCArIDEpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmIChyKHR5cGVvZiBnID09IFwibnVtYmVyXCIpLCByKGcgPCA2NzEwODg2NCksIGcgPCAwKSByZXR1cm4gdGhpcy5pYWRkbigtZyk7XG4gICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKVxuICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pYWRkbihnKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXM7XG4gICAgICAgIGlmICh0aGlzLndvcmRzWzBdIC09IGcsIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKVxuICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXSwgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbeF0gPCAwOyB4KyspXG4gICAgICAgICAgICB0aGlzLndvcmRzW3hdICs9IDY3MTA4ODY0LCB0aGlzLndvcmRzW3ggKyAxXSAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIHZhciBEID0gZy5sZW5ndGggKyB3LCBPO1xuICAgICAgICB0aGlzLl9leHBhbmQoRCk7XG4gICAgICAgIHZhciBVLCBWID0gMDtcbiAgICAgICAgZm9yIChPID0gMDsgTyA8IGcubGVuZ3RoOyBPKyspIHtcbiAgICAgICAgICBVID0gKHRoaXMud29yZHNbTyArIHddIHwgMCkgKyBWO1xuICAgICAgICAgIHZhciBMID0gKGcud29yZHNbT10gfCAwKSAqIHg7XG4gICAgICAgICAgVSAtPSBMICYgNjcxMDg4NjMsIFYgPSAoVSA+PiAyNikgLSAoTCAvIDY3MTA4ODY0IHwgMCksIHRoaXMud29yZHNbTyArIHddID0gVSAmIDY3MTA4ODYzO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBPIDwgdGhpcy5sZW5ndGggLSB3OyBPKyspXG4gICAgICAgICAgVSA9ICh0aGlzLndvcmRzW08gKyB3XSB8IDApICsgViwgViA9IFUgPj4gMjYsIHRoaXMud29yZHNbTyArIHddID0gVSAmIDY3MTA4ODYzO1xuICAgICAgICBpZiAoViA9PT0gMCkgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICAgIGZvciAocihWID09PSAtMSksIFYgPSAwLCBPID0gMDsgTyA8IHRoaXMubGVuZ3RoOyBPKyspXG4gICAgICAgICAgVSA9IC0odGhpcy53b3Jkc1tPXSB8IDApICsgViwgViA9IFUgPj4gMjYsIHRoaXMud29yZHNbT10gPSBVICYgNjcxMDg4NjM7XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICB2YXIgdyA9IHRoaXMubGVuZ3RoIC0gZy5sZW5ndGgsIEQgPSB0aGlzLmNsb25lKCksIE8gPSBnLCBVID0gTy53b3Jkc1tPLmxlbmd0aCAtIDFdIHwgMCwgViA9IHRoaXMuX2NvdW50Qml0cyhVKTtcbiAgICAgICAgdyA9IDI2IC0gViwgdyAhPT0gMCAmJiAoTyA9IE8udXNobG4odyksIEQuaXVzaGxuKHcpLCBVID0gTy53b3Jkc1tPLmxlbmd0aCAtIDFdIHwgMCk7XG4gICAgICAgIHZhciBMID0gRC5sZW5ndGggLSBPLmxlbmd0aCwgbTtcbiAgICAgICAgaWYgKHggIT09IFwibW9kXCIpIHtcbiAgICAgICAgICBtID0gbmV3IGkobnVsbCksIG0ubGVuZ3RoID0gTCArIDEsIG0ud29yZHMgPSBuZXcgQXJyYXkobS5sZW5ndGgpO1xuICAgICAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwgbS5sZW5ndGg7IHYrKylcbiAgICAgICAgICAgIG0ud29yZHNbdl0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBQID0gRC5jbG9uZSgpLl9pc2hsbnN1Ym11bChPLCAxLCBMKTtcbiAgICAgICAgUC5uZWdhdGl2ZSA9PT0gMCAmJiAoRCA9IFAsIG0gJiYgKG0ud29yZHNbTF0gPSAxKSk7XG4gICAgICAgIGZvciAodmFyIE4gPSBMIC0gMTsgTiA+PSAwOyBOLS0pIHtcbiAgICAgICAgICB2YXIgWSA9IChELndvcmRzW08ubGVuZ3RoICsgTl0gfCAwKSAqIDY3MTA4ODY0ICsgKEQud29yZHNbTy5sZW5ndGggKyBOIC0gMV0gfCAwKTtcbiAgICAgICAgICBmb3IgKFkgPSBNYXRoLm1pbihZIC8gVSB8IDAsIDY3MTA4ODYzKSwgRC5faXNobG5zdWJtdWwoTywgWSwgTik7IEQubmVnYXRpdmUgIT09IDA7IClcbiAgICAgICAgICAgIFktLSwgRC5uZWdhdGl2ZSA9IDAsIEQuX2lzaGxuc3VibXVsKE8sIDEsIE4pLCBELmlzWmVybygpIHx8IChELm5lZ2F0aXZlIF49IDEpO1xuICAgICAgICAgIG0gJiYgKG0ud29yZHNbTl0gPSBZKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbSAmJiBtLl9zdHJpcCgpLCBELl9zdHJpcCgpLCB4ICE9PSBcImRpdlwiICYmIHcgIT09IDAgJiYgRC5pdXNocm4odyksIHtcbiAgICAgICAgICBkaXY6IG0gfHwgbnVsbCxcbiAgICAgICAgICBtb2Q6IERcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uKGcsIHgsIHcpIHtcbiAgICAgICAgaWYgKHIoIWcuaXNaZXJvKCkpLCB0aGlzLmlzWmVybygpKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXY6IG5ldyBpKDApLFxuICAgICAgICAgICAgbW9kOiBuZXcgaSgwKVxuICAgICAgICAgIH07XG4gICAgICAgIHZhciBELCBPLCBVO1xuICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBnLm5lZ2F0aXZlID09PSAwID8gKFUgPSB0aGlzLm5lZygpLmRpdm1vZChnLCB4KSwgeCAhPT0gXCJtb2RcIiAmJiAoRCA9IFUuZGl2Lm5lZygpKSwgeCAhPT0gXCJkaXZcIiAmJiAoTyA9IFUubW9kLm5lZygpLCB3ICYmIE8ubmVnYXRpdmUgIT09IDAgJiYgTy5pYWRkKGcpKSwge1xuICAgICAgICAgIGRpdjogRCxcbiAgICAgICAgICBtb2Q6IE9cbiAgICAgICAgfSkgOiB0aGlzLm5lZ2F0aXZlID09PSAwICYmIGcubmVnYXRpdmUgIT09IDAgPyAoVSA9IHRoaXMuZGl2bW9kKGcubmVnKCksIHgpLCB4ICE9PSBcIm1vZFwiICYmIChEID0gVS5kaXYubmVnKCkpLCB7XG4gICAgICAgICAgZGl2OiBELFxuICAgICAgICAgIG1vZDogVS5tb2RcbiAgICAgICAgfSkgOiAodGhpcy5uZWdhdGl2ZSAmIGcubmVnYXRpdmUpICE9PSAwID8gKFUgPSB0aGlzLm5lZygpLmRpdm1vZChnLm5lZygpLCB4KSwgeCAhPT0gXCJkaXZcIiAmJiAoTyA9IFUubW9kLm5lZygpLCB3ICYmIE8ubmVnYXRpdmUgIT09IDAgJiYgTy5pc3ViKGcpKSwge1xuICAgICAgICAgIGRpdjogVS5kaXYsXG4gICAgICAgICAgbW9kOiBPXG4gICAgICAgIH0pIDogZy5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChnKSA8IDAgPyB7XG4gICAgICAgICAgZGl2OiBuZXcgaSgwKSxcbiAgICAgICAgICBtb2Q6IHRoaXNcbiAgICAgICAgfSA6IGcubGVuZ3RoID09PSAxID8geCA9PT0gXCJkaXZcIiA/IHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihnLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG51bGxcbiAgICAgICAgfSA6IHggPT09IFwibW9kXCIgPyB7XG4gICAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICAgIG1vZDogbmV3IGkodGhpcy5tb2RybihnLndvcmRzWzBdKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihnLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG5ldyBpKHRoaXMubW9kcm4oZy53b3Jkc1swXSkpXG4gICAgICAgIH0gOiB0aGlzLl93b3JkRGl2KGcsIHgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoZywgXCJkaXZcIiwgITEpLmRpdjtcbiAgICAgIH0sIGkucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGcsIFwibW9kXCIsICExKS5tb2Q7XG4gICAgICB9LCBpLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoZywgXCJtb2RcIiwgITApLm1vZDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IHRoaXMuZGl2bW9kKGcpO1xuICAgICAgICBpZiAoeC5tb2QuaXNaZXJvKCkpIHJldHVybiB4LmRpdjtcbiAgICAgICAgdmFyIHcgPSB4LmRpdi5uZWdhdGl2ZSAhPT0gMCA/IHgubW9kLmlzdWIoZykgOiB4Lm1vZCwgRCA9IGcudXNocm4oMSksIE8gPSBnLmFuZGxuKDEpLCBVID0gdy5jbXAoRCk7XG4gICAgICAgIHJldHVybiBVIDwgMCB8fCBPID09PSAxICYmIFUgPT09IDAgPyB4LmRpdiA6IHguZGl2Lm5lZ2F0aXZlICE9PSAwID8geC5kaXYuaXN1Ym4oMSkgOiB4LmRpdi5pYWRkbigxKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm1vZHJuID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcgPCAwO1xuICAgICAgICB4ICYmIChnID0gLWcpLCByKGcgPD0gNjcxMDg4NjMpO1xuICAgICAgICBmb3IgKHZhciB3ID0gKDEgPDwgMjYpICUgZywgRCA9IDAsIE8gPSB0aGlzLmxlbmd0aCAtIDE7IE8gPj0gMDsgTy0tKVxuICAgICAgICAgIEQgPSAodyAqIEQgKyAodGhpcy53b3Jkc1tPXSB8IDApKSAlIGc7XG4gICAgICAgIHJldHVybiB4ID8gLUQgOiBEO1xuICAgICAgfSwgaS5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kcm4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBnIDwgMDtcbiAgICAgICAgeCAmJiAoZyA9IC1nKSwgcihnIDw9IDY3MTA4ODYzKTtcbiAgICAgICAgZm9yICh2YXIgdyA9IDAsIEQgPSB0aGlzLmxlbmd0aCAtIDE7IEQgPj0gMDsgRC0tKSB7XG4gICAgICAgICAgdmFyIE8gPSAodGhpcy53b3Jkc1tEXSB8IDApICsgdyAqIDY3MTA4ODY0O1xuICAgICAgICAgIHRoaXMud29yZHNbRF0gPSBPIC8gZyB8IDAsIHcgPSBPICUgZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKSwgeCA/IHRoaXMuaW5lZygpIDogdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24oZykge1xuICAgICAgICByKGcubmVnYXRpdmUgPT09IDApLCByKCFnLmlzWmVybygpKTtcbiAgICAgICAgdmFyIHggPSB0aGlzLCB3ID0gZy5jbG9uZSgpO1xuICAgICAgICB4Lm5lZ2F0aXZlICE9PSAwID8geCA9IHgudW1vZChnKSA6IHggPSB4LmNsb25lKCk7XG4gICAgICAgIGZvciAodmFyIEQgPSBuZXcgaSgxKSwgTyA9IG5ldyBpKDApLCBVID0gbmV3IGkoMCksIFYgPSBuZXcgaSgxKSwgTCA9IDA7IHguaXNFdmVuKCkgJiYgdy5pc0V2ZW4oKTsgKVxuICAgICAgICAgIHguaXVzaHJuKDEpLCB3Lml1c2hybigxKSwgKytMO1xuICAgICAgICBmb3IgKHZhciBtID0gdy5jbG9uZSgpLCB2ID0geC5jbG9uZSgpOyAheC5pc1plcm8oKTsgKSB7XG4gICAgICAgICAgZm9yICh2YXIgUCA9IDAsIE4gPSAxOyAoeC53b3Jkc1swXSAmIE4pID09PSAwICYmIFAgPCAyNjsgKytQLCBOIDw8PSAxKSA7XG4gICAgICAgICAgaWYgKFAgPiAwKVxuICAgICAgICAgICAgZm9yICh4Lml1c2hybihQKTsgUC0tID4gMDsgKVxuICAgICAgICAgICAgICAoRC5pc09kZCgpIHx8IE8uaXNPZGQoKSkgJiYgKEQuaWFkZChtKSwgTy5pc3ViKHYpKSwgRC5pdXNocm4oMSksIE8uaXVzaHJuKDEpO1xuICAgICAgICAgIGZvciAodmFyIFkgPSAwLCBlZSA9IDE7ICh3LndvcmRzWzBdICYgZWUpID09PSAwICYmIFkgPCAyNjsgKytZLCBlZSA8PD0gMSkgO1xuICAgICAgICAgIGlmIChZID4gMClcbiAgICAgICAgICAgIGZvciAody5pdXNocm4oWSk7IFktLSA+IDA7IClcbiAgICAgICAgICAgICAgKFUuaXNPZGQoKSB8fCBWLmlzT2RkKCkpICYmIChVLmlhZGQobSksIFYuaXN1Yih2KSksIFUuaXVzaHJuKDEpLCBWLml1c2hybigxKTtcbiAgICAgICAgICB4LmNtcCh3KSA+PSAwID8gKHguaXN1Yih3KSwgRC5pc3ViKFUpLCBPLmlzdWIoVikpIDogKHcuaXN1Yih4KSwgVS5pc3ViKEQpLCBWLmlzdWIoTykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYTogVSxcbiAgICAgICAgICBiOiBWLFxuICAgICAgICAgIGdjZDogdy5pdXNobG4oTClcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcihnLm5lZ2F0aXZlID09PSAwKSwgcighZy5pc1plcm8oKSk7XG4gICAgICAgIHZhciB4ID0gdGhpcywgdyA9IGcuY2xvbmUoKTtcbiAgICAgICAgeC5uZWdhdGl2ZSAhPT0gMCA/IHggPSB4LnVtb2QoZykgOiB4ID0geC5jbG9uZSgpO1xuICAgICAgICBmb3IgKHZhciBEID0gbmV3IGkoMSksIE8gPSBuZXcgaSgwKSwgVSA9IHcuY2xvbmUoKTsgeC5jbXBuKDEpID4gMCAmJiB3LmNtcG4oMSkgPiAwOyApIHtcbiAgICAgICAgICBmb3IgKHZhciBWID0gMCwgTCA9IDE7ICh4LndvcmRzWzBdICYgTCkgPT09IDAgJiYgViA8IDI2OyArK1YsIEwgPDw9IDEpIDtcbiAgICAgICAgICBpZiAoViA+IDApXG4gICAgICAgICAgICBmb3IgKHguaXVzaHJuKFYpOyBWLS0gPiAwOyApXG4gICAgICAgICAgICAgIEQuaXNPZGQoKSAmJiBELmlhZGQoVSksIEQuaXVzaHJuKDEpO1xuICAgICAgICAgIGZvciAodmFyIG0gPSAwLCB2ID0gMTsgKHcud29yZHNbMF0gJiB2KSA9PT0gMCAmJiBtIDwgMjY7ICsrbSwgdiA8PD0gMSkgO1xuICAgICAgICAgIGlmIChtID4gMClcbiAgICAgICAgICAgIGZvciAody5pdXNocm4obSk7IG0tLSA+IDA7IClcbiAgICAgICAgICAgICAgTy5pc09kZCgpICYmIE8uaWFkZChVKSwgTy5pdXNocm4oMSk7XG4gICAgICAgICAgeC5jbXAodykgPj0gMCA/ICh4LmlzdWIodyksIEQuaXN1YihPKSkgOiAody5pc3ViKHgpLCBPLmlzdWIoRCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBQO1xuICAgICAgICByZXR1cm4geC5jbXBuKDEpID09PSAwID8gUCA9IEQgOiBQID0gTywgUC5jbXBuKDApIDwgMCAmJiBQLmlhZGQoZyksIFA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gZy5hYnMoKTtcbiAgICAgICAgaWYgKGcuaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuICAgICAgICB2YXIgeCA9IHRoaXMuY2xvbmUoKSwgdyA9IGcuY2xvbmUoKTtcbiAgICAgICAgeC5uZWdhdGl2ZSA9IDAsIHcubmVnYXRpdmUgPSAwO1xuICAgICAgICBmb3IgKHZhciBEID0gMDsgeC5pc0V2ZW4oKSAmJiB3LmlzRXZlbigpOyBEKyspXG4gICAgICAgICAgeC5pdXNocm4oMSksIHcuaXVzaHJuKDEpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgZm9yICg7IHguaXNFdmVuKCk7IClcbiAgICAgICAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgICAgIGZvciAoOyB3LmlzRXZlbigpOyApXG4gICAgICAgICAgICB3Lml1c2hybigxKTtcbiAgICAgICAgICB2YXIgTyA9IHguY21wKHcpO1xuICAgICAgICAgIGlmIChPIDwgMCkge1xuICAgICAgICAgICAgdmFyIFUgPSB4O1xuICAgICAgICAgICAgeCA9IHcsIHcgPSBVO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTyA9PT0gMCB8fCB3LmNtcG4oMSkgPT09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB4LmlzdWIodyk7XG4gICAgICAgIH0gd2hpbGUgKCEwKTtcbiAgICAgICAgcmV0dXJuIHcuaXVzaGxuKEQpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWdjZChnKS5hLnVtb2QoZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIGc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcih0eXBlb2YgZyA9PSBcIm51bWJlclwiKTtcbiAgICAgICAgdmFyIHggPSBnICUgMjYsIHcgPSAoZyAtIHgpIC8gMjYsIEQgPSAxIDw8IHg7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSB3KVxuICAgICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQodyArIDEpLCB0aGlzLndvcmRzW3ddIHw9IEQsIHRoaXM7XG4gICAgICAgIGZvciAodmFyIE8gPSBELCBVID0gdzsgTyAhPT0gMCAmJiBVIDwgdGhpcy5sZW5ndGg7IFUrKykge1xuICAgICAgICAgIHZhciBWID0gdGhpcy53b3Jkc1tVXSB8IDA7XG4gICAgICAgICAgViArPSBPLCBPID0gViA+Pj4gMjYsIFYgJj0gNjcxMDg4NjMsIHRoaXMud29yZHNbVV0gPSBWO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPICE9PSAwICYmICh0aGlzLndvcmRzW1VdID0gTywgdGhpcy5sZW5ndGgrKyksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcgPCAwO1xuICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAheCkgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiB4KSByZXR1cm4gMTtcbiAgICAgICAgdGhpcy5fc3RyaXAoKTtcbiAgICAgICAgdmFyIHc7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpXG4gICAgICAgICAgdyA9IDE7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHggJiYgKGcgPSAtZyksIHIoZyA8PSA2NzEwODg2MywgXCJOdW1iZXIgaXMgdG9vIGJpZ1wiKTtcbiAgICAgICAgICB2YXIgRCA9IHRoaXMud29yZHNbMF0gfCAwO1xuICAgICAgICAgIHcgPSBEID09PSBnID8gMCA6IEQgPCBnID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLXcgfCAwIDogdztcbiAgICAgIH0sIGkucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgZy5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBnLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcbiAgICAgICAgdmFyIHggPSB0aGlzLnVjbXAoZyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLXggfCAwIDogeDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGcubGVuZ3RoKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgZy5sZW5ndGgpIHJldHVybiAtMTtcbiAgICAgICAgZm9yICh2YXIgeCA9IDAsIHcgPSB0aGlzLmxlbmd0aCAtIDE7IHcgPj0gMDsgdy0tKSB7XG4gICAgICAgICAgdmFyIEQgPSB0aGlzLndvcmRzW3ddIHwgMCwgTyA9IGcud29yZHNbd10gfCAwO1xuICAgICAgICAgIGlmIChEICE9PSBPKSB7XG4gICAgICAgICAgICBEIDwgTyA/IHggPSAtMSA6IEQgPiBPICYmICh4ID0gMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9LCBpLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNtcG4oZykgPT09IDE7XG4gICAgICB9LCBpLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpID09PSAxO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihnKSA+PSAwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbXAoZykgPj0gMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihnKSA9PT0gLTE7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpID09PSAtMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNtcG4oZykgPD0gMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpIDw9IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNtcG4oZykgPT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpID09PSAwO1xuICAgICAgfSwgaS5yZWQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBuZXcgJChnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsIFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSwgcih0aGlzLm5lZ2F0aXZlID09PSAwLCBcInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzXCIpLCBnLmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHRcIiksIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWQgPSBnLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKCF0aGlzLnJlZCwgXCJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0XCIpLCB0aGlzLl9mb3JjZVJlZChnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsIFwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSwgdGhpcy5yZWQuYWRkKHRoaXMsIGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsIFwicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLmlhZGQodGhpcywgZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLnN1Yih0aGlzLCBnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5pc3ViKHRoaXMsIGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5zaGwodGhpcywgZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIGcpLCB0aGlzLnJlZC5tdWwodGhpcywgZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBnKSwgdGhpcy5yZWQuaW11bCh0aGlzLCBnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FyKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsIFwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pbnZtKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5uZWcodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkICYmICFnLnJlZCwgXCJyZWRQb3cobm9ybWFsTnVtKVwiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnBvdyh0aGlzLCBnKTtcbiAgICAgIH07XG4gICAgICB2YXIgTSA9IHtcbiAgICAgICAgazI1NjogbnVsbCxcbiAgICAgICAgcDIyNDogbnVsbCxcbiAgICAgICAgcDE5MjogbnVsbCxcbiAgICAgICAgcDI1NTE5OiBudWxsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gSChfLCBnKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IF8sIHRoaXMucCA9IG5ldyBpKGcsIDE2KSwgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpLCB0aGlzLmsgPSBuZXcgaSgxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7XG4gICAgICB9XG4gICAgICBILnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gbmV3IGkobnVsbCk7XG4gICAgICAgIHJldHVybiBnLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpLCBnO1xuICAgICAgfSwgSC5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBnLCB3O1xuICAgICAgICBkb1xuICAgICAgICAgIHRoaXMuc3BsaXQoeCwgdGhpcy50bXApLCB4ID0gdGhpcy5pbXVsSyh4KSwgeCA9IHguaWFkZCh0aGlzLnRtcCksIHcgPSB4LmJpdExlbmd0aCgpO1xuICAgICAgICB3aGlsZSAodyA+IHRoaXMubik7XG4gICAgICAgIHZhciBEID0gdyA8IHRoaXMubiA/IC0xIDogeC51Y21wKHRoaXMucCk7XG4gICAgICAgIHJldHVybiBEID09PSAwID8gKHgud29yZHNbMF0gPSAwLCB4Lmxlbmd0aCA9IDEpIDogRCA+IDAgPyB4LmlzdWIodGhpcy5wKSA6IHguc3RyaXAgIT09IHZvaWQgMCA/IHguc3RyaXAoKSA6IHguX3N0cmlwKCksIHg7XG4gICAgICB9LCBILnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgZy5pdXNocm4odGhpcy5uLCAwLCB4KTtcbiAgICAgIH0sIEgucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gZy5pbXVsKHRoaXMuayk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gSygpIHtcbiAgICAgICAgSC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJrMjU2XCIsXG4gICAgICAgICAgXCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBuKEssIEgpLCBLLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgZm9yICh2YXIgdyA9IDQxOTQzMDMsIEQgPSBNYXRoLm1pbihnLmxlbmd0aCwgOSksIE8gPSAwOyBPIDwgRDsgTysrKVxuICAgICAgICAgIHgud29yZHNbT10gPSBnLndvcmRzW09dO1xuICAgICAgICBpZiAoeC5sZW5ndGggPSBELCBnLmxlbmd0aCA8PSA5KSB7XG4gICAgICAgICAgZy53b3Jkc1swXSA9IDAsIGcubGVuZ3RoID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFUgPSBnLndvcmRzWzldO1xuICAgICAgICBmb3IgKHgud29yZHNbeC5sZW5ndGgrK10gPSBVICYgdywgTyA9IDEwOyBPIDwgZy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgIHZhciBWID0gZy53b3Jkc1tPXSB8IDA7XG4gICAgICAgICAgZy53b3Jkc1tPIC0gMTBdID0gKFYgJiB3KSA8PCA0IHwgVSA+Pj4gMjIsIFUgPSBWO1xuICAgICAgICB9XG4gICAgICAgIFUgPj4+PSAyMiwgZy53b3Jkc1tPIC0gMTBdID0gVSwgVSA9PT0gMCAmJiBnLmxlbmd0aCA+IDEwID8gZy5sZW5ndGggLT0gMTAgOiBnLmxlbmd0aCAtPSA5O1xuICAgICAgfSwgSy5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGcud29yZHNbZy5sZW5ndGhdID0gMCwgZy53b3Jkc1tnLmxlbmd0aCArIDFdID0gMCwgZy5sZW5ndGggKz0gMjtcbiAgICAgICAgZm9yICh2YXIgeCA9IDAsIHcgPSAwOyB3IDwgZy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgIHZhciBEID0gZy53b3Jkc1t3XSB8IDA7XG4gICAgICAgICAgeCArPSBEICogOTc3LCBnLndvcmRzW3ddID0geCAmIDY3MTA4ODYzLCB4ID0gRCAqIDY0ICsgKHggLyA2NzEwODg2NCB8IDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnLndvcmRzW2cubGVuZ3RoIC0gMV0gPT09IDAgJiYgKGcubGVuZ3RoLS0sIGcud29yZHNbZy5sZW5ndGggLSAxXSA9PT0gMCAmJiBnLmxlbmd0aC0tKSwgZztcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBqKCkge1xuICAgICAgICBILmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcInAyMjRcIixcbiAgICAgICAgICBcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG4oaiwgSCk7XG4gICAgICBmdW5jdGlvbiBDKCkge1xuICAgICAgICBILmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcInAxOTJcIixcbiAgICAgICAgICBcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG4oQywgSCk7XG4gICAgICBmdW5jdGlvbiBrKCkge1xuICAgICAgICBILmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIjI1NTE5XCIsXG4gICAgICAgICAgXCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG4oaywgSCksIGsucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oZykge1xuICAgICAgICBmb3IgKHZhciB4ID0gMCwgdyA9IDA7IHcgPCBnLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgdmFyIEQgPSAoZy53b3Jkc1t3XSB8IDApICogMTkgKyB4LCBPID0gRCAmIDY3MTA4ODYzO1xuICAgICAgICAgIEQgPj4+PSAyNiwgZy53b3Jkc1t3XSA9IE8sIHggPSBEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4ICE9PSAwICYmIChnLndvcmRzW2cubGVuZ3RoKytdID0geCksIGc7XG4gICAgICB9LCBpLl9wcmltZSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKE1bZ10pIHJldHVybiBNW2ddO1xuICAgICAgICB2YXIgeDtcbiAgICAgICAgaWYgKGcgPT09IFwiazI1NlwiKVxuICAgICAgICAgIHggPSBuZXcgSygpO1xuICAgICAgICBlbHNlIGlmIChnID09PSBcInAyMjRcIilcbiAgICAgICAgICB4ID0gbmV3IGooKTtcbiAgICAgICAgZWxzZSBpZiAoZyA9PT0gXCJwMTkyXCIpXG4gICAgICAgICAgeCA9IG5ldyBDKCk7XG4gICAgICAgIGVsc2UgaWYgKGcgPT09IFwicDI1NTE5XCIpXG4gICAgICAgICAgeCA9IG5ldyBrKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHByaW1lIFwiICsgZyk7XG4gICAgICAgIHJldHVybiBNW2ddID0geCwgeDtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiAkKF8pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB2YXIgZyA9IGkuX3ByaW1lKF8pO1xuICAgICAgICAgIHRoaXMubSA9IGcucCwgdGhpcy5wcmltZSA9IGc7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHIoXy5ndG4oMSksIFwibW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxXCIpLCB0aGlzLm0gPSBfLCB0aGlzLnByaW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgICQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24oZykge1xuICAgICAgICByKGcubmVnYXRpdmUgPT09IDAsIFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksIHIoZy5yZWQsIFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKTtcbiAgICAgIH0sICQucHJvdG90eXBlLl92ZXJpZnkyID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByKChnLm5lZ2F0aXZlIHwgeC5uZWdhdGl2ZSkgPT09IDAsIFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksIHIoXG4gICAgICAgICAgZy5yZWQgJiYgZy5yZWQgPT09IHgucmVkLFxuICAgICAgICAgIFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiXG4gICAgICAgICk7XG4gICAgICB9LCAkLnByb3RvdHlwZS5pbW9kID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmltZSA/IHRoaXMucHJpbWUuaXJlZHVjZShnKS5fZm9yY2VSZWQodGhpcykgOiAodShnLCBnLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcykpLCBnKTtcbiAgICAgIH0sICQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIGcuaXNaZXJvKCkgPyBnLmNsb25lKCkgOiB0aGlzLm0uc3ViKGcpLl9mb3JjZVJlZCh0aGlzKTtcbiAgICAgIH0sICQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5MihnLCB4KTtcbiAgICAgICAgdmFyIHcgPSBnLmFkZCh4KTtcbiAgICAgICAgcmV0dXJuIHcuY21wKHRoaXMubSkgPj0gMCAmJiB3LmlzdWIodGhpcy5tKSwgdy5fZm9yY2VSZWQodGhpcyk7XG4gICAgICB9LCAkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICB0aGlzLl92ZXJpZnkyKGcsIHgpO1xuICAgICAgICB2YXIgdyA9IGcuaWFkZCh4KTtcbiAgICAgICAgcmV0dXJuIHcuY21wKHRoaXMubSkgPj0gMCAmJiB3LmlzdWIodGhpcy5tKSwgdztcbiAgICAgIH0sICQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5MihnLCB4KTtcbiAgICAgICAgdmFyIHcgPSBnLnN1Yih4KTtcbiAgICAgICAgcmV0dXJuIHcuY21wbigwKSA8IDAgJiYgdy5pYWRkKHRoaXMubSksIHcuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgfSwgJC5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5MihnLCB4KTtcbiAgICAgICAgdmFyIHcgPSBnLmlzdWIoeCk7XG4gICAgICAgIHJldHVybiB3LmNtcG4oMCkgPCAwICYmIHcuaWFkZCh0aGlzLm0pLCB3O1xuICAgICAgfSwgJC5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MShnKSwgdGhpcy5pbW9kKGcudXNobG4oeCkpO1xuICAgICAgfSwgJC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIoZywgeCksIHRoaXMuaW1vZChnLmltdWwoeCkpO1xuICAgICAgfSwgJC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MihnLCB4KSwgdGhpcy5pbW9kKGcubXVsKHgpKTtcbiAgICAgIH0sICQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltdWwoZywgZy5jbG9uZSgpKTtcbiAgICAgIH0sICQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsKGcsIGcpO1xuICAgICAgfSwgJC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKGcuaXNaZXJvKCkpIHJldHVybiBnLmNsb25lKCk7XG4gICAgICAgIHZhciB4ID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgICAgICBpZiAocih4ICUgMiA9PT0gMSksIHggPT09IDMpIHtcbiAgICAgICAgICB2YXIgdyA9IHRoaXMubS5hZGQobmV3IGkoMSkpLml1c2hybigyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wb3coZywgdyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgRCA9IHRoaXMubS5zdWJuKDEpLCBPID0gMDsgIUQuaXNaZXJvKCkgJiYgRC5hbmRsbigxKSA9PT0gMDsgKVxuICAgICAgICAgIE8rKywgRC5pdXNocm4oMSk7XG4gICAgICAgIHIoIUQuaXNaZXJvKCkpO1xuICAgICAgICB2YXIgVSA9IG5ldyBpKDEpLnRvUmVkKHRoaXMpLCBWID0gVS5yZWROZWcoKSwgTCA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKSwgbSA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICAgICAgZm9yIChtID0gbmV3IGkoMiAqIG0gKiBtKS50b1JlZCh0aGlzKTsgdGhpcy5wb3cobSwgTCkuY21wKFYpICE9PSAwOyApXG4gICAgICAgICAgbS5yZWRJQWRkKFYpO1xuICAgICAgICBmb3IgKHZhciB2ID0gdGhpcy5wb3cobSwgRCksIFAgPSB0aGlzLnBvdyhnLCBELmFkZG4oMSkuaXVzaHJuKDEpKSwgTiA9IHRoaXMucG93KGcsIEQpLCBZID0gTzsgTi5jbXAoVSkgIT09IDA7ICkge1xuICAgICAgICAgIGZvciAodmFyIGVlID0gTiwgaWUgPSAwOyBlZS5jbXAoVSkgIT09IDA7IGllKyspXG4gICAgICAgICAgICBlZSA9IGVlLnJlZFNxcigpO1xuICAgICAgICAgIHIoaWUgPCBZKTtcbiAgICAgICAgICB2YXIgbGUgPSB0aGlzLnBvdyh2LCBuZXcgaSgxKS5pdXNobG4oWSAtIGllIC0gMSkpO1xuICAgICAgICAgIFAgPSBQLnJlZE11bChsZSksIHYgPSBsZS5yZWRTcXIoKSwgTiA9IE4ucmVkTXVsKHYpLCBZID0gaWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFA7XG4gICAgICB9LCAkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcuX2ludm1wKHRoaXMubSk7XG4gICAgICAgIHJldHVybiB4Lm5lZ2F0aXZlICE9PSAwID8gKHgubmVnYXRpdmUgPSAwLCB0aGlzLmltb2QoeCkucmVkTmVnKCkpIDogdGhpcy5pbW9kKHgpO1xuICAgICAgfSwgJC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICBpZiAoeC5pc1plcm8oKSkgcmV0dXJuIG5ldyBpKDEpLnRvUmVkKHRoaXMpO1xuICAgICAgICBpZiAoeC5jbXBuKDEpID09PSAwKSByZXR1cm4gZy5jbG9uZSgpO1xuICAgICAgICB2YXIgdyA9IDQsIEQgPSBuZXcgQXJyYXkoMSA8PCB3KTtcbiAgICAgICAgRFswXSA9IG5ldyBpKDEpLnRvUmVkKHRoaXMpLCBEWzFdID0gZztcbiAgICAgICAgZm9yICh2YXIgTyA9IDI7IE8gPCBELmxlbmd0aDsgTysrKVxuICAgICAgICAgIERbT10gPSB0aGlzLm11bChEW08gLSAxXSwgZyk7XG4gICAgICAgIHZhciBVID0gRFswXSwgViA9IDAsIEwgPSAwLCBtID0geC5iaXRMZW5ndGgoKSAlIDI2O1xuICAgICAgICBmb3IgKG0gPT09IDAgJiYgKG0gPSAyNiksIE8gPSB4Lmxlbmd0aCAtIDE7IE8gPj0gMDsgTy0tKSB7XG4gICAgICAgICAgZm9yICh2YXIgdiA9IHgud29yZHNbT10sIFAgPSBtIC0gMTsgUCA+PSAwOyBQLS0pIHtcbiAgICAgICAgICAgIHZhciBOID0gdiA+PiBQICYgMTtcbiAgICAgICAgICAgIGlmIChVICE9PSBEWzBdICYmIChVID0gdGhpcy5zcXIoVSkpLCBOID09PSAwICYmIFYgPT09IDApIHtcbiAgICAgICAgICAgICAgTCA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgViA8PD0gMSwgViB8PSBOLCBMKyssICEoTCAhPT0gdyAmJiAoTyAhPT0gMCB8fCBQICE9PSAwKSkgJiYgKFUgPSB0aGlzLm11bChVLCBEW1ZdKSwgTCA9IDAsIFYgPSAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbSA9IDI2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVO1xuICAgICAgfSwgJC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcudW1vZCh0aGlzLm0pO1xuICAgICAgICByZXR1cm4geCA9PT0gZyA/IHguY2xvbmUoKSA6IHg7XG4gICAgICB9LCAkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBnLmNsb25lKCk7XG4gICAgICAgIHJldHVybiB4LnJlZCA9IG51bGwsIHg7XG4gICAgICB9LCBpLm1vbnQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBuZXcgVyhnKTtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBXKF8pIHtcbiAgICAgICAgJC5jYWxsKHRoaXMsIF8pLCB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpLCB0aGlzLnNoaWZ0ICUgMjYgIT09IDAgJiYgKHRoaXMuc2hpZnQgKz0gMjYgLSB0aGlzLnNoaWZ0ICUgMjYpLCB0aGlzLnIgPSBuZXcgaSgxKS5pdXNobG4odGhpcy5zaGlmdCksIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKSwgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pLCB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMuciksIHRoaXMubWludiA9IHRoaXMuci5zdWIodGhpcy5taW52KTtcbiAgICAgIH1cbiAgICAgIG4oVywgJCksIFcucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1vZChnLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgICAgIH0sIFcucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IHRoaXMuaW1vZChnLm11bCh0aGlzLnJpbnYpKTtcbiAgICAgICAgcmV0dXJuIHgucmVkID0gbnVsbCwgeDtcbiAgICAgIH0sIFcucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihnLCB4KSB7XG4gICAgICAgIGlmIChnLmlzWmVybygpIHx8IHguaXNaZXJvKCkpXG4gICAgICAgICAgcmV0dXJuIGcud29yZHNbMF0gPSAwLCBnLmxlbmd0aCA9IDEsIGc7XG4gICAgICAgIHZhciB3ID0gZy5pbXVsKHgpLCBEID0gdy5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIE8gPSB3LmlzdWIoRCkuaXVzaHJuKHRoaXMuc2hpZnQpLCBVID0gTztcbiAgICAgICAgcmV0dXJuIE8uY21wKHRoaXMubSkgPj0gMCA/IFUgPSBPLmlzdWIodGhpcy5tKSA6IE8uY21wbigwKSA8IDAgJiYgKFUgPSBPLmlhZGQodGhpcy5tKSksIFUuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgfSwgVy5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICBpZiAoZy5pc1plcm8oKSB8fCB4LmlzWmVybygpKSByZXR1cm4gbmV3IGkoMCkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgICB2YXIgdyA9IGcubXVsKHgpLCBEID0gdy5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIE8gPSB3LmlzdWIoRCkuaXVzaHJuKHRoaXMuc2hpZnQpLCBVID0gTztcbiAgICAgICAgcmV0dXJuIE8uY21wKHRoaXMubSkgPj0gMCA/IFUgPSBPLmlzdWIodGhpcy5tKSA6IE8uY21wbigwKSA8IDAgJiYgKFUgPSBPLmlhZGQodGhpcy5tKSksIFUuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgfSwgVy5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLmltb2QoZy5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgICAgICByZXR1cm4geC5fZm9yY2VSZWQodGhpcyk7XG4gICAgICB9O1xuICAgIH0pKHMsIE15KTtcbiAgfSkoY28pKSwgY28uZXhwb3J0cztcbn1cbnZhciBPeSA9IHYwKCk7XG5jb25zdCBiZCA9IC8qIEBfX1BVUkVfXyAqLyBGYyhPeSk7XG52YXIgVWkgPSB7IGV4cG9ydHM6IHt9IH07XG4vKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbnZhciBUZDtcbmZ1bmN0aW9uIEJ5KCkge1xuICByZXR1cm4gVGQgfHwgKFRkID0gMSwgKGZ1bmN0aW9uKHMsIGUpIHtcbiAgICB2YXIgdCA9IEtjKCksIHIgPSB0LkJ1ZmZlcjtcbiAgICBmdW5jdGlvbiBuKG8sIGEpIHtcbiAgICAgIGZvciAodmFyIGwgaW4gbylcbiAgICAgICAgYVtsXSA9IG9bbF07XG4gICAgfVxuICAgIHIuZnJvbSAmJiByLmFsbG9jICYmIHIuYWxsb2NVbnNhZmUgJiYgci5hbGxvY1Vuc2FmZVNsb3cgPyBzLmV4cG9ydHMgPSB0IDogKG4odCwgZSksIGUuQnVmZmVyID0gaSk7XG4gICAgZnVuY3Rpb24gaShvLCBhLCBsKSB7XG4gICAgICByZXR1cm4gcihvLCBhLCBsKTtcbiAgICB9XG4gICAgaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSwgbihyLCBpKSwgaS5mcm9tID0gZnVuY3Rpb24obywgYSwgbCkge1xuICAgICAgaWYgKHR5cGVvZiBvID09IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlclwiKTtcbiAgICAgIHJldHVybiByKG8sIGEsIGwpO1xuICAgIH0sIGkuYWxsb2MgPSBmdW5jdGlvbihvLCBhLCBsKSB7XG4gICAgICBpZiAodHlwZW9mIG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7XG4gICAgICB2YXIgYyA9IHIobyk7XG4gICAgICByZXR1cm4gYSAhPT0gdm9pZCAwID8gdHlwZW9mIGwgPT0gXCJzdHJpbmdcIiA/IGMuZmlsbChhLCBsKSA6IGMuZmlsbChhKSA6IGMuZmlsbCgwKSwgYztcbiAgICB9LCBpLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24obykge1xuICAgICAgaWYgKHR5cGVvZiBvICE9IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO1xuICAgICAgcmV0dXJuIHIobyk7XG4gICAgfSwgaS5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbihvKSB7XG4gICAgICBpZiAodHlwZW9mIG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7XG4gICAgICByZXR1cm4gdC5TbG93QnVmZmVyKG8pO1xuICAgIH07XG4gIH0pKFVpLCBVaS5leHBvcnRzKSksIFVpLmV4cG9ydHM7XG59XG52YXIgemEsIHdkO1xuZnVuY3Rpb24gRTAoKSB7XG4gIGlmICh3ZCkgcmV0dXJuIHphO1xuICB3ZCA9IDE7XG4gIHZhciBzID0gQnkoKS5CdWZmZXI7XG4gIGZ1bmN0aW9uIGUodCkge1xuICAgIGlmICh0Lmxlbmd0aCA+PSAyNTUpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWxwaGFiZXQgdG9vIGxvbmdcIik7XG4gICAgZm9yICh2YXIgciA9IG5ldyBVaW50OEFycmF5KDI1NiksIG4gPSAwOyBuIDwgci5sZW5ndGg7IG4rKylcbiAgICAgIHJbbl0gPSAyNTU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbyA9IHQuY2hhckF0KGkpLCBhID0gby5jaGFyQ29kZUF0KDApO1xuICAgICAgaWYgKHJbYV0gIT09IDI1NSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihvICsgXCIgaXMgYW1iaWd1b3VzXCIpO1xuICAgICAgclthXSA9IGk7XG4gICAgfVxuICAgIHZhciBsID0gdC5sZW5ndGgsIGMgPSB0LmNoYXJBdCgwKSwgdSA9IE1hdGgubG9nKGwpIC8gTWF0aC5sb2coMjU2KSwgZCA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyhsKTtcbiAgICBmdW5jdGlvbiBoKHkpIHtcbiAgICAgIGlmICgoQXJyYXkuaXNBcnJheSh5KSB8fCB5IGluc3RhbmNlb2YgVWludDhBcnJheSkgJiYgKHkgPSBzLmZyb20oeSkpLCAhcy5pc0J1ZmZlcih5KSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIEJ1ZmZlclwiKTtcbiAgICAgIGlmICh5Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICBmb3IgKHZhciBFID0gMCwgYiA9IDAsIFIgPSAwLCBBID0geS5sZW5ndGg7IFIgIT09IEEgJiYgeVtSXSA9PT0gMDsgKVxuICAgICAgICBSKyssIEUrKztcbiAgICAgIGZvciAodmFyIEYgPSAoQSAtIFIpICogZCArIDEgPj4+IDAsIE0gPSBuZXcgVWludDhBcnJheShGKTsgUiAhPT0gQTsgKSB7XG4gICAgICAgIGZvciAodmFyIEggPSB5W1JdLCBLID0gMCwgaiA9IEYgLSAxOyAoSCAhPT0gMCB8fCBLIDwgYikgJiYgaiAhPT0gLTE7IGotLSwgSysrKVxuICAgICAgICAgIEggKz0gMjU2ICogTVtqXSA+Pj4gMCwgTVtqXSA9IEggJSBsID4+PiAwLCBIID0gSCAvIGwgPj4+IDA7XG4gICAgICAgIGlmIChIICE9PSAwKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuICAgICAgICBiID0gSywgUisrO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgQyA9IEYgLSBiOyBDICE9PSBGICYmIE1bQ10gPT09IDA7IClcbiAgICAgICAgQysrO1xuICAgICAgZm9yICh2YXIgayA9IGMucmVwZWF0KEUpOyBDIDwgRjsgKytDKVxuICAgICAgICBrICs9IHQuY2hhckF0KE1bQ10pO1xuICAgICAgcmV0dXJuIGs7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGYoeSkge1xuICAgICAgaWYgKHR5cGVvZiB5ICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBTdHJpbmdcIik7XG4gICAgICBpZiAoeS5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBzLmFsbG9jKDApO1xuICAgICAgZm9yICh2YXIgRSA9IDAsIGIgPSAwLCBSID0gMDsgeVtFXSA9PT0gYzsgKVxuICAgICAgICBiKyssIEUrKztcbiAgICAgIGZvciAodmFyIEEgPSAoeS5sZW5ndGggLSBFKSAqIHUgKyAxID4+PiAwLCBGID0gbmV3IFVpbnQ4QXJyYXkoQSk7IEUgPCB5Lmxlbmd0aDsgKSB7XG4gICAgICAgIHZhciBNID0geS5jaGFyQ29kZUF0KEUpO1xuICAgICAgICBpZiAoTSA+IDI1NSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBIID0gcltNXTtcbiAgICAgICAgaWYgKEggPT09IDI1NSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAodmFyIEsgPSAwLCBqID0gQSAtIDE7IChIICE9PSAwIHx8IEsgPCBSKSAmJiBqICE9PSAtMTsgai0tLCBLKyspXG4gICAgICAgICAgSCArPSBsICogRltqXSA+Pj4gMCwgRltqXSA9IEggJSAyNTYgPj4+IDAsIEggPSBIIC8gMjU2ID4+PiAwO1xuICAgICAgICBpZiAoSCAhPT0gMClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcbiAgICAgICAgUiA9IEssIEUrKztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIEMgPSBBIC0gUjsgQyAhPT0gQSAmJiBGW0NdID09PSAwOyApXG4gICAgICAgIEMrKztcbiAgICAgIHZhciBrID0gcy5hbGxvY1Vuc2FmZShiICsgKEEgLSBDKSk7XG4gICAgICBrLmZpbGwoMCwgMCwgYik7XG4gICAgICBmb3IgKHZhciAkID0gYjsgQyAhPT0gQTsgKVxuICAgICAgICBrWyQrK10gPSBGW0MrK107XG4gICAgICByZXR1cm4gaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcCh5KSB7XG4gICAgICB2YXIgRSA9IGYoeSk7XG4gICAgICBpZiAoRSlcbiAgICAgICAgcmV0dXJuIEU7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb24tYmFzZVwiICsgbCArIFwiIGNoYXJhY3RlclwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuY29kZTogaCxcbiAgICAgIGRlY29kZVVuc2FmZTogZixcbiAgICAgIGRlY29kZTogcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHphID0gZSwgemE7XG59XG52YXIgWWEsIEFkO1xuZnVuY3Rpb24gRnkoKSB7XG4gIGlmIChBZCkgcmV0dXJuIFlhO1xuICBBZCA9IDE7XG4gIHZhciBzID0gRTAoKSwgZSA9IFwiMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5elwiO1xuICByZXR1cm4gWWEgPSBzKGUpLCBZYTtcbn1cbnZhciBOeSA9IEZ5KCk7XG5jb25zdCBhciA9IC8qIEBfX1BVUkVfXyAqLyBGYyhOeSksIElkID0gWGY7XG52YXIgZXQgPSB7fSwgWmEsIF9kO1xuZnVuY3Rpb24gVXkoKSB7XG4gIGlmIChfZCkgcmV0dXJuIFphO1xuICBfZCA9IDE7XG4gIHZhciBzID0gRTAoKSwgZSA9IFwiMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5elwiO1xuICByZXR1cm4gWmEgPSBzKGUpLCBaYTtcbn1cbmZ1bmN0aW9uIHVzKHMsIGUsIHQpIHtcbiAgcmV0dXJuIGUgPD0gcyAmJiBzIDw9IHQ7XG59XG5mdW5jdGlvbiBjYShzKSB7XG4gIGlmIChzID09PSB2b2lkIDApIHJldHVybiB7fTtcbiAgaWYgKHMgPT09IE9iamVjdChzKSkgcmV0dXJuIHM7XG4gIHRocm93IFR5cGVFcnJvcihcIkNvdWxkIG5vdCBjb252ZXJ0IGFyZ3VtZW50IHRvIGRpY3Rpb25hcnlcIik7XG59XG5mdW5jdGlvbiAkeShzKSB7XG4gIGZvciAodmFyIGUgPSBTdHJpbmcocyksIHQgPSBlLmxlbmd0aCwgciA9IDAsIG4gPSBbXTsgciA8IHQ7ICkge1xuICAgIHZhciBpID0gZS5jaGFyQ29kZUF0KHIpO1xuICAgIGlmIChpIDwgNTUyOTYgfHwgaSA+IDU3MzQzKVxuICAgICAgbi5wdXNoKGkpO1xuICAgIGVsc2UgaWYgKDU2MzIwIDw9IGkgJiYgaSA8PSA1NzM0MylcbiAgICAgIG4ucHVzaCg2NTUzMyk7XG4gICAgZWxzZSBpZiAoNTUyOTYgPD0gaSAmJiBpIDw9IDU2MzE5KVxuICAgICAgaWYgKHIgPT09IHQgLSAxKVxuICAgICAgICBuLnB1c2goNjU1MzMpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBvID0gcy5jaGFyQ29kZUF0KHIgKyAxKTtcbiAgICAgICAgaWYgKDU2MzIwIDw9IG8gJiYgbyA8PSA1NzM0Mykge1xuICAgICAgICAgIHZhciBhID0gaSAmIDEwMjMsIGwgPSBvICYgMTAyMztcbiAgICAgICAgICBuLnB1c2goNjU1MzYgKyAoYSA8PCAxMCkgKyBsKSwgciArPSAxO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBuLnB1c2goNjU1MzMpO1xuICAgICAgfVxuICAgIHIgKz0gMTtcbiAgfVxuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIEd5KHMpIHtcbiAgZm9yICh2YXIgZSA9IFwiXCIsIHQgPSAwOyB0IDwgcy5sZW5ndGg7ICsrdCkge1xuICAgIHZhciByID0gc1t0XTtcbiAgICByIDw9IDY1NTM1ID8gZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHIpIDogKHIgLT0gNjU1MzYsIGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgIChyID4+IDEwKSArIDU1Mjk2LFxuICAgICAgKHIgJiAxMDIzKSArIDU2MzIwXG4gICAgKSk7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG52YXIgQm8gPSAtMTtcbmZ1bmN0aW9uIFhjKHMpIHtcbiAgdGhpcy50b2tlbnMgPSBbXS5zbGljZS5jYWxsKHMpO1xufVxuWGMucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbmQtb2Ytc3RyZWFtIGhhcyBiZWVuIGhpdC5cbiAgICovXG4gIGVuZE9mU3RyZWFtOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gIXRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIFdoZW4gYSB0b2tlbiBpcyByZWFkIGZyb20gYSBzdHJlYW0sIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICogc3RyZWFtIG11c3QgYmUgcmV0dXJuZWQgYW5kIHN1YnNlcXVlbnRseSByZW1vdmVkLCBhbmRcbiAgICogZW5kLW9mLXN0cmVhbSBtdXN0IGJlIHJldHVybmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfSBHZXQgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgc3RyZWFtLCBvclxuICAgKiBlbmRfb2Zfc3RyZWFtLlxuICAgKi9cbiAgcmVhZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmxlbmd0aCA/IHRoaXMudG9rZW5zLnNoaWZ0KCkgOiBCbztcbiAgfSxcbiAgLyoqXG4gICAqIFdoZW4gb25lIG9yIG1vcmUgdG9rZW5zIGFyZSBwcmVwZW5kZWQgdG8gYSBzdHJlYW0sIHRob3NlIHRva2Vuc1xuICAgKiBtdXN0IGJlIGluc2VydGVkLCBpbiBnaXZlbiBvcmRlciwgYmVmb3JlIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICogc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VuKHMpIHRvIHByZXBlbmQgdG8gdGhlIHN0cmVhbS5cbiAgICovXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzKSlcbiAgICAgIGZvciAodmFyIGUgPSAoXG4gICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgc1xuICAgICAgKTsgZS5sZW5ndGg7IClcbiAgICAgICAgdGhpcy50b2tlbnMudW5zaGlmdChlLnBvcCgpKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnRva2Vucy51bnNoaWZ0KHMpO1xuICB9LFxuICAvKipcbiAgICogV2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHB1c2hlZCB0byBhIHN0cmVhbSwgdGhvc2UgdG9rZW5zXG4gICAqIG11c3QgYmUgaW5zZXJ0ZWQsIGluIGdpdmVuIG9yZGVyLCBhZnRlciB0aGUgbGFzdCB0b2tlbiBpbiB0aGVcbiAgICogc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VucyhzKSB0byBwcmVwZW5kIHRvIHRoZSBzdHJlYW0uXG4gICAqL1xuICBwdXNoOiBmdW5jdGlvbihzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocykpXG4gICAgICBmb3IgKHZhciBlID0gKFxuICAgICAgICAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovXG4gICAgICAgIHNcbiAgICAgICk7IGUubGVuZ3RoOyApXG4gICAgICAgIHRoaXMudG9rZW5zLnB1c2goZS5zaGlmdCgpKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHMpO1xuICB9XG59O1xudmFyIFBuID0gLTE7XG5mdW5jdGlvbiBYYShzLCBlKSB7XG4gIGlmIChzKVxuICAgIHRocm93IFR5cGVFcnJvcihcIkRlY29kZXIgZXJyb3JcIik7XG4gIHJldHVybiBlIHx8IDY1NTMzO1xufVxudmFyIEZvID0gXCJ1dGYtOFwiO1xuZnVuY3Rpb24gTm8ocywgZSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTm8pKVxuICAgIHJldHVybiBuZXcgTm8ocywgZSk7XG4gIGlmIChzID0gcyAhPT0gdm9pZCAwID8gU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCkgOiBGbywgcyAhPT0gRm8pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2Rpbmcgbm90IHN1cHBvcnRlZC4gT25seSB1dGYtOCBpcyBzdXBwb3J0ZWRcIik7XG4gIGUgPSBjYShlKSwgdGhpcy5fc3RyZWFtaW5nID0gITEsIHRoaXMuX0JPTXNlZW4gPSAhMSwgdGhpcy5fZGVjb2RlciA9IG51bGwsIHRoaXMuX2ZhdGFsID0gISFlLmZhdGFsLCB0aGlzLl9pZ25vcmVCT00gPSAhIWUuaWdub3JlQk9NLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJlbmNvZGluZ1wiLCB7IHZhbHVlOiBcInV0Zi04XCIgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImZhdGFsXCIsIHsgdmFsdWU6IHRoaXMuX2ZhdGFsIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJpZ25vcmVCT01cIiwgeyB2YWx1ZTogdGhpcy5faWdub3JlQk9NIH0pO1xufVxuTm8ucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlclZpZXc9fSBpbnB1dCBUaGUgYnVmZmVyIG9mIGJ5dGVzIHRvIGRlY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgZGVjb2RlOiBmdW5jdGlvbihlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgdHlwZW9mIGUgPT0gXCJvYmplY3RcIiAmJiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyByID0gbmV3IFVpbnQ4QXJyYXkoZSkgOiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIFwiYnVmZmVyXCIgaW4gZSAmJiBlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gciA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgZS5idWZmZXIsXG4gICAgICBlLmJ5dGVPZmZzZXQsXG4gICAgICBlLmJ5dGVMZW5ndGhcbiAgICApIDogciA9IG5ldyBVaW50OEFycmF5KDApLCB0ID0gY2EodCksIHRoaXMuX3N0cmVhbWluZyB8fCAodGhpcy5fZGVjb2RlciA9IG5ldyBWeSh7IGZhdGFsOiB0aGlzLl9mYXRhbCB9KSwgdGhpcy5fQk9Nc2VlbiA9ICExKSwgdGhpcy5fc3RyZWFtaW5nID0gISF0LnN0cmVhbTtcbiAgICBmb3IgKHZhciBuID0gbmV3IFhjKHIpLCBpID0gW10sIG87ICFuLmVuZE9mU3RyZWFtKCkgJiYgKG8gPSB0aGlzLl9kZWNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBvICE9PSBQbik7IClcbiAgICAgIG8gIT09IG51bGwgJiYgKEFycmF5LmlzQXJyYXkobykgPyBpLnB1c2guYXBwbHkoXG4gICAgICAgIGksXG4gICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgb1xuICAgICAgKSA6IGkucHVzaChvKSk7XG4gICAgaWYgKCF0aGlzLl9zdHJlYW1pbmcpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG8gPSB0aGlzLl9kZWNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBvID09PSBQbilcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgbyAhPT0gbnVsbCAmJiAoQXJyYXkuaXNBcnJheShvKSA/IGkucHVzaC5hcHBseShcbiAgICAgICAgICBpLFxuICAgICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgICBvXG4gICAgICAgICkgOiBpLnB1c2gobykpO1xuICAgICAgfSB3aGlsZSAoIW4uZW5kT2ZTdHJlYW0oKSk7XG4gICAgICB0aGlzLl9kZWNvZGVyID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGkubGVuZ3RoICYmIFtcInV0Zi04XCJdLmluZGV4T2YodGhpcy5lbmNvZGluZykgIT09IC0xICYmICF0aGlzLl9pZ25vcmVCT00gJiYgIXRoaXMuX0JPTXNlZW4gJiYgKGlbMF0gPT09IDY1Mjc5ID8gKHRoaXMuX0JPTXNlZW4gPSAhMCwgaS5zaGlmdCgpKSA6IHRoaXMuX0JPTXNlZW4gPSAhMCksIEd5KGkpO1xuICB9XG59O1xuZnVuY3Rpb24gVW8ocywgZSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVW8pKVxuICAgIHJldHVybiBuZXcgVW8ocywgZSk7XG4gIGlmIChzID0gcyAhPT0gdm9pZCAwID8gU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCkgOiBGbywgcyAhPT0gRm8pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2Rpbmcgbm90IHN1cHBvcnRlZC4gT25seSB1dGYtOCBpcyBzdXBwb3J0ZWRcIik7XG4gIGUgPSBjYShlKSwgdGhpcy5fc3RyZWFtaW5nID0gITEsIHRoaXMuX2VuY29kZXIgPSBudWxsLCB0aGlzLl9vcHRpb25zID0geyBmYXRhbDogISFlLmZhdGFsIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuY29kaW5nXCIsIHsgdmFsdWU6IFwidXRmLThcIiB9KTtcbn1cblVvLnByb3RvdHlwZSA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0X3N0cmluZyBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9IEVuY29kZWQgYnl0ZXMsIGFzIGEgVWludDhBcnJheS5cbiAgICovXG4gIGVuY29kZTogZnVuY3Rpb24oZSwgdCkge1xuICAgIGUgPSBlID8gU3RyaW5nKGUpIDogXCJcIiwgdCA9IGNhKHQpLCB0aGlzLl9zdHJlYW1pbmcgfHwgKHRoaXMuX2VuY29kZXIgPSBuZXcgankodGhpcy5fb3B0aW9ucykpLCB0aGlzLl9zdHJlYW1pbmcgPSAhIXQuc3RyZWFtO1xuICAgIGZvciAodmFyIHIgPSBbXSwgbiA9IG5ldyBYYygkeShlKSksIGk7ICFuLmVuZE9mU3RyZWFtKCkgJiYgKGkgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBpICE9PSBQbik7IClcbiAgICAgIEFycmF5LmlzQXJyYXkoaSkgPyByLnB1c2guYXBwbHkoXG4gICAgICAgIHIsXG4gICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgaVxuICAgICAgKSA6IHIucHVzaChpKTtcbiAgICBpZiAoIXRoaXMuX3N0cmVhbWluZykge1xuICAgICAgZm9yICg7IGkgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBpICE9PSBQbjsgKVxuICAgICAgICBBcnJheS5pc0FycmF5KGkpID8gci5wdXNoLmFwcGx5KFxuICAgICAgICAgIHIsXG4gICAgICAgICAgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qL1xuICAgICAgICAgIGlcbiAgICAgICAgKSA6IHIucHVzaChpKTtcbiAgICAgIHRoaXMuX2VuY29kZXIgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocik7XG4gIH1cbn07XG5mdW5jdGlvbiBWeShzKSB7XG4gIHZhciBlID0gcy5mYXRhbCwgdCA9IDAsIHIgPSAwLCBuID0gMCwgaSA9IDEyOCwgbyA9IDE5MTtcbiAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oYSwgbCkge1xuICAgIGlmIChsID09PSBCbyAmJiBuICE9PSAwKVxuICAgICAgcmV0dXJuIG4gPSAwLCBYYShlKTtcbiAgICBpZiAobCA9PT0gQm8pXG4gICAgICByZXR1cm4gUG47XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmICh1cyhsLCAwLCAxMjcpKVxuICAgICAgICByZXR1cm4gbDtcbiAgICAgIGlmICh1cyhsLCAxOTQsIDIyMykpXG4gICAgICAgIG4gPSAxLCB0ID0gbCAtIDE5MjtcbiAgICAgIGVsc2UgaWYgKHVzKGwsIDIyNCwgMjM5KSlcbiAgICAgICAgbCA9PT0gMjI0ICYmIChpID0gMTYwKSwgbCA9PT0gMjM3ICYmIChvID0gMTU5KSwgbiA9IDIsIHQgPSBsIC0gMjI0O1xuICAgICAgZWxzZSBpZiAodXMobCwgMjQwLCAyNDQpKVxuICAgICAgICBsID09PSAyNDAgJiYgKGkgPSAxNDQpLCBsID09PSAyNDQgJiYgKG8gPSAxNDMpLCBuID0gMywgdCA9IGwgLSAyNDA7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBYYShlKTtcbiAgICAgIHJldHVybiB0ID0gdCA8PCA2ICogbiwgbnVsbDtcbiAgICB9XG4gICAgaWYgKCF1cyhsLCBpLCBvKSlcbiAgICAgIHJldHVybiB0ID0gbiA9IHIgPSAwLCBpID0gMTI4LCBvID0gMTkxLCBhLnByZXBlbmQobCksIFhhKGUpO1xuICAgIGlmIChpID0gMTI4LCBvID0gMTkxLCByICs9IDEsIHQgKz0gbCAtIDEyOCA8PCA2ICogKG4gLSByKSwgciAhPT0gbilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHZhciBjID0gdDtcbiAgICByZXR1cm4gdCA9IG4gPSByID0gMCwgYztcbiAgfTtcbn1cbmZ1bmN0aW9uIGp5KHMpIHtcbiAgcy5mYXRhbCwgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oZSwgdCkge1xuICAgIGlmICh0ID09PSBCbylcbiAgICAgIHJldHVybiBQbjtcbiAgICBpZiAodXModCwgMCwgMTI3KSlcbiAgICAgIHJldHVybiB0O1xuICAgIHZhciByLCBuO1xuICAgIHVzKHQsIDEyOCwgMjA0NykgPyAociA9IDEsIG4gPSAxOTIpIDogdXModCwgMjA0OCwgNjU1MzUpID8gKHIgPSAyLCBuID0gMjI0KSA6IHVzKHQsIDY1NTM2LCAxMTE0MTExKSAmJiAociA9IDMsIG4gPSAyNDApO1xuICAgIGZvciAodmFyIGkgPSBbKHQgPj4gNiAqIHIpICsgbl07IHIgPiAwOyApIHtcbiAgICAgIHZhciBvID0gdCA+PiA2ICogKHIgLSAxKTtcbiAgICAgIGkucHVzaCgxMjggfCBvICYgNjMpLCByIC09IDE7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9O1xufVxuY29uc3QgS3kgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmZyZWV6ZSgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHtcbiAgX19wcm90b19fOiBudWxsLFxuICBUZXh0RGVjb2RlcjogTm8sXG4gIFRleHRFbmNvZGVyOiBVb1xufSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiBcIk1vZHVsZVwiIH0pKSwgSHkgPSAvKiBAX19QVVJFX18gKi8gTmMoS3kpO1xudmFyIFJkO1xuZnVuY3Rpb24gcXkoKSB7XG4gIGlmIChSZCkgcmV0dXJuIGV0O1xuICBSZCA9IDE7XG4gIHZhciBzID0gZXQgJiYgZXQuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKEMsIGssICQsIFcpIHtcbiAgICBXID09PSB2b2lkIDAgJiYgKFcgPSAkKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIFcsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ga1skXTtcbiAgICB9IH0pO1xuICB9KSA6IChmdW5jdGlvbihDLCBrLCAkLCBXKSB7XG4gICAgVyA9PT0gdm9pZCAwICYmIChXID0gJCksIENbV10gPSBrWyRdO1xuICB9KSksIGUgPSBldCAmJiBldC5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24oQywgaykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiAhMCwgdmFsdWU6IGsgfSk7XG4gIH0pIDogZnVuY3Rpb24oQywgaykge1xuICAgIEMuZGVmYXVsdCA9IGs7XG4gIH0pLCB0ID0gZXQgJiYgZXQuX19kZWNvcmF0ZSB8fCBmdW5jdGlvbihDLCBrLCAkLCBXKSB7XG4gICAgdmFyIF8gPSBhcmd1bWVudHMubGVuZ3RoLCBnID0gXyA8IDMgPyBrIDogVyA9PT0gbnVsbCA/IFcgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGssICQpIDogVywgeDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PSBcImZ1bmN0aW9uXCIpIGcgPSBSZWZsZWN0LmRlY29yYXRlKEMsIGssICQsIFcpO1xuICAgIGVsc2UgZm9yICh2YXIgdyA9IEMubGVuZ3RoIC0gMTsgdyA+PSAwOyB3LS0pICh4ID0gQ1t3XSkgJiYgKGcgPSAoXyA8IDMgPyB4KGcpIDogXyA+IDMgPyB4KGssICQsIGcpIDogeChrLCAkKSkgfHwgZyk7XG4gICAgcmV0dXJuIF8gPiAzICYmIGcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGssICQsIGcpLCBnO1xuICB9LCByID0gZXQgJiYgZXQuX19pbXBvcnRTdGFyIHx8IGZ1bmN0aW9uKEMpIHtcbiAgICBpZiAoQyAmJiBDLl9fZXNNb2R1bGUpIHJldHVybiBDO1xuICAgIHZhciBrID0ge307XG4gICAgaWYgKEMgIT0gbnVsbCkgZm9yICh2YXIgJCBpbiBDKSAkICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChDLCAkKSAmJiBzKGssIEMsICQpO1xuICAgIHJldHVybiBlKGssIEMpLCBrO1xuICB9LCBuID0gZXQgJiYgZXQuX19pbXBvcnREZWZhdWx0IHx8IGZ1bmN0aW9uKEMpIHtcbiAgICByZXR1cm4gQyAmJiBDLl9fZXNNb2R1bGUgPyBDIDogeyBkZWZhdWx0OiBDIH07XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pLCBldC5kZXNlcmlhbGl6ZVVuY2hlY2tlZCA9IGV0LmRlc2VyaWFsaXplID0gZXQuc2VyaWFsaXplID0gZXQuQmluYXJ5UmVhZGVyID0gZXQuQmluYXJ5V3JpdGVyID0gZXQuQm9yc2hFcnJvciA9IGV0LmJhc2VEZWNvZGUgPSBldC5iYXNlRW5jb2RlID0gdm9pZCAwO1xuICBjb25zdCBpID0gbih2MCgpKSwgbyA9IG4oVXkoKSksIGEgPSByKEh5KSwgbCA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPSBcImZ1bmN0aW9uXCIgPyBhLlRleHREZWNvZGVyIDogVGV4dERlY29kZXIsIGMgPSBuZXcgbChcInV0Zi04XCIsIHsgZmF0YWw6ICEwIH0pO1xuICBmdW5jdGlvbiB1KEMpIHtcbiAgICByZXR1cm4gdHlwZW9mIEMgPT0gXCJzdHJpbmdcIiAmJiAoQyA9IEJ1ZmZlci5mcm9tKEMsIFwidXRmOFwiKSksIG8uZGVmYXVsdC5lbmNvZGUoQnVmZmVyLmZyb20oQykpO1xuICB9XG4gIGV0LmJhc2VFbmNvZGUgPSB1O1xuICBmdW5jdGlvbiBkKEMpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oby5kZWZhdWx0LmRlY29kZShDKSk7XG4gIH1cbiAgZXQuYmFzZURlY29kZSA9IGQ7XG4gIGNvbnN0IGggPSAxMDI0O1xuICBjbGFzcyBmIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGspIHtcbiAgICAgIHN1cGVyKGspLCB0aGlzLmZpZWxkUGF0aCA9IFtdLCB0aGlzLm9yaWdpbmFsTWVzc2FnZSA9IGs7XG4gICAgfVxuICAgIGFkZFRvRmllbGRQYXRoKGspIHtcbiAgICAgIHRoaXMuZmllbGRQYXRoLnNwbGljZSgwLCAwLCBrKSwgdGhpcy5tZXNzYWdlID0gdGhpcy5vcmlnaW5hbE1lc3NhZ2UgKyBcIjogXCIgKyB0aGlzLmZpZWxkUGF0aC5qb2luKFwiLlwiKTtcbiAgICB9XG4gIH1cbiAgZXQuQm9yc2hFcnJvciA9IGY7XG4gIGNsYXNzIHAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5idWYgPSBCdWZmZXIuYWxsb2MoaCksIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgbWF5YmVSZXNpemUoKSB7XG4gICAgICB0aGlzLmJ1Zi5sZW5ndGggPCAxNiArIHRoaXMubGVuZ3RoICYmICh0aGlzLmJ1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmLCBCdWZmZXIuYWxsb2MoaCldKSk7XG4gICAgfVxuICAgIHdyaXRlVTgoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLmJ1Zi53cml0ZVVJbnQ4KGssIHRoaXMubGVuZ3RoKSwgdGhpcy5sZW5ndGggKz0gMTtcbiAgICB9XG4gICAgd3JpdGVVMTYoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLmJ1Zi53cml0ZVVJbnQxNkxFKGssIHRoaXMubGVuZ3RoKSwgdGhpcy5sZW5ndGggKz0gMjtcbiAgICB9XG4gICAgd3JpdGVVMzIoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKGssIHRoaXMubGVuZ3RoKSwgdGhpcy5sZW5ndGggKz0gNDtcbiAgICB9XG4gICAgd3JpdGVVNjQoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKG5ldyBpLmRlZmF1bHQoaykudG9BcnJheShcImxlXCIsIDgpKSk7XG4gICAgfVxuICAgIHdyaXRlVTEyOChrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGkuZGVmYXVsdChrKS50b0FycmF5KFwibGVcIiwgMTYpKSk7XG4gICAgfVxuICAgIHdyaXRlVTI1NihrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGkuZGVmYXVsdChrKS50b0FycmF5KFwibGVcIiwgMzIpKSk7XG4gICAgfVxuICAgIHdyaXRlVTUxMihrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGkuZGVmYXVsdChrKS50b0FycmF5KFwibGVcIiwgNjQpKSk7XG4gICAgfVxuICAgIHdyaXRlQnVmZmVyKGspIHtcbiAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIEJ1ZmZlci5mcm9tKHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKSksXG4gICAgICAgIGssXG4gICAgICAgIEJ1ZmZlci5hbGxvYyhoKVxuICAgICAgXSksIHRoaXMubGVuZ3RoICs9IGsubGVuZ3RoO1xuICAgIH1cbiAgICB3cml0ZVN0cmluZyhrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCk7XG4gICAgICBjb25zdCAkID0gQnVmZmVyLmZyb20oaywgXCJ1dGY4XCIpO1xuICAgICAgdGhpcy53cml0ZVUzMigkLmxlbmd0aCksIHRoaXMud3JpdGVCdWZmZXIoJCk7XG4gICAgfVxuICAgIHdyaXRlRml4ZWRBcnJheShrKSB7XG4gICAgICB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKGspKTtcbiAgICB9XG4gICAgd3JpdGVBcnJheShrLCAkKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVVMzIoay5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBXIG9mIGspXG4gICAgICAgIHRoaXMubWF5YmVSZXNpemUoKSwgJChXKTtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIGV0LkJpbmFyeVdyaXRlciA9IHA7XG4gIGZ1bmN0aW9uIHkoQywgaywgJCkge1xuICAgIGNvbnN0IFcgPSAkLnZhbHVlO1xuICAgICQudmFsdWUgPSBmdW5jdGlvbiguLi5fKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gVy5hcHBseSh0aGlzLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGcpIHtcbiAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XG4gICAgICAgICAgY29uc3QgeCA9IGcuY29kZTtcbiAgICAgICAgICBpZiAoW1wiRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTXCIsIFwiRVJSX09VVF9PRl9SQU5HRVwiXS5pbmRleE9mKHgpID49IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgZihcIlJlYWNoZWQgdGhlIGVuZCBvZiBidWZmZXIgd2hlbiBkZXNlcmlhbGl6aW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGc7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBjbGFzcyBFIHtcbiAgICBjb25zdHJ1Y3RvcihrKSB7XG4gICAgICB0aGlzLmJ1ZiA9IGssIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgcmVhZFU4KCkge1xuICAgICAgY29uc3QgayA9IHRoaXMuYnVmLnJlYWRVSW50OCh0aGlzLm9mZnNldCk7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKz0gMSwgaztcbiAgICB9XG4gICAgcmVhZFUxNigpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLmJ1Zi5yZWFkVUludDE2TEUodGhpcy5vZmZzZXQpO1xuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ICs9IDIsIGs7XG4gICAgfVxuICAgIHJlYWRVMzIoKSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMub2Zmc2V0KTtcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldCArPSA0LCBrO1xuICAgIH1cbiAgICByZWFkVTY0KCkge1xuICAgICAgY29uc3QgayA9IHRoaXMucmVhZEJ1ZmZlcig4KTtcbiAgICAgIHJldHVybiBuZXcgaS5kZWZhdWx0KGssIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRVMTI4KCkge1xuICAgICAgY29uc3QgayA9IHRoaXMucmVhZEJ1ZmZlcigxNik7XG4gICAgICByZXR1cm4gbmV3IGkuZGVmYXVsdChrLCBcImxlXCIpO1xuICAgIH1cbiAgICByZWFkVTI1NigpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLnJlYWRCdWZmZXIoMzIpO1xuICAgICAgcmV0dXJuIG5ldyBpLmRlZmF1bHQoaywgXCJsZVwiKTtcbiAgICB9XG4gICAgcmVhZFU1MTIoKSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5yZWFkQnVmZmVyKDY0KTtcbiAgICAgIHJldHVybiBuZXcgaS5kZWZhdWx0KGssIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRCdWZmZXIoaykge1xuICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgayA+IHRoaXMuYnVmLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IGYoYEV4cGVjdGVkIGJ1ZmZlciBsZW5ndGggJHtrfSBpc24ndCB3aXRoaW4gYm91bmRzYCk7XG4gICAgICBjb25zdCAkID0gdGhpcy5idWYuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ICsgayk7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKz0gaywgJDtcbiAgICB9XG4gICAgcmVhZFN0cmluZygpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLnJlYWRVMzIoKSwgJCA9IHRoaXMucmVhZEJ1ZmZlcihrKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjLmRlY29kZSgkKTtcbiAgICAgIH0gY2F0Y2ggKFcpIHtcbiAgICAgICAgdGhyb3cgbmV3IGYoYEVycm9yIGRlY29kaW5nIFVURi04IHN0cmluZzogJHtXfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZWFkRml4ZWRBcnJheShrKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5yZWFkQnVmZmVyKGspKTtcbiAgICB9XG4gICAgcmVhZEFycmF5KGspIHtcbiAgICAgIGNvbnN0ICQgPSB0aGlzLnJlYWRVMzIoKSwgVyA9IEFycmF5KCk7XG4gICAgICBmb3IgKGxldCBfID0gMDsgXyA8ICQ7ICsrXylcbiAgICAgICAgVy5wdXNoKGsoKSk7XG4gICAgICByZXR1cm4gVztcbiAgICB9XG4gIH1cbiAgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkVThcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFUxNlwiLCBudWxsKSwgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkVTMyXCIsIG51bGwpLCB0KFtcbiAgICB5XG4gIF0sIEUucHJvdG90eXBlLCBcInJlYWRVNjRcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFUxMjhcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFUyNTZcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFU1MTJcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFN0cmluZ1wiLCBudWxsKSwgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkRml4ZWRBcnJheVwiLCBudWxsKSwgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkQXJyYXlcIiwgbnVsbCksIGV0LkJpbmFyeVJlYWRlciA9IEU7XG4gIGZ1bmN0aW9uIGIoQykge1xuICAgIHJldHVybiBDLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgQy5zbGljZSgxKTtcbiAgfVxuICBmdW5jdGlvbiBSKEMsIGssICQsIFcsIF8pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBXID09IFwic3RyaW5nXCIpXG4gICAgICAgIF9bYHdyaXRlJHtiKFcpfWBdKCQpO1xuICAgICAgZWxzZSBpZiAoVyBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgICBpZiAodHlwZW9mIFdbMF0gPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGlmICgkLmxlbmd0aCAhPT0gV1swXSlcbiAgICAgICAgICAgIHRocm93IG5ldyBmKGBFeHBlY3RpbmcgYnl0ZSBhcnJheSBvZiBsZW5ndGggJHtXWzBdfSwgYnV0IGdvdCAkeyQubGVuZ3RofSBieXRlc2ApO1xuICAgICAgICAgIF8ud3JpdGVGaXhlZEFycmF5KCQpO1xuICAgICAgICB9IGVsc2UgaWYgKFcubGVuZ3RoID09PSAyICYmIHR5cGVvZiBXWzFdID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBpZiAoJC5sZW5ndGggIT09IFdbMV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgZihgRXhwZWN0aW5nIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoICR7V1sxXX0sIGJ1dCBnb3QgJHskLmxlbmd0aH0gYnl0ZXNgKTtcbiAgICAgICAgICBmb3IgKGxldCBnID0gMDsgZyA8IFdbMV07IGcrKylcbiAgICAgICAgICAgIFIoQywgbnVsbCwgJFtnXSwgV1swXSwgXyk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIF8ud3JpdGVBcnJheSgkLCAoZykgPT4ge1xuICAgICAgICAgICAgUihDLCBrLCBnLCBXWzBdLCBfKTtcbiAgICAgICAgICB9KTtcbiAgICAgIGVsc2UgaWYgKFcua2luZCAhPT0gdm9pZCAwKVxuICAgICAgICBzd2l0Y2ggKFcua2luZCkge1xuICAgICAgICAgIGNhc2UgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgJCA9PSBudWxsID8gXy53cml0ZVU4KDApIDogKF8ud3JpdGVVOCgxKSwgUihDLCBrLCAkLCBXLnR5cGUsIF8pKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwibWFwXCI6IHtcbiAgICAgICAgICAgIF8ud3JpdGVVMzIoJC5zaXplKSwgJC5mb3JFYWNoKChnLCB4KSA9PiB7XG4gICAgICAgICAgICAgIFIoQywgaywgeCwgVy5rZXksIF8pLCBSKEMsIGssIGcsIFcudmFsdWUsIF8pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBmKGBGaWVsZFR5cGUgJHtXfSB1bnJlY29nbml6ZWRgKTtcbiAgICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBBKEMsICQsIF8pO1xuICAgIH0gY2F0Y2ggKGcpIHtcbiAgICAgIHRocm93IGcgaW5zdGFuY2VvZiBmICYmIGcuYWRkVG9GaWVsZFBhdGgoayksIGc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIEEoQywgaywgJCkge1xuICAgIGlmICh0eXBlb2Ygay5ib3JzaFNlcmlhbGl6ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGsuYm9yc2hTZXJpYWxpemUoJCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFcgPSBDLmdldChrLmNvbnN0cnVjdG9yKTtcbiAgICBpZiAoIVcpXG4gICAgICB0aHJvdyBuZXcgZihgQ2xhc3MgJHtrLmNvbnN0cnVjdG9yLm5hbWV9IGlzIG1pc3NpbmcgaW4gc2NoZW1hYCk7XG4gICAgaWYgKFcua2luZCA9PT0gXCJzdHJ1Y3RcIilcbiAgICAgIFcuZmllbGRzLm1hcCgoW18sIGddKSA9PiB7XG4gICAgICAgIFIoQywgXywga1tfXSwgZywgJCk7XG4gICAgICB9KTtcbiAgICBlbHNlIGlmIChXLmtpbmQgPT09IFwiZW51bVwiKSB7XG4gICAgICBjb25zdCBfID0ga1tXLmZpZWxkXTtcbiAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgVy52YWx1ZXMubGVuZ3RoOyArK2cpIHtcbiAgICAgICAgY29uc3QgW3gsIHddID0gVy52YWx1ZXNbZ107XG4gICAgICAgIGlmICh4ID09PSBfKSB7XG4gICAgICAgICAgJC53cml0ZVU4KGcpLCBSKEMsIHgsIGtbeF0sIHcsICQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlXG4gICAgICB0aHJvdyBuZXcgZihgVW5leHBlY3RlZCBzY2hlbWEga2luZDogJHtXLmtpbmR9IGZvciAke2suY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxuICBmdW5jdGlvbiBGKEMsIGssICQgPSBwKSB7XG4gICAgY29uc3QgVyA9IG5ldyAkKCk7XG4gICAgcmV0dXJuIEEoQywgaywgVyksIFcudG9BcnJheSgpO1xuICB9XG4gIGV0LnNlcmlhbGl6ZSA9IEY7XG4gIGZ1bmN0aW9uIE0oQywgaywgJCwgVykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mICQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIFdbYHJlYWQke2IoJCl9YF0oKTtcbiAgICAgIGlmICgkIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAkWzBdID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgcmV0dXJuIFcucmVhZEZpeGVkQXJyYXkoJFswXSk7XG4gICAgICAgIGlmICh0eXBlb2YgJFsxXSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc3QgXyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgJFsxXTsgZysrKVxuICAgICAgICAgICAgXy5wdXNoKE0oQywgbnVsbCwgJFswXSwgVykpO1xuICAgICAgICAgIHJldHVybiBfO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICByZXR1cm4gVy5yZWFkQXJyYXkoKCkgPT4gTShDLCBrLCAkWzBdLCBXKSk7XG4gICAgICB9XG4gICAgICBpZiAoJC5raW5kID09PSBcIm9wdGlvblwiKVxuICAgICAgICByZXR1cm4gVy5yZWFkVTgoKSA/IE0oQywgaywgJC50eXBlLCBXKSA6IHZvaWQgMDtcbiAgICAgIGlmICgkLmtpbmQgPT09IFwibWFwXCIpIHtcbiAgICAgICAgbGV0IF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBnID0gVy5yZWFkVTMyKCk7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZzsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgdyA9IE0oQywgaywgJC5rZXksIFcpLCBEID0gTShDLCBrLCAkLnZhbHVlLCBXKTtcbiAgICAgICAgICBfLnNldCh3LCBEKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXztcbiAgICAgIH1cbiAgICAgIHJldHVybiBIKEMsICQsIFcpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRocm93IF8gaW5zdGFuY2VvZiBmICYmIF8uYWRkVG9GaWVsZFBhdGgoayksIF87XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIEgoQywgaywgJCkge1xuICAgIGlmICh0eXBlb2Ygay5ib3JzaERlc2VyaWFsaXplID09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBrLmJvcnNoRGVzZXJpYWxpemUoJCk7XG4gICAgY29uc3QgVyA9IEMuZ2V0KGspO1xuICAgIGlmICghVylcbiAgICAgIHRocm93IG5ldyBmKGBDbGFzcyAke2submFtZX0gaXMgbWlzc2luZyBpbiBzY2hlbWFgKTtcbiAgICBpZiAoVy5raW5kID09PSBcInN0cnVjdFwiKSB7XG4gICAgICBjb25zdCBfID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtnLCB4XSBvZiBDLmdldChrKS5maWVsZHMpXG4gICAgICAgIF9bZ10gPSBNKEMsIGcsIHgsICQpO1xuICAgICAgcmV0dXJuIG5ldyBrKF8pO1xuICAgIH1cbiAgICBpZiAoVy5raW5kID09PSBcImVudW1cIikge1xuICAgICAgY29uc3QgXyA9ICQucmVhZFU4KCk7XG4gICAgICBpZiAoXyA+PSBXLnZhbHVlcy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBmKGBFbnVtIGluZGV4OiAke199IGlzIG91dCBvZiByYW5nZWApO1xuICAgICAgY29uc3QgW2csIHhdID0gVy52YWx1ZXNbX10sIHcgPSBNKEMsIGcsIHgsICQpO1xuICAgICAgcmV0dXJuIG5ldyBrKHsgW2ddOiB3IH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgZihgVW5leHBlY3RlZCBzY2hlbWEga2luZDogJHtXLmtpbmR9IGZvciAke2suY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxuICBmdW5jdGlvbiBLKEMsIGssICQsIFcgPSBFKSB7XG4gICAgY29uc3QgXyA9IG5ldyBXKCQpLCBnID0gSChDLCBrLCBfKTtcbiAgICBpZiAoXy5vZmZzZXQgPCAkLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBmKGBVbmV4cGVjdGVkICR7JC5sZW5ndGggLSBfLm9mZnNldH0gYnl0ZXMgYWZ0ZXIgZGVzZXJpYWxpemVkIGRhdGFgKTtcbiAgICByZXR1cm4gZztcbiAgfVxuICBldC5kZXNlcmlhbGl6ZSA9IEs7XG4gIGZ1bmN0aW9uIGooQywgaywgJCwgVyA9IEUpIHtcbiAgICBjb25zdCBfID0gbmV3IFcoJCk7XG4gICAgcmV0dXJuIEgoQywgaywgXyk7XG4gIH1cbiAgcmV0dXJuIGV0LmRlc2VyaWFsaXplVW5jaGVja2VkID0gaiwgZXQ7XG59XG52YXIgSmEgPSBxeSgpLCByZSA9IHt9LCBMZDtcbmZ1bmN0aW9uIFd5KCkge1xuICBpZiAoTGQpIHJldHVybiByZTtcbiAgTGQgPSAxLCBPYmplY3QuZGVmaW5lUHJvcGVydHkocmUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgcmUuczE2ID0gcmUuczggPSByZS5udTY0YmUgPSByZS51NDhiZSA9IHJlLnU0MGJlID0gcmUudTMyYmUgPSByZS51MjRiZSA9IHJlLnUxNmJlID0gcmUubnU2NCA9IHJlLnU0OCA9IHJlLnU0MCA9IHJlLnUzMiA9IHJlLnUyNCA9IHJlLnUxNiA9IHJlLnU4ID0gcmUub2Zmc2V0ID0gcmUuZ3JlZWR5ID0gcmUuQ29uc3RhbnQgPSByZS5VVEY4ID0gcmUuQ1N0cmluZyA9IHJlLkJsb2IgPSByZS5Cb29sZWFuID0gcmUuQml0RmllbGQgPSByZS5CaXRTdHJ1Y3R1cmUgPSByZS5WYXJpYW50TGF5b3V0ID0gcmUuVW5pb24gPSByZS5VbmlvbkxheW91dERpc2NyaW1pbmF0b3IgPSByZS5VbmlvbkRpc2NyaW1pbmF0b3IgPSByZS5TdHJ1Y3R1cmUgPSByZS5TZXF1ZW5jZSA9IHJlLkRvdWJsZUJFID0gcmUuRG91YmxlID0gcmUuRmxvYXRCRSA9IHJlLkZsb2F0ID0gcmUuTmVhckludDY0QkUgPSByZS5OZWFySW50NjQgPSByZS5OZWFyVUludDY0QkUgPSByZS5OZWFyVUludDY0ID0gcmUuSW50QkUgPSByZS5JbnQgPSByZS5VSW50QkUgPSByZS5VSW50ID0gcmUuT2Zmc2V0TGF5b3V0ID0gcmUuR3JlZWR5Q291bnQgPSByZS5FeHRlcm5hbExheW91dCA9IHJlLmJpbmRDb25zdHJ1Y3RvckxheW91dCA9IHJlLm5hbWVXaXRoUHJvcGVydHkgPSByZS5MYXlvdXQgPSByZS51aW50OEFycmF5VG9CdWZmZXIgPSByZS5jaGVja1VpbnQ4QXJyYXkgPSB2b2lkIDAsIHJlLmNvbnN0YW50ID0gcmUudXRmOCA9IHJlLmNzdHIgPSByZS5ibG9iID0gcmUudW5pb25MYXlvdXREaXNjcmltaW5hdG9yID0gcmUudW5pb24gPSByZS5zZXEgPSByZS5iaXRzID0gcmUuc3RydWN0ID0gcmUuZjY0YmUgPSByZS5mNjQgPSByZS5mMzJiZSA9IHJlLmYzMiA9IHJlLm5zNjRiZSA9IHJlLnM0OGJlID0gcmUuczQwYmUgPSByZS5zMzJiZSA9IHJlLnMyNGJlID0gcmUuczE2YmUgPSByZS5uczY0ID0gcmUuczQ4ID0gcmUuczQwID0gcmUuczMyID0gcmUuczI0ID0gdm9pZCAwO1xuICBjb25zdCBzID0gS2MoKTtcbiAgZnVuY3Rpb24gZShtKSB7XG4gICAgaWYgKCEobSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImIgbXVzdCBiZSBhIFVpbnQ4QXJyYXlcIik7XG4gIH1cbiAgcmUuY2hlY2tVaW50OEFycmF5ID0gZTtcbiAgZnVuY3Rpb24gdChtKSB7XG4gICAgcmV0dXJuIGUobSksIHMuQnVmZmVyLmZyb20obS5idWZmZXIsIG0uYnl0ZU9mZnNldCwgbS5sZW5ndGgpO1xuICB9XG4gIHJlLnVpbnQ4QXJyYXlUb0J1ZmZlciA9IHQ7XG4gIGxldCByID0gY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2KSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNwYW4gbXVzdCBiZSBhbiBpbnRlZ2VyXCIpO1xuICAgICAgdGhpcy5zcGFuID0gdiwgdGhpcy5wcm9wZXJ0eSA9IFA7XG4gICAgfVxuICAgIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgYW4gT2JqZWN0IGludG8gd2hpY2ggZGVjb2RlZCBwcm9wZXJ0aWVzIHdpbGxcbiAgICAgKiBiZSB3cml0dGVuLlxuICAgICAqXG4gICAgICogVXNlZCBvbmx5IGZvciBsYXlvdXRzIHRoYXQge0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlfSB0byBPYmplY3RcbiAgICAgKiBpbnN0YW5jZXMsIHdoaWNoIG1lYW5zOlxuICAgICAqICoge0BsaW5rIFN0cnVjdHVyZX1cbiAgICAgKiAqIHtAbGluayBVbmlvbn1cbiAgICAgKiAqIHtAbGluayBWYXJpYW50TGF5b3V0fVxuICAgICAqICoge0BsaW5rIEJpdFN0cnVjdHVyZX1cbiAgICAgKlxuICAgICAqIElmIGxlZnQgdW5kZWZpbmVkIHRoZSBKYXZhU2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIGxheW91dHNcbiAgICAgKiB3aWxsIGJlIE9iamVjdCBpbnN0YW5jZXMuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGJpbmRDb25zdHJ1Y3RvckxheW91dH0uXG4gICAgICovXG4gICAgbWFrZURlc3RpbmF0aW9uT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHNwYW4gb2YgYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBhIGxheW91dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gYiAtIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyBhbiBlbmNvZGVkIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvZmZzZXRdIC0gdGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZW5jb2RlZCBpbnN0YW5jZVxuICAgICAqIHN0YXJ0cy4gIElmIGFic2VudCBhIHplcm8gb2Zmc2V0IGlzIGluZmVycmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgY292ZXJlZCBieSB0aGUgbGF5b3V0XG4gICAgICogaW5zdGFuY2UuICBJZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRoZVxuICAgICAqIGRlZmluaXRpb24tdGltZSBjb25zdGFudCB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0gd2lsbCBiZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gLSBpZiB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBjYW5ub3QgYmVcbiAgICAgKiBkZXRlcm1pbmVkLlxuICAgICAqL1xuICAgIGdldFNwYW4odiwgUCkge1xuICAgICAgaWYgKDAgPiB0aGlzLnNwYW4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiaW5kZXRlcm1pbmF0ZSBzcGFuXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwbGljYXRlIHRoZSBsYXlvdXQgdXNpbmcgYSBuZXcgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBnZXQgYSBzdHJ1Y3R1cmFsbHktZXF1aXZhbGVudCBsYXlvdXRcbiAgICAgKiB3aXRoIGEgZGlmZmVyZW50IG5hbWUgc2luY2UgYWxsIHtAbGluayBMYXlvdXR9IGluc3RhbmNlcyBhcmVcbiAgICAgKiBpbW11dGFibGUuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGlzIGEgc2hhbGxvdyBjb3B5LiAgQWxsIGZpZWxkcyBleGNlcHQge0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fSBhcmUgc3RyaWN0bHkgZXF1YWwgdG8gdGhlIG9yaWdpbiBsYXlvdXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgdmFsdWUgZm9yIHtAbGlua1xuICAgICAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0gaW4gdGhlIHJlcGxpY2EuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TGF5b3V0fSAtIHRoZSBjb3B5IHdpdGgge0BsaW5rIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX1cbiAgICAgKiBzZXQgdG8gYHByb3BlcnR5YC5cbiAgICAgKi9cbiAgICByZXBsaWNhdGUodikge1xuICAgICAgY29uc3QgUCA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oUCwgdGhpcyksIFAucHJvcGVydHkgPSB2LCBQO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IGZyb20gbGF5b3V0IHByb3BlcnRpZXMgYW5kIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTk9URSoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBgdW5kZWZpbmVkYCBpZiBpbnZva2VkIG9uIGEgbGF5b3V0XG4gICAgICogdGhhdCBkb2VzIG5vdCByZXR1cm4gaXRzIHZhbHVlIGFzIGFuIE9iamVjdC4gIE9iamVjdHMgYXJlXG4gICAgICogcmV0dXJuZWQgZm9yIHRoaW5ncyB0aGF0IGFyZSBhIHtAbGluayBTdHJ1Y3R1cmV9LCB3aGljaCBpbmNsdWRlc1xuICAgICAqIHtAbGluayBWYXJpYW50TGF5b3V0fHZhcmlhbnQgbGF5b3V0c30gaWYgdGhleSBhcmUgc3RydWN0dXJlcywgYW5kXG4gICAgICogZXhjbHVkZXMge0BsaW5rIFVuaW9ufXMuICBJZiB5b3Ugd2FudCB0aGlzIGZlYXR1cmUgZm9yIGEgdW5pb25cbiAgICAgKiB5b3UgbXVzdCB1c2Uge0BsaW5rIFVuaW9uLmdldFZhcmlhbnR8Z2V0VmFyaWFudH0gdG8gc2VsZWN0IHRoZVxuICAgICAqIGRlc2lyZWQgbGF5b3V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIC0gYW4gYXJyYXkgb2YgdmFsdWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGVcbiAgICAgKiBkZWZhdWx0IG9yZGVyIGZvciBwcm9wZXJ0aWVzLiAgQXMgd2l0aCB7QGxpbmsgTGF5b3V0I2RlY29kZXxkZWNvZGV9XG4gICAgICogbGF5b3V0IGVsZW1lbnRzIHRoYXQgaGF2ZSBubyBwcm9wZXJ0eSBuYW1lIGFyZSBza2lwcGVkIHdoZW5cbiAgICAgKiBpdGVyYXRpbmcgb3ZlciB0aGUgYXJyYXkgdmFsdWVzLiAgT25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgYXJlXG4gICAgICogYXNzaWduZWQ7IGFyZ3VtZW50cyBhcmUgbm90IGFzc2lnbmVkIHRvIHByb3BlcnRpZXMgb2YgY29udGFpbmVkXG4gICAgICogbGF5b3V0cy4gIEFueSB1bnVzZWQgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7KE9iamVjdHx1bmRlZmluZWQpfVxuICAgICAqL1xuICAgIGZyb21BcnJheSh2KSB7XG4gICAgfVxuICB9O1xuICByZS5MYXlvdXQgPSByO1xuICBmdW5jdGlvbiBuKG0sIHYpIHtcbiAgICByZXR1cm4gdi5wcm9wZXJ0eSA/IG0gKyBcIltcIiArIHYucHJvcGVydHkgKyBcIl1cIiA6IG07XG4gIH1cbiAgcmUubmFtZVdpdGhQcm9wZXJ0eSA9IG47XG4gIGZ1bmN0aW9uIGkobSwgdikge1xuICAgIGlmICh0eXBlb2YgbSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgbXVzdCBiZSBjb25zdHJ1Y3RvclwiKTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG0sIFwibGF5b3V0X1wiKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGlzIGFscmVhZHkgYm91bmQgdG8gYSBsYXlvdXRcIik7XG4gICAgaWYgKCEodiAmJiB2IGluc3RhbmNlb2YgcikpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGF5b3V0IG11c3QgYmUgYSBMYXlvdXRcIik7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2LCBcImJvdW5kQ29uc3RydWN0b3JfXCIpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibGF5b3V0IGlzIGFscmVhZHkgYm91bmQgdG8gYSBjb25zdHJ1Y3RvclwiKTtcbiAgICBtLmxheW91dF8gPSB2LCB2LmJvdW5kQ29uc3RydWN0b3JfID0gbSwgdi5tYWtlRGVzdGluYXRpb25PYmplY3QgPSAoKCkgPT4gbmV3IG0oKSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLnByb3RvdHlwZSwgXCJlbmNvZGVcIiwge1xuICAgICAgdmFsdWUoUCwgTikge1xuICAgICAgICByZXR1cm4gdi5lbmNvZGUodGhpcywgUCwgTik7XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLCBcImRlY29kZVwiLCB7XG4gICAgICB2YWx1ZShQLCBOKSB7XG4gICAgICAgIHJldHVybiB2LmRlY29kZShQLCBOKTtcbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogITBcbiAgICB9KTtcbiAgfVxuICByZS5iaW5kQ29uc3RydWN0b3JMYXlvdXQgPSBpO1xuICBjbGFzcyBvIGV4dGVuZHMgciB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZmYgdGhlIGV4dGVybmFsIGxheW91dCBkZWNvZGVzIHRvIGFuIHVuc2lnbmVkXG4gICAgICogaW50ZWdlciBsYXlvdXQuXG4gICAgICpcbiAgICAgKiBJbiB0aGF0IGNhc2UgaXQgY2FuIGJlIHVzZWQgYXMgdGhlIHNvdXJjZSBvZiB7QGxpbmtcbiAgICAgKiBTZXF1ZW5jZSNjb3VudHxTZXF1ZW5jZSBjb3VudHN9LCB7QGxpbmsgQmxvYiNsZW5ndGh8QmxvYiBsZW5ndGhzfSxcbiAgICAgKiBvciBhcyB7QGxpbmsgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yI2xheW91dHxleHRlcm5hbCB1bmlvblxuICAgICAqIGRpc2NyaW1pbmF0b3JzfS5cbiAgICAgKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGlzQ291bnQoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHRlcm5hbExheW91dCBpcyBhYnN0cmFjdFwiKTtcbiAgICB9XG4gIH1cbiAgcmUuRXh0ZXJuYWxMYXlvdXQgPSBvO1xuICBjbGFzcyBhIGV4dGVuZHMgbyB7XG4gICAgY29uc3RydWN0b3IodiA9IDEsIFApIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2KSB8fCAwID49IHYpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJlbGVtZW50U3BhbiBtdXN0IGJlIGEgKHBvc2l0aXZlKSBpbnRlZ2VyXCIpO1xuICAgICAgc3VwZXIoLTEsIFApLCB0aGlzLmVsZW1lbnRTcGFuID0gdjtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGlzQ291bnQoKSB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGUodik7XG4gICAgICBjb25zdCBOID0gdi5sZW5ndGggLSBQO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTiAvIHRoaXMuZWxlbWVudFNwYW4pO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4pIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuICByZS5HcmVlZHlDb3VudCA9IGE7XG4gIGNsYXNzIGwgZXh0ZW5kcyBvIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQID0gMCwgTikge1xuICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIHIpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGF5b3V0IG11c3QgYmUgYSBMYXlvdXRcIik7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoUCkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvZmZzZXQgbXVzdCBiZSBpbnRlZ2VyIG9yIHVuZGVmaW5lZFwiKTtcbiAgICAgIHN1cGVyKHYuc3BhbiwgTiB8fCB2LnByb3BlcnR5KSwgdGhpcy5sYXlvdXQgPSB2LCB0aGlzLm9mZnNldCA9IFA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBpc0NvdW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF5b3V0IGluc3RhbmNlb2YgYyB8fCB0aGlzLmxheW91dCBpbnN0YW5jZW9mIHU7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dC5kZWNvZGUodiwgUCArIHRoaXMub2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuY29kZSh2LCBQLCBOICsgdGhpcy5vZmZzZXQpO1xuICAgIH1cbiAgfVxuICByZS5PZmZzZXRMYXlvdXQgPSBsO1xuICBjbGFzcyBjIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3IodiwgUCkge1xuICAgICAgaWYgKHN1cGVyKHYsIFApLCA2IDwgdGhpcy5zcGFuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNwYW4gbXVzdCBub3QgZXhjZWVkIDYgYnl0ZXNcIik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIHJldHVybiB0KHYpLnJlYWRVSW50TEUoUCwgdGhpcy5zcGFuKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHQoUCkud3JpdGVVSW50TEUodiwgTiwgdGhpcy5zcGFuKSwgdGhpcy5zcGFuO1xuICAgIH1cbiAgfVxuICByZS5VSW50ID0gYztcbiAgY2xhc3MgdSBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmIChzdXBlcih2LCBQKSwgNiA8IHRoaXMuc3BhbilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzcGFuIG11c3Qgbm90IGV4Y2VlZCA2IGJ5dGVzXCIpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkVUludEJFKFAsIHRoaXMuc3Bhbik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHJldHVybiB0KFApLndyaXRlVUludEJFKHYsIE4sIHRoaXMuc3BhbiksIHRoaXMuc3BhbjtcbiAgICB9XG4gIH1cbiAgcmUuVUludEJFID0gdTtcbiAgY2xhc3MgZCBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmIChzdXBlcih2LCBQKSwgNiA8IHRoaXMuc3BhbilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzcGFuIG11c3Qgbm90IGV4Y2VlZCA2IGJ5dGVzXCIpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkSW50TEUoUCwgdGhpcy5zcGFuKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHQoUCkud3JpdGVJbnRMRSh2LCBOLCB0aGlzLnNwYW4pLCB0aGlzLnNwYW47XG4gICAgfVxuICB9XG4gIHJlLkludCA9IGQ7XG4gIGNsYXNzIGggZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQKSB7XG4gICAgICBpZiAoc3VwZXIodiwgUCksIDYgPCB0aGlzLnNwYW4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwic3BhbiBtdXN0IG5vdCBleGNlZWQgNiBieXRlc1wiKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgcmV0dXJuIHQodikucmVhZEludEJFKFAsIHRoaXMuc3Bhbik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHJldHVybiB0KFApLndyaXRlSW50QkUodiwgTiwgdGhpcy5zcGFuKSwgdGhpcy5zcGFuO1xuICAgIH1cbiAgfVxuICByZS5JbnRCRSA9IGg7XG4gIGNvbnN0IGYgPSBNYXRoLnBvdygyLCAzMik7XG4gIGZ1bmN0aW9uIHAobSkge1xuICAgIGNvbnN0IHYgPSBNYXRoLmZsb29yKG0gLyBmKSwgUCA9IG0gLSB2ICogZjtcbiAgICByZXR1cm4geyBoaTMyOiB2LCBsbzMyOiBQIH07XG4gIH1cbiAgZnVuY3Rpb24geShtLCB2KSB7XG4gICAgcmV0dXJuIG0gKiBmICsgdjtcbiAgfVxuICBjbGFzcyBFIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3Iodikge1xuICAgICAgc3VwZXIoOCwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0KHYpLCBZID0gTi5yZWFkVUludDMyTEUoUCksIGVlID0gTi5yZWFkVUludDMyTEUoUCArIDQpO1xuICAgICAgcmV0dXJuIHkoZWUsIFkpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICBjb25zdCBZID0gcCh2KSwgZWUgPSB0KFApO1xuICAgICAgcmV0dXJuIGVlLndyaXRlVUludDMyTEUoWS5sbzMyLCBOKSwgZWUud3JpdGVVSW50MzJMRShZLmhpMzIsIE4gKyA0KSwgODtcbiAgICB9XG4gIH1cbiAgcmUuTmVhclVJbnQ2NCA9IEU7XG4gIGNsYXNzIGIgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcig4LCB2KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgY29uc3QgTiA9IHQodiksIFkgPSBOLnJlYWRVSW50MzJCRShQKSwgZWUgPSBOLnJlYWRVSW50MzJCRShQICsgNCk7XG4gICAgICByZXR1cm4geShZLCBlZSk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIGNvbnN0IFkgPSBwKHYpLCBlZSA9IHQoUCk7XG4gICAgICByZXR1cm4gZWUud3JpdGVVSW50MzJCRShZLmhpMzIsIE4pLCBlZS53cml0ZVVJbnQzMkJFKFkubG8zMiwgTiArIDQpLCA4O1xuICAgIH1cbiAgfVxuICByZS5OZWFyVUludDY0QkUgPSBiO1xuICBjbGFzcyBSIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3Iodikge1xuICAgICAgc3VwZXIoOCwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0KHYpLCBZID0gTi5yZWFkVUludDMyTEUoUCksIGVlID0gTi5yZWFkSW50MzJMRShQICsgNCk7XG4gICAgICByZXR1cm4geShlZSwgWSk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIGNvbnN0IFkgPSBwKHYpLCBlZSA9IHQoUCk7XG4gICAgICByZXR1cm4gZWUud3JpdGVVSW50MzJMRShZLmxvMzIsIE4pLCBlZS53cml0ZUludDMyTEUoWS5oaTMyLCBOICsgNCksIDg7XG4gICAgfVxuICB9XG4gIHJlLk5lYXJJbnQ2NCA9IFI7XG4gIGNsYXNzIEEgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcig4LCB2KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgY29uc3QgTiA9IHQodiksIFkgPSBOLnJlYWRJbnQzMkJFKFApLCBlZSA9IE4ucmVhZFVJbnQzMkJFKFAgKyA0KTtcbiAgICAgIHJldHVybiB5KFksIGVlKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IHAodiksIGVlID0gdChQKTtcbiAgICAgIHJldHVybiBlZS53cml0ZUludDMyQkUoWS5oaTMyLCBOKSwgZWUud3JpdGVVSW50MzJCRShZLmxvMzIsIE4gKyA0KSwgODtcbiAgICB9XG4gIH1cbiAgcmUuTmVhckludDY0QkUgPSBBO1xuICBjbGFzcyBGIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3Iodikge1xuICAgICAgc3VwZXIoNCwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIHJldHVybiB0KHYpLnJlYWRGbG9hdExFKFApO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICByZXR1cm4gdChQKS53cml0ZUZsb2F0TEUodiwgTiksIDQ7XG4gICAgfVxuICB9XG4gIHJlLkZsb2F0ID0gRjtcbiAgY2xhc3MgTSBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYpIHtcbiAgICAgIHN1cGVyKDQsIHYpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkRmxvYXRCRShQKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHQoUCkud3JpdGVGbG9hdEJFKHYsIE4pLCA0O1xuICAgIH1cbiAgfVxuICByZS5GbG9hdEJFID0gTTtcbiAgY2xhc3MgSCBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYpIHtcbiAgICAgIHN1cGVyKDgsIHYpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkRG91YmxlTEUoUCk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHJldHVybiB0KFApLndyaXRlRG91YmxlTEUodiwgTiksIDg7XG4gICAgfVxuICB9XG4gIHJlLkRvdWJsZSA9IEg7XG4gIGNsYXNzIEsgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcig4LCB2KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgcmV0dXJuIHQodikucmVhZERvdWJsZUJFKFApO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICByZXR1cm4gdChQKS53cml0ZURvdWJsZUJFKHYsIE4pLCA4O1xuICAgIH1cbiAgfVxuICByZS5Eb3VibGVCRSA9IEs7XG4gIGNsYXNzIGogZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBpZiAoISh2IGluc3RhbmNlb2YgcikpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJlbGVtZW50TGF5b3V0IG11c3QgYmUgYSBMYXlvdXRcIik7XG4gICAgICBpZiAoIShQIGluc3RhbmNlb2YgbyAmJiBQLmlzQ291bnQoKSB8fCBOdW1iZXIuaXNJbnRlZ2VyKFApICYmIDAgPD0gUCkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb3VudCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIGFuIHVuc2lnbmVkIGludGVnZXIgRXh0ZXJuYWxMYXlvdXRcIik7XG4gICAgICBsZXQgWSA9IC0xO1xuICAgICAgIShQIGluc3RhbmNlb2YgbykgJiYgMCA8IHYuc3BhbiAmJiAoWSA9IFAgKiB2LnNwYW4pLCBzdXBlcihZLCBOKSwgdGhpcy5lbGVtZW50TGF5b3V0ID0gdiwgdGhpcy5jb3VudCA9IFA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICBpZiAoMCA8PSB0aGlzLnNwYW4pXG4gICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgICBsZXQgTiA9IDAsIFkgPSB0aGlzLmNvdW50O1xuICAgICAgaWYgKFkgaW5zdGFuY2VvZiBvICYmIChZID0gWS5kZWNvZGUodiwgUCkpLCAwIDwgdGhpcy5lbGVtZW50TGF5b3V0LnNwYW4pXG4gICAgICAgIE4gPSBZICogdGhpcy5lbGVtZW50TGF5b3V0LnNwYW47XG4gICAgICBlbHNlIHtcbiAgICAgICAgbGV0IGVlID0gMDtcbiAgICAgICAgZm9yICg7IGVlIDwgWTsgKVxuICAgICAgICAgIE4gKz0gdGhpcy5lbGVtZW50TGF5b3V0LmdldFNwYW4odiwgUCArIE4pLCArK2VlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSBbXTtcbiAgICAgIGxldCBZID0gMCwgZWUgPSB0aGlzLmNvdW50O1xuICAgICAgZm9yIChlZSBpbnN0YW5jZW9mIG8gJiYgKGVlID0gZWUuZGVjb2RlKHYsIFApKTsgWSA8IGVlOyApXG4gICAgICAgIE4ucHVzaCh0aGlzLmVsZW1lbnRMYXlvdXQuZGVjb2RlKHYsIFApKSwgUCArPSB0aGlzLmVsZW1lbnRMYXlvdXQuZ2V0U3Bhbih2LCBQKSwgWSArPSAxO1xuICAgICAgcmV0dXJuIE47XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIFNlcXVlbmNlfS5cbiAgICAgKlxuICAgICAqICoqTk9URSoqIElmIGBzcmNgIGlzIHNob3J0ZXIgdGhhbiB7QGxpbmsgU2VxdWVuY2UjY291bnR8Y291bnR9IHRoZW5cbiAgICAgKiB0aGUgdW51c2VkIHNwYWNlIGluIHRoZSBidWZmZXIgaXMgbGVmdCB1bmNoYW5nZWQuICBJZiBgc3JjYCBpc1xuICAgICAqIGxvbmdlciB0aGFuIHtAbGluayBTZXF1ZW5jZSNjb3VudHxjb3VudH0gdGhlIHVubmVlZGVkIGVsZW1lbnRzIGFyZVxuICAgICAqIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBJZiB7QGxpbmsgTGF5b3V0I2NvdW50fGNvdW50fSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmtcbiAgICAgKiBFeHRlcm5hbExheW91dH0gdGhlbiB0aGUgbGVuZ3RoIG9mIGBzcmNgIHdpbGwgYmUgZW5jb2RlZCBhcyB0aGVcbiAgICAgKiBjb3VudCBhZnRlciBgc3JjYCBpcyBlbmNvZGVkLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IHRoaXMuZWxlbWVudExheW91dCwgZWUgPSB2LnJlZHVjZSgoaWUsIGxlKSA9PiBpZSArIFkuZW5jb2RlKGxlLCBQLCBOICsgaWUpLCAwKTtcbiAgICAgIHJldHVybiB0aGlzLmNvdW50IGluc3RhbmNlb2YgbyAmJiB0aGlzLmNvdW50LmVuY29kZSh2Lmxlbmd0aCwgUCwgTiksIGVlO1xuICAgIH1cbiAgfVxuICByZS5TZXF1ZW5jZSA9IGo7XG4gIGNsYXNzIEMgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBpZiAoIShBcnJheS5pc0FycmF5KHYpICYmIHYucmVkdWNlKChlZSwgaWUpID0+IGVlICYmIGllIGluc3RhbmNlb2YgciwgITApKSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImZpZWxkcyBtdXN0IGJlIGFycmF5IG9mIExheW91dCBpbnN0YW5jZXNcIik7XG4gICAgICB0eXBlb2YgUCA9PSBcImJvb2xlYW5cIiAmJiBOID09PSB2b2lkIDAgJiYgKE4gPSBQLCBQID0gdm9pZCAwKTtcbiAgICAgIGZvciAoY29uc3QgZWUgb2YgdilcbiAgICAgICAgaWYgKDAgPiBlZS5zcGFuICYmIGVlLnByb3BlcnR5ID09PSB2b2lkIDApXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmllbGRzIGNhbm5vdCBjb250YWluIHVubmFtZWQgdmFyaWFibGUtbGVuZ3RoIGxheW91dFwiKTtcbiAgICAgIGxldCBZID0gLTE7XG4gICAgICB0cnkge1xuICAgICAgICBZID0gdi5yZWR1Y2UoKGVlLCBpZSkgPT4gZWUgKyBpZS5nZXRTcGFuKCksIDApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgICBzdXBlcihZLCBQKSwgdGhpcy5maWVsZHMgPSB2LCB0aGlzLmRlY29kZVByZWZpeGVzID0gISFOO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3Bhbih2LCBQID0gMCkge1xuICAgICAgaWYgKDAgPD0gdGhpcy5zcGFuKVxuICAgICAgICByZXR1cm4gdGhpcy5zcGFuO1xuICAgICAgbGV0IE4gPSAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgTiA9IHRoaXMuZmllbGRzLnJlZHVjZSgoWSwgZWUpID0+IHtcbiAgICAgICAgICBjb25zdCBpZSA9IGVlLmdldFNwYW4odiwgUCk7XG4gICAgICAgICAgcmV0dXJuIFAgKz0gaWUsIFkgKyBpZTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJpbmRldGVybWluYXRlIHNwYW5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gTjtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgZSh2KTtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgZm9yIChjb25zdCBZIG9mIHRoaXMuZmllbGRzKVxuICAgICAgICBpZiAoWS5wcm9wZXJ0eSAhPT0gdm9pZCAwICYmIChOW1kucHJvcGVydHldID0gWS5kZWNvZGUodiwgUCkpLCBQICs9IFkuZ2V0U3Bhbih2LCBQKSwgdGhpcy5kZWNvZGVQcmVmaXhlcyAmJiB2Lmxlbmd0aCA9PT0gUClcbiAgICAgICAgICBicmVhaztcbiAgICAgIHJldHVybiBOO1xuICAgIH1cbiAgICAvKiogSW1wbGVtZW50IHtAbGluayBMYXlvdXQjZW5jb2RlfGVuY29kZX0gZm9yIHtAbGluayBTdHJ1Y3R1cmV9LlxuICAgICAqXG4gICAgICogSWYgYHNyY2AgaXMgbWlzc2luZyBhIHByb3BlcnR5IGZvciBhIG1lbWJlciB3aXRoIGEgZGVmaW5lZCB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9IHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbiBvZiB0aGUgYnVmZmVyIGlzXG4gICAgICogbGVmdCB1bm1vZGlmaWVkLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IE47XG4gICAgICBsZXQgZWUgPSAwLCBpZSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGxlIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgIGxldCBUZSA9IGxlLnNwYW47XG4gICAgICAgIGlmIChpZSA9IDAgPCBUZSA/IFRlIDogMCwgbGUucHJvcGVydHkgIT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnN0IERlID0gdltsZS5wcm9wZXJ0eV07XG4gICAgICAgICAgRGUgIT09IHZvaWQgMCAmJiAoaWUgPSBsZS5lbmNvZGUoRGUsIFAsIE4pLCAwID4gVGUgJiYgKFRlID0gbGUuZ2V0U3BhbihQLCBOKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVlID0gTiwgTiArPSBUZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlZSArIGllIC0gWTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGZyb21BcnJheSh2KSB7XG4gICAgICBjb25zdCBQID0gdGhpcy5tYWtlRGVzdGluYXRpb25PYmplY3QoKTtcbiAgICAgIGZvciAoY29uc3QgTiBvZiB0aGlzLmZpZWxkcylcbiAgICAgICAgTi5wcm9wZXJ0eSAhPT0gdm9pZCAwICYmIDAgPCB2Lmxlbmd0aCAmJiAoUFtOLnByb3BlcnR5XSA9IHYuc2hpZnQoKSk7XG4gICAgICByZXR1cm4gUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFjY2VzcyB0byB0aGUgbGF5b3V0IG9mIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgc3RydWN0dXJlIG1lbWJlciBvZiBpbnRlcmVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xheW91dH0gLSB0aGUgbGF5b3V0IGFzc29jaWF0ZWQgd2l0aCBgcHJvcGVydHlgLCBvclxuICAgICAqIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBzdWNoIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGxheW91dEZvcih2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3BlcnR5IG11c3QgYmUgc3RyaW5nXCIpO1xuICAgICAgZm9yIChjb25zdCBQIG9mIHRoaXMuZmllbGRzKVxuICAgICAgICBpZiAoUC5wcm9wZXJ0eSA9PT0gdilcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvZmZzZXQgb2YgYSBzdHJ1Y3R1cmUgbWVtYmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IC0gdGhlIHN0cnVjdHVyZSBtZW1iZXIgb2YgaW50ZXJlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gdGhlIG9mZnNldCBpbiBieXRlcyB0byB0aGUgc3RhcnQgb2YgYHByb3BlcnR5YFxuICAgICAqIHdpdGhpbiB0aGUgc3RydWN0dXJlLCBvciB1bmRlZmluZWQgaWYgYHByb3BlcnR5YCBpcyBub3QgYSBmaWVsZFxuICAgICAqIHdpdGhpbiB0aGUgc3RydWN0dXJlLiAgSWYgdGhlIHByb3BlcnR5IGlzIGEgbWVtYmVyIGJ1dCBmb2xsb3dzIGFcbiAgICAgKiB2YXJpYWJsZS1sZW5ndGggc3RydWN0dXJlIG1lbWJlciBhIG5lZ2F0aXZlIG51bWJlciB3aWxsIGJlXG4gICAgICogcmV0dXJuZWQuXG4gICAgICovXG4gICAgb2Zmc2V0T2Yodikge1xuICAgICAgaWYgKHR5cGVvZiB2ICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm9wZXJ0eSBtdXN0IGJlIHN0cmluZ1wiKTtcbiAgICAgIGxldCBQID0gMDtcbiAgICAgIGZvciAoY29uc3QgTiBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICBpZiAoTi5wcm9wZXJ0eSA9PT0gdilcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICAgICAgMCA+IE4uc3BhbiA/IFAgPSAtMSA6IDAgPD0gUCAmJiAoUCArPSBOLnNwYW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZS5TdHJ1Y3R1cmUgPSBDO1xuICBjbGFzcyBrIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICB0aGlzLnByb3BlcnR5ID0gdjtcbiAgICB9XG4gICAgLyoqIEFuYWxvZyB0byB7QGxpbmsgTGF5b3V0I2RlY29kZXxMYXlvdXQgZGVjb2RlfSBmb3IgdW5pb24gZGlzY3JpbWluYXRvcnMuXG4gICAgICpcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgbmVlZCBub3QgcmVmZXJlbmNlIHRoZSBidWZmZXIgaWZcbiAgICAgKiB2YXJpYW50IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0aHJvdWdoIG90aGVyIG1lYW5zLiAqL1xuICAgIGRlY29kZSh2LCBQKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmlvbkRpc2NyaW1pbmF0b3IgaXMgYWJzdHJhY3RcIik7XG4gICAgfVxuICAgIC8qKiBBbmFsb2cgdG8ge0BsaW5rIExheW91dCNkZWNvZGV8TGF5b3V0IGVuY29kZX0gZm9yIHVuaW9uIGRpc2NyaW1pbmF0b3JzLlxuICAgICAqXG4gICAgICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIG5lZWQgbm90IHN0b3JlIHRoZSB2YWx1ZSBpZlxuICAgICAqIHZhcmlhbnQgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCB0aHJvdWdoIG90aGVyIG1lYW5zLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmlvbkRpc2NyaW1pbmF0b3IgaXMgYWJzdHJhY3RcIik7XG4gICAgfVxuICB9XG4gIHJlLlVuaW9uRGlzY3JpbWluYXRvciA9IGs7XG4gIGNsYXNzICQgZXh0ZW5kcyBrIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQKSB7XG4gICAgICBpZiAoISh2IGluc3RhbmNlb2YgbyAmJiB2LmlzQ291bnQoKSkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsYXlvdXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIEV4dGVybmFsTGF5b3V0XCIpO1xuICAgICAgc3VwZXIoUCB8fCB2LnByb3BlcnR5IHx8IFwidmFyaWFudFwiKSwgdGhpcy5sYXlvdXQgPSB2O1xuICAgIH1cbiAgICAvKiogRGVsZWdhdGUgZGVjb2RpbmcgdG8ge0BsaW5rIFVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciNsYXlvdXR8bGF5b3V0fS4gKi9cbiAgICBkZWNvZGUodiwgUCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmRlY29kZSh2LCBQKTtcbiAgICB9XG4gICAgLyoqIERlbGVnYXRlIGVuY29kaW5nIHRvIHtAbGluayBVbmlvbkxheW91dERpc2NyaW1pbmF0b3IjbGF5b3V0fGxheW91dH0uICovXG4gICAgZW5jb2RlKHYsIFAsIE4pIHtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dC5lbmNvZGUodiwgUCwgTik7XG4gICAgfVxuICB9XG4gIHJlLlVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciA9ICQ7XG4gIGNsYXNzIFcgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBsZXQgWTtcbiAgICAgIGlmICh2IGluc3RhbmNlb2YgYyB8fCB2IGluc3RhbmNlb2YgdSlcbiAgICAgICAgWSA9IG5ldyAkKG5ldyBsKHYpKTtcbiAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBvICYmIHYuaXNDb3VudCgpKVxuICAgICAgICBZID0gbmV3ICQodik7XG4gICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgaylcbiAgICAgICAgWSA9IHY7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJkaXNjciBtdXN0IGJlIGEgVW5pb25EaXNjcmltaW5hdG9yIG9yIGFuIHVuc2lnbmVkIGludGVnZXIgbGF5b3V0XCIpO1xuICAgICAgaWYgKFAgPT09IHZvaWQgMCAmJiAoUCA9IG51bGwpLCAhKFAgPT09IG51bGwgfHwgUCBpbnN0YW5jZW9mIHIpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZGVmYXVsdExheW91dCBtdXN0IGJlIG51bGwgb3IgYSBMYXlvdXRcIik7XG4gICAgICBpZiAoUCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoMCA+IFAuc3BhbilcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWZhdWx0TGF5b3V0IG11c3QgaGF2ZSBjb25zdGFudCBzcGFuXCIpO1xuICAgICAgICBQLnByb3BlcnR5ID09PSB2b2lkIDAgJiYgKFAgPSBQLnJlcGxpY2F0ZShcImNvbnRlbnRcIikpO1xuICAgICAgfVxuICAgICAgbGV0IGVlID0gLTE7XG4gICAgICBQICYmIChlZSA9IFAuc3BhbiwgMCA8PSBlZSAmJiAodiBpbnN0YW5jZW9mIGMgfHwgdiBpbnN0YW5jZW9mIHUpICYmIChlZSArPSBZLmxheW91dC5zcGFuKSksIHN1cGVyKGVlLCBOKSwgdGhpcy5kaXNjcmltaW5hdG9yID0gWSwgdGhpcy51c2VzUHJlZml4RGlzY3JpbWluYXRvciA9IHYgaW5zdGFuY2VvZiBjIHx8IHYgaW5zdGFuY2VvZiB1LCB0aGlzLmRlZmF1bHRMYXlvdXQgPSBQLCB0aGlzLnJlZ2lzdHJ5ID0ge307XG4gICAgICBsZXQgaWUgPSB0aGlzLmRlZmF1bHRHZXRTb3VyY2VWYXJpYW50LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmdldFNvdXJjZVZhcmlhbnQgPSBmdW5jdGlvbihsZSkge1xuICAgICAgICByZXR1cm4gaWUobGUpO1xuICAgICAgfSwgdGhpcy5jb25maWdHZXRTb3VyY2VWYXJpYW50ID0gZnVuY3Rpb24obGUpIHtcbiAgICAgICAgaWUgPSBsZS5iaW5kKHRoaXMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGdldFNwYW4odiwgUCA9IDApIHtcbiAgICAgIGlmICgwIDw9IHRoaXMuc3BhbilcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLmdldFZhcmlhbnQodiwgUCk7XG4gICAgICBpZiAoIU4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBkZXRlcm1pbmUgc3BhbiBmb3IgdW5yZWNvZ25pemVkIHZhcmlhbnRcIik7XG4gICAgICByZXR1cm4gTi5nZXRTcGFuKHYsIFApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gaW5mZXIgYSByZWdpc3RlcmVkIFVuaW9uIHZhcmlhbnQgY29tcGF0aWJsZSB3aXRoIGBzcmNgLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHNhdGlzZmllZCBydWxlIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgZGVmaW5lcyB0aGVcbiAgICAgKiByZXR1cm4gdmFsdWU6XG4gICAgICogKiBJZiBgc3JjYCBoYXMgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgVW5pb24gZGlzY3JpbWluYXRvciBhbmRcbiAgICAgKiAgIHRoZSBkZWZhdWx0IGxheW91dCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAgKiAgIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5ICh0aGlzIGVuc3VyZXMgdGhlIGRlZmF1bHRcbiAgICAgKiAgIGxheW91dCB3aWxsIGJlIHVzZWQpO1xuICAgICAqICogSWYgYHNyY2AgaGFzIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIFVuaW9uIGRpc2NyaW1pbmF0b3IsIHRoZVxuICAgICAqICAgdmFsdWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgaWRlbnRpZmllcyBhIHJlZ2lzdGVyZWQgdmFyaWFudCwgYW5kXG4gICAgICogICBlaXRoZXIgKGEpIHRoZSB2YXJpYW50IGhhcyBubyBsYXlvdXQsIG9yIChiKSBgc3JjYCBoYXMgdGhlXG4gICAgICogICB2YXJpYW50J3MgcHJvcGVydHksIHRoZW4gdGhlIHZhcmlhbnQgaXMgcmV0dXJuZWQgKGJlY2F1c2UgdGhlXG4gICAgICogICBzb3VyY2Ugc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgdmFyaWFudCBpdCBpZGVudGlmaWVzKTtcbiAgICAgKiAqIElmIGBzcmNgIGRvZXMgbm90IGhhdmUgYSBwcm9wZXJ0eSBtYXRjaGluZyB0aGUgVW5pb25cbiAgICAgKiAgIGRpc2NyaW1pbmF0b3IsIGJ1dCBkb2VzIGhhdmUgYSBwcm9wZXJ0eSBtYXRjaGluZyBhIHJlZ2lzdGVyZWRcbiAgICAgKiAgIHZhcmlhbnQsIHRoZW4gdGhlIHZhcmlhbnQgaXMgcmV0dXJuZWQgKGJlY2F1c2UgdGhlIHNvdXJjZVxuICAgICAqICAgbWF0Y2hlcyBhIHZhcmlhbnQgd2l0aG91dCBhbiBleHBsaWNpdCBjb25mbGljdCk7XG4gICAgICogKiBBbiBlcnJvciBpcyB0aHJvd24gKGJlY2F1c2Ugd2UgZWl0aGVyIGNhbid0IGlkZW50aWZ5IGEgdmFyaWFudCxcbiAgICAgKiAgIG9yIHdlIHdlcmUgZXhwbGljaXRseSB0b2xkIHRoZSB2YXJpYW50IGJ1dCBjYW4ndCBzYXRpc2Z5IGl0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgLSBhbiBvYmplY3QgcHJlc3VtZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIFVuaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7KHVuZGVmaW5lZHxWYXJpYW50TGF5b3V0KX0gLSBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBpZiBgc3JjYCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGVmYXVsdCBvclxuICAgICAqIHJlZ2lzdGVyZWQgdmFyaWFudC5cbiAgICAgKi9cbiAgICBkZWZhdWx0R2V0U291cmNlVmFyaWFudCh2KSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIHRoaXMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eSkpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdExheW91dCAmJiB0aGlzLmRlZmF1bHRMYXlvdXQucHJvcGVydHkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIHRoaXMuZGVmYXVsdExheW91dC5wcm9wZXJ0eSkpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBQID0gdGhpcy5yZWdpc3RyeVt2W3RoaXMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eV1dO1xuICAgICAgICBpZiAoUCAmJiAoIVAubGF5b3V0IHx8IFAucHJvcGVydHkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIFAucHJvcGVydHkpKSlcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBmb3IgKGNvbnN0IFAgaW4gdGhpcy5yZWdpc3RyeSkge1xuICAgICAgICAgIGNvbnN0IE4gPSB0aGlzLnJlZ2lzdHJ5W1BdO1xuICAgICAgICAgIGlmIChOLnByb3BlcnR5ICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2LCBOLnByb3BlcnR5KSlcbiAgICAgICAgICAgIHJldHVybiBOO1xuICAgICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gaW5mZXIgc3JjIHZhcmlhbnRcIik7XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlfSBmb3Ige0BsaW5rIFVuaW9ufS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB2YXJpYW50IGlzIHtAbGluayBVbmlvbiNhZGRWYXJpYW50fHJlZ2lzdGVyZWR9IHRoZSByZXR1cm5cbiAgICAgKiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGF0IHZhcmlhbnQsIHdpdGggbm8gZXhwbGljaXRcbiAgICAgKiBkaXNjcmltaW5hdG9yLiAgT3RoZXJ3aXNlIHRoZSB7QGxpbmsgVW5pb24jZGVmYXVsdExheW91dHxkZWZhdWx0XG4gICAgICogbGF5b3V0fSBpcyB1c2VkIHRvIGRlY29kZSB0aGUgY29udGVudC4gKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGxldCBOO1xuICAgICAgY29uc3QgWSA9IHRoaXMuZGlzY3JpbWluYXRvciwgZWUgPSBZLmRlY29kZSh2LCBQKSwgaWUgPSB0aGlzLnJlZ2lzdHJ5W2VlXTtcbiAgICAgIGlmIChpZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IGxlID0gdGhpcy5kZWZhdWx0TGF5b3V0O1xuICAgICAgICBsZXQgVGUgPSAwO1xuICAgICAgICB0aGlzLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChUZSA9IFkubGF5b3V0LnNwYW4pLCBOID0gdGhpcy5tYWtlRGVzdGluYXRpb25PYmplY3QoKSwgTltZLnByb3BlcnR5XSA9IGVlLCBOW2xlLnByb3BlcnR5XSA9IGxlLmRlY29kZSh2LCBQICsgVGUpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIE4gPSBpZS5kZWNvZGUodiwgUCk7XG4gICAgICByZXR1cm4gTjtcbiAgICB9XG4gICAgLyoqIEltcGxlbWVudCB7QGxpbmsgTGF5b3V0I2VuY29kZXxlbmNvZGV9IGZvciB7QGxpbmsgVW5pb259LlxuICAgICAqXG4gICAgICogVGhpcyBBUEkgYXNzdW1lcyB0aGUgYHNyY2Agb2JqZWN0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdW5pb24nc1xuICAgICAqIHtAbGluayBVbmlvbiNkZWZhdWx0TGF5b3V0fGRlZmF1bHQgbGF5b3V0fS4gIFRvIGVuY29kZSB2YXJpYW50c1xuICAgICAqIHVzZSB0aGUgYXBwcm9wcmlhdGUgdmFyaWFudC1zcGVjaWZpYyB7QGxpbmsgVmFyaWFudExheW91dCNlbmNvZGV9XG4gICAgICogbWV0aG9kLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IHRoaXMuZ2V0U291cmNlVmFyaWFudCh2KTtcbiAgICAgIGlmIChZID09PSB2b2lkIDApIHtcbiAgICAgICAgY29uc3QgZWUgPSB0aGlzLmRpc2NyaW1pbmF0b3IsIGllID0gdGhpcy5kZWZhdWx0TGF5b3V0O1xuICAgICAgICBsZXQgbGUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy51c2VzUHJlZml4RGlzY3JpbWluYXRvciAmJiAobGUgPSBlZS5sYXlvdXQuc3BhbiksIGVlLmVuY29kZSh2W2VlLnByb3BlcnR5XSwgUCwgTiksIGxlICsgaWUuZW5jb2RlKHZbaWUucHJvcGVydHldLCBQLCBOICsgbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFkuZW5jb2RlKHYsIFAsIE4pO1xuICAgIH1cbiAgICAvKiogUmVnaXN0ZXIgYSBuZXcgdmFyaWFudCBzdHJ1Y3R1cmUgd2l0aGluIGEgdW5pb24uICBUaGUgbmV3bHlcbiAgICAgKiBjcmVhdGVkIHZhcmlhbnQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmFyaWFudCAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBWYXJpYW50TGF5b3V0I3ZhcmlhbnR8dmFyaWFudH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xheW91dH0gbGF5b3V0IC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICAgICAqIFZhcmlhbnRMYXlvdXQjbGF5b3V0fGxheW91dH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZhcmlhbnRMYXlvdXR9ICovXG4gICAgYWRkVmFyaWFudCh2LCBQLCBOKSB7XG4gICAgICBjb25zdCBZID0gbmV3IF8odGhpcywgdiwgUCwgTik7XG4gICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeVt2XSA9IFksIFk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGF5b3V0IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdGVyZWQgdmFyaWFudC5cbiAgICAgKlxuICAgICAqIElmIGB2YmAgZG9lcyBub3QgcHJvZHVjZSBhIHJlZ2lzdGVyZWQgdmFyaWFudCB0aGUgZnVuY3Rpb24gcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsoTnVtYmVyfFVpbnQ4QXJyYXkpfSB2YiAtIGVpdGhlciB0aGUgdmFyaWFudCBudW1iZXIsIG9yIGFcbiAgICAgKiBidWZmZXIgZnJvbSB3aGljaCB0aGUgZGlzY3JpbWluYXRvciBpcyB0byBiZSByZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIG9mZnNldCBpbnRvIGB2YmAgZm9yIHRoZSBzdGFydCBvZiB0aGVcbiAgICAgKiB1bmlvbi4gIFVzZWQgb25seSB3aGVuIGB2YmAgaXMgYW4gaW5zdGFuY2Ugb2Yge1VpbnQ4QXJyYXl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7KHtWYXJpYW50TGF5b3V0fXx1bmRlZmluZWQpfVxuICAgICAqL1xuICAgIGdldFZhcmlhbnQodiwgUCA9IDApIHtcbiAgICAgIGxldCBOO1xuICAgICAgcmV0dXJuIHYgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gTiA9IHRoaXMuZGlzY3JpbWluYXRvci5kZWNvZGUodiwgUCkgOiBOID0gdiwgdGhpcy5yZWdpc3RyeVtOXTtcbiAgICB9XG4gIH1cbiAgcmUuVW5pb24gPSBXO1xuICBjbGFzcyBfIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3IodiwgUCwgTiwgWSkge1xuICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIFcpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5pb24gbXVzdCBiZSBhIFVuaW9uXCIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKFApIHx8IDAgPiBQKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFyaWFudCBtdXN0IGJlIGEgKG5vbi1uZWdhdGl2ZSkgaW50ZWdlclwiKTtcbiAgICAgIGlmICh0eXBlb2YgTiA9PSBcInN0cmluZ1wiICYmIFkgPT09IHZvaWQgMCAmJiAoWSA9IE4sIE4gPSBudWxsKSwgTikge1xuICAgICAgICBpZiAoIShOIGluc3RhbmNlb2YgcikpXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxheW91dCBtdXN0IGJlIGEgTGF5b3V0XCIpO1xuICAgICAgICBpZiAodi5kZWZhdWx0TGF5b3V0ICE9PSBudWxsICYmIDAgPD0gTi5zcGFuICYmIE4uc3BhbiA+IHYuZGVmYXVsdExheW91dC5zcGFuKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhcmlhbnQgc3BhbiBleGNlZWRzIHNwYW4gb2YgY29udGFpbmluZyB1bmlvblwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBZICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhcmlhbnQgbXVzdCBoYXZlIGEgU3RyaW5nIHByb3BlcnR5XCIpO1xuICAgICAgfVxuICAgICAgbGV0IGVlID0gdi5zcGFuO1xuICAgICAgMCA+IHYuc3BhbiAmJiAoZWUgPSBOID8gTi5zcGFuIDogMCwgMCA8PSBlZSAmJiB2LnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChlZSArPSB2LmRpc2NyaW1pbmF0b3IubGF5b3V0LnNwYW4pKSwgc3VwZXIoZWUsIFkpLCB0aGlzLnVuaW9uID0gdiwgdGhpcy52YXJpYW50ID0gUCwgdGhpcy5sYXlvdXQgPSBOIHx8IG51bGw7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICBpZiAoMCA8PSB0aGlzLnNwYW4pXG4gICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgICBsZXQgTiA9IDA7XG4gICAgICB0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChOID0gdGhpcy51bmlvbi5kaXNjcmltaW5hdG9yLmxheW91dC5zcGFuKTtcbiAgICAgIGxldCBZID0gMDtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dCAmJiAoWSA9IHRoaXMubGF5b3V0LmdldFNwYW4odiwgUCArIE4pKSwgTiArIFk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgaWYgKHRoaXMgIT09IHRoaXMudW5pb24uZ2V0VmFyaWFudCh2LCBQKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmFyaWFudCBtaXNtYXRjaFwiKTtcbiAgICAgIGxldCBZID0gMDtcbiAgICAgIHJldHVybiB0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChZID0gdGhpcy51bmlvbi5kaXNjcmltaW5hdG9yLmxheW91dC5zcGFuKSwgdGhpcy5sYXlvdXQgPyBOW3RoaXMucHJvcGVydHldID0gdGhpcy5sYXlvdXQuZGVjb2RlKHYsIFAgKyBZKSA6IHRoaXMucHJvcGVydHkgPyBOW3RoaXMucHJvcGVydHldID0gITAgOiB0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChOW3RoaXMudW5pb24uZGlzY3JpbWluYXRvci5wcm9wZXJ0eV0gPSB0aGlzLnZhcmlhbnQpLCBOO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICBsZXQgWSA9IDA7XG4gICAgICBpZiAodGhpcy51bmlvbi51c2VzUHJlZml4RGlzY3JpbWluYXRvciAmJiAoWSA9IHRoaXMudW5pb24uZGlzY3JpbWluYXRvci5sYXlvdXQuc3BhbiksIHRoaXMubGF5b3V0ICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodiwgdGhpcy5wcm9wZXJ0eSkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YXJpYW50IGxhY2tzIHByb3BlcnR5IFwiICsgdGhpcy5wcm9wZXJ0eSk7XG4gICAgICB0aGlzLnVuaW9uLmRpc2NyaW1pbmF0b3IuZW5jb2RlKHRoaXMudmFyaWFudCwgUCwgTik7XG4gICAgICBsZXQgZWUgPSBZO1xuICAgICAgaWYgKHRoaXMubGF5b3V0ICYmICh0aGlzLmxheW91dC5lbmNvZGUodlt0aGlzLnByb3BlcnR5XSwgUCwgTiArIFkpLCBlZSArPSB0aGlzLmxheW91dC5nZXRTcGFuKFAsIE4gKyBZKSwgMCA8PSB0aGlzLnVuaW9uLnNwYW4gJiYgZWUgPiB0aGlzLnVuaW9uLnNwYW4pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmNvZGVkIHZhcmlhbnQgb3ZlcnJ1bnMgY29udGFpbmluZyB1bmlvblwiKTtcbiAgICAgIHJldHVybiBlZTtcbiAgICB9XG4gICAgLyoqIERlbGVnYXRlIHtAbGluayBMYXlvdXQjZnJvbUFycmF5fGZyb21BcnJheX0gdG8ge0BsaW5rXG4gICAgICogVmFyaWFudExheW91dCNsYXlvdXR8bGF5b3V0fS4gKi9cbiAgICBmcm9tQXJyYXkodikge1xuICAgICAgaWYgKHRoaXMubGF5b3V0KVxuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQuZnJvbUFycmF5KHYpO1xuICAgIH1cbiAgfVxuICByZS5WYXJpYW50TGF5b3V0ID0gXztcbiAgZnVuY3Rpb24gZyhtKSB7XG4gICAgcmV0dXJuIDAgPiBtICYmIChtICs9IDQyOTQ5NjcyOTYpLCBtO1xuICB9XG4gIGNsYXNzIHggZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBpZiAoISh2IGluc3RhbmNlb2YgYyB8fCB2IGluc3RhbmNlb2YgdSkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ3b3JkIG11c3QgYmUgYSBVSW50IG9yIFVJbnRCRSBsYXlvdXRcIik7XG4gICAgICBpZiAodHlwZW9mIFAgPT0gXCJzdHJpbmdcIiAmJiBOID09PSB2b2lkIDAgJiYgKE4gPSBQLCBQID0gITEpLCA0IDwgdi5zcGFuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIndvcmQgY2Fubm90IGV4Y2VlZCAzMiBiaXRzXCIpO1xuICAgICAgc3VwZXIodi5zcGFuLCBOKSwgdGhpcy53b3JkID0gdiwgdGhpcy5tc2IgPSAhIVAsIHRoaXMuZmllbGRzID0gW107XG4gICAgICBsZXQgWSA9IDA7XG4gICAgICB0aGlzLl9wYWNrZWRTZXRWYWx1ZSA9IGZ1bmN0aW9uKGVlKSB7XG4gICAgICAgIHJldHVybiBZID0gZyhlZSksIHRoaXM7XG4gICAgICB9LCB0aGlzLl9wYWNrZWRHZXRWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gWTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpLCBZID0gdGhpcy53b3JkLmRlY29kZSh2LCBQKTtcbiAgICAgIHRoaXMuX3BhY2tlZFNldFZhbHVlKFkpO1xuICAgICAgZm9yIChjb25zdCBlZSBvZiB0aGlzLmZpZWxkcylcbiAgICAgICAgZWUucHJvcGVydHkgIT09IHZvaWQgMCAmJiAoTltlZS5wcm9wZXJ0eV0gPSBlZS5kZWNvZGUodikpO1xuICAgICAgcmV0dXJuIE47XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIEJpdFN0cnVjdHVyZX0uXG4gICAgICpcbiAgICAgKiBJZiBgc3JjYCBpcyBtaXNzaW5nIGEgcHJvcGVydHkgZm9yIGEgbWVtYmVyIHdpdGggYSBkZWZpbmVkIHtAbGlua1xuICAgICAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaW9uIG9mIHRoZSBwYWNrZWRcbiAgICAgKiB2YWx1ZSBpcyBsZWZ0IHVubW9kaWZpZWQuICBVbnVzZWQgYml0cyBhcmUgYWxzbyBsZWZ0IHVubW9kaWZpZWQuICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICBjb25zdCBZID0gdGhpcy53b3JkLmRlY29kZShQLCBOKTtcbiAgICAgIHRoaXMuX3BhY2tlZFNldFZhbHVlKFkpO1xuICAgICAgZm9yIChjb25zdCBlZSBvZiB0aGlzLmZpZWxkcylcbiAgICAgICAgaWYgKGVlLnByb3BlcnR5ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBjb25zdCBpZSA9IHZbZWUucHJvcGVydHldO1xuICAgICAgICAgIGllICE9PSB2b2lkIDAgJiYgZWUuZW5jb2RlKGllKTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud29yZC5lbmNvZGUodGhpcy5fcGFja2VkR2V0VmFsdWUoKSwgUCwgTik7XG4gICAgfVxuICAgIC8qKiBSZWdpc3RlciBhIG5ldyBiaXRmaWVsZCB3aXRoIGEgY29udGFpbmluZyBiaXQgc3RydWN0dXJlLiAgVGhlXG4gICAgICogcmVzdWx0aW5nIGJpdGZpZWxkIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJpdHMgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rIEJpdEZpZWxkI2JpdHN8Yml0c30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0JpdEZpZWxkfSAqL1xuICAgIGFkZEZpZWxkKHYsIFApIHtcbiAgICAgIGNvbnN0IE4gPSBuZXcgdyh0aGlzLCB2LCBQKTtcbiAgICAgIHJldHVybiB0aGlzLmZpZWxkcy5wdXNoKE4pLCBOO1xuICAgIH1cbiAgICAvKiogQXMgd2l0aCB7QGxpbmsgQml0U3RydWN0dXJlI2FkZEZpZWxkfGFkZEZpZWxkfSBmb3Igc2luZ2xlLWJpdFxuICAgICAqIGZpZWxkcyB3aXRoIGBib29sZWFuYCB2YWx1ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gKi9cbiAgICAvLyBgQm9vbGVhbmAgY29uZmxpY3RzIHdpdGggdGhlIG5hdGl2ZSBwcmltaXRpdmUgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgYWRkQm9vbGVhbih2KSB7XG4gICAgICBjb25zdCBQID0gbmV3IEQodGhpcywgdik7XG4gICAgICByZXR1cm4gdGhpcy5maWVsZHMucHVzaChQKSwgUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFjY2VzcyB0byB0aGUgYml0IGZpZWxkIGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IC0gdGhlIGJpdCBmaWVsZCBvZiBpbnRlcmVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0JpdEZpZWxkfSAtIHRoZSBmaWVsZCBhc3NvY2lhdGVkIHdpdGggYHByb3BlcnR5YCwgb3JcbiAgICAgKiB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gc3VjaCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBmaWVsZEZvcih2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3BlcnR5IG11c3QgYmUgc3RyaW5nXCIpO1xuICAgICAgZm9yIChjb25zdCBQIG9mIHRoaXMuZmllbGRzKVxuICAgICAgICBpZiAoUC5wcm9wZXJ0eSA9PT0gdilcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICB9XG4gIH1cbiAgcmUuQml0U3RydWN0dXJlID0geDtcbiAgY2xhc3MgdyB7XG4gICAgY29uc3RydWN0b3IodiwgUCwgTikge1xuICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIHgpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29udGFpbmVyIG11c3QgYmUgYSBCaXRTdHJ1Y3R1cmVcIik7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoUCkgfHwgMCA+PSBQKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYml0cyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJcIik7XG4gICAgICBjb25zdCBZID0gOCAqIHYuc3BhbiwgZWUgPSB2LmZpZWxkcy5yZWR1Y2UoKGllLCBsZSkgPT4gaWUgKyBsZS5iaXRzLCAwKTtcbiAgICAgIGlmIChQICsgZWUgPiBZKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiaXRzIHRvbyBsb25nIGZvciBzcGFuIHJlbWFpbmRlciAoXCIgKyAoWSAtIGVlKSArIFwiIG9mIFwiICsgWSArIFwiIHJlbWFpbilcIik7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHYsIHRoaXMuYml0cyA9IFAsIHRoaXMudmFsdWVNYXNrID0gKDEgPDwgUCkgLSAxLCBQID09PSAzMiAmJiAodGhpcy52YWx1ZU1hc2sgPSA0Mjk0OTY3Mjk1KSwgdGhpcy5zdGFydCA9IGVlLCB0aGlzLmNvbnRhaW5lci5tc2IgJiYgKHRoaXMuc3RhcnQgPSBZIC0gZWUgLSBQKSwgdGhpcy53b3JkTWFzayA9IGcodGhpcy52YWx1ZU1hc2sgPDwgdGhpcy5zdGFydCksIHRoaXMucHJvcGVydHkgPSBOO1xuICAgIH1cbiAgICAvKiogU3RvcmUgYSB2YWx1ZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHN1YnNlcXVlbmNlIG9mIHRoZSBjb250YWluaW5nXG4gICAgICogYml0IGZpZWxkLiAqL1xuICAgIGRlY29kZSh2LCBQKSB7XG4gICAgICBjb25zdCBOID0gdGhpcy5jb250YWluZXIuX3BhY2tlZEdldFZhbHVlKCk7XG4gICAgICByZXR1cm4gZyhOICYgdGhpcy53b3JkTWFzaykgPj4+IHRoaXMuc3RhcnQ7XG4gICAgfVxuICAgIC8qKiBTdG9yZSBhIHZhbHVlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc3Vic2VxdWVuY2Ugb2YgdGhlIGNvbnRhaW5pbmdcbiAgICAgKiBiaXQgZmllbGQuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGlzIG5vdCBhIHNwZWNpYWxpemF0aW9uIG9mIHtAbGlua1xuICAgICAqIExheW91dCNlbmNvZGV8TGF5b3V0LmVuY29kZX0gYW5kIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4gKi9cbiAgICBlbmNvZGUodikge1xuICAgICAgaWYgKHR5cGVvZiB2ICE9IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodikgfHwgdiAhPT0gZyh2ICYgdGhpcy52YWx1ZU1hc2spKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG4oXCJCaXRGaWVsZC5lbmNvZGVcIiwgdGhpcykgKyBcIiB2YWx1ZSBtdXN0IGJlIGludGVnZXIgbm90IGV4Y2VlZGluZyBcIiArIHRoaXMudmFsdWVNYXNrKTtcbiAgICAgIGNvbnN0IFAgPSB0aGlzLmNvbnRhaW5lci5fcGFja2VkR2V0VmFsdWUoKSwgTiA9IGcodiA8PCB0aGlzLnN0YXJ0KTtcbiAgICAgIHRoaXMuY29udGFpbmVyLl9wYWNrZWRTZXRWYWx1ZShnKFAgJiB+dGhpcy53b3JkTWFzaykgfCBOKTtcbiAgICB9XG4gIH1cbiAgcmUuQml0RmllbGQgPSB3O1xuICBjbGFzcyBEIGV4dGVuZHMgdyB7XG4gICAgY29uc3RydWN0b3IodiwgUCkge1xuICAgICAgc3VwZXIodiwgMSwgUCk7XG4gICAgfVxuICAgIC8qKiBPdmVycmlkZSB7QGxpbmsgQml0RmllbGQjZGVjb2RlfGRlY29kZX0gZm9yIHtAbGluayBCb29sZWFufEJvb2xlYW59LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICovXG4gICAgZGVjb2RlKHYsIFApIHtcbiAgICAgIHJldHVybiAhIXN1cGVyLmRlY29kZSh2LCBQKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2KSB7XG4gICAgICB0eXBlb2YgdiA9PSBcImJvb2xlYW5cIiAmJiAodiA9ICt2KSwgc3VwZXIuZW5jb2RlKHYpO1xuICAgIH1cbiAgfVxuICByZS5Cb29sZWFuID0gRDtcbiAgY2xhc3MgTyBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmICghKHYgaW5zdGFuY2VvZiBvICYmIHYuaXNDb3VudCgpIHx8IE51bWJlci5pc0ludGVnZXIodikgJiYgMCA8PSB2KSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgb3IgYW4gdW5zaWduZWQgaW50ZWdlciBFeHRlcm5hbExheW91dFwiKTtcbiAgICAgIGxldCBOID0gLTE7XG4gICAgICB2IGluc3RhbmNlb2YgbyB8fCAoTiA9IHYpLCBzdXBlcihOLCBQKSwgdGhpcy5sZW5ndGggPSB2O1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3Bhbih2LCBQKSB7XG4gICAgICBsZXQgTiA9IHRoaXMuc3BhbjtcbiAgICAgIHJldHVybiAwID4gTiAmJiAoTiA9IHRoaXMubGVuZ3RoLmRlY29kZSh2LCBQKSksIE47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGxldCBOID0gdGhpcy5zcGFuO1xuICAgICAgcmV0dXJuIDAgPiBOICYmIChOID0gdGhpcy5sZW5ndGguZGVjb2RlKHYsIFApKSwgdCh2KS5zbGljZShQLCBQICsgTik7XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIEJsb2J9LlxuICAgICAqXG4gICAgICogKipOT1RFKiogSWYge0BsaW5rIExheW91dCNjb3VudHxjb3VudH0gaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rXG4gICAgICogRXh0ZXJuYWxMYXlvdXR9IHRoZW4gdGhlIGxlbmd0aCBvZiBgc3JjYCB3aWxsIGJlIGVuY29kZWQgYXMgdGhlXG4gICAgICogY291bnQgYWZ0ZXIgYHNyY2AgaXMgZW5jb2RlZC4gKi9cbiAgICBlbmNvZGUodiwgUCwgTikge1xuICAgICAgbGV0IFkgPSB0aGlzLmxlbmd0aDtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIG8gJiYgKFkgPSB2Lmxlbmd0aCksICEodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgWSA9PT0gdi5sZW5ndGgpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG4oXCJCbG9iLmVuY29kZVwiLCB0aGlzKSArIFwiIHJlcXVpcmVzIChsZW5ndGggXCIgKyBZICsgXCIpIFVpbnQ4QXJyYXkgYXMgc3JjXCIpO1xuICAgICAgaWYgKE4gKyBZID4gUC5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiZW5jb2Rpbmcgb3ZlcnJ1bnMgVWludDhBcnJheVwiKTtcbiAgICAgIGNvbnN0IGVlID0gdCh2KTtcbiAgICAgIHJldHVybiB0KFApLndyaXRlKGVlLnRvU3RyaW5nKFwiaGV4XCIpLCBOLCBZLCBcImhleFwiKSwgdGhpcy5sZW5ndGggaW5zdGFuY2VvZiBvICYmIHRoaXMubGVuZ3RoLmVuY29kZShZLCBQLCBOKSwgWTtcbiAgICB9XG4gIH1cbiAgcmUuQmxvYiA9IE87XG4gIGNsYXNzIFUgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcigtMSwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICBlKHYpO1xuICAgICAgbGV0IE4gPSBQO1xuICAgICAgZm9yICg7IE4gPCB2Lmxlbmd0aCAmJiB2W05dICE9PSAwOyApXG4gICAgICAgIE4gKz0gMTtcbiAgICAgIHJldHVybiAxICsgTiAtIFA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLmdldFNwYW4odiwgUCk7XG4gICAgICByZXR1cm4gdCh2KS5zbGljZShQLCBQICsgTiAtIDEpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHR5cGVvZiB2ICE9IFwic3RyaW5nXCIgJiYgKHYgPSBTdHJpbmcodikpO1xuICAgICAgY29uc3QgWSA9IHMuQnVmZmVyLmZyb20odiwgXCJ1dGY4XCIpLCBlZSA9IFkubGVuZ3RoO1xuICAgICAgaWYgKE4gKyBlZSA+IFAubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImVuY29kaW5nIG92ZXJydW5zIEJ1ZmZlclwiKTtcbiAgICAgIGNvbnN0IGllID0gdChQKTtcbiAgICAgIHJldHVybiBZLmNvcHkoaWUsIE4pLCBpZVtOICsgZWVdID0gMCwgZWUgKyAxO1xuICAgIH1cbiAgfVxuICByZS5DU3RyaW5nID0gVTtcbiAgY2xhc3MgViBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PSBcInN0cmluZ1wiICYmIFAgPT09IHZvaWQgMCAmJiAoUCA9IHYsIHYgPSB2b2lkIDApLCB2ID09PSB2b2lkIDApXG4gICAgICAgIHYgPSAtMTtcbiAgICAgIGVsc2UgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHYpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibWF4U3BhbiBtdXN0IGJlIGFuIGludGVnZXJcIik7XG4gICAgICBzdXBlcigtMSwgUCksIHRoaXMubWF4U3BhbiA9IHY7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gZSh2KSwgdi5sZW5ndGggLSBQO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICBjb25zdCBOID0gdGhpcy5nZXRTcGFuKHYsIFApO1xuICAgICAgaWYgKDAgPD0gdGhpcy5tYXhTcGFuICYmIHRoaXMubWF4U3BhbiA8IE4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwidGV4dCBsZW5ndGggZXhjZWVkcyBtYXhTcGFuXCIpO1xuICAgICAgcmV0dXJuIHQodikuc2xpY2UoUCwgUCArIE4pLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHR5cGVvZiB2ICE9IFwic3RyaW5nXCIgJiYgKHYgPSBTdHJpbmcodikpO1xuICAgICAgY29uc3QgWSA9IHMuQnVmZmVyLmZyb20odiwgXCJ1dGY4XCIpLCBlZSA9IFkubGVuZ3RoO1xuICAgICAgaWYgKDAgPD0gdGhpcy5tYXhTcGFuICYmIHRoaXMubWF4U3BhbiA8IGVlKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRleHQgbGVuZ3RoIGV4Y2VlZHMgbWF4U3BhblwiKTtcbiAgICAgIGlmIChOICsgZWUgPiBQLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJlbmNvZGluZyBvdmVycnVucyBCdWZmZXJcIik7XG4gICAgICByZXR1cm4gWS5jb3B5KHQoUCksIE4pLCBlZTtcbiAgICB9XG4gIH1cbiAgcmUuVVRGOCA9IFY7XG4gIGNsYXNzIEwgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQKSB7XG4gICAgICBzdXBlcigwLCBQKSwgdGhpcy52YWx1ZSA9IHY7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiByZS5Db25zdGFudCA9IEwsIHJlLmdyZWVkeSA9ICgobSwgdikgPT4gbmV3IGEobSwgdikpLCByZS5vZmZzZXQgPSAoKG0sIHYsIFApID0+IG5ldyBsKG0sIHYsIFApKSwgcmUudTggPSAoKG0pID0+IG5ldyBjKDEsIG0pKSwgcmUudTE2ID0gKChtKSA9PiBuZXcgYygyLCBtKSksIHJlLnUyNCA9ICgobSkgPT4gbmV3IGMoMywgbSkpLCByZS51MzIgPSAoKG0pID0+IG5ldyBjKDQsIG0pKSwgcmUudTQwID0gKChtKSA9PiBuZXcgYyg1LCBtKSksIHJlLnU0OCA9ICgobSkgPT4gbmV3IGMoNiwgbSkpLCByZS5udTY0ID0gKChtKSA9PiBuZXcgRShtKSksIHJlLnUxNmJlID0gKChtKSA9PiBuZXcgdSgyLCBtKSksIHJlLnUyNGJlID0gKChtKSA9PiBuZXcgdSgzLCBtKSksIHJlLnUzMmJlID0gKChtKSA9PiBuZXcgdSg0LCBtKSksIHJlLnU0MGJlID0gKChtKSA9PiBuZXcgdSg1LCBtKSksIHJlLnU0OGJlID0gKChtKSA9PiBuZXcgdSg2LCBtKSksIHJlLm51NjRiZSA9ICgobSkgPT4gbmV3IGIobSkpLCByZS5zOCA9ICgobSkgPT4gbmV3IGQoMSwgbSkpLCByZS5zMTYgPSAoKG0pID0+IG5ldyBkKDIsIG0pKSwgcmUuczI0ID0gKChtKSA9PiBuZXcgZCgzLCBtKSksIHJlLnMzMiA9ICgobSkgPT4gbmV3IGQoNCwgbSkpLCByZS5zNDAgPSAoKG0pID0+IG5ldyBkKDUsIG0pKSwgcmUuczQ4ID0gKChtKSA9PiBuZXcgZCg2LCBtKSksIHJlLm5zNjQgPSAoKG0pID0+IG5ldyBSKG0pKSwgcmUuczE2YmUgPSAoKG0pID0+IG5ldyBoKDIsIG0pKSwgcmUuczI0YmUgPSAoKG0pID0+IG5ldyBoKDMsIG0pKSwgcmUuczMyYmUgPSAoKG0pID0+IG5ldyBoKDQsIG0pKSwgcmUuczQwYmUgPSAoKG0pID0+IG5ldyBoKDUsIG0pKSwgcmUuczQ4YmUgPSAoKG0pID0+IG5ldyBoKDYsIG0pKSwgcmUubnM2NGJlID0gKChtKSA9PiBuZXcgQShtKSksIHJlLmYzMiA9ICgobSkgPT4gbmV3IEYobSkpLCByZS5mMzJiZSA9ICgobSkgPT4gbmV3IE0obSkpLCByZS5mNjQgPSAoKG0pID0+IG5ldyBIKG0pKSwgcmUuZjY0YmUgPSAoKG0pID0+IG5ldyBLKG0pKSwgcmUuc3RydWN0ID0gKChtLCB2LCBQKSA9PiBuZXcgQyhtLCB2LCBQKSksIHJlLmJpdHMgPSAoKG0sIHYsIFApID0+IG5ldyB4KG0sIHYsIFApKSwgcmUuc2VxID0gKChtLCB2LCBQKSA9PiBuZXcgaihtLCB2LCBQKSksIHJlLnVuaW9uID0gKChtLCB2LCBQKSA9PiBuZXcgVyhtLCB2LCBQKSksIHJlLnVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciA9ICgobSwgdikgPT4gbmV3ICQobSwgdikpLCByZS5ibG9iID0gKChtLCB2KSA9PiBuZXcgTyhtLCB2KSksIHJlLmNzdHIgPSAoKG0pID0+IG5ldyBVKG0pKSwgcmUudXRmOCA9ICgobSwgdikgPT4gbmV3IFYobSwgdikpLCByZS5jb25zdGFudCA9ICgobSwgdikgPT4gbmV3IEwobSwgdikpLCByZTtcbn1cbnZhciB6ID0gV3koKSwgenkgPSA4MDc4ZTMsIFl5ID0gODA3ODAwMSwgWnkgPSA4MDc4MDA0LCBYeSA9IDgwNzgwMDUsIEp5ID0gODA3ODAwNiwgUXkgPSA4MDc4MDExO1xuZnVuY3Rpb24geDAocykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzKSA/IFwiJTVCXCIgKyBzLm1hcCh4MCkuam9pbihcbiAgICBcIiUyQyUyMFwiXG4gICAgLyogXCIsIFwiICovXG4gICkgKyAvKiBcIl1cIiAqL1xuICBcIiU1RFwiIDogdHlwZW9mIHMgPT0gXCJiaWdpbnRcIiA/IGAke3N9bmAgOiBlbmNvZGVVUklDb21wb25lbnQoXG4gICAgU3RyaW5nKFxuICAgICAgcyAhPSBudWxsICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihzKSA9PT0gbnVsbCA/IChcbiAgICAgICAgLy8gUGxhaW4gb2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSBkb24ndCBoYXZlIGEgYHRvU3RyaW5nYCBtZXRob2QuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlbSBiZWZvcmUgc3RyaW5naWZ5aW5nIHRoZW0uXG4gICAgICAgIHsgLi4ucyB9XG4gICAgICApIDogc1xuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGV2KFtzLCBlXSkge1xuICByZXR1cm4gYCR7c309JHt4MChlKX1gO1xufVxuZnVuY3Rpb24gdHYocykge1xuICBjb25zdCBlID0gT2JqZWN0LmVudHJpZXMocykubWFwKGV2KS5qb2luKFwiJlwiKTtcbiAgcmV0dXJuIGJ0b2EoZSk7XG59XG5mdW5jdGlvbiBydihzLCBlID0ge30pIHtcbiAge1xuICAgIGxldCB0ID0gYFNvbGFuYSBlcnJvciAjJHtzfTsgRGVjb2RlIHRoaXMgZXJyb3IgYnkgcnVubmluZyBcXGBucHggQHNvbGFuYS9lcnJvcnMgZGVjb2RlIC0tICR7c31gO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGggJiYgKHQgKz0gYCAnJHt0dihlKX0nYCksIGAke3R9XFxgYDtcbiAgfVxufVxudmFyIGJuID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKC4uLltlLCB0XSkge1xuICAgIGxldCByLCBuO1xuICAgIGlmICh0KSB7XG4gICAgICBjb25zdCB7IGNhdXNlOiBvLCAuLi5hIH0gPSB0O1xuICAgICAgbyAmJiAobiA9IHsgY2F1c2U6IG8gfSksIE9iamVjdC5rZXlzKGEpLmxlbmd0aCA+IDAgJiYgKHIgPSBhKTtcbiAgICB9XG4gICAgY29uc3QgaSA9IHJ2KGUsIHIpO1xuICAgIHN1cGVyKGksIG4pO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgcm9vdCBjYXVzZSBvZiB0aGlzIHtAbGluayBTb2xhbmFFcnJvcn0sIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBhIHRyYW5zYWN0aW9uIGVycm9yIG1pZ2h0IGhhdmUgYW4gaW5zdHJ1Y3Rpb24gZXJyb3IgYXMgaXRzIHJvb3QgY2F1c2UuIEluIHRoaXNcbiAgICAgKiBjYXNlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgaW5zdHJ1Y3Rpb24gZXJyb3Igb24gdGhlIHRyYW5zYWN0aW9uIGVycm9yIGFzIGBjYXVzZWAuXG4gICAgICovXG4gICAgQ3IodGhpcywgXCJjYXVzZVwiLCB0aGlzLmNhdXNlKTtcbiAgICAvKipcbiAgICAgKiBDb250YWlucyBjb250ZXh0IHRoYXQgY2FuIGFzc2lzdCBpbiB1bmRlcnN0YW5kaW5nIG9yIHJlY292ZXJpbmcgZnJvbSBhIHtAbGluayBTb2xhbmFFcnJvcn0uXG4gICAgICovXG4gICAgQ3IodGhpcywgXCJjb250ZXh0XCIpO1xuICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgIF9fY29kZTogZSxcbiAgICAgIC4uLnJcbiAgICB9LCB0aGlzLm5hbWUgPSBcIlNvbGFuYUVycm9yXCI7XG4gIH1cbn07XG5mdW5jdGlvbiBzdihzLCBlKSB7XG4gIHJldHVybiBcImZpeGVkU2l6ZVwiIGluIGUgPyBlLmZpeGVkU2l6ZSA6IGUuZ2V0U2l6ZUZyb21WYWx1ZShzKTtcbn1cbmZ1bmN0aW9uIG52KHMpIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIC4uLnMsXG4gICAgZW5jb2RlOiAoZSkgPT4ge1xuICAgICAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KHN2KGUsIHMpKTtcbiAgICAgIHJldHVybiBzLndyaXRlKGUsIHQsIDApLCB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBpdihzKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAuLi5zLFxuICAgIGRlY29kZTogKGUsIHQgPSAwKSA9PiBzLnJlYWQoZSwgdClbMF1cbiAgfSk7XG59XG5mdW5jdGlvbiBkbihzKSB7XG4gIHJldHVybiBcImZpeGVkU2l6ZVwiIGluIHMgJiYgdHlwZW9mIHMuZml4ZWRTaXplID09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBvdihzLCBlKSB7XG4gIGlmIChkbihzKSAhPT0gZG4oZSkpXG4gICAgdGhyb3cgbmV3IGJuKFp5KTtcbiAgaWYgKGRuKHMpICYmIGRuKGUpICYmIHMuZml4ZWRTaXplICE9PSBlLmZpeGVkU2l6ZSlcbiAgICB0aHJvdyBuZXcgYm4oWHksIHtcbiAgICAgIGRlY29kZXJGaXhlZFNpemU6IGUuZml4ZWRTaXplLFxuICAgICAgZW5jb2RlckZpeGVkU2l6ZTogcy5maXhlZFNpemVcbiAgICB9KTtcbiAgaWYgKCFkbihzKSAmJiAhZG4oZSkgJiYgcy5tYXhTaXplICE9PSBlLm1heFNpemUpXG4gICAgdGhyb3cgbmV3IGJuKEp5LCB7XG4gICAgICBkZWNvZGVyTWF4U2l6ZTogZS5tYXhTaXplLFxuICAgICAgZW5jb2Rlck1heFNpemU6IHMubWF4U2l6ZVxuICAgIH0pO1xuICByZXR1cm4ge1xuICAgIC4uLmUsXG4gICAgLi4ucyxcbiAgICBkZWNvZGU6IGUuZGVjb2RlLFxuICAgIGVuY29kZTogcy5lbmNvZGUsXG4gICAgcmVhZDogZS5yZWFkLFxuICAgIHdyaXRlOiBzLndyaXRlXG4gIH07XG59XG5mdW5jdGlvbiBhdihzLCBlLCB0ID0gMCkge1xuICBpZiAoZS5sZW5ndGggLSB0IDw9IDApXG4gICAgdGhyb3cgbmV3IGJuKHp5LCB7XG4gICAgICBjb2RlY0Rlc2NyaXB0aW9uOiBzXG4gICAgfSk7XG59XG5mdW5jdGlvbiBsdihzLCBlLCB0LCByID0gMCkge1xuICBjb25zdCBuID0gdC5sZW5ndGggLSByO1xuICBpZiAobiA8IGUpXG4gICAgdGhyb3cgbmV3IGJuKFl5LCB7XG4gICAgICBieXRlc0xlbmd0aDogbixcbiAgICAgIGNvZGVjRGVzY3JpcHRpb246IHMsXG4gICAgICBleHBlY3RlZDogZVxuICAgIH0pO1xufVxuZnVuY3Rpb24gY3YocywgZSwgdCwgcikge1xuICBpZiAociA8IGUgfHwgciA+IHQpXG4gICAgdGhyb3cgbmV3IGJuKFF5LCB7XG4gICAgICBjb2RlY0Rlc2NyaXB0aW9uOiBzLFxuICAgICAgbWF4OiB0LFxuICAgICAgbWluOiBlLFxuICAgICAgdmFsdWU6IHJcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFMwKHMpIHtcbiAgcmV0dXJuIChzID09IG51bGwgPyB2b2lkIDAgOiBzLmVuZGlhbikgIT09IDE7XG59XG5mdW5jdGlvbiB1dihzKSB7XG4gIHJldHVybiBudih7XG4gICAgZml4ZWRTaXplOiBzLnNpemUsXG4gICAgd3JpdGUoZSwgdCwgcikge1xuICAgICAgcy5yYW5nZSAmJiBjdihzLm5hbWUsIHMucmFuZ2VbMF0sIHMucmFuZ2VbMV0sIGUpO1xuICAgICAgY29uc3QgbiA9IG5ldyBBcnJheUJ1ZmZlcihzLnNpemUpO1xuICAgICAgcmV0dXJuIHMuc2V0KG5ldyBEYXRhVmlldyhuKSwgZSwgUzAocy5jb25maWcpKSwgdC5zZXQobmV3IFVpbnQ4QXJyYXkobiksIHIpLCByICsgcy5zaXplO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBkdihzKSB7XG4gIHJldHVybiBpdih7XG4gICAgZml4ZWRTaXplOiBzLnNpemUsXG4gICAgcmVhZChlLCB0ID0gMCkge1xuICAgICAgYXYocy5uYW1lLCBlLCB0KSwgbHYocy5uYW1lLCBzLnNpemUsIGUsIHQpO1xuICAgICAgY29uc3QgciA9IG5ldyBEYXRhVmlldyhodihlLCB0LCBzLnNpemUpKTtcbiAgICAgIHJldHVybiBbcy5nZXQociwgUzAocy5jb25maWcpKSwgdCArIHMuc2l6ZV07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGh2KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHMuYnl0ZU9mZnNldCArIChlID8/IDApLCBuID0gdCA/PyBzLmJ5dGVMZW5ndGg7XG4gIHJldHVybiBzLmJ1ZmZlci5zbGljZShyLCByICsgbik7XG59XG52YXIgZnYgPSAocyA9IHt9KSA9PiB1dih7XG4gIGNvbmZpZzogcyxcbiAgbmFtZTogXCJ1NjRcIixcbiAgcmFuZ2U6IFswbiwgQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmXCIpXSxcbiAgc2V0OiAoZSwgdCwgcikgPT4gZS5zZXRCaWdVaW50NjQoMCwgQmlnSW50KHQpLCByKSxcbiAgc2l6ZTogOFxufSksIGd2ID0gKHMgPSB7fSkgPT4gZHYoe1xuICBjb25maWc6IHMsXG4gIGdldDogKGUsIHQpID0+IGUuZ2V0QmlnVWludDY0KDAsIHQpLFxuICBuYW1lOiBcInU2NFwiLFxuICBzaXplOiA4XG59KSwgcHYgPSAocyA9IHt9KSA9PiBvdihmdihzKSwgZ3YocykpO1xuY2xhc3MgbXYgZXh0ZW5kcyBUeXBlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgbGV0IHI7XG4gICAgY29uc3QgeyBtZXNzYWdlOiBuLCBleHBsYW5hdGlvbjogaSwgLi4ubyB9ID0gZSwgeyBwYXRoOiBhIH0gPSBlLCBsID0gYS5sZW5ndGggPT09IDAgPyBuIDogYEF0IHBhdGg6ICR7YS5qb2luKFwiLlwiKX0gLS0gJHtufWA7XG4gICAgc3VwZXIoaSA/PyBsKSwgaSAhPSBudWxsICYmICh0aGlzLmNhdXNlID0gbCksIE9iamVjdC5hc3NpZ24odGhpcywgbyksIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSwgdGhpcy5mYWlsdXJlcyA9ICgpID0+IHIgPz8gKHIgPSBbZSwgLi4udCgpXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHl2KHMpIHtcbiAgcmV0dXJuIENpKHMpICYmIHR5cGVvZiBzW1N5bWJvbC5pdGVyYXRvcl0gPT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gQ2kocykge1xuICByZXR1cm4gdHlwZW9mIHMgPT0gXCJvYmplY3RcIiAmJiBzICE9IG51bGw7XG59XG5mdW5jdGlvbiAkbyhzKSB7XG4gIHJldHVybiBDaShzKSAmJiAhQXJyYXkuaXNBcnJheShzKTtcbn1cbmZ1bmN0aW9uIEJyKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwic3ltYm9sXCIgPyBzLnRvU3RyaW5nKCkgOiB0eXBlb2YgcyA9PSBcInN0cmluZ1wiID8gSlNPTi5zdHJpbmdpZnkocykgOiBgJHtzfWA7XG59XG5mdW5jdGlvbiB2dihzKSB7XG4gIGNvbnN0IHsgZG9uZTogZSwgdmFsdWU6IHQgfSA9IHMubmV4dCgpO1xuICByZXR1cm4gZSA/IHZvaWQgMCA6IHQ7XG59XG5mdW5jdGlvbiBFdihzLCBlLCB0LCByKSB7XG4gIGlmIChzID09PSAhMClcbiAgICByZXR1cm47XG4gIHMgPT09ICExID8gcyA9IHt9IDogdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiAmJiAocyA9IHsgbWVzc2FnZTogcyB9KTtcbiAgY29uc3QgeyBwYXRoOiBuLCBicmFuY2g6IGkgfSA9IGUsIHsgdHlwZTogbyB9ID0gdCwgeyByZWZpbmVtZW50OiBhLCBtZXNzYWdlOiBsID0gYEV4cGVjdGVkIGEgdmFsdWUgb2YgdHlwZSBcXGAke299XFxgJHthID8gYCB3aXRoIHJlZmluZW1lbnQgXFxgJHthfVxcYGAgOiBcIlwifSwgYnV0IHJlY2VpdmVkOiBcXGAke0JyKHIpfVxcYGAgfSA9IHM7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHIsXG4gICAgdHlwZTogbyxcbiAgICByZWZpbmVtZW50OiBhLFxuICAgIGtleTogbltuLmxlbmd0aCAtIDFdLFxuICAgIHBhdGg6IG4sXG4gICAgYnJhbmNoOiBpLFxuICAgIC4uLnMsXG4gICAgbWVzc2FnZTogbFxuICB9O1xufVxuZnVuY3Rpb24qIENkKHMsIGUsIHQsIHIpIHtcbiAgeXYocykgfHwgKHMgPSBbc10pO1xuICBmb3IgKGNvbnN0IG4gb2Ygcykge1xuICAgIGNvbnN0IGkgPSBFdihuLCBlLCB0LCByKTtcbiAgICBpICYmICh5aWVsZCBpKTtcbiAgfVxufVxuZnVuY3Rpb24qIEpjKHMsIGUsIHQgPSB7fSkge1xuICBjb25zdCB7IHBhdGg6IHIgPSBbXSwgYnJhbmNoOiBuID0gW3NdLCBjb2VyY2U6IGkgPSAhMSwgbWFzazogbyA9ICExIH0gPSB0LCBhID0geyBwYXRoOiByLCBicmFuY2g6IG4sIG1hc2s6IG8gfTtcbiAgaSAmJiAocyA9IGUuY29lcmNlcihzLCBhKSk7XG4gIGxldCBsID0gXCJ2YWxpZFwiO1xuICBmb3IgKGNvbnN0IGMgb2YgZS52YWxpZGF0b3IocywgYSkpXG4gICAgYy5leHBsYW5hdGlvbiA9IHQubWVzc2FnZSwgbCA9IFwibm90X3ZhbGlkXCIsIHlpZWxkIFtjLCB2b2lkIDBdO1xuICBmb3IgKGxldCBbYywgdSwgZF0gb2YgZS5lbnRyaWVzKHMsIGEpKSB7XG4gICAgY29uc3QgaCA9IEpjKHUsIGQsIHtcbiAgICAgIHBhdGg6IGMgPT09IHZvaWQgMCA/IHIgOiBbLi4uciwgY10sXG4gICAgICBicmFuY2g6IGMgPT09IHZvaWQgMCA/IG4gOiBbLi4ubiwgdV0sXG4gICAgICBjb2VyY2U6IGksXG4gICAgICBtYXNrOiBvLFxuICAgICAgbWVzc2FnZTogdC5tZXNzYWdlXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmIG9mIGgpXG4gICAgICBmWzBdID8gKGwgPSBmWzBdLnJlZmluZW1lbnQgIT0gbnVsbCA/IFwibm90X3JlZmluZWRcIiA6IFwibm90X3ZhbGlkXCIsIHlpZWxkIFtmWzBdLCB2b2lkIDBdKSA6IGkgJiYgKHUgPSBmWzFdLCBjID09PSB2b2lkIDAgPyBzID0gdSA6IHMgaW5zdGFuY2VvZiBNYXAgPyBzLnNldChjLCB1KSA6IHMgaW5zdGFuY2VvZiBTZXQgPyBzLmFkZCh1KSA6IENpKHMpICYmICh1ICE9PSB2b2lkIDAgfHwgYyBpbiBzKSAmJiAoc1tjXSA9IHUpKTtcbiAgfVxuICBpZiAobCAhPT0gXCJub3RfdmFsaWRcIilcbiAgICBmb3IgKGNvbnN0IGMgb2YgZS5yZWZpbmVyKHMsIGEpKVxuICAgICAgYy5leHBsYW5hdGlvbiA9IHQubWVzc2FnZSwgbCA9IFwibm90X3JlZmluZWRcIiwgeWllbGQgW2MsIHZvaWQgMF07XG4gIGwgPT09IFwidmFsaWRcIiAmJiAoeWllbGQgW3ZvaWQgMCwgc10pO1xufVxubGV0IGVzID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgY29uc3QgeyB0eXBlOiB0LCBzY2hlbWE6IHIsIHZhbGlkYXRvcjogbiwgcmVmaW5lcjogaSwgY29lcmNlcjogbyA9IChsKSA9PiBsLCBlbnRyaWVzOiBhID0gZnVuY3Rpb24qICgpIHtcbiAgICB9IH0gPSBlO1xuICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuc2NoZW1hID0gciwgdGhpcy5lbnRyaWVzID0gYSwgdGhpcy5jb2VyY2VyID0gbywgbiA/IHRoaXMudmFsaWRhdG9yID0gKGwsIGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBuKGwsIGMpO1xuICAgICAgcmV0dXJuIENkKHUsIGMsIHRoaXMsIGwpO1xuICAgIH0gOiB0aGlzLnZhbGlkYXRvciA9ICgpID0+IFtdLCBpID8gdGhpcy5yZWZpbmVyID0gKGwsIGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBpKGwsIGMpO1xuICAgICAgcmV0dXJuIENkKHUsIGMsIHRoaXMsIGwpO1xuICAgIH0gOiB0aGlzLnJlZmluZXIgPSAoKSA9PiBbXTtcbiAgfVxuICAvKipcbiAgICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBwYXNzZXMgdGhlIHN0cnVjdCdzIHZhbGlkYXRpb24sIHRocm93aW5nIGlmIGl0IGRvZXNuJ3QuXG4gICAqL1xuICBhc3NlcnQoZSwgdCkge1xuICAgIHJldHVybiB4dihlLCB0aGlzLCB0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdmFsdWUgd2l0aCB0aGUgc3RydWN0J3MgY29lcmNpb24gbG9naWMsIHRoZW4gdmFsaWRhdGUgaXQuXG4gICAqL1xuICBjcmVhdGUoZSwgdCkge1xuICAgIHJldHVybiB0aShlLCB0aGlzLCB0KTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBwYXNzZXMgdGhlIHN0cnVjdCdzIHZhbGlkYXRpb24uXG4gICAqL1xuICBpcyhlKSB7XG4gICAgcmV0dXJuIGIwKGUsIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBNYXNrIGEgdmFsdWUsIGNvZXJjaW5nIGFuZCB2YWxpZGF0aW5nIGl0LCBidXQgcmV0dXJuaW5nIG9ubHkgdGhlIHN1YnNldCBvZlxuICAgKiBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhlIHN0cnVjdCdzIHNjaGVtYS4gTWFza2luZyBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvXG4gICAqIHByb3BzIG9mIGBvYmplY3RgIHN0cnVjdHMgb25seS5cbiAgICovXG4gIG1hc2soZSwgdCkge1xuICAgIHJldHVybiBTdihlLCB0aGlzLCB0KTtcbiAgfVxuICAvKipcbiAgICogVmFsaWRhdGUgYSB2YWx1ZSB3aXRoIHRoZSBzdHJ1Y3QncyB2YWxpZGF0aW9uIGxvZ2ljLCByZXR1cm5pbmcgYSB0dXBsZVxuICAgKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogWW91IG1heSBvcHRpb25hbGx5IHBhc3MgYHRydWVgIGZvciB0aGUgYGNvZXJjZWAgYXJndW1lbnQgdG8gY29lcmNlXG4gICAqIHRoZSB2YWx1ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB2YWxpZGF0ZSBpdC4gSWYgeW91IGRvLCB0aGUgcmVzdWx0IHdpbGxcbiAgICogY29udGFpbiB0aGUgY29lcmNlZCByZXN1bHQgd2hlbiBzdWNjZXNzZnVsLiBBbHNvLCBgbWFza2Agd2lsbCB0dXJuIG9uXG4gICAqIG1hc2tpbmcgb2YgdGhlIHVua25vd24gYG9iamVjdGAgcHJvcHMgcmVjdXJzaXZlbHkgaWYgcGFzc2VkLlxuICAgKi9cbiAgdmFsaWRhdGUoZSwgdCA9IHt9KSB7XG4gICAgcmV0dXJuIGtpKGUsIHRoaXMsIHQpO1xuICB9XG59O1xuZnVuY3Rpb24geHYocywgZSwgdCkge1xuICBjb25zdCByID0ga2kocywgZSwgeyBtZXNzYWdlOiB0IH0pO1xuICBpZiAoclswXSlcbiAgICB0aHJvdyByWzBdO1xufVxuZnVuY3Rpb24gdGkocywgZSwgdCkge1xuICBjb25zdCByID0ga2kocywgZSwgeyBjb2VyY2U6ICEwLCBtZXNzYWdlOiB0IH0pO1xuICBpZiAoclswXSlcbiAgICB0aHJvdyByWzBdO1xuICByZXR1cm4gclsxXTtcbn1cbmZ1bmN0aW9uIFN2KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IGtpKHMsIGUsIHsgY29lcmNlOiAhMCwgbWFzazogITAsIG1lc3NhZ2U6IHQgfSk7XG4gIGlmIChyWzBdKVxuICAgIHRocm93IHJbMF07XG4gIHJldHVybiByWzFdO1xufVxuZnVuY3Rpb24gYjAocywgZSkge1xuICByZXR1cm4gIWtpKHMsIGUpWzBdO1xufVxuZnVuY3Rpb24ga2kocywgZSwgdCA9IHt9KSB7XG4gIGNvbnN0IHIgPSBKYyhzLCBlLCB0KSwgbiA9IHZ2KHIpO1xuICByZXR1cm4gblswXSA/IFtuZXcgbXYoblswXSwgZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGNvbnN0IG8gb2YgcilcbiAgICAgIG9bMF0gJiYgKHlpZWxkIG9bMF0pO1xuICB9KSwgdm9pZCAwXSA6IFt2b2lkIDAsIG5bMV1dO1xufVxuZnVuY3Rpb24gdG4ocywgZSkge1xuICByZXR1cm4gbmV3IGVzKHsgdHlwZTogcywgc2NoZW1hOiBudWxsLCB2YWxpZGF0b3I6IGUgfSk7XG59XG5mdW5jdGlvbiBidigpIHtcbiAgcmV0dXJuIHRuKFwiYW55XCIsICgpID0+ICEwKTtcbn1cbmZ1bmN0aW9uIGZlKHMpIHtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgdHlwZTogXCJhcnJheVwiLFxuICAgIHNjaGVtYTogcyxcbiAgICAqZW50cmllcyhlKSB7XG4gICAgICBpZiAocyAmJiBBcnJheS5pc0FycmF5KGUpKVxuICAgICAgICBmb3IgKGNvbnN0IFt0LCByXSBvZiBlLmVudHJpZXMoKSlcbiAgICAgICAgICB5aWVsZCBbdCwgciwgc107XG4gICAgfSxcbiAgICBjb2VyY2VyKGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZS5zbGljZSgpIDogZTtcbiAgICB9LFxuICAgIHZhbGlkYXRvcihlKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlKSB8fCBgRXhwZWN0ZWQgYW4gYXJyYXkgdmFsdWUsIGJ1dCByZWNlaXZlZDogJHtCcihlKX1gO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBYcigpIHtcbiAgcmV0dXJuIHRuKFwiYm9vbGVhblwiLCAocykgPT4gdHlwZW9mIHMgPT0gXCJib29sZWFuXCIpO1xufVxuZnVuY3Rpb24gUWMocykge1xuICByZXR1cm4gdG4oXCJpbnN0YW5jZVwiLCAoZSkgPT4gZSBpbnN0YW5jZW9mIHMgfHwgYEV4cGVjdGVkIGEgXFxgJHtzLm5hbWV9XFxgIGluc3RhbmNlLCBidXQgcmVjZWl2ZWQ6ICR7QnIoZSl9YCk7XG59XG5mdW5jdGlvbiBwdChzKSB7XG4gIGNvbnN0IGUgPSBCcihzKSwgdCA9IHR5cGVvZiBzO1xuICByZXR1cm4gbmV3IGVzKHtcbiAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICBzY2hlbWE6IHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiA/IHMgOiBudWxsLFxuICAgIHZhbGlkYXRvcihyKSB7XG4gICAgICByZXR1cm4gciA9PT0gcyB8fCBgRXhwZWN0ZWQgdGhlIGxpdGVyYWwgXFxgJHtlfVxcYCwgYnV0IHJlY2VpdmVkOiAke0JyKHIpfWA7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIFR2KCkge1xuICByZXR1cm4gdG4oXCJuZXZlclwiLCAoKSA9PiAhMSk7XG59XG5mdW5jdGlvbiBnZShzKSB7XG4gIHJldHVybiBuZXcgZXMoe1xuICAgIC4uLnMsXG4gICAgdmFsaWRhdG9yOiAoZSwgdCkgPT4gZSA9PT0gbnVsbCB8fCBzLnZhbGlkYXRvcihlLCB0KSxcbiAgICByZWZpbmVyOiAoZSwgdCkgPT4gZSA9PT0gbnVsbCB8fCBzLnJlZmluZXIoZSwgdClcbiAgfSk7XG59XG5mdW5jdGlvbiB0ZSgpIHtcbiAgcmV0dXJuIHRuKFwibnVtYmVyXCIsIChzKSA9PiB0eXBlb2YgcyA9PSBcIm51bWJlclwiICYmICFpc05hTihzKSB8fCBgRXhwZWN0ZWQgYSBudW1iZXIsIGJ1dCByZWNlaXZlZDogJHtCcihzKX1gKTtcbn1cbmZ1bmN0aW9uIFNlKHMpIHtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgLi4ucyxcbiAgICB2YWxpZGF0b3I6IChlLCB0KSA9PiBlID09PSB2b2lkIDAgfHwgcy52YWxpZGF0b3IoZSwgdCksXG4gICAgcmVmaW5lcjogKGUsIHQpID0+IGUgPT09IHZvaWQgMCB8fCBzLnJlZmluZXIoZSwgdClcbiAgfSk7XG59XG5mdW5jdGlvbiBUMChzLCBlKSB7XG4gIHJldHVybiBuZXcgZXMoe1xuICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgc2NoZW1hOiBudWxsLFxuICAgICplbnRyaWVzKHQpIHtcbiAgICAgIGlmIChDaSh0KSlcbiAgICAgICAgZm9yIChjb25zdCByIGluIHQpIHtcbiAgICAgICAgICBjb25zdCBuID0gdFtyXTtcbiAgICAgICAgICB5aWVsZCBbciwgciwgc10sIHlpZWxkIFtyLCBuLCBlXTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdmFsaWRhdG9yKHQpIHtcbiAgICAgIHJldHVybiAkbyh0KSB8fCBgRXhwZWN0ZWQgYW4gb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YDtcbiAgICB9LFxuICAgIGNvZXJjZXIodCkge1xuICAgICAgcmV0dXJuICRvKHQpID8geyAuLi50IH0gOiB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjZSgpIHtcbiAgcmV0dXJuIHRuKFwic3RyaW5nXCIsIChzKSA9PiB0eXBlb2YgcyA9PSBcInN0cmluZ1wiIHx8IGBFeHBlY3RlZCBhIHN0cmluZywgYnV0IHJlY2VpdmVkOiAke0JyKHMpfWApO1xufVxuZnVuY3Rpb24gZXUocykge1xuICBjb25zdCBlID0gVHYoKTtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgIHNjaGVtYTogbnVsbCxcbiAgICAqZW50cmllcyh0KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICBjb25zdCByID0gTWF0aC5tYXgocy5sZW5ndGgsIHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByOyBuKyspXG4gICAgICAgICAgeWllbGQgW24sIHRbbl0sIHNbbl0gfHwgZV07XG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0b3IodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgfHwgYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YDtcbiAgICB9LFxuICAgIGNvZXJjZXIodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyB0LnNsaWNlKCkgOiB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBvZShzKSB7XG4gIGNvbnN0IGUgPSBPYmplY3Qua2V5cyhzKTtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgdHlwZTogXCJ0eXBlXCIsXG4gICAgc2NoZW1hOiBzLFxuICAgICplbnRyaWVzKHQpIHtcbiAgICAgIGlmIChDaSh0KSlcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGUpXG4gICAgICAgICAgeWllbGQgW3IsIHRbcl0sIHNbcl1dO1xuICAgIH0sXG4gICAgdmFsaWRhdG9yKHQpIHtcbiAgICAgIHJldHVybiAkbyh0KSB8fCBgRXhwZWN0ZWQgYW4gb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YDtcbiAgICB9LFxuICAgIGNvZXJjZXIodCkge1xuICAgICAgcmV0dXJuICRvKHQpID8geyAuLi50IH0gOiB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiB1cihzKSB7XG4gIGNvbnN0IGUgPSBzLm1hcCgodCkgPT4gdC50eXBlKS5qb2luKFwiIHwgXCIpO1xuICByZXR1cm4gbmV3IGVzKHtcbiAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgc2NoZW1hOiBudWxsLFxuICAgIGNvZXJjZXIodCwgcikge1xuICAgICAgZm9yIChjb25zdCBuIG9mIHMpIHtcbiAgICAgICAgY29uc3QgW2ksIG9dID0gbi52YWxpZGF0ZSh0LCB7XG4gICAgICAgICAgY29lcmNlOiAhMCxcbiAgICAgICAgICBtYXNrOiByLm1hc2tcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaSlcbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICAgIH0sXG4gICAgdmFsaWRhdG9yKHQsIHIpIHtcbiAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBzKSB7XG4gICAgICAgIGNvbnN0IFsuLi5vXSA9IEpjKHQsIGksIHIpLCBbYV0gPSBvO1xuICAgICAgICBpZiAoYVswXSlcbiAgICAgICAgICBmb3IgKGNvbnN0IFtsXSBvZiBvKVxuICAgICAgICAgICAgbCAmJiBuLnB1c2gobCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICBgRXhwZWN0ZWQgdGhlIHZhbHVlIHRvIHNhdGlzZnkgYSB1bmlvbiBvZiBcXGAke2V9XFxgLCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YCxcbiAgICAgICAgLi4ublxuICAgICAgXTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gR24oKSB7XG4gIHJldHVybiB0bihcInVua25vd25cIiwgKCkgPT4gITApO1xufVxuZnVuY3Rpb24gRGkocywgZSwgdCkge1xuICByZXR1cm4gbmV3IGVzKHtcbiAgICAuLi5zLFxuICAgIGNvZXJjZXI6IChyLCBuKSA9PiBiMChyLCBlKSA/IHMuY29lcmNlcih0KHIsIG4pLCBuKSA6IHMuY29lcmNlcihyLCBuKVxuICB9KTtcbn1cbnZhciAkaSwgd3YgPSBuZXcgVWludDhBcnJheSgxNik7XG5mdW5jdGlvbiB3MCgpIHtcbiAgaWYgKCEkaSAmJiAoJGkgPSB0eXBlb2YgY3J5cHRvIDwgXCJ1XCIgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSB8fCB0eXBlb2YgbXNDcnlwdG8gPCBcInVcIiAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09IFwiZnVuY3Rpb25cIiAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksICEkaSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWRcIik7XG4gIHJldHVybiAkaSh3dik7XG59XG5jb25zdCBBdiA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtcbmZ1bmN0aW9uIHVhKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwic3RyaW5nXCIgJiYgQXYudGVzdChzKTtcbn1cbnZhciBZdCA9IFtdO1xuZm9yICh2YXIgUWEgPSAwOyBRYSA8IDI1NjsgKytRYSlcbiAgWXQucHVzaCgoUWEgKyAyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xuZnVuY3Rpb24gZGEocykge1xuICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDogMCwgdCA9IChZdFtzW2UgKyAwXV0gKyBZdFtzW2UgKyAxXV0gKyBZdFtzW2UgKyAyXV0gKyBZdFtzW2UgKyAzXV0gKyBcIi1cIiArIFl0W3NbZSArIDRdXSArIFl0W3NbZSArIDVdXSArIFwiLVwiICsgWXRbc1tlICsgNl1dICsgWXRbc1tlICsgN11dICsgXCItXCIgKyBZdFtzW2UgKyA4XV0gKyBZdFtzW2UgKyA5XV0gKyBcIi1cIiArIFl0W3NbZSArIDEwXV0gKyBZdFtzW2UgKyAxMV1dICsgWXRbc1tlICsgMTJdXSArIFl0W3NbZSArIDEzXV0gKyBZdFtzW2UgKyAxNF1dICsgWXRbc1tlICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCF1YSh0KSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWRcIik7XG4gIHJldHVybiB0O1xufVxudmFyIGtkLCBlbCwgdGwgPSAwLCBybCA9IDA7XG5mdW5jdGlvbiBJdihzLCBlLCB0KSB7XG4gIHZhciByID0gZSAmJiB0IHx8IDAsIG4gPSBlIHx8IG5ldyBBcnJheSgxNik7XG4gIHMgPSBzIHx8IHt9O1xuICB2YXIgaSA9IHMubm9kZSB8fCBrZCwgbyA9IHMuY2xvY2tzZXEgIT09IHZvaWQgMCA/IHMuY2xvY2tzZXEgOiBlbDtcbiAgaWYgKGkgPT0gbnVsbCB8fCBvID09IG51bGwpIHtcbiAgICB2YXIgYSA9IHMucmFuZG9tIHx8IChzLnJuZyB8fCB3MCkoKTtcbiAgICBpID09IG51bGwgJiYgKGkgPSBrZCA9IFthWzBdIHwgMSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XV0pLCBvID09IG51bGwgJiYgKG8gPSBlbCA9IChhWzZdIDw8IDggfCBhWzddKSAmIDE2MzgzKTtcbiAgfVxuICB2YXIgbCA9IHMubXNlY3MgIT09IHZvaWQgMCA/IHMubXNlY3MgOiBEYXRlLm5vdygpLCBjID0gcy5uc2VjcyAhPT0gdm9pZCAwID8gcy5uc2VjcyA6IHJsICsgMSwgdSA9IGwgLSB0bCArIChjIC0gcmwpIC8gMWU0O1xuICBpZiAodSA8IDAgJiYgcy5jbG9ja3NlcSA9PT0gdm9pZCAwICYmIChvID0gbyArIDEgJiAxNjM4MyksICh1IDwgMCB8fCBsID4gdGwpICYmIHMubnNlY3MgPT09IHZvaWQgMCAmJiAoYyA9IDApLCBjID49IDFlNClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgdGwgPSBsLCBybCA9IGMsIGVsID0gbywgbCArPSAxMjIxOTI5MjhlNTtcbiAgdmFyIGQgPSAoKGwgJiAyNjg0MzU0NTUpICogMWU0ICsgYykgJSA0Mjk0OTY3Mjk2O1xuICBuW3IrK10gPSBkID4+PiAyNCAmIDI1NSwgbltyKytdID0gZCA+Pj4gMTYgJiAyNTUsIG5bcisrXSA9IGQgPj4+IDggJiAyNTUsIG5bcisrXSA9IGQgJiAyNTU7XG4gIHZhciBoID0gbCAvIDQyOTQ5NjcyOTYgKiAxZTQgJiAyNjg0MzU0NTU7XG4gIG5bcisrXSA9IGggPj4+IDggJiAyNTUsIG5bcisrXSA9IGggJiAyNTUsIG5bcisrXSA9IGggPj4+IDI0ICYgMTUgfCAxNiwgbltyKytdID0gaCA+Pj4gMTYgJiAyNTUsIG5bcisrXSA9IG8gPj4+IDggfCAxMjgsIG5bcisrXSA9IG8gJiAyNTU7XG4gIGZvciAodmFyIGYgPSAwOyBmIDwgNjsgKytmKVxuICAgIG5bciArIGZdID0gaVtmXTtcbiAgcmV0dXJuIGUgfHwgZGEobik7XG59XG5mdW5jdGlvbiBBMChzKSB7XG4gIGlmICghdWEocykpXG4gICAgdGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCBVVUlEXCIpO1xuICB2YXIgZSwgdCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgcmV0dXJuIHRbMF0gPSAoZSA9IHBhcnNlSW50KHMuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0LCB0WzFdID0gZSA+Pj4gMTYgJiAyNTUsIHRbMl0gPSBlID4+PiA4ICYgMjU1LCB0WzNdID0gZSAmIDI1NSwgdFs0XSA9IChlID0gcGFyc2VJbnQocy5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDgsIHRbNV0gPSBlICYgMjU1LCB0WzZdID0gKGUgPSBwYXJzZUludChzLnNsaWNlKDE0LCAxOCksIDE2KSkgPj4+IDgsIHRbN10gPSBlICYgMjU1LCB0WzhdID0gKGUgPSBwYXJzZUludChzLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDgsIHRbOV0gPSBlICYgMjU1LCB0WzEwXSA9IChlID0gcGFyc2VJbnQocy5zbGljZSgyNCwgMzYpLCAxNikpIC8gMTA5OTUxMTYyNzc3NiAmIDI1NSwgdFsxMV0gPSBlIC8gNDI5NDk2NzI5NiAmIDI1NSwgdFsxMl0gPSBlID4+PiAyNCAmIDI1NSwgdFsxM10gPSBlID4+PiAxNiAmIDI1NSwgdFsxNF0gPSBlID4+PiA4ICYgMjU1LCB0WzE1XSA9IGUgJiAyNTUsIHQ7XG59XG5mdW5jdGlvbiBfdihzKSB7XG4gIHMgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQocykpO1xuICBmb3IgKHZhciBlID0gW10sIHQgPSAwOyB0IDwgcy5sZW5ndGg7ICsrdClcbiAgICBlLnB1c2gocy5jaGFyQ29kZUF0KHQpKTtcbiAgcmV0dXJuIGU7XG59XG52YXIgUnYgPSBcIjZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOFwiLCBMdiA9IFwiNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4XCI7XG5mdW5jdGlvbiBJMChzLCBlLCB0KSB7XG4gIGZ1bmN0aW9uIHIobiwgaSwgbywgYSkge1xuICAgIGlmICh0eXBlb2YgbiA9PSBcInN0cmluZ1wiICYmIChuID0gX3YobikpLCB0eXBlb2YgaSA9PSBcInN0cmluZ1wiICYmIChpID0gQTAoaSkpLCBpLmxlbmd0aCAhPT0gMTYpXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpXCIpO1xuICAgIHZhciBsID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBuLmxlbmd0aCk7XG4gICAgaWYgKGwuc2V0KGkpLCBsLnNldChuLCBpLmxlbmd0aCksIGwgPSB0KGwpLCBsWzZdID0gbFs2XSAmIDE1IHwgZSwgbFs4XSA9IGxbOF0gJiA2MyB8IDEyOCwgbykge1xuICAgICAgYSA9IGEgfHwgMDtcbiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgMTY7ICsrYylcbiAgICAgICAgb1thICsgY10gPSBsW2NdO1xuICAgICAgcmV0dXJuIG87XG4gICAgfVxuICAgIHJldHVybiBkYShsKTtcbiAgfVxuICB0cnkge1xuICAgIHIubmFtZSA9IHM7XG4gIH0gY2F0Y2gge1xuICB9XG4gIHJldHVybiByLkROUyA9IFJ2LCByLlVSTCA9IEx2LCByO1xufVxuZnVuY3Rpb24gQ3Yocykge1xuICBpZiAodHlwZW9mIHMgPT0gXCJzdHJpbmdcIikge1xuICAgIHZhciBlID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMpKTtcbiAgICBzID0gbmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgpO1xuICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgIHNbdF0gPSBlLmNoYXJDb2RlQXQodCk7XG4gIH1cbiAgcmV0dXJuIGt2KER2KFB2KHMpLCBzLmxlbmd0aCAqIDgpKTtcbn1cbmZ1bmN0aW9uIGt2KHMpIHtcbiAgZm9yICh2YXIgZSA9IFtdLCB0ID0gcy5sZW5ndGggKiAzMiwgciA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiLCBuID0gMDsgbiA8IHQ7IG4gKz0gOCkge1xuICAgIHZhciBpID0gc1tuID4+IDVdID4+PiBuICUgMzIgJiAyNTUsIG8gPSBwYXJzZUludChyLmNoYXJBdChpID4+PiA0ICYgMTUpICsgci5jaGFyQXQoaSAmIDE1KSwgMTYpO1xuICAgIGUucHVzaChvKTtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIF8wKHMpIHtcbiAgcmV0dXJuIChzICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG5mdW5jdGlvbiBEdihzLCBlKSB7XG4gIHNbZSA+PiA1XSB8PSAxMjggPDwgZSAlIDMyLCBzW18wKGUpIC0gMV0gPSBlO1xuICBmb3IgKHZhciB0ID0gMTczMjU4NDE5MywgciA9IC0yNzE3MzM4NzksIG4gPSAtMTczMjU4NDE5NCwgaSA9IDI3MTczMzg3OCwgbyA9IDA7IG8gPCBzLmxlbmd0aDsgbyArPSAxNikge1xuICAgIHZhciBhID0gdCwgbCA9IHIsIGMgPSBuLCB1ID0gaTtcbiAgICB0ID0gZXIodCwgciwgbiwgaSwgc1tvXSwgNywgLTY4MDg3NjkzNiksIGkgPSBlcihpLCB0LCByLCBuLCBzW28gKyAxXSwgMTIsIC0zODk1NjQ1ODYpLCBuID0gZXIobiwgaSwgdCwgciwgc1tvICsgMl0sIDE3LCA2MDYxMDU4MTkpLCByID0gZXIociwgbiwgaSwgdCwgc1tvICsgM10sIDIyLCAtMTA0NDUyNTMzMCksIHQgPSBlcih0LCByLCBuLCBpLCBzW28gKyA0XSwgNywgLTE3NjQxODg5NyksIGkgPSBlcihpLCB0LCByLCBuLCBzW28gKyA1XSwgMTIsIDEyMDAwODA0MjYpLCBuID0gZXIobiwgaSwgdCwgciwgc1tvICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSksIHIgPSBlcihyLCBuLCBpLCB0LCBzW28gKyA3XSwgMjIsIC00NTcwNTk4MyksIHQgPSBlcih0LCByLCBuLCBpLCBzW28gKyA4XSwgNywgMTc3MDAzNTQxNiksIGkgPSBlcihpLCB0LCByLCBuLCBzW28gKyA5XSwgMTIsIC0xOTU4NDE0NDE3KSwgbiA9IGVyKG4sIGksIHQsIHIsIHNbbyArIDEwXSwgMTcsIC00MjA2MyksIHIgPSBlcihyLCBuLCBpLCB0LCBzW28gKyAxMV0sIDIyLCAtMTk5MDQwNDE2MiksIHQgPSBlcih0LCByLCBuLCBpLCBzW28gKyAxMl0sIDcsIDE4MDQ2MDM2ODIpLCBpID0gZXIoaSwgdCwgciwgbiwgc1tvICsgMTNdLCAxMiwgLTQwMzQxMTAxKSwgbiA9IGVyKG4sIGksIHQsIHIsIHNbbyArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKSwgciA9IGVyKHIsIG4sIGksIHQsIHNbbyArIDE1XSwgMjIsIDEyMzY1MzUzMjkpLCB0ID0gdHIodCwgciwgbiwgaSwgc1tvICsgMV0sIDUsIC0xNjU3OTY1MTApLCBpID0gdHIoaSwgdCwgciwgbiwgc1tvICsgNl0sIDksIC0xMDY5NTAxNjMyKSwgbiA9IHRyKG4sIGksIHQsIHIsIHNbbyArIDExXSwgMTQsIDY0MzcxNzcxMyksIHIgPSB0cihyLCBuLCBpLCB0LCBzW29dLCAyMCwgLTM3Mzg5NzMwMiksIHQgPSB0cih0LCByLCBuLCBpLCBzW28gKyA1XSwgNSwgLTcwMTU1ODY5MSksIGkgPSB0cihpLCB0LCByLCBuLCBzW28gKyAxMF0sIDksIDM4MDE2MDgzKSwgbiA9IHRyKG4sIGksIHQsIHIsIHNbbyArIDE1XSwgMTQsIC02NjA0NzgzMzUpLCByID0gdHIociwgbiwgaSwgdCwgc1tvICsgNF0sIDIwLCAtNDA1NTM3ODQ4KSwgdCA9IHRyKHQsIHIsIG4sIGksIHNbbyArIDldLCA1LCA1Njg0NDY0MzgpLCBpID0gdHIoaSwgdCwgciwgbiwgc1tvICsgMTRdLCA5LCAtMTAxOTgwMzY5MCksIG4gPSB0cihuLCBpLCB0LCByLCBzW28gKyAzXSwgMTQsIC0xODczNjM5NjEpLCByID0gdHIociwgbiwgaSwgdCwgc1tvICsgOF0sIDIwLCAxMTYzNTMxNTAxKSwgdCA9IHRyKHQsIHIsIG4sIGksIHNbbyArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpLCBpID0gdHIoaSwgdCwgciwgbiwgc1tvICsgMl0sIDksIC01MTQwMzc4NCksIG4gPSB0cihuLCBpLCB0LCByLCBzW28gKyA3XSwgMTQsIDE3MzUzMjg0NzMpLCByID0gdHIociwgbiwgaSwgdCwgc1tvICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpLCB0ID0gcnIodCwgciwgbiwgaSwgc1tvICsgNV0sIDQsIC0zNzg1NTgpLCBpID0gcnIoaSwgdCwgciwgbiwgc1tvICsgOF0sIDExLCAtMjAyMjU3NDQ2MyksIG4gPSBycihuLCBpLCB0LCByLCBzW28gKyAxMV0sIDE2LCAxODM5MDMwNTYyKSwgciA9IHJyKHIsIG4sIGksIHQsIHNbbyArIDE0XSwgMjMsIC0zNTMwOTU1NiksIHQgPSBycih0LCByLCBuLCBpLCBzW28gKyAxXSwgNCwgLTE1MzA5OTIwNjApLCBpID0gcnIoaSwgdCwgciwgbiwgc1tvICsgNF0sIDExLCAxMjcyODkzMzUzKSwgbiA9IHJyKG4sIGksIHQsIHIsIHNbbyArIDddLCAxNiwgLTE1NTQ5NzYzMiksIHIgPSBycihyLCBuLCBpLCB0LCBzW28gKyAxMF0sIDIzLCAtMTA5NDczMDY0MCksIHQgPSBycih0LCByLCBuLCBpLCBzW28gKyAxM10sIDQsIDY4MTI3OTE3NCksIGkgPSBycihpLCB0LCByLCBuLCBzW29dLCAxMSwgLTM1ODUzNzIyMiksIG4gPSBycihuLCBpLCB0LCByLCBzW28gKyAzXSwgMTYsIC03MjI1MjE5NzkpLCByID0gcnIociwgbiwgaSwgdCwgc1tvICsgNl0sIDIzLCA3NjAyOTE4OSksIHQgPSBycih0LCByLCBuLCBpLCBzW28gKyA5XSwgNCwgLTY0MDM2NDQ4NyksIGkgPSBycihpLCB0LCByLCBuLCBzW28gKyAxMl0sIDExLCAtNDIxODE1ODM1KSwgbiA9IHJyKG4sIGksIHQsIHIsIHNbbyArIDE1XSwgMTYsIDUzMDc0MjUyMCksIHIgPSBycihyLCBuLCBpLCB0LCBzW28gKyAyXSwgMjMsIC05OTUzMzg2NTEpLCB0ID0gc3IodCwgciwgbiwgaSwgc1tvXSwgNiwgLTE5ODYzMDg0NCksIGkgPSBzcihpLCB0LCByLCBuLCBzW28gKyA3XSwgMTAsIDExMjY4OTE0MTUpLCBuID0gc3IobiwgaSwgdCwgciwgc1tvICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpLCByID0gc3IociwgbiwgaSwgdCwgc1tvICsgNV0sIDIxLCAtNTc0MzQwNTUpLCB0ID0gc3IodCwgciwgbiwgaSwgc1tvICsgMTJdLCA2LCAxNzAwNDg1NTcxKSwgaSA9IHNyKGksIHQsIHIsIG4sIHNbbyArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpLCBuID0gc3IobiwgaSwgdCwgciwgc1tvICsgMTBdLCAxNSwgLTEwNTE1MjMpLCByID0gc3IociwgbiwgaSwgdCwgc1tvICsgMV0sIDIxLCAtMjA1NDkyMjc5OSksIHQgPSBzcih0LCByLCBuLCBpLCBzW28gKyA4XSwgNiwgMTg3MzMxMzM1OSksIGkgPSBzcihpLCB0LCByLCBuLCBzW28gKyAxNV0sIDEwLCAtMzA2MTE3NDQpLCBuID0gc3IobiwgaSwgdCwgciwgc1tvICsgNl0sIDE1LCAtMTU2MDE5ODM4MCksIHIgPSBzcihyLCBuLCBpLCB0LCBzW28gKyAxM10sIDIxLCAxMzA5MTUxNjQ5KSwgdCA9IHNyKHQsIHIsIG4sIGksIHNbbyArIDRdLCA2LCAtMTQ1NTIzMDcwKSwgaSA9IHNyKGksIHQsIHIsIG4sIHNbbyArIDExXSwgMTAsIC0xMTIwMjEwMzc5KSwgbiA9IHNyKG4sIGksIHQsIHIsIHNbbyArIDJdLCAxNSwgNzE4Nzg3MjU5KSwgciA9IHNyKHIsIG4sIGksIHQsIHNbbyArIDldLCAyMSwgLTM0MzQ4NTU1MSksIHQgPSBMcyh0LCBhKSwgciA9IExzKHIsIGwpLCBuID0gTHMobiwgYyksIGkgPSBMcyhpLCB1KTtcbiAgfVxuICByZXR1cm4gW3QsIHIsIG4sIGldO1xufVxuZnVuY3Rpb24gUHYocykge1xuICBpZiAocy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFtdO1xuICBmb3IgKHZhciBlID0gcy5sZW5ndGggKiA4LCB0ID0gbmV3IFVpbnQzMkFycmF5KF8wKGUpKSwgciA9IDA7IHIgPCBlOyByICs9IDgpXG4gICAgdFtyID4+IDVdIHw9IChzW3IgLyA4XSAmIDI1NSkgPDwgciAlIDMyO1xuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIExzKHMsIGUpIHtcbiAgdmFyIHQgPSAocyAmIDY1NTM1KSArIChlICYgNjU1MzUpLCByID0gKHMgPj4gMTYpICsgKGUgPj4gMTYpICsgKHQgPj4gMTYpO1xuICByZXR1cm4gciA8PCAxNiB8IHQgJiA2NTUzNTtcbn1cbmZ1bmN0aW9uIE12KHMsIGUpIHtcbiAgcmV0dXJuIHMgPDwgZSB8IHMgPj4+IDMyIC0gZTtcbn1cbmZ1bmN0aW9uIGhhKHMsIGUsIHQsIHIsIG4sIGkpIHtcbiAgcmV0dXJuIExzKE12KExzKExzKGUsIHMpLCBMcyhyLCBpKSksIG4pLCB0KTtcbn1cbmZ1bmN0aW9uIGVyKHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgcmV0dXJuIGhhKGUgJiB0IHwgfmUgJiByLCBzLCBlLCBuLCBpLCBvKTtcbn1cbmZ1bmN0aW9uIHRyKHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgcmV0dXJuIGhhKGUgJiByIHwgdCAmIH5yLCBzLCBlLCBuLCBpLCBvKTtcbn1cbmZ1bmN0aW9uIHJyKHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgcmV0dXJuIGhhKGUgXiB0IF4gciwgcywgZSwgbiwgaSwgbyk7XG59XG5mdW5jdGlvbiBzcihzLCBlLCB0LCByLCBuLCBpLCBvKSB7XG4gIHJldHVybiBoYSh0IF4gKGUgfCB+ciksIHMsIGUsIG4sIGksIG8pO1xufVxudmFyIE92ID0gSTAoXCJ2M1wiLCA0OCwgQ3YpO1xuZnVuY3Rpb24gQnYocywgZSwgdCkge1xuICBzID0gcyB8fCB7fTtcbiAgdmFyIHIgPSBzLnJhbmRvbSB8fCAocy5ybmcgfHwgdzApKCk7XG4gIGlmIChyWzZdID0gcls2XSAmIDE1IHwgNjQsIHJbOF0gPSByWzhdICYgNjMgfCAxMjgsIGUpIHtcbiAgICB0ID0gdCB8fCAwO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgMTY7ICsrbilcbiAgICAgIGVbdCArIG5dID0gcltuXTtcbiAgICByZXR1cm4gZTtcbiAgfVxuICByZXR1cm4gZGEocik7XG59XG5mdW5jdGlvbiBGdihzLCBlLCB0LCByKSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBlICYgdCBeIH5lICYgcjtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZSBeIHQgXiByO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBlICYgdCBeIGUgJiByIF4gdCAmIHI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGUgXiB0IF4gcjtcbiAgfVxufVxuZnVuY3Rpb24gc2wocywgZSkge1xuICByZXR1cm4gcyA8PCBlIHwgcyA+Pj4gMzIgLSBlO1xufVxuZnVuY3Rpb24gTnYocykge1xuICB2YXIgZSA9IFsxNTE4NTAwMjQ5LCAxODU5Nzc1MzkzLCAyNDAwOTU5NzA4LCAzMzk1NDY5NzgyXSwgdCA9IFsxNzMyNTg0MTkzLCA0MDIzMjMzNDE3LCAyNTYyMzgzMTAyLCAyNzE3MzM4NzgsIDMyODUzNzc1MjBdO1xuICBpZiAodHlwZW9mIHMgPT0gXCJzdHJpbmdcIikge1xuICAgIHZhciByID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMpKTtcbiAgICBzID0gW107XG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCByLmxlbmd0aDsgKytuKVxuICAgICAgcy5wdXNoKHIuY2hhckNvZGVBdChuKSk7XG4gIH0gZWxzZSBBcnJheS5pc0FycmF5KHMpIHx8IChzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocykpO1xuICBzLnB1c2goMTI4KTtcbiAgZm9yICh2YXIgaSA9IHMubGVuZ3RoIC8gNCArIDIsIG8gPSBNYXRoLmNlaWwoaSAvIDE2KSwgYSA9IG5ldyBBcnJheShvKSwgbCA9IDA7IGwgPCBvOyArK2wpIHtcbiAgICBmb3IgKHZhciBjID0gbmV3IFVpbnQzMkFycmF5KDE2KSwgdSA9IDA7IHUgPCAxNjsgKyt1KVxuICAgICAgY1t1XSA9IHNbbCAqIDY0ICsgdSAqIDRdIDw8IDI0IHwgc1tsICogNjQgKyB1ICogNCArIDFdIDw8IDE2IHwgc1tsICogNjQgKyB1ICogNCArIDJdIDw8IDggfCBzW2wgKiA2NCArIHUgKiA0ICsgM107XG4gICAgYVtsXSA9IGM7XG4gIH1cbiAgYVtvIC0gMV1bMTRdID0gKHMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpLCBhW28gLSAxXVsxNF0gPSBNYXRoLmZsb29yKGFbbyAtIDFdWzE0XSksIGFbbyAtIDFdWzE1XSA9IChzLmxlbmd0aCAtIDEpICogOCAmIDQyOTQ5NjcyOTU7XG4gIGZvciAodmFyIGQgPSAwOyBkIDwgbzsgKytkKSB7XG4gICAgZm9yICh2YXIgaCA9IG5ldyBVaW50MzJBcnJheSg4MCksIGYgPSAwOyBmIDwgMTY7ICsrZilcbiAgICAgIGhbZl0gPSBhW2RdW2ZdO1xuICAgIGZvciAodmFyIHAgPSAxNjsgcCA8IDgwOyArK3ApXG4gICAgICBoW3BdID0gc2woaFtwIC0gM10gXiBoW3AgLSA4XSBeIGhbcCAtIDE0XSBeIGhbcCAtIDE2XSwgMSk7XG4gICAgZm9yICh2YXIgeSA9IHRbMF0sIEUgPSB0WzFdLCBiID0gdFsyXSwgUiA9IHRbM10sIEEgPSB0WzRdLCBGID0gMDsgRiA8IDgwOyArK0YpIHtcbiAgICAgIHZhciBNID0gTWF0aC5mbG9vcihGIC8gMjApLCBIID0gc2woeSwgNSkgKyBGdihNLCBFLCBiLCBSKSArIEEgKyBlW01dICsgaFtGXSA+Pj4gMDtcbiAgICAgIEEgPSBSLCBSID0gYiwgYiA9IHNsKEUsIDMwKSA+Pj4gMCwgRSA9IHksIHkgPSBIO1xuICAgIH1cbiAgICB0WzBdID0gdFswXSArIHkgPj4+IDAsIHRbMV0gPSB0WzFdICsgRSA+Pj4gMCwgdFsyXSA9IHRbMl0gKyBiID4+PiAwLCB0WzNdID0gdFszXSArIFIgPj4+IDAsIHRbNF0gPSB0WzRdICsgQSA+Pj4gMDtcbiAgfVxuICByZXR1cm4gW3RbMF0gPj4gMjQgJiAyNTUsIHRbMF0gPj4gMTYgJiAyNTUsIHRbMF0gPj4gOCAmIDI1NSwgdFswXSAmIDI1NSwgdFsxXSA+PiAyNCAmIDI1NSwgdFsxXSA+PiAxNiAmIDI1NSwgdFsxXSA+PiA4ICYgMjU1LCB0WzFdICYgMjU1LCB0WzJdID4+IDI0ICYgMjU1LCB0WzJdID4+IDE2ICYgMjU1LCB0WzJdID4+IDggJiAyNTUsIHRbMl0gJiAyNTUsIHRbM10gPj4gMjQgJiAyNTUsIHRbM10gPj4gMTYgJiAyNTUsIHRbM10gPj4gOCAmIDI1NSwgdFszXSAmIDI1NSwgdFs0XSA+PiAyNCAmIDI1NSwgdFs0XSA+PiAxNiAmIDI1NSwgdFs0XSA+PiA4ICYgMjU1LCB0WzRdICYgMjU1XTtcbn1cbnZhciBVdiA9IEkwKFwidjVcIiwgODAsIE52KTtcbmNvbnN0ICR2ID0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcbmZ1bmN0aW9uIEd2KHMpIHtcbiAgaWYgKCF1YShzKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIFVVSURcIik7XG4gIHJldHVybiBwYXJzZUludChzLnN1YnN0cigxNCwgMSksIDE2KTtcbn1cbmNvbnN0IFZ2ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5mcmVlemUoLyogQF9fUFVSRV9fICovIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgTklMOiAkdixcbiAgcGFyc2U6IEEwLFxuICBzdHJpbmdpZnk6IGRhLFxuICB2MTogSXYsXG4gIHYzOiBPdixcbiAgdjQ6IEJ2LFxuICB2NTogVXYsXG4gIHZhbGlkYXRlOiB1YSxcbiAgdmVyc2lvbjogR3Zcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogXCJNb2R1bGVcIiB9KSksIFIwID0gLyogQF9fUFVSRV9fICovIE5jKFZ2KTtcbnZhciBubCwgRGQ7XG5mdW5jdGlvbiBqdigpIHtcbiAgaWYgKERkKSByZXR1cm4gbmw7XG4gIERkID0gMTtcbiAgY29uc3QgcyA9IFIwLnY0O1xuICByZXR1cm4gbmwgPSBmdW5jdGlvbih0LCByLCBuLCBpKSB7XG4gICAgaWYgKHR5cGVvZiB0ICE9IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHQgKyBcIiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIGkgPSBpIHx8IHt9O1xuICAgIGNvbnN0IG8gPSB0eXBlb2YgaS52ZXJzaW9uID09IFwibnVtYmVyXCIgPyBpLnZlcnNpb24gOiAyO1xuICAgIGlmIChvICE9PSAxICYmIG8gIT09IDIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG8gKyBcIiBtdXN0IGJlIDEgb3IgMlwiKTtcbiAgICBjb25zdCBhID0ge1xuICAgICAgbWV0aG9kOiB0XG4gICAgfTtcbiAgICBpZiAobyA9PT0gMiAmJiAoYS5qc29ucnBjID0gXCIyLjBcIiksIHIpIHtcbiAgICAgIGlmICh0eXBlb2YgciAhPSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHIpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHIgKyBcIiBtdXN0IGJlIGFuIG9iamVjdCwgYXJyYXkgb3Igb21pdHRlZFwiKTtcbiAgICAgIGEucGFyYW1zID0gcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuID4gXCJ1XCIpIHtcbiAgICAgIGNvbnN0IGwgPSB0eXBlb2YgaS5nZW5lcmF0b3IgPT0gXCJmdW5jdGlvblwiID8gaS5nZW5lcmF0b3IgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHMoKTtcbiAgICAgIH07XG4gICAgICBhLmlkID0gbChhLCBpKTtcbiAgICB9IGVsc2UgbyA9PT0gMiAmJiBuID09PSBudWxsID8gaS5ub3RpZmljYXRpb25JZE51bGwgJiYgKGEuaWQgPSBudWxsKSA6IGEuaWQgPSBuO1xuICAgIHJldHVybiBhO1xuICB9LCBubDtcbn1cbnZhciBpbCwgUGQ7XG5mdW5jdGlvbiBLdigpIHtcbiAgaWYgKFBkKSByZXR1cm4gaWw7XG4gIFBkID0gMTtcbiAgY29uc3QgcyA9IFIwLnY0LCBlID0ganYoKSwgdCA9IGZ1bmN0aW9uKHIsIG4pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdCkpXG4gICAgICByZXR1cm4gbmV3IHQociwgbik7XG4gICAgbiB8fCAobiA9IHt9KSwgdGhpcy5vcHRpb25zID0ge1xuICAgICAgcmV2aXZlcjogdHlwZW9mIG4ucmV2aXZlciA8IFwidVwiID8gbi5yZXZpdmVyIDogbnVsbCxcbiAgICAgIHJlcGxhY2VyOiB0eXBlb2Ygbi5yZXBsYWNlciA8IFwidVwiID8gbi5yZXBsYWNlciA6IG51bGwsXG4gICAgICBnZW5lcmF0b3I6IHR5cGVvZiBuLmdlbmVyYXRvciA8IFwidVwiID8gbi5nZW5lcmF0b3IgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHMoKTtcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uOiB0eXBlb2Ygbi52ZXJzaW9uIDwgXCJ1XCIgPyBuLnZlcnNpb24gOiAyLFxuICAgICAgbm90aWZpY2F0aW9uSWROdWxsOiB0eXBlb2Ygbi5ub3RpZmljYXRpb25JZE51bGwgPT0gXCJib29sZWFuXCIgPyBuLm5vdGlmaWNhdGlvbklkTnVsbCA6ICExXG4gICAgfSwgdGhpcy5jYWxsU2VydmVyID0gcjtcbiAgfTtcbiAgcmV0dXJuIGlsID0gdCwgdC5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uKHIsIG4sIGksIG8pIHtcbiAgICBjb25zdCBhID0gdGhpcztcbiAgICBsZXQgbCA9IG51bGw7XG4gICAgY29uc3QgYyA9IEFycmF5LmlzQXJyYXkocikgJiYgdHlwZW9mIG4gPT0gXCJmdW5jdGlvblwiO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyc2lvbiA9PT0gMSAmJiBjKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkpTT04tUlBDIDEuMCBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoaW5nXCIpO1xuICAgIGlmIChjIHx8ICFjICYmIHIgJiYgdHlwZW9mIHIgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICBvID0gbiwgbCA9IHI7XG4gICAgZWxzZSB7XG4gICAgICB0eXBlb2YgaSA9PSBcImZ1bmN0aW9uXCIgJiYgKG8gPSBpLCBpID0gdm9pZCAwKTtcbiAgICAgIGNvbnN0IGggPSB0eXBlb2YgbyA9PSBcImZ1bmN0aW9uXCI7XG4gICAgICB0cnkge1xuICAgICAgICBsID0gZShyLCBuLCBpLCB7XG4gICAgICAgICAgZ2VuZXJhdG9yOiB0aGlzLm9wdGlvbnMuZ2VuZXJhdG9yLFxuICAgICAgICAgIHZlcnNpb246IHRoaXMub3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICAgIG5vdGlmaWNhdGlvbklkTnVsbDogdGhpcy5vcHRpb25zLm5vdGlmaWNhdGlvbklkTnVsbFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGYpIHtcbiAgICAgICAgaWYgKGgpXG4gICAgICAgICAgcmV0dXJuIG8oZik7XG4gICAgICAgIHRocm93IGY7XG4gICAgICB9XG4gICAgICBpZiAoIWgpXG4gICAgICAgIHJldHVybiBsO1xuICAgIH1cbiAgICBsZXQgZDtcbiAgICB0cnkge1xuICAgICAgZCA9IEpTT04uc3RyaW5naWZ5KGwsIHRoaXMub3B0aW9ucy5yZXBsYWNlcik7XG4gICAgfSBjYXRjaCAoaCkge1xuICAgICAgcmV0dXJuIG8oaCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhbGxTZXJ2ZXIoZCwgZnVuY3Rpb24oaCwgZikge1xuICAgICAgYS5fcGFyc2VSZXNwb25zZShoLCBmLCBvKTtcbiAgICB9KSwgbDtcbiAgfSwgdC5wcm90b3R5cGUuX3BhcnNlUmVzcG9uc2UgPSBmdW5jdGlvbihyLCBuLCBpKSB7XG4gICAgaWYgKHIpIHtcbiAgICAgIGkocik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbilcbiAgICAgIHJldHVybiBpKCk7XG4gICAgbGV0IG87XG4gICAgdHJ5IHtcbiAgICAgIG8gPSBKU09OLnBhcnNlKG4sIHRoaXMub3B0aW9ucy5yZXZpdmVyKTtcbiAgICB9IGNhdGNoIChhKSB7XG4gICAgICByZXR1cm4gaShhKTtcbiAgICB9XG4gICAgaWYgKGkubGVuZ3RoID09PSAzKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHtcbiAgICAgICAgY29uc3QgYSA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGMuZXJyb3IgPCBcInVcIjtcbiAgICAgICAgfSwgbCA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICByZXR1cm4gIWEoYyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpKG51bGwsIG8uZmlsdGVyKGEpLCBvLmZpbHRlcihsKSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIGkobnVsbCwgby5lcnJvciwgby5yZXN1bHQpO1xuICAgIGkobnVsbCwgbyk7XG4gIH0sIGlsO1xufVxuS3YoKTtcbnZhciBvbCA9IHsgZXhwb3J0czoge30gfSwgTWQ7XG5mdW5jdGlvbiBIdigpIHtcbiAgcmV0dXJuIE1kIHx8IChNZCA9IDEsIChmdW5jdGlvbihzKSB7XG4gICAgdmFyIGUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCB0ID0gXCJ+XCI7XG4gICAgZnVuY3Rpb24gcigpIHtcbiAgICB9XG4gICAgT2JqZWN0LmNyZWF0ZSAmJiAoci5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgbmV3IHIoKS5fX3Byb3RvX18gfHwgKHQgPSAhMSkpO1xuICAgIGZ1bmN0aW9uIG4obCwgYywgdSkge1xuICAgICAgdGhpcy5mbiA9IGwsIHRoaXMuY29udGV4dCA9IGMsIHRoaXMub25jZSA9IHUgfHwgITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGkobCwgYywgdSwgZCwgaCkge1xuICAgICAgaWYgKHR5cGVvZiB1ICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICB2YXIgZiA9IG5ldyBuKHUsIGQgfHwgbCwgaCksIHAgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgcmV0dXJuIGwuX2V2ZW50c1twXSA/IGwuX2V2ZW50c1twXS5mbiA/IGwuX2V2ZW50c1twXSA9IFtsLl9ldmVudHNbcF0sIGZdIDogbC5fZXZlbnRzW3BdLnB1c2goZikgOiAobC5fZXZlbnRzW3BdID0gZiwgbC5fZXZlbnRzQ291bnQrKyksIGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG8obCwgYykge1xuICAgICAgLS1sLl9ldmVudHNDb3VudCA9PT0gMCA/IGwuX2V2ZW50cyA9IG5ldyByKCkgOiBkZWxldGUgbC5fZXZlbnRzW2NdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IHIoKSwgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYyA9IFtdLCB1LCBkO1xuICAgICAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gYztcbiAgICAgIGZvciAoZCBpbiB1ID0gdGhpcy5fZXZlbnRzKVxuICAgICAgICBlLmNhbGwodSwgZCkgJiYgYy5wdXNoKHQgPyBkLnNsaWNlKDEpIDogZCk7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IGMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModSkpIDogYztcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihjKSB7XG4gICAgICB2YXIgdSA9IHQgPyB0ICsgYyA6IGMsIGQgPSB0aGlzLl9ldmVudHNbdV07XG4gICAgICBpZiAoIWQpIHJldHVybiBbXTtcbiAgICAgIGlmIChkLmZuKSByZXR1cm4gW2QuZm5dO1xuICAgICAgZm9yICh2YXIgaCA9IDAsIGYgPSBkLmxlbmd0aCwgcCA9IG5ldyBBcnJheShmKTsgaCA8IGY7IGgrKylcbiAgICAgICAgcFtoXSA9IGRbaF0uZm47XG4gICAgICByZXR1cm4gcDtcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHUgPSB0ID8gdCArIGMgOiBjLCBkID0gdGhpcy5fZXZlbnRzW3VdO1xuICAgICAgcmV0dXJuIGQgPyBkLmZuID8gMSA6IGQubGVuZ3RoIDogMDtcbiAgICB9LCBhLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oYywgdSwgZCwgaCwgZiwgcCkge1xuICAgICAgdmFyIHkgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgaWYgKCF0aGlzLl9ldmVudHNbeV0pIHJldHVybiAhMTtcbiAgICAgIHZhciBFID0gdGhpcy5fZXZlbnRzW3ldLCBiID0gYXJndW1lbnRzLmxlbmd0aCwgUiwgQTtcbiAgICAgIGlmIChFLmZuKSB7XG4gICAgICAgIHN3aXRjaCAoRS5vbmNlICYmIHRoaXMucmVtb3ZlTGlzdGVuZXIoYywgRS5mbiwgdm9pZCAwLCAhMCksIGIpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCksICEwO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1KSwgITA7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQpLCAhMDtcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCwgdSwgZCwgaCksICEwO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1LCBkLCBoLCBmKSwgITA7XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQsIGgsIGYsIHApLCAhMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKEEgPSAxLCBSID0gbmV3IEFycmF5KGIgLSAxKTsgQSA8IGI7IEErKylcbiAgICAgICAgICBSW0EgLSAxXSA9IGFyZ3VtZW50c1tBXTtcbiAgICAgICAgRS5mbi5hcHBseShFLmNvbnRleHQsIFIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIEYgPSBFLmxlbmd0aCwgTTtcbiAgICAgICAgZm9yIChBID0gMDsgQSA8IEY7IEErKylcbiAgICAgICAgICBzd2l0Y2ggKEVbQV0ub25jZSAmJiB0aGlzLnJlbW92ZUxpc3RlbmVyKGMsIEVbQV0uZm4sIHZvaWQgMCwgITApLCBiKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgRVtBXS5mbi5jYWxsKEVbQV0uY29udGV4dCwgdSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBFW0FdLmZuLmNhbGwoRVtBXS5jb250ZXh0LCB1LCBkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQsIHUsIGQsIGgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmICghUikgZm9yIChNID0gMSwgUiA9IG5ldyBBcnJheShiIC0gMSk7IE0gPCBiOyBNKyspXG4gICAgICAgICAgICAgICAgUltNIC0gMV0gPSBhcmd1bWVudHNbTV07XG4gICAgICAgICAgICAgIEVbQV0uZm4uYXBwbHkoRVtBXS5jb250ZXh0LCBSKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgYS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihjLCB1LCBkKSB7XG4gICAgICByZXR1cm4gaSh0aGlzLCBjLCB1LCBkLCAhMSk7XG4gICAgfSwgYS5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGMsIHUsIGQpIHtcbiAgICAgIHJldHVybiBpKHRoaXMsIGMsIHUsIGQsICEwKTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGMsIHUsIGQsIGgpIHtcbiAgICAgIHZhciBmID0gdCA/IHQgKyBjIDogYztcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzW2ZdKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghdSlcbiAgICAgICAgcmV0dXJuIG8odGhpcywgZiksIHRoaXM7XG4gICAgICB2YXIgcCA9IHRoaXMuX2V2ZW50c1tmXTtcbiAgICAgIGlmIChwLmZuKVxuICAgICAgICBwLmZuID09PSB1ICYmICghaCB8fCBwLm9uY2UpICYmICghZCB8fCBwLmNvbnRleHQgPT09IGQpICYmIG8odGhpcywgZik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgeSA9IDAsIEUgPSBbXSwgYiA9IHAubGVuZ3RoOyB5IDwgYjsgeSsrKVxuICAgICAgICAgIChwW3ldLmZuICE9PSB1IHx8IGggJiYgIXBbeV0ub25jZSB8fCBkICYmIHBbeV0uY29udGV4dCAhPT0gZCkgJiYgRS5wdXNoKHBbeV0pO1xuICAgICAgICBFLmxlbmd0aCA/IHRoaXMuX2V2ZW50c1tmXSA9IEUubGVuZ3RoID09PSAxID8gRVswXSA6IEUgOiBvKHRoaXMsIGYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHU7XG4gICAgICByZXR1cm4gYyA/ICh1ID0gdCA/IHQgKyBjIDogYywgdGhpcy5fZXZlbnRzW3VdICYmIG8odGhpcywgdSkpIDogKHRoaXMuX2V2ZW50cyA9IG5ldyByKCksIHRoaXMuX2V2ZW50c0NvdW50ID0gMCksIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUub2ZmID0gYS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsIGEucHJvdG90eXBlLmFkZExpc3RlbmVyID0gYS5wcm90b3R5cGUub24sIGEucHJlZml4ZWQgPSB0LCBhLkV2ZW50RW1pdHRlciA9IGEsIHMuZXhwb3J0cyA9IGE7XG4gIH0pKG9sKSksIG9sLmV4cG9ydHM7XG59XG52YXIgcXYgPSBIdigpO1xuY29uc3QgTDAgPSAvKiBAX19QVVJFX18gKi8gRmMocXYpO1xuY2xhc3MgQzAgZXh0ZW5kcyBXZiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcigpLCB0aGlzLmZpbmlzaGVkID0gITEsIHRoaXMuZGVzdHJveWVkID0gITEsIEhmKGUpO1xuICAgIGNvbnN0IHIgPSBIYyh0KTtcbiAgICBpZiAodGhpcy5pSGFzaCA9IGUuY3JlYXRlKCksIHR5cGVvZiB0aGlzLmlIYXNoLnVwZGF0ZSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBpbnN0YW5jZSBvZiBjbGFzcyB3aGljaCBleHRlbmRzIHV0aWxzLkhhc2hcIik7XG4gICAgdGhpcy5ibG9ja0xlbiA9IHRoaXMuaUhhc2guYmxvY2tMZW4sIHRoaXMub3V0cHV0TGVuID0gdGhpcy5pSGFzaC5vdXRwdXRMZW47XG4gICAgY29uc3QgbiA9IHRoaXMuYmxvY2tMZW4sIGkgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICBpLnNldChyLmxlbmd0aCA+IG4gPyBlLmNyZWF0ZSgpLnVwZGF0ZShyKS5kaWdlc3QoKSA6IHIpO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgaS5sZW5ndGg7IG8rKylcbiAgICAgIGlbb10gXj0gNTQ7XG4gICAgdGhpcy5pSGFzaC51cGRhdGUoaSksIHRoaXMub0hhc2ggPSBlLmNyZWF0ZSgpO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgaS5sZW5ndGg7IG8rKylcbiAgICAgIGlbb10gXj0gMTA2O1xuICAgIHRoaXMub0hhc2gudXBkYXRlKGkpLCBrbihpKTtcbiAgfVxuICB1cGRhdGUoZSkge1xuICAgIHJldHVybiBEbyh0aGlzKSwgdGhpcy5pSGFzaC51cGRhdGUoZSksIHRoaXM7XG4gIH1cbiAgZGlnZXN0SW50byhlKSB7XG4gICAgRG8odGhpcyksIFFzKGUsIHRoaXMub3V0cHV0TGVuKSwgdGhpcy5maW5pc2hlZCA9ICEwLCB0aGlzLmlIYXNoLmRpZ2VzdEludG8oZSksIHRoaXMub0hhc2gudXBkYXRlKGUpLCB0aGlzLm9IYXNoLmRpZ2VzdEludG8oZSksIHRoaXMuZGVzdHJveSgpO1xuICB9XG4gIGRpZ2VzdCgpIHtcbiAgICBjb25zdCBlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5vSGFzaC5vdXRwdXRMZW4pO1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdEludG8oZSksIGU7XG4gIH1cbiAgX2Nsb25lSW50byhlKSB7XG4gICAgZSB8fCAoZSA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLCB7fSkpO1xuICAgIGNvbnN0IHsgb0hhc2g6IHQsIGlIYXNoOiByLCBmaW5pc2hlZDogbiwgZGVzdHJveWVkOiBpLCBibG9ja0xlbjogbywgb3V0cHV0TGVuOiBhIH0gPSB0aGlzO1xuICAgIHJldHVybiBlID0gZSwgZS5maW5pc2hlZCA9IG4sIGUuZGVzdHJveWVkID0gaSwgZS5ibG9ja0xlbiA9IG8sIGUub3V0cHV0TGVuID0gYSwgZS5vSGFzaCA9IHQuX2Nsb25lSW50byhlLm9IYXNoKSwgZS5pSGFzaCA9IHIuX2Nsb25lSW50byhlLmlIYXNoKSwgZTtcbiAgfVxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvbmVJbnRvKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9ICEwLCB0aGlzLm9IYXNoLmRlc3Ryb3koKSwgdGhpcy5pSGFzaC5kZXN0cm95KCk7XG4gIH1cbn1cbmNvbnN0IGswID0gKHMsIGUsIHQpID0+IG5ldyBDMChzLCBlKS51cGRhdGUodCkuZGlnZXN0KCk7XG5rMC5jcmVhdGUgPSAocywgZSkgPT4gbmV3IEMwKHMsIGUpO1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuY29uc3QgT2QgPSAocywgZSkgPT4gKHMgKyAocyA+PSAwID8gZSA6IC1lKSAvIEQwKSAvIGU7XG5mdW5jdGlvbiBXdihzLCBlLCB0KSB7XG4gIGNvbnN0IFtbciwgbl0sIFtpLCBvXV0gPSBlLCBhID0gT2QobyAqIHMsIHQpLCBsID0gT2QoLW4gKiBzLCB0KTtcbiAgbGV0IGMgPSBzIC0gYSAqIHIgLSBsICogaSwgdSA9IC1hICogbiAtIGwgKiBvO1xuICBjb25zdCBkID0gYyA8IGhzLCBoID0gdSA8IGhzO1xuICBkICYmIChjID0gLWMpLCBoICYmICh1ID0gLXUpO1xuICBjb25zdCBmID0gX2koTWF0aC5jZWlsKGUwKHQpIC8gMikpICsgVG47XG4gIGlmIChjIDwgaHMgfHwgYyA+PSBmIHx8IHUgPCBocyB8fCB1ID49IGYpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3BsaXRTY2FsYXIgKGVuZG9tb3JwaGlzbSk6IGZhaWxlZCwgaz1cIiArIHMpO1xuICByZXR1cm4geyBrMW5lZzogZCwgazE6IGMsIGsybmVnOiBoLCBrMjogdSB9O1xufVxuZnVuY3Rpb24gZWMocykge1xuICBpZiAoIVtcImNvbXBhY3RcIiwgXCJyZWNvdmVyZWRcIiwgXCJkZXJcIl0uaW5jbHVkZXMocykpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaWduYXR1cmUgZm9ybWF0IG11c3QgYmUgXCJjb21wYWN0XCIsIFwicmVjb3ZlcmVkXCIsIG9yIFwiZGVyXCInKTtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBhbChzLCBlKSB7XG4gIGNvbnN0IHQgPSB7fTtcbiAgZm9yIChsZXQgciBvZiBPYmplY3Qua2V5cyhlKSlcbiAgICB0W3JdID0gc1tyXSA9PT0gdm9pZCAwID8gZVtyXSA6IHNbcl07XG4gIHJldHVybiBYcyh0Lmxvd1MsIFwibG93U1wiKSwgWHModC5wcmVoYXNoLCBcInByZWhhc2hcIiksIHQuZm9ybWF0ICE9PSB2b2lkIDAgJiYgZWModC5mb3JtYXQpLCB0O1xufVxuY2xhc3MgenYgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcIlwiKSB7XG4gICAgc3VwZXIoZSk7XG4gIH1cbn1cbmNvbnN0IGNzID0ge1xuICAvLyBhc24uMSBERVIgZW5jb2RpbmcgdXRpbHNcbiAgRXJyOiB6dixcbiAgLy8gQmFzaWMgYnVpbGRpbmcgYmxvY2sgaXMgVExWIChUYWctTGVuZ3RoLVZhbHVlKVxuICBfdGx2OiB7XG4gICAgZW5jb2RlOiAocywgZSkgPT4ge1xuICAgICAgY29uc3QgeyBFcnI6IHQgfSA9IGNzO1xuICAgICAgaWYgKHMgPCAwIHx8IHMgPiAyNTYpXG4gICAgICAgIHRocm93IG5ldyB0KFwidGx2LmVuY29kZTogd3JvbmcgdGFnXCIpO1xuICAgICAgaWYgKGUubGVuZ3RoICYgMSlcbiAgICAgICAgdGhyb3cgbmV3IHQoXCJ0bHYuZW5jb2RlOiB1bnBhZGRlZCBkYXRhXCIpO1xuICAgICAgY29uc3QgciA9IGUubGVuZ3RoIC8gMiwgbiA9IE5pKHIpO1xuICAgICAgaWYgKG4ubGVuZ3RoIC8gMiAmIDEyOClcbiAgICAgICAgdGhyb3cgbmV3IHQoXCJ0bHYuZW5jb2RlOiBsb25nIGZvcm0gbGVuZ3RoIHRvbyBiaWdcIik7XG4gICAgICBjb25zdCBpID0gciA+IDEyNyA/IE5pKG4ubGVuZ3RoIC8gMiB8IDEyOCkgOiBcIlwiO1xuICAgICAgcmV0dXJuIE5pKHMpICsgaSArIG4gKyBlO1xuICAgIH0sXG4gICAgLy8gdiAtIHZhbHVlLCBsIC0gbGVmdCBieXRlcyAodW5wYXJzZWQpXG4gICAgZGVjb2RlKHMsIGUpIHtcbiAgICAgIGNvbnN0IHsgRXJyOiB0IH0gPSBjcztcbiAgICAgIGxldCByID0gMDtcbiAgICAgIGlmIChzIDwgMCB8fCBzID4gMjU2KVxuICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5lbmNvZGU6IHdyb25nIHRhZ1wiKTtcbiAgICAgIGlmIChlLmxlbmd0aCA8IDIgfHwgZVtyKytdICE9PSBzKVxuICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5kZWNvZGU6IHdyb25nIHRsdlwiKTtcbiAgICAgIGNvbnN0IG4gPSBlW3IrK10sIGkgPSAhIShuICYgMTI4KTtcbiAgICAgIGxldCBvID0gMDtcbiAgICAgIGlmICghaSlcbiAgICAgICAgbyA9IG47XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbCA9IG4gJiAxMjc7XG4gICAgICAgIGlmICghbClcbiAgICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5kZWNvZGUobG9uZyk6IGluZGVmaW5pdGUgbGVuZ3RoIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIGlmIChsID4gNClcbiAgICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5kZWNvZGUobG9uZyk6IGJ5dGUgbGVuZ3RoIGlzIHRvbyBiaWdcIik7XG4gICAgICAgIGNvbnN0IGMgPSBlLnN1YmFycmF5KHIsIHIgKyBsKTtcbiAgICAgICAgaWYgKGMubGVuZ3RoICE9PSBsKVxuICAgICAgICAgIHRocm93IG5ldyB0KFwidGx2LmRlY29kZTogbGVuZ3RoIGJ5dGVzIG5vdCBjb21wbGV0ZVwiKTtcbiAgICAgICAgaWYgKGNbMF0gPT09IDApXG4gICAgICAgICAgdGhyb3cgbmV3IHQoXCJ0bHYuZGVjb2RlKGxvbmcpOiB6ZXJvIGxlZnRtb3N0IGJ5dGVcIik7XG4gICAgICAgIGZvciAoY29uc3QgdSBvZiBjKVxuICAgICAgICAgIG8gPSBvIDw8IDggfCB1O1xuICAgICAgICBpZiAociArPSBsLCBvIDwgMTI4KVxuICAgICAgICAgIHRocm93IG5ldyB0KFwidGx2LmRlY29kZShsb25nKTogbm90IG1pbmltYWwgZW5jb2RpbmdcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBhID0gZS5zdWJhcnJheShyLCByICsgbyk7XG4gICAgICBpZiAoYS5sZW5ndGggIT09IG8pXG4gICAgICAgIHRocm93IG5ldyB0KFwidGx2LmRlY29kZTogd3JvbmcgdmFsdWUgbGVuZ3RoXCIpO1xuICAgICAgcmV0dXJuIHsgdjogYSwgbDogZS5zdWJhcnJheShyICsgbykgfTtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vY3J5cHRvLnN0YWNrZXhjaGFuZ2UuY29tL2EvNTc3MzQgTGVmdG1vc3QgYml0IG9mIGZpcnN0IGJ5dGUgaXMgJ25lZ2F0aXZlJyBmbGFnLFxuICAvLyBzaW5jZSB3ZSBhbHdheXMgdXNlIHBvc2l0aXZlIGludGVnZXJzIGhlcmUuIEl0IG11c3QgYWx3YXlzIGJlIGVtcHR5OlxuICAvLyAtIGFkZCB6ZXJvIGJ5dGUgaWYgZXhpc3RzXG4gIC8vIC0gaWYgbmV4dCBieXRlIGRvZXNuJ3QgaGF2ZSBhIGZsYWcsIGxlYWRpbmcgemVybyBpcyBub3QgYWxsb3dlZCAobWluaW1hbCBlbmNvZGluZylcbiAgX2ludDoge1xuICAgIGVuY29kZShzKSB7XG4gICAgICBjb25zdCB7IEVycjogZSB9ID0gY3M7XG4gICAgICBpZiAocyA8IGhzKVxuICAgICAgICB0aHJvdyBuZXcgZShcImludGVnZXI6IG5lZ2F0aXZlIGludGVnZXJzIGFyZSBub3QgYWxsb3dlZFwiKTtcbiAgICAgIGxldCB0ID0gTmkocyk7XG4gICAgICBpZiAoTnVtYmVyLnBhcnNlSW50KHRbMF0sIDE2KSAmIDggJiYgKHQgPSBcIjAwXCIgKyB0KSwgdC5sZW5ndGggJiAxKVxuICAgICAgICB0aHJvdyBuZXcgZShcInVuZXhwZWN0ZWQgREVSIHBhcnNpbmcgYXNzZXJ0aW9uOiB1bnBhZGRlZCBoZXhcIik7XG4gICAgICByZXR1cm4gdDtcbiAgICB9LFxuICAgIGRlY29kZShzKSB7XG4gICAgICBjb25zdCB7IEVycjogZSB9ID0gY3M7XG4gICAgICBpZiAoc1swXSAmIDEyOClcbiAgICAgICAgdGhyb3cgbmV3IGUoXCJpbnZhbGlkIHNpZ25hdHVyZSBpbnRlZ2VyOiBuZWdhdGl2ZVwiKTtcbiAgICAgIGlmIChzWzBdID09PSAwICYmICEoc1sxXSAmIDEyOCkpXG4gICAgICAgIHRocm93IG5ldyBlKFwiaW52YWxpZCBzaWduYXR1cmUgaW50ZWdlcjogdW5uZWNlc3NhcnkgbGVhZGluZyB6ZXJvXCIpO1xuICAgICAgcmV0dXJuIGxhKHMpO1xuICAgIH1cbiAgfSxcbiAgdG9TaWcocykge1xuICAgIGNvbnN0IHsgRXJyOiBlLCBfaW50OiB0LCBfdGx2OiByIH0gPSBjcywgbiA9IEV0KFwic2lnbmF0dXJlXCIsIHMpLCB7IHY6IGksIGw6IG8gfSA9IHIuZGVjb2RlKDQ4LCBuKTtcbiAgICBpZiAoby5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgZShcImludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmdcIik7XG4gICAgY29uc3QgeyB2OiBhLCBsIH0gPSByLmRlY29kZSgyLCBpKSwgeyB2OiBjLCBsOiB1IH0gPSByLmRlY29kZSgyLCBsKTtcbiAgICBpZiAodS5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgZShcImludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmdcIik7XG4gICAgcmV0dXJuIHsgcjogdC5kZWNvZGUoYSksIHM6IHQuZGVjb2RlKGMpIH07XG4gIH0sXG4gIGhleEZyb21TaWcocykge1xuICAgIGNvbnN0IHsgX3RsdjogZSwgX2ludDogdCB9ID0gY3MsIHIgPSBlLmVuY29kZSgyLCB0LmVuY29kZShzLnIpKSwgbiA9IGUuZW5jb2RlKDIsIHQuZW5jb2RlKHMucykpLCBpID0gciArIG47XG4gICAgcmV0dXJuIGUuZW5jb2RlKDQ4LCBpKTtcbiAgfVxufSwgaHMgPSBCaWdJbnQoMCksIFRuID0gQmlnSW50KDEpLCBEMCA9IEJpZ0ludCgyKSwgR2kgPSBCaWdJbnQoMyksIFl2ID0gQmlnSW50KDQpO1xuZnVuY3Rpb24gRW4ocywgZSkge1xuICBjb25zdCB7IEJZVEVTOiB0IH0gPSBzO1xuICBsZXQgcjtcbiAgaWYgKHR5cGVvZiBlID09IFwiYmlnaW50XCIpXG4gICAgciA9IGU7XG4gIGVsc2Uge1xuICAgIGxldCBuID0gRXQoXCJwcml2YXRlIGtleVwiLCBlKTtcbiAgICB0cnkge1xuICAgICAgciA9IHMuZnJvbUJ5dGVzKG4pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHByaXZhdGUga2V5OiBleHBlY3RlZCB1aThhIG9mIHNpemUgJHt0fSwgZ290ICR7dHlwZW9mIGV9YCk7XG4gICAgfVxuICB9XG4gIGlmICghcy5pc1ZhbGlkTm90MChyKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHByaXZhdGUga2V5OiBvdXQgb2YgcmFuZ2UgWzEuLk4tMV1cIik7XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gWnYocywgZSA9IHt9KSB7XG4gIGNvbnN0IHQgPSBtMChcIndlaWVyc3RyYXNzXCIsIHMsIGUpLCB7IEZwOiByLCBGbjogbiB9ID0gdDtcbiAgbGV0IGkgPSB0LkNVUlZFO1xuICBjb25zdCB7IGg6IG8sIG46IGEgfSA9IGk7XG4gIFJpKGUsIHt9LCB7XG4gICAgYWxsb3dJbmZpbml0eVBvaW50OiBcImJvb2xlYW5cIixcbiAgICBjbGVhckNvZmFjdG9yOiBcImZ1bmN0aW9uXCIsXG4gICAgaXNUb3JzaW9uRnJlZTogXCJmdW5jdGlvblwiLFxuICAgIGZyb21CeXRlczogXCJmdW5jdGlvblwiLFxuICAgIHRvQnl0ZXM6IFwiZnVuY3Rpb25cIixcbiAgICBlbmRvOiBcIm9iamVjdFwiLFxuICAgIHdyYXBQcml2YXRlS2V5OiBcImJvb2xlYW5cIlxuICB9KTtcbiAgY29uc3QgeyBlbmRvOiBsIH0gPSBlO1xuICBpZiAobCAmJiAoIXIuaXMwKGkuYSkgfHwgdHlwZW9mIGwuYmV0YSAhPSBcImJpZ2ludFwiIHx8ICFBcnJheS5pc0FycmF5KGwuYmFzaXNlcykpKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbmRvOiBleHBlY3RlZCBcImJldGFcIjogYmlnaW50IGFuZCBcImJhc2lzZXNcIjogYXJyYXknKTtcbiAgY29uc3QgYyA9IE0wKHIsIG4pO1xuICBmdW5jdGlvbiB1KCkge1xuICAgIGlmICghci5pc09kZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbXByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQ6IEZpZWxkIGRvZXMgbm90IGhhdmUgLmlzT2RkKClcIik7XG4gIH1cbiAgZnVuY3Rpb24gZChXLCBfLCBnKSB7XG4gICAgY29uc3QgeyB4LCB5OiB3IH0gPSBfLnRvQWZmaW5lKCksIEQgPSByLnRvQnl0ZXMoeCk7XG4gICAgaWYgKFhzKGcsIFwiaXNDb21wcmVzc2VkXCIpLCBnKSB7XG4gICAgICB1KCk7XG4gICAgICBjb25zdCBPID0gIXIuaXNPZGQodyk7XG4gICAgICByZXR1cm4gS3IoUDAoTyksIEQpO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuIEtyKFVpbnQ4QXJyYXkub2YoNCksIEQsIHIudG9CeXRlcyh3KSk7XG4gIH1cbiAgZnVuY3Rpb24gaChXKSB7XG4gICAgT3IoVywgdm9pZCAwLCBcIlBvaW50XCIpO1xuICAgIGNvbnN0IHsgcHVibGljS2V5OiBfLCBwdWJsaWNLZXlVbmNvbXByZXNzZWQ6IGcgfSA9IGMsIHggPSBXLmxlbmd0aCwgdyA9IFdbMF0sIEQgPSBXLnN1YmFycmF5KDEpO1xuICAgIGlmICh4ID09PSBfICYmICh3ID09PSAyIHx8IHcgPT09IDMpKSB7XG4gICAgICBjb25zdCBPID0gci5mcm9tQnl0ZXMoRCk7XG4gICAgICBpZiAoIXIuaXNWYWxpZChPKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHBvaW50OiBpcyBub3Qgb24gY3VydmUsIHdyb25nIHhcIik7XG4gICAgICBjb25zdCBVID0geShPKTtcbiAgICAgIGxldCBWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgViA9IHIuc3FydChVKTtcbiAgICAgIH0gY2F0Y2ggKHYpIHtcbiAgICAgICAgY29uc3QgUCA9IHYgaW5zdGFuY2VvZiBFcnJvciA/IFwiOiBcIiArIHYubWVzc2FnZSA6IFwiXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogaXMgbm90IG9uIGN1cnZlLCBzcXJ0IGVycm9yXCIgKyBQKTtcbiAgICAgIH1cbiAgICAgIHUoKTtcbiAgICAgIGNvbnN0IEwgPSByLmlzT2RkKFYpO1xuICAgICAgcmV0dXJuICh3ICYgMSkgPT09IDEgIT09IEwgJiYgKFYgPSByLm5lZyhWKSksIHsgeDogTywgeTogViB9O1xuICAgIH0gZWxzZSBpZiAoeCA9PT0gZyAmJiB3ID09PSA0KSB7XG4gICAgICBjb25zdCBPID0gci5CWVRFUywgVSA9IHIuZnJvbUJ5dGVzKEQuc3ViYXJyYXkoMCwgTykpLCBWID0gci5mcm9tQnl0ZXMoRC5zdWJhcnJheShPLCBPICogMikpO1xuICAgICAgaWYgKCFFKFUsIFYpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcG9pbnQ6IGlzIG5vdCBvbiBjdXJ2ZVwiKTtcbiAgICAgIHJldHVybiB7IHg6IFUsIHk6IFYgfTtcbiAgICB9IGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYmFkIHBvaW50OiBnb3QgbGVuZ3RoICR7eH0sIGV4cGVjdGVkIGNvbXByZXNzZWQ9JHtffSBvciB1bmNvbXByZXNzZWQ9JHtnfWApO1xuICB9XG4gIGNvbnN0IGYgPSBlLnRvQnl0ZXMgfHwgZCwgcCA9IGUuZnJvbUJ5dGVzIHx8IGg7XG4gIGZ1bmN0aW9uIHkoVykge1xuICAgIGNvbnN0IF8gPSByLnNxcihXKSwgZyA9IHIubXVsKF8sIFcpO1xuICAgIHJldHVybiByLmFkZChyLmFkZChnLCByLm11bChXLCBpLmEpKSwgaS5iKTtcbiAgfVxuICBmdW5jdGlvbiBFKFcsIF8pIHtcbiAgICBjb25zdCBnID0gci5zcXIoXyksIHggPSB5KFcpO1xuICAgIHJldHVybiByLmVxbChnLCB4KTtcbiAgfVxuICBpZiAoIUUoaS5HeCwgaS5HeSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGN1cnZlIHBhcmFtczogZ2VuZXJhdG9yIHBvaW50XCIpO1xuICBjb25zdCBiID0gci5tdWwoci5wb3coaS5hLCBHaSksIFl2KSwgUiA9IHIubXVsKHIuc3FyKGkuYiksIEJpZ0ludCgyNykpO1xuICBpZiAoci5pczAoci5hZGQoYiwgUikpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBjdXJ2ZSBwYXJhbXM6IGEgb3IgYlwiKTtcbiAgZnVuY3Rpb24gQShXLCBfLCBnID0gITEpIHtcbiAgICBpZiAoIXIuaXNWYWxpZChfKSB8fCBnICYmIHIuaXMwKF8pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgcG9pbnQgY29vcmRpbmF0ZSAke1d9YCk7XG4gICAgcmV0dXJuIF87XG4gIH1cbiAgZnVuY3Rpb24gRihXKSB7XG4gICAgaWYgKCEoVyBpbnN0YW5jZW9mIEMpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvamVjdGl2ZVBvaW50IGV4cGVjdGVkXCIpO1xuICB9XG4gIGZ1bmN0aW9uIE0oVykge1xuICAgIGlmICghbCB8fCAhbC5iYXNpc2VzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gZW5kb1wiKTtcbiAgICByZXR1cm4gV3YoVywgbC5iYXNpc2VzLCBuLk9SREVSKTtcbiAgfVxuICBjb25zdCBIID0gTW8oKFcsIF8pID0+IHtcbiAgICBjb25zdCB7IFg6IGcsIFk6IHgsIFo6IHcgfSA9IFc7XG4gICAgaWYgKHIuZXFsKHcsIHIuT05FKSlcbiAgICAgIHJldHVybiB7IHg6IGcsIHk6IHggfTtcbiAgICBjb25zdCBEID0gVy5pczAoKTtcbiAgICBfID09IG51bGwgJiYgKF8gPSBEID8gci5PTkUgOiByLmludih3KSk7XG4gICAgY29uc3QgTyA9IHIubXVsKGcsIF8pLCBVID0gci5tdWwoeCwgXyksIFYgPSByLm11bCh3LCBfKTtcbiAgICBpZiAoRClcbiAgICAgIHJldHVybiB7IHg6IHIuWkVSTywgeTogci5aRVJPIH07XG4gICAgaWYgKCFyLmVxbChWLCByLk9ORSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZaIHdhcyBpbnZhbGlkXCIpO1xuICAgIHJldHVybiB7IHg6IE8sIHk6IFUgfTtcbiAgfSksIEsgPSBNbygoVykgPT4ge1xuICAgIGlmIChXLmlzMCgpKSB7XG4gICAgICBpZiAoZS5hbGxvd0luZmluaXR5UG9pbnQgJiYgIXIuaXMwKFcuWSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogWkVST1wiKTtcbiAgICB9XG4gICAgY29uc3QgeyB4OiBfLCB5OiBnIH0gPSBXLnRvQWZmaW5lKCk7XG4gICAgaWYgKCFyLmlzVmFsaWQoXykgfHwgIXIuaXNWYWxpZChnKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogeCBvciB5IG5vdCBmaWVsZCBlbGVtZW50c1wiKTtcbiAgICBpZiAoIUUoXywgZykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHRcIik7XG4gICAgaWYgKCFXLmlzVG9yc2lvbkZyZWUoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogbm90IGluIHByaW1lLW9yZGVyIHN1Ymdyb3VwXCIpO1xuICAgIHJldHVybiAhMDtcbiAgfSk7XG4gIGZ1bmN0aW9uIGooVywgXywgZywgeCwgdykge1xuICAgIHJldHVybiBnID0gbmV3IEMoci5tdWwoZy5YLCBXKSwgZy5ZLCBnLlopLCBfID0gT28oeCwgXyksIGcgPSBPbyh3LCBnKSwgXy5hZGQoZyk7XG4gIH1cbiAgY2xhc3MgQyB7XG4gICAgLyoqIERvZXMgTk9UIHZhbGlkYXRlIGlmIHRoZSBwb2ludCBpcyB2YWxpZC4gVXNlIGAuYXNzZXJ0VmFsaWRpdHkoKWAuICovXG4gICAgY29uc3RydWN0b3IoXywgZywgeCkge1xuICAgICAgdGhpcy5YID0gQShcInhcIiwgXyksIHRoaXMuWSA9IEEoXCJ5XCIsIGcsICEwKSwgdGhpcy5aID0gQShcInpcIiwgeCksIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfVxuICAgIHN0YXRpYyBDVVJWRSgpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICAvKiogRG9lcyBOT1QgdmFsaWRhdGUgaWYgdGhlIHBvaW50IGlzIHZhbGlkLiBVc2UgYC5hc3NlcnRWYWxpZGl0eSgpYC4gKi9cbiAgICBzdGF0aWMgZnJvbUFmZmluZShfKSB7XG4gICAgICBjb25zdCB7IHg6IGcsIHk6IHggfSA9IF8gfHwge307XG4gICAgICBpZiAoIV8gfHwgIXIuaXNWYWxpZChnKSB8fCAhci5pc1ZhbGlkKHgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGFmZmluZSBwb2ludFwiKTtcbiAgICAgIGlmIChfIGluc3RhbmNlb2YgQylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJvamVjdGl2ZSBwb2ludCBub3QgYWxsb3dlZFwiKTtcbiAgICAgIHJldHVybiByLmlzMChnKSAmJiByLmlzMCh4KSA/IEMuWkVSTyA6IG5ldyBDKGcsIHgsIHIuT05FKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21CeXRlcyhfKSB7XG4gICAgICBjb25zdCBnID0gQy5mcm9tQWZmaW5lKHAoT3IoXywgdm9pZCAwLCBcInBvaW50XCIpKSk7XG4gICAgICByZXR1cm4gZy5hc3NlcnRWYWxpZGl0eSgpLCBnO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUhleChfKSB7XG4gICAgICByZXR1cm4gQy5mcm9tQnl0ZXMoRXQoXCJwb2ludEhleFwiLCBfKSk7XG4gICAgfVxuICAgIGdldCB4KCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9BZmZpbmUoKS54O1xuICAgIH1cbiAgICBnZXQgeSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2luZG93U2l6ZVxuICAgICAqIEBwYXJhbSBpc0xhenkgdHJ1ZSB3aWxsIGRlZmVyIHRhYmxlIGNvbXB1dGF0aW9uIHVudGlsIHRoZSBmaXJzdCBtdWx0aXBsaWNhdGlvblxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJlY29tcHV0ZShfID0gOCwgZyA9ICEwKSB7XG4gICAgICByZXR1cm4gJC5jcmVhdGVDYWNoZSh0aGlzLCBfKSwgZyB8fCB0aGlzLm11bHRpcGx5KEdpKSwgdGhpcztcbiAgICB9XG4gICAgLy8gVE9ETzogcmV0dXJuIGB0aGlzYFxuICAgIC8qKiBBIHBvaW50IG9uIGN1cnZlIGlzIHZhbGlkIGlmIGl0IGNvbmZvcm1zIHRvIGVxdWF0aW9uLiAqL1xuICAgIGFzc2VydFZhbGlkaXR5KCkge1xuICAgICAgSyh0aGlzKTtcbiAgICB9XG4gICAgaGFzRXZlblkoKSB7XG4gICAgICBjb25zdCB7IHk6IF8gfSA9IHRoaXMudG9BZmZpbmUoKTtcbiAgICAgIGlmICghci5pc09kZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgZG9lc24ndCBzdXBwb3J0IGlzT2RkXCIpO1xuICAgICAgcmV0dXJuICFyLmlzT2RkKF8pO1xuICAgIH1cbiAgICAvKiogQ29tcGFyZSBvbmUgcG9pbnQgdG8gYW5vdGhlci4gKi9cbiAgICBlcXVhbHMoXykge1xuICAgICAgRihfKTtcbiAgICAgIGNvbnN0IHsgWDogZywgWTogeCwgWjogdyB9ID0gdGhpcywgeyBYOiBELCBZOiBPLCBaOiBVIH0gPSBfLCBWID0gci5lcWwoci5tdWwoZywgVSksIHIubXVsKEQsIHcpKSwgTCA9IHIuZXFsKHIubXVsKHgsIFUpLCByLm11bChPLCB3KSk7XG4gICAgICByZXR1cm4gViAmJiBMO1xuICAgIH1cbiAgICAvKiogRmxpcHMgcG9pbnQgdG8gb25lIGNvcnJlc3BvbmRpbmcgdG8gKHgsIC15KSBpbiBBZmZpbmUgY29vcmRpbmF0ZXMuICovXG4gICAgbmVnYXRlKCkge1xuICAgICAgcmV0dXJuIG5ldyBDKHRoaXMuWCwgci5uZWcodGhpcy5ZKSwgdGhpcy5aKTtcbiAgICB9XG4gICAgLy8gUmVuZXMtQ29zdGVsbG8tQmF0aW5hIGV4Y2VwdGlvbi1mcmVlIGRvdWJsaW5nIGZvcm11bGEuXG4gICAgLy8gVGhlcmUgaXMgMzAlIGZhc3RlciBKYWNvYmlhbiBmb3JtdWxhLCBidXQgaXQgaXMgbm90IGNvbXBsZXRlLlxuICAgIC8vIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTUvMTA2MCwgYWxnb3JpdGhtIDNcbiAgICAvLyBDb3N0OiA4TSArIDNTICsgMyphICsgMipiMyArIDE1YWRkLlxuICAgIGRvdWJsZSgpIHtcbiAgICAgIGNvbnN0IHsgYTogXywgYjogZyB9ID0gaSwgeCA9IHIubXVsKGcsIEdpKSwgeyBYOiB3LCBZOiBELCBaOiBPIH0gPSB0aGlzO1xuICAgICAgbGV0IFUgPSByLlpFUk8sIFYgPSByLlpFUk8sIEwgPSByLlpFUk8sIG0gPSByLm11bCh3LCB3KSwgdiA9IHIubXVsKEQsIEQpLCBQID0gci5tdWwoTywgTyksIE4gPSByLm11bCh3LCBEKTtcbiAgICAgIHJldHVybiBOID0gci5hZGQoTiwgTiksIEwgPSByLm11bCh3LCBPKSwgTCA9IHIuYWRkKEwsIEwpLCBVID0gci5tdWwoXywgTCksIFYgPSByLm11bCh4LCBQKSwgViA9IHIuYWRkKFUsIFYpLCBVID0gci5zdWIodiwgViksIFYgPSByLmFkZCh2LCBWKSwgViA9IHIubXVsKFUsIFYpLCBVID0gci5tdWwoTiwgVSksIEwgPSByLm11bCh4LCBMKSwgUCA9IHIubXVsKF8sIFApLCBOID0gci5zdWIobSwgUCksIE4gPSByLm11bChfLCBOKSwgTiA9IHIuYWRkKE4sIEwpLCBMID0gci5hZGQobSwgbSksIG0gPSByLmFkZChMLCBtKSwgbSA9IHIuYWRkKG0sIFApLCBtID0gci5tdWwobSwgTiksIFYgPSByLmFkZChWLCBtKSwgUCA9IHIubXVsKEQsIE8pLCBQID0gci5hZGQoUCwgUCksIG0gPSByLm11bChQLCBOKSwgVSA9IHIuc3ViKFUsIG0pLCBMID0gci5tdWwoUCwgdiksIEwgPSByLmFkZChMLCBMKSwgTCA9IHIuYWRkKEwsIEwpLCBuZXcgQyhVLCBWLCBMKTtcbiAgICB9XG4gICAgLy8gUmVuZXMtQ29zdGVsbG8tQmF0aW5hIGV4Y2VwdGlvbi1mcmVlIGFkZGl0aW9uIGZvcm11bGEuXG4gICAgLy8gVGhlcmUgaXMgMzAlIGZhc3RlciBKYWNvYmlhbiBmb3JtdWxhLCBidXQgaXQgaXMgbm90IGNvbXBsZXRlLlxuICAgIC8vIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTUvMTA2MCwgYWxnb3JpdGhtIDFcbiAgICAvLyBDb3N0OiAxMk0gKyAwUyArIDMqYSArIDMqYjMgKyAyM2FkZC5cbiAgICBhZGQoXykge1xuICAgICAgRihfKTtcbiAgICAgIGNvbnN0IHsgWDogZywgWTogeCwgWjogdyB9ID0gdGhpcywgeyBYOiBELCBZOiBPLCBaOiBVIH0gPSBfO1xuICAgICAgbGV0IFYgPSByLlpFUk8sIEwgPSByLlpFUk8sIG0gPSByLlpFUk87XG4gICAgICBjb25zdCB2ID0gaS5hLCBQID0gci5tdWwoaS5iLCBHaSk7XG4gICAgICBsZXQgTiA9IHIubXVsKGcsIEQpLCBZID0gci5tdWwoeCwgTyksIGVlID0gci5tdWwodywgVSksIGllID0gci5hZGQoZywgeCksIGxlID0gci5hZGQoRCwgTyk7XG4gICAgICBpZSA9IHIubXVsKGllLCBsZSksIGxlID0gci5hZGQoTiwgWSksIGllID0gci5zdWIoaWUsIGxlKSwgbGUgPSByLmFkZChnLCB3KTtcbiAgICAgIGxldCBUZSA9IHIuYWRkKEQsIFUpO1xuICAgICAgcmV0dXJuIGxlID0gci5tdWwobGUsIFRlKSwgVGUgPSByLmFkZChOLCBlZSksIGxlID0gci5zdWIobGUsIFRlKSwgVGUgPSByLmFkZCh4LCB3KSwgViA9IHIuYWRkKE8sIFUpLCBUZSA9IHIubXVsKFRlLCBWKSwgViA9IHIuYWRkKFksIGVlKSwgVGUgPSByLnN1YihUZSwgViksIG0gPSByLm11bCh2LCBsZSksIFYgPSByLm11bChQLCBlZSksIG0gPSByLmFkZChWLCBtKSwgViA9IHIuc3ViKFksIG0pLCBtID0gci5hZGQoWSwgbSksIEwgPSByLm11bChWLCBtKSwgWSA9IHIuYWRkKE4sIE4pLCBZID0gci5hZGQoWSwgTiksIGVlID0gci5tdWwodiwgZWUpLCBsZSA9IHIubXVsKFAsIGxlKSwgWSA9IHIuYWRkKFksIGVlKSwgZWUgPSByLnN1YihOLCBlZSksIGVlID0gci5tdWwodiwgZWUpLCBsZSA9IHIuYWRkKGxlLCBlZSksIE4gPSByLm11bChZLCBsZSksIEwgPSByLmFkZChMLCBOKSwgTiA9IHIubXVsKFRlLCBsZSksIFYgPSByLm11bChpZSwgViksIFYgPSByLnN1YihWLCBOKSwgTiA9IHIubXVsKGllLCBZKSwgbSA9IHIubXVsKFRlLCBtKSwgbSA9IHIuYWRkKG0sIE4pLCBuZXcgQyhWLCBMLCBtKTtcbiAgICB9XG4gICAgc3VidHJhY3QoXykge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkKF8ubmVnYXRlKCkpO1xuICAgIH1cbiAgICBpczAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcXVhbHMoQy5aRVJPKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgdGltZSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBVc2VzIHdOQUYgbWV0aG9kLiBXaW5kb3dlZCBtZXRob2QgbWF5IGJlIDEwJSBmYXN0ZXIsXG4gICAgICogYnV0IHRha2VzIDJ4IGxvbmdlciB0byBnZW5lcmF0ZSBhbmQgY29uc3VtZXMgMnggbWVtb3J5LlxuICAgICAqIFVzZXMgcHJlY29tcHV0ZXMgd2hlbiBhdmFpbGFibGUuXG4gICAgICogVXNlcyBlbmRvbW9ycGhpc20gZm9yIEtvYmxpdHogY3VydmVzLlxuICAgICAqIEBwYXJhbSBzY2FsYXIgYnkgd2hpY2ggdGhlIHBvaW50IHdvdWxkIGJlIG11bHRpcGxpZWRcbiAgICAgKiBAcmV0dXJucyBOZXcgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0aXBseShfKSB7XG4gICAgICBjb25zdCB7IGVuZG86IGcgfSA9IGU7XG4gICAgICBpZiAoIW4uaXNWYWxpZE5vdDAoXykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2NhbGFyOiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICBsZXQgeCwgdztcbiAgICAgIGNvbnN0IEQgPSAoTykgPT4gJC5jYWNoZWQodGhpcywgTywgKFUpID0+IGpzKEMsIFUpKTtcbiAgICAgIGlmIChnKSB7XG4gICAgICAgIGNvbnN0IHsgazFuZWc6IE8sIGsxOiBVLCBrMm5lZzogViwgazI6IEwgfSA9IE0oXyksIHsgcDogbSwgZjogdiB9ID0gRChVKSwgeyBwOiBQLCBmOiBOIH0gPSBEKEwpO1xuICAgICAgICB3ID0gdi5hZGQoTiksIHggPSBqKGcuYmV0YSwgbSwgUCwgTywgVik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHA6IE8sIGY6IFUgfSA9IEQoXyk7XG4gICAgICAgIHggPSBPLCB3ID0gVTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBqcyhDLCBbeCwgd10pWzBdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb24tY29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi4gVXNlcyBkb3VibGUtYW5kLWFkZCBhbGdvcml0aG0uXG4gICAgICogSXQncyBmYXN0ZXIsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGRvbid0IGNhcmUgYWJvdXRcbiAgICAgKiBhbiBleHBvc2VkIHNlY3JldCBrZXkgZS5nLiBzaWcgdmVyaWZpY2F0aW9uLCB3aGljaCB3b3JrcyBvdmVyICpwdWJsaWMqIGtleXMuXG4gICAgICovXG4gICAgbXVsdGlwbHlVbnNhZmUoXykge1xuICAgICAgY29uc3QgeyBlbmRvOiBnIH0gPSBlLCB4ID0gdGhpcztcbiAgICAgIGlmICghbi5pc1ZhbGlkKF8pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNjYWxhcjogb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgaWYgKF8gPT09IGhzIHx8IHguaXMwKCkpXG4gICAgICAgIHJldHVybiBDLlpFUk87XG4gICAgICBpZiAoXyA9PT0gVG4pXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgaWYgKCQuaGFzQ2FjaGUodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5KF8pO1xuICAgICAgaWYgKGcpIHtcbiAgICAgICAgY29uc3QgeyBrMW5lZzogdywgazE6IEQsIGsybmVnOiBPLCBrMjogVSB9ID0gTShfKSwgeyBwMTogViwgcDI6IEwgfSA9IHB5KEMsIHgsIEQsIFUpO1xuICAgICAgICByZXR1cm4gaihnLmJldGEsIFYsIEwsIHcsIE8pO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiAkLnVuc2FmZSh4LCBfKTtcbiAgICB9XG4gICAgbXVsdGlwbHlBbmRBZGRVbnNhZmUoXywgZywgeCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMubXVsdGlwbHlVbnNhZmUoZykuYWRkKF8ubXVsdGlwbHlVbnNhZmUoeCkpO1xuICAgICAgcmV0dXJuIHcuaXMwKCkgPyB2b2lkIDAgOiB3O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBQcm9qZWN0aXZlIHBvaW50IHRvIGFmZmluZSAoeCwgeSkgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIGludmVydGVkWiBaXi0xIChpbnZlcnRlZCB6ZXJvKSAtIG9wdGlvbmFsLCBwcmVjb21wdXRhdGlvbiBpcyB1c2VmdWwgZm9yIGludmVydEJhdGNoXG4gICAgICovXG4gICAgdG9BZmZpbmUoXykge1xuICAgICAgcmV0dXJuIEgodGhpcywgXyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIFBvaW50IGlzIGZyZWUgb2YgdG9yc2lvbiBlbGVtZW50cyAoaXMgaW4gcHJpbWUgc3ViZ3JvdXApLlxuICAgICAqIEFsd2F5cyB0b3JzaW9uLWZyZWUgZm9yIGNvZmFjdG9yPTEgY3VydmVzLlxuICAgICAqL1xuICAgIGlzVG9yc2lvbkZyZWUoKSB7XG4gICAgICBjb25zdCB7IGlzVG9yc2lvbkZyZWU6IF8gfSA9IGU7XG4gICAgICByZXR1cm4gbyA9PT0gVG4gPyAhMCA6IF8gPyBfKEMsIHRoaXMpIDogJC51bnNhZmUodGhpcywgYSkuaXMwKCk7XG4gICAgfVxuICAgIGNsZWFyQ29mYWN0b3IoKSB7XG4gICAgICBjb25zdCB7IGNsZWFyQ29mYWN0b3I6IF8gfSA9IGU7XG4gICAgICByZXR1cm4gbyA9PT0gVG4gPyB0aGlzIDogXyA/IF8oQywgdGhpcykgOiB0aGlzLm11bHRpcGx5VW5zYWZlKG8pO1xuICAgIH1cbiAgICBpc1NtYWxsT3JkZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVVuc2FmZShvKS5pczAoKTtcbiAgICB9XG4gICAgdG9CeXRlcyhfID0gITApIHtcbiAgICAgIHJldHVybiBYcyhfLCBcImlzQ29tcHJlc3NlZFwiKSwgdGhpcy5hc3NlcnRWYWxpZGl0eSgpLCBmKEMsIHRoaXMsIF8pO1xuICAgIH1cbiAgICB0b0hleChfID0gITApIHtcbiAgICAgIHJldHVybiBIcyh0aGlzLnRvQnl0ZXMoXykpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBgPFBvaW50ICR7dGhpcy5pczAoKSA/IFwiWkVST1wiIDogdGhpcy50b0hleCgpfT5gO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBnZXQgcHgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5YO1xuICAgIH1cbiAgICBnZXQgcHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5YO1xuICAgIH1cbiAgICBnZXQgcHooKSB7XG4gICAgICByZXR1cm4gdGhpcy5aO1xuICAgIH1cbiAgICB0b1Jhd0J5dGVzKF8gPSAhMCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9CeXRlcyhfKTtcbiAgICB9XG4gICAgX3NldFdpbmRvd1NpemUoXykge1xuICAgICAgdGhpcy5wcmVjb21wdXRlKF8pO1xuICAgIH1cbiAgICBzdGF0aWMgbm9ybWFsaXplWihfKSB7XG4gICAgICByZXR1cm4ganMoQywgXyk7XG4gICAgfVxuICAgIHN0YXRpYyBtc20oXywgZykge1xuICAgICAgcmV0dXJuIHAwKEMsIG4sIF8sIGcpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVByaXZhdGVLZXkoXykge1xuICAgICAgcmV0dXJuIEMuQkFTRS5tdWx0aXBseShFbihuLCBfKSk7XG4gICAgfVxuICB9XG4gIEMuQkFTRSA9IG5ldyBDKGkuR3gsIGkuR3ksIHIuT05FKSwgQy5aRVJPID0gbmV3IEMoci5aRVJPLCByLk9ORSwgci5aRVJPKSwgQy5GcCA9IHIsIEMuRm4gPSBuO1xuICBjb25zdCBrID0gbi5CSVRTLCAkID0gbmV3IGcwKEMsIGUuZW5kbyA/IE1hdGguY2VpbChrIC8gMikgOiBrKTtcbiAgcmV0dXJuIEMuQkFTRS5wcmVjb21wdXRlKDgpLCBDO1xufVxuZnVuY3Rpb24gUDAocykge1xuICByZXR1cm4gVWludDhBcnJheS5vZihzID8gMiA6IDMpO1xufVxuZnVuY3Rpb24gTTAocywgZSkge1xuICByZXR1cm4ge1xuICAgIHNlY3JldEtleTogZS5CWVRFUyxcbiAgICBwdWJsaWNLZXk6IDEgKyBzLkJZVEVTLFxuICAgIHB1YmxpY0tleVVuY29tcHJlc3NlZDogMSArIDIgKiBzLkJZVEVTLFxuICAgIHB1YmxpY0tleUhhc1ByZWZpeDogITAsXG4gICAgc2lnbmF0dXJlOiAyICogZS5CWVRFU1xuICB9O1xufVxuZnVuY3Rpb24gWHYocywgZSA9IHt9KSB7XG4gIGNvbnN0IHsgRm46IHQgfSA9IHMsIHIgPSBlLnJhbmRvbUJ5dGVzIHx8IHFjLCBuID0gT2JqZWN0LmFzc2lnbihNMChzLkZwLCB0KSwgeyBzZWVkOiBkMCh0Lk9SREVSKSB9KTtcbiAgZnVuY3Rpb24gaShmKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIUVuKHQsIGYpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvKGYsIHApIHtcbiAgICBjb25zdCB7IHB1YmxpY0tleTogeSwgcHVibGljS2V5VW5jb21wcmVzc2VkOiBFIH0gPSBuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiID0gZi5sZW5ndGg7XG4gICAgICByZXR1cm4gcCA9PT0gITAgJiYgYiAhPT0geSB8fCBwID09PSAhMSAmJiBiICE9PSBFID8gITEgOiAhIXMuZnJvbUJ5dGVzKGYpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhKGYgPSByKG4uc2VlZCkpIHtcbiAgICByZXR1cm4gaHkoT3IoZiwgbi5zZWVkLCBcInNlZWRcIiksIHQuT1JERVIpO1xuICB9XG4gIGZ1bmN0aW9uIGwoZiwgcCA9ICEwKSB7XG4gICAgcmV0dXJuIHMuQkFTRS5tdWx0aXBseShFbih0LCBmKSkudG9CeXRlcyhwKTtcbiAgfVxuICBmdW5jdGlvbiBjKGYpIHtcbiAgICBjb25zdCBwID0gYShmKTtcbiAgICByZXR1cm4geyBzZWNyZXRLZXk6IHAsIHB1YmxpY0tleTogbChwKSB9O1xuICB9XG4gIGZ1bmN0aW9uIHUoZikge1xuICAgIGlmICh0eXBlb2YgZiA9PSBcImJpZ2ludFwiKVxuICAgICAgcmV0dXJuICExO1xuICAgIGlmIChmIGluc3RhbmNlb2YgcylcbiAgICAgIHJldHVybiAhMDtcbiAgICBjb25zdCB7IHNlY3JldEtleTogcCwgcHVibGljS2V5OiB5LCBwdWJsaWNLZXlVbmNvbXByZXNzZWQ6IEUgfSA9IG47XG4gICAgaWYgKHQuYWxsb3dlZExlbmd0aHMgfHwgcCA9PT0geSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBiID0gRXQoXCJrZXlcIiwgZikubGVuZ3RoO1xuICAgIHJldHVybiBiID09PSB5IHx8IGIgPT09IEU7XG4gIH1cbiAgZnVuY3Rpb24gZChmLCBwLCB5ID0gITApIHtcbiAgICBpZiAodShmKSA9PT0gITApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaXJzdCBhcmcgbXVzdCBiZSBwcml2YXRlIGtleVwiKTtcbiAgICBpZiAodShwKSA9PT0gITEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZWNvbmQgYXJnIG11c3QgYmUgcHVibGljIGtleVwiKTtcbiAgICBjb25zdCBFID0gRW4odCwgZik7XG4gICAgcmV0dXJuIHMuZnJvbUhleChwKS5tdWx0aXBseShFKS50b0J5dGVzKHkpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgZ2V0UHVibGljS2V5OiBsLCBnZXRTaGFyZWRTZWNyZXQ6IGQsIGtleWdlbjogYywgUG9pbnQ6IHMsIHV0aWxzOiB7XG4gICAgaXNWYWxpZFNlY3JldEtleTogaSxcbiAgICBpc1ZhbGlkUHVibGljS2V5OiBvLFxuICAgIHJhbmRvbVNlY3JldEtleTogYSxcbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBpc1ZhbGlkUHJpdmF0ZUtleTogaSxcbiAgICByYW5kb21Qcml2YXRlS2V5OiBhLFxuICAgIG5vcm1Qcml2YXRlS2V5VG9TY2FsYXI6IChmKSA9PiBFbih0LCBmKSxcbiAgICBwcmVjb21wdXRlKGYgPSA4LCBwID0gcy5CQVNFKSB7XG4gICAgICByZXR1cm4gcC5wcmVjb21wdXRlKGYsICExKTtcbiAgICB9XG4gIH0sIGxlbmd0aHM6IG4gfSk7XG59XG5mdW5jdGlvbiBKdihzLCBlLCB0ID0ge30pIHtcbiAgSGYoZSksIFJpKHQsIHt9LCB7XG4gICAgaG1hYzogXCJmdW5jdGlvblwiLFxuICAgIGxvd1M6IFwiYm9vbGVhblwiLFxuICAgIHJhbmRvbUJ5dGVzOiBcImZ1bmN0aW9uXCIsXG4gICAgYml0czJpbnQ6IFwiZnVuY3Rpb25cIixcbiAgICBiaXRzMmludF9tb2ROOiBcImZ1bmN0aW9uXCJcbiAgfSk7XG4gIGNvbnN0IHIgPSB0LnJhbmRvbUJ5dGVzIHx8IHFjLCBuID0gdC5obWFjIHx8ICgoZywgLi4ueCkgPT4gazAoZSwgZywgS3IoLi4ueCkpKSwgeyBGcDogaSwgRm46IG8gfSA9IHMsIHsgT1JERVI6IGEsIEJJVFM6IGwgfSA9IG8sIHsga2V5Z2VuOiBjLCBnZXRQdWJsaWNLZXk6IHUsIGdldFNoYXJlZFNlY3JldDogZCwgdXRpbHM6IGgsIGxlbmd0aHM6IGYgfSA9IFh2KHMsIHQpLCBwID0ge1xuICAgIHByZWhhc2g6ICExLFxuICAgIGxvd1M6IHR5cGVvZiB0Lmxvd1MgPT0gXCJib29sZWFuXCIgPyB0Lmxvd1MgOiAhMSxcbiAgICBmb3JtYXQ6IHZvaWQgMCxcbiAgICAvLydjb21wYWN0JyBhcyBFQ0RTQVNpZ0Zvcm1hdCxcbiAgICBleHRyYUVudHJvcHk6ICExXG4gIH0sIHkgPSBcImNvbXBhY3RcIjtcbiAgZnVuY3Rpb24gRShnKSB7XG4gICAgY29uc3QgeCA9IGEgPj4gVG47XG4gICAgcmV0dXJuIGcgPiB4O1xuICB9XG4gIGZ1bmN0aW9uIGIoZywgeCkge1xuICAgIGlmICghby5pc1ZhbGlkTm90MCh4KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzaWduYXR1cmUgJHtnfTogb3V0IG9mIHJhbmdlIDEuLlBvaW50LkZuLk9SREVSYCk7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgZnVuY3Rpb24gUihnLCB4KSB7XG4gICAgZWMoeCk7XG4gICAgY29uc3QgdyA9IGYuc2lnbmF0dXJlLCBEID0geCA9PT0gXCJjb21wYWN0XCIgPyB3IDogeCA9PT0gXCJyZWNvdmVyZWRcIiA/IHcgKyAxIDogdm9pZCAwO1xuICAgIHJldHVybiBPcihnLCBELCBgJHt4fSBzaWduYXR1cmVgKTtcbiAgfVxuICBjbGFzcyBBIHtcbiAgICBjb25zdHJ1Y3Rvcih4LCB3LCBEKSB7XG4gICAgICB0aGlzLnIgPSBiKFwiclwiLCB4KSwgdGhpcy5zID0gYihcInNcIiwgdyksIEQgIT0gbnVsbCAmJiAodGhpcy5yZWNvdmVyeSA9IEQpLCBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUJ5dGVzKHgsIHcgPSB5KSB7XG4gICAgICBSKHgsIHcpO1xuICAgICAgbGV0IEQ7XG4gICAgICBpZiAodyA9PT0gXCJkZXJcIikge1xuICAgICAgICBjb25zdCB7IHI6IEwsIHM6IG0gfSA9IGNzLnRvU2lnKE9yKHgpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBKEwsIG0pO1xuICAgICAgfVxuICAgICAgdyA9PT0gXCJyZWNvdmVyZWRcIiAmJiAoRCA9IHhbMF0sIHcgPSBcImNvbXBhY3RcIiwgeCA9IHguc3ViYXJyYXkoMSkpO1xuICAgICAgY29uc3QgTyA9IG8uQllURVMsIFUgPSB4LnN1YmFycmF5KDAsIE8pLCBWID0geC5zdWJhcnJheShPLCBPICogMik7XG4gICAgICByZXR1cm4gbmV3IEEoby5mcm9tQnl0ZXMoVSksIG8uZnJvbUJ5dGVzKFYpLCBEKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21IZXgoeCwgdykge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbUJ5dGVzKFBvKHgpLCB3KTtcbiAgICB9XG4gICAgYWRkUmVjb3ZlcnlCaXQoeCkge1xuICAgICAgcmV0dXJuIG5ldyBBKHRoaXMuciwgdGhpcy5zLCB4KTtcbiAgICB9XG4gICAgcmVjb3ZlclB1YmxpY0tleSh4KSB7XG4gICAgICBjb25zdCB3ID0gaS5PUkRFUiwgeyByOiBELCBzOiBPLCByZWNvdmVyeTogVSB9ID0gdGhpcztcbiAgICAgIGlmIChVID09IG51bGwgfHwgIVswLCAxLCAyLCAzXS5pbmNsdWRlcyhVKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVjb3ZlcnkgaWQgaW52YWxpZFwiKTtcbiAgICAgIGlmIChhICogRDAgPCB3ICYmIFUgPiAxKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWNvdmVyeSBpZCBpcyBhbWJpZ3VvdXMgZm9yIGg+MSBjdXJ2ZVwiKTtcbiAgICAgIGNvbnN0IEwgPSBVID09PSAyIHx8IFUgPT09IDMgPyBEICsgYSA6IEQ7XG4gICAgICBpZiAoIWkuaXNWYWxpZChMKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVjb3ZlcnkgaWQgMiBvciAzIGludmFsaWRcIik7XG4gICAgICBjb25zdCBtID0gaS50b0J5dGVzKEwpLCB2ID0gcy5mcm9tQnl0ZXMoS3IoUDAoKFUgJiAxKSA9PT0gMCksIG0pKSwgUCA9IG8uaW52KEwpLCBOID0gTShFdChcIm1zZ0hhc2hcIiwgeCkpLCBZID0gby5jcmVhdGUoLU4gKiBQKSwgZWUgPSBvLmNyZWF0ZShPICogUCksIGllID0gcy5CQVNFLm11bHRpcGx5VW5zYWZlKFkpLmFkZCh2Lm11bHRpcGx5VW5zYWZlKGVlKSk7XG4gICAgICBpZiAoaWUuaXMwKCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInBvaW50IGF0IGluZmluaWZ5XCIpO1xuICAgICAgcmV0dXJuIGllLmFzc2VydFZhbGlkaXR5KCksIGllO1xuICAgIH1cbiAgICAvLyBTaWduYXR1cmVzIHNob3VsZCBiZSBsb3ctcywgdG8gcHJldmVudCBtYWxsZWFiaWxpdHkuXG4gICAgaGFzSGlnaFMoKSB7XG4gICAgICByZXR1cm4gRSh0aGlzLnMpO1xuICAgIH1cbiAgICB0b0J5dGVzKHggPSB5KSB7XG4gICAgICBpZiAoZWMoeCksIHggPT09IFwiZGVyXCIpXG4gICAgICAgIHJldHVybiBQbyhjcy5oZXhGcm9tU2lnKHRoaXMpKTtcbiAgICAgIGNvbnN0IHcgPSBvLnRvQnl0ZXModGhpcy5yKSwgRCA9IG8udG9CeXRlcyh0aGlzLnMpO1xuICAgICAgaWYgKHggPT09IFwicmVjb3ZlcmVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjb3ZlcnkgPT0gbnVsbClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWNvdmVyeSBiaXQgbXVzdCBiZSBwcmVzZW50XCIpO1xuICAgICAgICByZXR1cm4gS3IoVWludDhBcnJheS5vZih0aGlzLnJlY292ZXJ5KSwgdywgRCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gS3IodywgRCk7XG4gICAgfVxuICAgIHRvSGV4KHgpIHtcbiAgICAgIHJldHVybiBIcyh0aGlzLnRvQnl0ZXMoeCkpO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBhc3NlcnRWYWxpZGl0eSgpIHtcbiAgICB9XG4gICAgc3RhdGljIGZyb21Db21wYWN0KHgpIHtcbiAgICAgIHJldHVybiBBLmZyb21CeXRlcyhFdChcInNpZ1wiLCB4KSwgXCJjb21wYWN0XCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbURFUih4KSB7XG4gICAgICByZXR1cm4gQS5mcm9tQnl0ZXMoRXQoXCJzaWdcIiwgeCksIFwiZGVyXCIpO1xuICAgIH1cbiAgICBub3JtYWxpemVTKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzSGlnaFMoKSA/IG5ldyBBKHRoaXMuciwgby5uZWcodGhpcy5zKSwgdGhpcy5yZWNvdmVyeSkgOiB0aGlzO1xuICAgIH1cbiAgICB0b0RFUlJhd0J5dGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9CeXRlcyhcImRlclwiKTtcbiAgICB9XG4gICAgdG9ERVJIZXgoKSB7XG4gICAgICByZXR1cm4gSHModGhpcy50b0J5dGVzKFwiZGVyXCIpKTtcbiAgICB9XG4gICAgdG9Db21wYWN0UmF3Qnl0ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0J5dGVzKFwiY29tcGFjdFwiKTtcbiAgICB9XG4gICAgdG9Db21wYWN0SGV4KCkge1xuICAgICAgcmV0dXJuIEhzKHRoaXMudG9CeXRlcyhcImNvbXBhY3RcIikpO1xuICAgIH1cbiAgfVxuICBjb25zdCBGID0gdC5iaXRzMmludCB8fCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHgubGVuZ3RoID4gODE5MilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlucHV0IGlzIHRvbyBsYXJnZVwiKTtcbiAgICBjb25zdCB3ID0gbGEoeCksIEQgPSB4Lmxlbmd0aCAqIDggLSBsO1xuICAgIHJldHVybiBEID4gMCA/IHcgPj4gQmlnSW50KEQpIDogdztcbiAgfSwgTSA9IHQuYml0czJpbnRfbW9kTiB8fCBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIG8uY3JlYXRlKEYoeCkpO1xuICB9LCBIID0gX2kobCk7XG4gIGZ1bmN0aW9uIEsoZykge1xuICAgIHJldHVybiBRbChcIm51bSA8IDJeXCIgKyBsLCBnLCBocywgSCksIG8udG9CeXRlcyhnKTtcbiAgfVxuICBmdW5jdGlvbiBqKGcsIHgpIHtcbiAgICByZXR1cm4gT3IoZywgdm9pZCAwLCBcIm1lc3NhZ2VcIiksIHggPyBPcihlKGcpLCB2b2lkIDAsIFwicHJlaGFzaGVkIG1lc3NhZ2VcIikgOiBnO1xuICB9XG4gIGZ1bmN0aW9uIEMoZywgeCwgdykge1xuICAgIGlmIChbXCJyZWNvdmVyZWRcIiwgXCJjYW5vbmljYWxcIl0uc29tZSgoWSkgPT4gWSBpbiB3KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNpZ24oKSBsZWdhY3kgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIGNvbnN0IHsgbG93UzogRCwgcHJlaGFzaDogTywgZXh0cmFFbnRyb3B5OiBVIH0gPSBhbCh3LCBwKTtcbiAgICBnID0gaihnLCBPKTtcbiAgICBjb25zdCBWID0gTShnKSwgTCA9IEVuKG8sIHgpLCBtID0gW0soTCksIEsoVildO1xuICAgIGlmIChVICE9IG51bGwgJiYgVSAhPT0gITEpIHtcbiAgICAgIGNvbnN0IFkgPSBVID09PSAhMCA/IHIoZi5zZWNyZXRLZXkpIDogVTtcbiAgICAgIG0ucHVzaChFdChcImV4dHJhRW50cm9weVwiLCBZKSk7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBLciguLi5tKSwgUCA9IFY7XG4gICAgZnVuY3Rpb24gTihZKSB7XG4gICAgICBjb25zdCBlZSA9IEYoWSk7XG4gICAgICBpZiAoIW8uaXNWYWxpZE5vdDAoZWUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBpZSA9IG8uaW52KGVlKSwgbGUgPSBzLkJBU0UubXVsdGlwbHkoZWUpLnRvQWZmaW5lKCksIFRlID0gby5jcmVhdGUobGUueCk7XG4gICAgICBpZiAoVGUgPT09IGhzKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBEZSA9IG8uY3JlYXRlKGllICogby5jcmVhdGUoUCArIFRlICogTCkpO1xuICAgICAgaWYgKERlID09PSBocylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHplID0gKGxlLnggPT09IFRlID8gMCA6IDIpIHwgTnVtYmVyKGxlLnkgJiBUbiksIF9lID0gRGU7XG4gICAgICByZXR1cm4gRCAmJiBFKERlKSAmJiAoX2UgPSBvLm5lZyhEZSksIHplIF49IDEpLCBuZXcgQShUZSwgX2UsIHplKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VlZDogdiwgazJzaWc6IE4gfTtcbiAgfVxuICBmdW5jdGlvbiBrKGcsIHgsIHcgPSB7fSkge1xuICAgIGcgPSBFdChcIm1lc3NhZ2VcIiwgZyk7XG4gICAgY29uc3QgeyBzZWVkOiBELCBrMnNpZzogTyB9ID0gQyhnLCB4LCB3KTtcbiAgICByZXR1cm4gcnkoZS5vdXRwdXRMZW4sIG8uQllURVMsIG4pKEQsIE8pO1xuICB9XG4gIGZ1bmN0aW9uICQoZykge1xuICAgIGxldCB4O1xuICAgIGNvbnN0IHcgPSB0eXBlb2YgZyA9PSBcInN0cmluZ1wiIHx8IElpKGcpLCBEID0gIXcgJiYgZyAhPT0gbnVsbCAmJiB0eXBlb2YgZyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBnLnIgPT0gXCJiaWdpbnRcIiAmJiB0eXBlb2YgZy5zID09IFwiYmlnaW50XCI7XG4gICAgaWYgKCF3ICYmICFEKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBzaWduYXR1cmUsIGV4cGVjdGVkIFVpbnQ4QXJyYXksIGhleCBzdHJpbmcgb3IgU2lnbmF0dXJlIGluc3RhbmNlXCIpO1xuICAgIGlmIChEKVxuICAgICAgeCA9IG5ldyBBKGcuciwgZy5zKTtcbiAgICBlbHNlIGlmICh3KSB7XG4gICAgICB0cnkge1xuICAgICAgICB4ID0gQS5mcm9tQnl0ZXMoRXQoXCJzaWdcIiwgZyksIFwiZGVyXCIpO1xuICAgICAgfSBjYXRjaCAoTykge1xuICAgICAgICBpZiAoIShPIGluc3RhbmNlb2YgY3MuRXJyKSlcbiAgICAgICAgICB0aHJvdyBPO1xuICAgICAgfVxuICAgICAgaWYgKCF4KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHggPSBBLmZyb21CeXRlcyhFdChcInNpZ1wiLCBnKSwgXCJjb21wYWN0XCIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHggfHwgITE7XG4gIH1cbiAgZnVuY3Rpb24gVyhnLCB4LCB3LCBEID0ge30pIHtcbiAgICBjb25zdCB7IGxvd1M6IE8sIHByZWhhc2g6IFUsIGZvcm1hdDogViB9ID0gYWwoRCwgcCk7XG4gICAgaWYgKHcgPSBFdChcInB1YmxpY0tleVwiLCB3KSwgeCA9IGooRXQoXCJtZXNzYWdlXCIsIHgpLCBVKSwgXCJzdHJpY3RcIiBpbiBEKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5zdHJpY3Qgd2FzIHJlbmFtZWQgdG8gbG93U1wiKTtcbiAgICBjb25zdCBMID0gViA9PT0gdm9pZCAwID8gJChnKSA6IEEuZnJvbUJ5dGVzKEV0KFwic2lnXCIsIGcpLCBWKTtcbiAgICBpZiAoTCA9PT0gITEpXG4gICAgICByZXR1cm4gITE7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSBzLmZyb21CeXRlcyh3KTtcbiAgICAgIGlmIChPICYmIEwuaGFzSGlnaFMoKSlcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgY29uc3QgeyByOiB2LCBzOiBQIH0gPSBMLCBOID0gTSh4KSwgWSA9IG8uaW52KFApLCBlZSA9IG8uY3JlYXRlKE4gKiBZKSwgaWUgPSBvLmNyZWF0ZSh2ICogWSksIGxlID0gcy5CQVNFLm11bHRpcGx5VW5zYWZlKGVlKS5hZGQobS5tdWx0aXBseVVuc2FmZShpZSkpO1xuICAgICAgcmV0dXJuIGxlLmlzMCgpID8gITEgOiBvLmNyZWF0ZShsZS54KSA9PT0gdjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gXyhnLCB4LCB3ID0ge30pIHtcbiAgICBjb25zdCB7IHByZWhhc2g6IEQgfSA9IGFsKHcsIHApO1xuICAgIHJldHVybiB4ID0gaih4LCBEKSwgQS5mcm9tQnl0ZXMoZywgXCJyZWNvdmVyZWRcIikucmVjb3ZlclB1YmxpY0tleSh4KS50b0J5dGVzKCk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGtleWdlbjogYyxcbiAgICBnZXRQdWJsaWNLZXk6IHUsXG4gICAgZ2V0U2hhcmVkU2VjcmV0OiBkLFxuICAgIHV0aWxzOiBoLFxuICAgIGxlbmd0aHM6IGYsXG4gICAgUG9pbnQ6IHMsXG4gICAgc2lnbjogayxcbiAgICB2ZXJpZnk6IFcsXG4gICAgcmVjb3ZlclB1YmxpY0tleTogXyxcbiAgICBTaWduYXR1cmU6IEEsXG4gICAgaGFzaDogZVxuICB9KTtcbn1cbmZ1bmN0aW9uIFF2KHMpIHtcbiAgY29uc3QgZSA9IHtcbiAgICBhOiBzLmEsXG4gICAgYjogcy5iLFxuICAgIHA6IHMuRnAuT1JERVIsXG4gICAgbjogcy5uLFxuICAgIGg6IHMuaCxcbiAgICBHeDogcy5HeCxcbiAgICBHeTogcy5HeVxuICB9LCB0ID0gcy5GcDtcbiAgbGV0IHIgPSBzLmFsbG93ZWRQcml2YXRlS2V5TGVuZ3RocyA/IEFycmF5LmZyb20obmV3IFNldChzLmFsbG93ZWRQcml2YXRlS2V5TGVuZ3Rocy5tYXAoKG8pID0+IE1hdGguY2VpbChvIC8gMikpKSkgOiB2b2lkIDA7XG4gIGNvbnN0IG4gPSBlbihlLm4sIHtcbiAgICBCSVRTOiBzLm5CaXRMZW5ndGgsXG4gICAgYWxsb3dlZExlbmd0aHM6IHIsXG4gICAgbW9kRnJvbUJ5dGVzOiBzLndyYXBQcml2YXRlS2V5XG4gIH0pLCBpID0ge1xuICAgIEZwOiB0LFxuICAgIEZuOiBuLFxuICAgIGFsbG93SW5maW5pdHlQb2ludDogcy5hbGxvd0luZmluaXR5UG9pbnQsXG4gICAgZW5kbzogcy5lbmRvLFxuICAgIGlzVG9yc2lvbkZyZWU6IHMuaXNUb3JzaW9uRnJlZSxcbiAgICBjbGVhckNvZmFjdG9yOiBzLmNsZWFyQ29mYWN0b3IsXG4gICAgZnJvbUJ5dGVzOiBzLmZyb21CeXRlcyxcbiAgICB0b0J5dGVzOiBzLnRvQnl0ZXNcbiAgfTtcbiAgcmV0dXJuIHsgQ1VSVkU6IGUsIGN1cnZlT3B0czogaSB9O1xufVxuZnVuY3Rpb24gZUUocykge1xuICBjb25zdCB7IENVUlZFOiBlLCBjdXJ2ZU9wdHM6IHQgfSA9IFF2KHMpLCByID0ge1xuICAgIGhtYWM6IHMuaG1hYyxcbiAgICByYW5kb21CeXRlczogcy5yYW5kb21CeXRlcyxcbiAgICBsb3dTOiBzLmxvd1MsXG4gICAgYml0czJpbnQ6IHMuYml0czJpbnQsXG4gICAgYml0czJpbnRfbW9kTjogcy5iaXRzMmludF9tb2ROXG4gIH07XG4gIHJldHVybiB7IENVUlZFOiBlLCBjdXJ2ZU9wdHM6IHQsIGhhc2g6IHMuaGFzaCwgZWNkc2FPcHRzOiByIH07XG59XG5mdW5jdGlvbiB0RShzLCBlKSB7XG4gIGNvbnN0IHQgPSBlLlBvaW50O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZSwge1xuICAgIFByb2plY3RpdmVQb2ludDogdCxcbiAgICBDVVJWRTogT2JqZWN0LmFzc2lnbih7fSwgcywgYzAodC5Gbi5PUkRFUiwgdC5Gbi5CSVRTKSlcbiAgfSk7XG59XG5mdW5jdGlvbiByRShzKSB7XG4gIGNvbnN0IHsgQ1VSVkU6IGUsIGN1cnZlT3B0czogdCwgaGFzaDogciwgZWNkc2FPcHRzOiBuIH0gPSBlRShzKSwgaSA9IFp2KGUsIHQpLCBvID0gSnYoaSwgciwgbik7XG4gIHJldHVybiB0RShzLCBvKTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmZ1bmN0aW9uIHNFKHMsIGUpIHtcbiAgY29uc3QgdCA9IChyKSA9PiByRSh7IC4uLnMsIGhhc2g6IHIgfSk7XG4gIHJldHVybiB7IC4uLnQoZSksIGNyZWF0ZTogdCB9O1xufVxuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuY29uc3QgdHUgPSB7XG4gIHA6IEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVmZmZmZmMyZlwiKSxcbiAgbjogQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWJhYWVkY2U2YWY0OGEwM2JiZmQyNWU4Y2QwMzY0MTQxXCIpLFxuICBoOiBCaWdJbnQoMSksXG4gIGE6IEJpZ0ludCgwKSxcbiAgYjogQmlnSW50KDcpLFxuICBHeDogQmlnSW50KFwiMHg3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4XCIpLFxuICBHeTogQmlnSW50KFwiMHg0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4XCIpXG59LCBuRSA9IHtcbiAgYmV0YTogQmlnSW50KFwiMHg3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlXCIpLFxuICBiYXNpc2VzOiBbXG4gICAgW0JpZ0ludChcIjB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTVcIiksIC1CaWdJbnQoXCIweGU0NDM3ZWQ2MDEwZTg4Mjg2ZjU0N2ZhOTBhYmZlNGMzXCIpXSxcbiAgICBbQmlnSW50KFwiMHgxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDhcIiksIEJpZ0ludChcIjB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTVcIildXG4gIF1cbn0sIEJkID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgyKTtcbmZ1bmN0aW9uIGlFKHMpIHtcbiAgY29uc3QgZSA9IHR1LnAsIHQgPSBCaWdJbnQoMyksIHIgPSBCaWdJbnQoNiksIG4gPSBCaWdJbnQoMTEpLCBpID0gQmlnSW50KDIyKSwgbyA9IEJpZ0ludCgyMyksIGEgPSBCaWdJbnQoNDQpLCBsID0gQmlnSW50KDg4KSwgYyA9IHMgKiBzICogcyAlIGUsIHUgPSBjICogYyAqIHMgJSBlLCBkID0gdnQodSwgdCwgZSkgKiB1ICUgZSwgaCA9IHZ0KGQsIHQsIGUpICogdSAlIGUsIGYgPSB2dChoLCBCZCwgZSkgKiBjICUgZSwgcCA9IHZ0KGYsIG4sIGUpICogZiAlIGUsIHkgPSB2dChwLCBpLCBlKSAqIHAgJSBlLCBFID0gdnQoeSwgYSwgZSkgKiB5ICUgZSwgYiA9IHZ0KEUsIGwsIGUpICogRSAlIGUsIFIgPSB2dChiLCBhLCBlKSAqIHkgJSBlLCBBID0gdnQoUiwgdCwgZSkgKiB1ICUgZSwgRiA9IHZ0KEEsIG8sIGUpICogcCAlIGUsIE0gPSB2dChGLCByLCBlKSAqIGMgJSBlLCBIID0gdnQoTSwgQmQsIGUpO1xuICBpZiAoIXRjLmVxbCh0Yy5zcXIoSCksIHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHNxdWFyZSByb290XCIpO1xuICByZXR1cm4gSDtcbn1cbmNvbnN0IHRjID0gZW4odHUucCwgeyBzcXJ0OiBpRSB9KSwgb0UgPSBzRSh7IC4uLnR1LCBGcDogdGMsIGxvd1M6ICEwLCBlbmRvOiBuRSB9LCBYZik7XG5MaS51dGlscy5yYW5kb21Qcml2YXRlS2V5O1xuTGkuZ2V0UHVibGljS2V5O1xuZnVuY3Rpb24gRmQocykge1xuICB0cnkge1xuICAgIHJldHVybiBMaS5FeHRlbmRlZFBvaW50LmZyb21IZXgocyksICEwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gITE7XG4gIH1cbn1cbmNvbnN0IE8wID0gKHMsIGUpID0+IExpLnNpZ24ocywgZS5zbGljZSgwLCAzMikpLCBhRSA9IExpLnZlcmlmeSwgcnUgPSAocykgPT4gSGUuQnVmZmVyLmlzQnVmZmVyKHMpID8gcyA6IHMgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gSGUuQnVmZmVyLmZyb20ocy5idWZmZXIsIHMuYnl0ZU9mZnNldCwgcy5ieXRlTGVuZ3RoKSA6IEhlLkJ1ZmZlci5mcm9tKHMpO1xuY2xhc3MgbEUge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBlKTtcbiAgfVxuICBlbmNvZGUoKSB7XG4gICAgcmV0dXJuIEhlLkJ1ZmZlci5mcm9tKEphLnNlcmlhbGl6ZSh1bywgdGhpcykpO1xuICB9XG4gIHN0YXRpYyBkZWNvZGUoZSkge1xuICAgIHJldHVybiBKYS5kZXNlcmlhbGl6ZSh1bywgdGhpcywgZSk7XG4gIH1cbiAgc3RhdGljIGRlY29kZVVuY2hlY2tlZChlKSB7XG4gICAgcmV0dXJuIEphLmRlc2VyaWFsaXplVW5jaGVja2VkKHVvLCB0aGlzLCBlKTtcbiAgfVxufVxuY29uc3QgdW8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xudmFyIEIwO1xuY29uc3QgY0UgPSAzMiwga3MgPSAzMjtcbmZ1bmN0aW9uIHVFKHMpIHtcbiAgcmV0dXJuIHMuX2JuICE9PSB2b2lkIDA7XG59XG5sZXQgTmQgPSAxO1xuY2xhc3MgT2UgZXh0ZW5kcyBsRSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUHVibGljS2V5IG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWUgZWQyNTUxOSBwdWJsaWMga2V5IGFzIGJ1ZmZlciBvciBiYXNlLTU4IGVuY29kZWQgc3RyaW5nXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgaWYgKHN1cGVyKHt9KSwgdGhpcy5fYm4gPSB2b2lkIDAsIHVFKGUpKVxuICAgICAgdGhpcy5fYm4gPSBlLl9ibjtcbiAgICBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhci5kZWNvZGUoZSk7XG4gICAgICAgIGlmICh0Lmxlbmd0aCAhPSBrcylcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHB1YmxpYyBrZXkgaW5wdXRcIik7XG4gICAgICAgIHRoaXMuX2JuID0gbmV3IGJkKHQpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX2JuID0gbmV3IGJkKGUpO1xuICAgICAgaWYgKHRoaXMuX2JuLmJ5dGVMZW5ndGgoKSA+IGtzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHB1YmxpYyBrZXkgaW5wdXRcIik7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIFB1YmxpY0tleSBmb3IgdGVzdHMgYW5kIGJlbmNobWFya3MgdXNpbmcgYSBjb3VudGVyXG4gICAqL1xuICBzdGF0aWMgdW5pcXVlKCkge1xuICAgIGNvbnN0IGUgPSBuZXcgT2UoTmQpO1xuICAgIHJldHVybiBOZCArPSAxLCBuZXcgT2UoZS50b0J1ZmZlcigpKTtcbiAgfVxuICAvKipcbiAgICogRGVmYXVsdCBwdWJsaWMga2V5IHZhbHVlLiBUaGUgYmFzZTU4LWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIGFsbCBvbmVzIChhcyBzZWVuIGJlbG93KVxuICAgKiBUaGUgdW5kZXJseWluZyBCTiBudW1iZXIgaXMgMzIgYnl0ZXMgdGhhdCBhcmUgYWxsIHplcm9zXG4gICAqL1xuICAvKipcbiAgICogQ2hlY2tzIGlmIHR3byBwdWJsaWNLZXlzIGFyZSBlcXVhbFxuICAgKi9cbiAgZXF1YWxzKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYm4uZXEoZS5fYm4pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGJhc2UtNTggcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXlcbiAgICovXG4gIHRvQmFzZTU4KCkge1xuICAgIHJldHVybiBhci5lbmNvZGUodGhpcy50b0J5dGVzKCkpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U1OCgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkgaW4gYmlnIGVuZGlhblxuICAgKi9cbiAgdG9CeXRlcygpIHtcbiAgICBjb25zdCBlID0gdGhpcy50b0J1ZmZlcigpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlciwgZS5ieXRlT2Zmc2V0LCBlLmJ5dGVMZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIEJ1ZmZlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleSBpbiBiaWcgZW5kaWFuXG4gICAqL1xuICB0b0J1ZmZlcigpIHtcbiAgICBjb25zdCBlID0gdGhpcy5fYm4udG9BcnJheUxpa2UoSGUuQnVmZmVyKTtcbiAgICBpZiAoZS5sZW5ndGggPT09IGtzKVxuICAgICAgcmV0dXJuIGU7XG4gICAgY29uc3QgdCA9IEhlLkJ1ZmZlci5hbGxvYygzMik7XG4gICAgcmV0dXJuIGUuY29weSh0LCAzMiAtIGUubGVuZ3RoKSwgdDtcbiAgfVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuIGBQdWJsaWNLZXkoJHt0aGlzLnRvU3RyaW5nKCl9KWA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNTgoKTtcbiAgfVxuICAvKipcbiAgICogRGVyaXZlIGEgcHVibGljIGtleSBmcm9tIGFub3RoZXIga2V5LCBhIHNlZWQsIGFuZCBhIHByb2dyYW0gSUQuXG4gICAqIFRoZSBwcm9ncmFtIElEIHdpbGwgYWxzbyBzZXJ2ZSBhcyB0aGUgb3duZXIgb2YgdGhlIHB1YmxpYyBrZXksIGdpdmluZ1xuICAgKiBpdCBwZXJtaXNzaW9uIHRvIHdyaXRlIGRhdGEgdG8gdGhlIGFjY291bnQuXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVXaXRoU2VlZChlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IEhlLkJ1ZmZlci5jb25jYXQoW2UudG9CdWZmZXIoKSwgSGUuQnVmZmVyLmZyb20odCksIHIudG9CdWZmZXIoKV0pLCBpID0gSWQobik7XG4gICAgcmV0dXJuIG5ldyBPZShpKTtcbiAgfVxuICAvKipcbiAgICogRGVyaXZlIGEgcHJvZ3JhbSBhZGRyZXNzIGZyb20gc2VlZHMgYW5kIGEgcHJvZ3JhbSBJRC5cbiAgICovXG4gIC8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbiAgc3RhdGljIGNyZWF0ZVByb2dyYW1BZGRyZXNzU3luYyhlLCB0KSB7XG4gICAgbGV0IHIgPSBIZS5CdWZmZXIuYWxsb2MoMCk7XG4gICAgZS5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIGlmIChpLmxlbmd0aCA+IGNFKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF4IHNlZWQgbGVuZ3RoIGV4Y2VlZGVkXCIpO1xuICAgICAgciA9IEhlLkJ1ZmZlci5jb25jYXQoW3IsIHJ1KGkpXSk7XG4gICAgfSksIHIgPSBIZS5CdWZmZXIuY29uY2F0KFtyLCB0LnRvQnVmZmVyKCksIEhlLkJ1ZmZlci5mcm9tKFwiUHJvZ3JhbURlcml2ZWRBZGRyZXNzXCIpXSk7XG4gICAgY29uc3QgbiA9IElkKHIpO1xuICAgIGlmIChGZChuKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2VlZHMsIGFkZHJlc3MgbXVzdCBmYWxsIG9mZiB0aGUgY3VydmVcIik7XG4gICAgcmV0dXJuIG5ldyBPZShuKTtcbiAgfVxuICAvKipcbiAgICogQXN5bmMgdmVyc2lvbiBvZiBjcmVhdGVQcm9ncmFtQWRkcmVzc1N5bmNcbiAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgY3JlYXRlUHJvZ3JhbUFkZHJlc3NTeW5jfSBpbnN0ZWFkXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVQcm9ncmFtQWRkcmVzcyhlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUHJvZ3JhbUFkZHJlc3NTeW5jKGUsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBGaW5kIGEgdmFsaWQgcHJvZ3JhbSBhZGRyZXNzXG4gICAqXG4gICAqIFZhbGlkIHByb2dyYW0gYWRkcmVzc2VzIG11c3QgZmFsbCBvZmYgdGhlIGVkMjU1MTkgY3VydmUuICBUaGlzIGZ1bmN0aW9uXG4gICAqIGl0ZXJhdGVzIGEgbm9uY2UgdW50aWwgaXQgZmluZHMgb25lIHRoYXQgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBzZWVkc1xuICAgKiByZXN1bHRzIGluIGEgdmFsaWQgcHJvZ3JhbSBhZGRyZXNzLlxuICAgKi9cbiAgc3RhdGljIGZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoZSwgdCkge1xuICAgIGxldCByID0gMjU1LCBuO1xuICAgIGZvciAoOyByICE9IDA7ICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaSA9IGUuY29uY2F0KEhlLkJ1ZmZlci5mcm9tKFtyXSkpO1xuICAgICAgICBuID0gdGhpcy5jcmVhdGVQcm9ncmFtQWRkcmVzc1N5bmMoaSwgdCk7XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIGlmIChpIGluc3RhbmNlb2YgVHlwZUVycm9yKVxuICAgICAgICAgIHRocm93IGk7XG4gICAgICAgIHItLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gW24sIHJdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBhIHZpYWJsZSBwcm9ncmFtIGFkZHJlc3Mgbm9uY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIEFzeW5jIHZlcnNpb24gb2YgZmluZFByb2dyYW1BZGRyZXNzU3luY1xuICAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBmaW5kUHJvZ3JhbUFkZHJlc3NTeW5jfSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZFByb2dyYW1BZGRyZXNzKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKGUsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayB0aGF0IGEgcHVia2V5IGlzIG9uIHRoZSBlZDI1NTE5IGN1cnZlLlxuICAgKi9cbiAgc3RhdGljIGlzT25DdXJ2ZShlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBPZShlKTtcbiAgICByZXR1cm4gRmQodC50b0J5dGVzKCkpO1xuICB9XG59XG5CMCA9IE9lO1xuT2UuZGVmYXVsdCA9IG5ldyBCMChcIjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xudW8uc2V0KE9lLCB7XG4gIGtpbmQ6IFwic3RydWN0XCIsXG4gIGZpZWxkczogW1tcIl9iblwiLCBcInUyNTZcIl1dXG59KTtcbm5ldyBPZShcIkJQRkxvYWRlcjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5jb25zdCB3biA9IDEyMzIsIHN1ID0gMTI3LCBHbyA9IDY0O1xuY2xhc3MgVm8ge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5zdGF0aWNBY2NvdW50S2V5cyA9IHZvaWQgMCwgdGhpcy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzID0gdm9pZCAwLCB0aGlzLnN0YXRpY0FjY291bnRLZXlzID0gZSwgdGhpcy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzID0gdDtcbiAgfVxuICBrZXlTZWdtZW50cygpIHtcbiAgICBjb25zdCBlID0gW3RoaXMuc3RhdGljQWNjb3VudEtleXNdO1xuICAgIHJldHVybiB0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMgJiYgKGUucHVzaCh0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMud3JpdGFibGUpLCBlLnB1c2godGhpcy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzLnJlYWRvbmx5KSksIGU7XG4gIH1cbiAgZ2V0KGUpIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5rZXlTZWdtZW50cygpKSB7XG4gICAgICBpZiAoZSA8IHQubGVuZ3RoKVxuICAgICAgICByZXR1cm4gdFtlXTtcbiAgICAgIGUgLT0gdC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMua2V5U2VnbWVudHMoKS5mbGF0KCkubGVuZ3RoO1xuICB9XG4gIGNvbXBpbGVJbnN0cnVjdGlvbnMoZSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDI1NilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgaW5kZXggb3ZlcmZsb3cgZW5jb3VudGVyZWQgZHVyaW5nIGNvbXBpbGF0aW9uXCIpO1xuICAgIGNvbnN0IHIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIHRoaXMua2V5U2VnbWVudHMoKS5mbGF0KCkuZm9yRWFjaCgoaSwgbykgPT4ge1xuICAgICAgci5zZXQoaS50b0Jhc2U1OCgpLCBvKTtcbiAgICB9KTtcbiAgICBjb25zdCBuID0gKGkpID0+IHtcbiAgICAgIGNvbnN0IG8gPSByLmdldChpLnRvQmFzZTU4KCkpO1xuICAgICAgaWYgKG8gPT09IHZvaWQgMCkgdGhyb3cgbmV3IEVycm9yKFwiRW5jb3VudGVyZWQgYW4gdW5rbm93biBpbnN0cnVjdGlvbiBhY2NvdW50IGtleSBkdXJpbmcgY29tcGlsYXRpb25cIik7XG4gICAgICByZXR1cm4gbztcbiAgICB9O1xuICAgIHJldHVybiBlLm1hcCgoaSkgPT4gKHtcbiAgICAgIHByb2dyYW1JZEluZGV4OiBuKGkucHJvZ3JhbUlkKSxcbiAgICAgIGFjY291bnRLZXlJbmRleGVzOiBpLmtleXMubWFwKChvKSA9PiBuKG8ucHVia2V5KSksXG4gICAgICBkYXRhOiBpLmRhdGFcbiAgICB9KSk7XG4gIH1cbn1cbmNvbnN0IFdlID0gKHMgPSBcInB1YmxpY0tleVwiKSA9PiB6LmJsb2IoMzIsIHMpLCBkRSA9IChzID0gXCJzaWduYXR1cmVcIikgPT4gei5ibG9iKDY0LCBzKSwgeG4gPSAocyA9IFwic3RyaW5nXCIpID0+IHtcbiAgY29uc3QgZSA9IHouc3RydWN0KFt6LnUzMihcImxlbmd0aFwiKSwgei51MzIoXCJsZW5ndGhQYWRkaW5nXCIpLCB6LmJsb2Ioei5vZmZzZXQoei51MzIoKSwgLTgpLCBcImNoYXJzXCIpXSwgcyksIHQgPSBlLmRlY29kZS5iaW5kKGUpLCByID0gZS5lbmNvZGUuYmluZChlKSwgbiA9IGU7XG4gIHJldHVybiBuLmRlY29kZSA9IChpLCBvKSA9PiB0KGksIG8pLmNoYXJzLnRvU3RyaW5nKCksIG4uZW5jb2RlID0gKGksIG8sIGEpID0+IHtcbiAgICBjb25zdCBsID0ge1xuICAgICAgY2hhcnM6IEhlLkJ1ZmZlci5mcm9tKGksIFwidXRmOFwiKVxuICAgIH07XG4gICAgcmV0dXJuIHIobCwgbywgYSk7XG4gIH0sIG4uYWxsb2MgPSAoaSkgPT4gei51MzIoKS5zcGFuICsgei51MzIoKS5zcGFuICsgSGUuQnVmZmVyLmZyb20oaSwgXCJ1dGY4XCIpLmxlbmd0aCwgbjtcbn0sIGhFID0gKHMgPSBcImF1dGhvcml6ZWRcIikgPT4gei5zdHJ1Y3QoW1dlKFwic3Rha2VyXCIpLCBXZShcIndpdGhkcmF3ZXJcIildLCBzKSwgZkUgPSAocyA9IFwibG9ja3VwXCIpID0+IHouc3RydWN0KFt6Lm5zNjQoXCJ1bml4VGltZXN0YW1wXCIpLCB6Lm5zNjQoXCJlcG9jaFwiKSwgV2UoXCJjdXN0b2RpYW5cIildLCBzKSwgZ0UgPSAocyA9IFwidm90ZUluaXRcIikgPT4gei5zdHJ1Y3QoW1dlKFwibm9kZVB1YmtleVwiKSwgV2UoXCJhdXRob3JpemVkVm90ZXJcIiksIFdlKFwiYXV0aG9yaXplZFdpdGhkcmF3ZXJcIiksIHoudTgoXCJjb21taXNzaW9uXCIpXSwgcyksIHBFID0gKHMgPSBcInZvdGVBdXRob3JpemVXaXRoU2VlZEFyZ3NcIikgPT4gei5zdHJ1Y3QoW3oudTMyKFwidm90ZUF1dGhvcml6YXRpb25UeXBlXCIpLCBXZShcImN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXlcIiksIHhuKFwiY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlTZWVkXCIpLCBXZShcIm5ld0F1dGhvcml6ZWRcIildLCBzKTtcbmZ1bmN0aW9uIEVyKHMpIHtcbiAgbGV0IGUgPSAwLCB0ID0gMDtcbiAgZm9yICg7IDsgKSB7XG4gICAgbGV0IHIgPSBzLnNoaWZ0KCk7XG4gICAgaWYgKGUgfD0gKHIgJiAxMjcpIDw8IHQgKiA3LCB0ICs9IDEsIChyICYgMTI4KSA9PT0gMClcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24geHIocywgZSkge1xuICBsZXQgdCA9IGU7XG4gIGZvciAoOyA7ICkge1xuICAgIGxldCByID0gdCAmIDEyNztcbiAgICBpZiAodCA+Pj0gNywgdCA9PSAwKSB7XG4gICAgICBzLnB1c2gocik7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2VcbiAgICAgIHIgfD0gMTI4LCBzLnB1c2gocik7XG4gIH1cbn1cbmZ1bmN0aW9uIEt0KHMsIGUpIHtcbiAgaWYgKCFzKVxuICAgIHRocm93IG5ldyBFcnJvcihlIHx8IFwiQXNzZXJ0aW9uIGZhaWxlZFwiKTtcbn1cbmNsYXNzIGZhIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHRoaXMucGF5ZXIgPSB2b2lkIDAsIHRoaXMua2V5TWV0YU1hcCA9IHZvaWQgMCwgdGhpcy5wYXllciA9IGUsIHRoaXMua2V5TWV0YU1hcCA9IHQ7XG4gIH1cbiAgc3RhdGljIGNvbXBpbGUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBuID0gKG8pID0+IHtcbiAgICAgIGNvbnN0IGEgPSBvLnRvQmFzZTU4KCk7XG4gICAgICBsZXQgbCA9IHIuZ2V0KGEpO1xuICAgICAgcmV0dXJuIGwgPT09IHZvaWQgMCAmJiAobCA9IHtcbiAgICAgICAgaXNTaWduZXI6ICExLFxuICAgICAgICBpc1dyaXRhYmxlOiAhMSxcbiAgICAgICAgaXNJbnZva2VkOiAhMVxuICAgICAgfSwgci5zZXQoYSwgbCkpLCBsO1xuICAgIH0sIGkgPSBuKHQpO1xuICAgIGkuaXNTaWduZXIgPSAhMCwgaS5pc1dyaXRhYmxlID0gITA7XG4gICAgZm9yIChjb25zdCBvIG9mIGUpIHtcbiAgICAgIG4oby5wcm9ncmFtSWQpLmlzSW52b2tlZCA9ICEwO1xuICAgICAgZm9yIChjb25zdCBhIG9mIG8ua2V5cykge1xuICAgICAgICBjb25zdCBsID0gbihhLnB1YmtleSk7XG4gICAgICAgIGwuaXNTaWduZXIgfHwgKGwuaXNTaWduZXIgPSBhLmlzU2lnbmVyKSwgbC5pc1dyaXRhYmxlIHx8IChsLmlzV3JpdGFibGUgPSBhLmlzV3JpdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IGZhKHQsIHIpO1xuICB9XG4gIGdldE1lc3NhZ2VDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGUgPSBbLi4udGhpcy5rZXlNZXRhTWFwLmVudHJpZXMoKV07XG4gICAgS3QoZS5sZW5ndGggPD0gMjU2LCBcIk1heCBzdGF0aWMgYWNjb3VudCBrZXlzIGxlbmd0aCBleGNlZWRlZFwiKTtcbiAgICBjb25zdCB0ID0gZS5maWx0ZXIoKFssIGxdKSA9PiBsLmlzU2lnbmVyICYmIGwuaXNXcml0YWJsZSksIHIgPSBlLmZpbHRlcigoWywgbF0pID0+IGwuaXNTaWduZXIgJiYgIWwuaXNXcml0YWJsZSksIG4gPSBlLmZpbHRlcigoWywgbF0pID0+ICFsLmlzU2lnbmVyICYmIGwuaXNXcml0YWJsZSksIGkgPSBlLmZpbHRlcigoWywgbF0pID0+ICFsLmlzU2lnbmVyICYmICFsLmlzV3JpdGFibGUpLCBvID0ge1xuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiB0Lmxlbmd0aCArIHIubGVuZ3RoLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogci5sZW5ndGgsXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGkubGVuZ3RoXG4gICAgfTtcbiAgICB7XG4gICAgICBLdCh0Lmxlbmd0aCA+IDAsIFwiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHdyaXRhYmxlIHNpZ25lciBrZXlcIik7XG4gICAgICBjb25zdCBbbF0gPSB0WzBdO1xuICAgICAgS3QobCA9PT0gdGhpcy5wYXllci50b0Jhc2U1OCgpLCBcIkV4cGVjdGVkIGZpcnN0IHdyaXRhYmxlIHNpZ25lciBrZXkgdG8gYmUgdGhlIGZlZSBwYXllclwiKTtcbiAgICB9XG4gICAgY29uc3QgYSA9IFsuLi50Lm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpLCAuLi5yLm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpLCAuLi5uLm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpLCAuLi5pLm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpXTtcbiAgICByZXR1cm4gW28sIGFdO1xuICB9XG4gIGV4dHJhY3RUYWJsZUxvb2t1cChlKSB7XG4gICAgY29uc3QgW3QsIHJdID0gdGhpcy5kcmFpbktleXNGb3VuZEluTG9va3VwVGFibGUoZS5zdGF0ZS5hZGRyZXNzZXMsIChvKSA9PiAhby5pc1NpZ25lciAmJiAhby5pc0ludm9rZWQgJiYgby5pc1dyaXRhYmxlKSwgW24sIGldID0gdGhpcy5kcmFpbktleXNGb3VuZEluTG9va3VwVGFibGUoZS5zdGF0ZS5hZGRyZXNzZXMsIChvKSA9PiAhby5pc1NpZ25lciAmJiAhby5pc0ludm9rZWQgJiYgIW8uaXNXcml0YWJsZSk7XG4gICAgaWYgKCEodC5sZW5ndGggPT09IDAgJiYgbi5sZW5ndGggPT09IDApKVxuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIGFjY291bnRLZXk6IGUua2V5LFxuICAgICAgICB3cml0YWJsZUluZGV4ZXM6IHQsXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogblxuICAgICAgfSwge1xuICAgICAgICB3cml0YWJsZTogcixcbiAgICAgICAgcmVhZG9ubHk6IGlcbiAgICAgIH1dO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZHJhaW5LZXlzRm91bmRJbkxvb2t1cFRhYmxlKGUsIHQpIHtcbiAgICBjb25zdCByID0gbmV3IEFycmF5KCksIG4gPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKGNvbnN0IFtpLCBvXSBvZiB0aGlzLmtleU1ldGFNYXAuZW50cmllcygpKVxuICAgICAgaWYgKHQobykpIHtcbiAgICAgICAgY29uc3QgYSA9IG5ldyBPZShpKSwgbCA9IGUuZmluZEluZGV4KChjKSA9PiBjLmVxdWFscyhhKSk7XG4gICAgICAgIGwgPj0gMCAmJiAoS3QobCA8IDI1NiwgXCJNYXggbG9va3VwIHRhYmxlIGluZGV4IGV4Y2VlZGVkXCIpLCByLnB1c2gobCksIG4ucHVzaChhKSwgdGhpcy5rZXlNZXRhTWFwLmRlbGV0ZShpKSk7XG4gICAgICB9XG4gICAgcmV0dXJuIFtyLCBuXTtcbiAgfVxufVxuY29uc3QgRjAgPSBcIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlciB1bmV4cGVjdGVkbHlcIjtcbmZ1bmN0aW9uIGRzKHMpIHtcbiAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcihGMCk7XG4gIHJldHVybiBzLnNoaWZ0KCk7XG59XG5mdW5jdGlvbiBTcihzLCAuLi5lKSB7XG4gIGNvbnN0IFt0XSA9IGU7XG4gIGlmIChlLmxlbmd0aCA9PT0gMiA/IHQgKyAoZVsxXSA/PyAwKSA+IHMubGVuZ3RoIDogdCA+PSBzLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoRjApO1xuICByZXR1cm4gcy5zcGxpY2UoLi4uZSk7XG59XG5jbGFzcyBNbiB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhlYWRlciA9IHZvaWQgMCwgdGhpcy5hY2NvdW50S2V5cyA9IHZvaWQgMCwgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDAsIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdm9pZCAwLCB0aGlzLmluZGV4VG9Qcm9ncmFtSWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgdGhpcy5oZWFkZXIgPSBlLmhlYWRlciwgdGhpcy5hY2NvdW50S2V5cyA9IGUuYWNjb3VudEtleXMubWFwKCh0KSA9PiBuZXcgT2UodCkpLCB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGUucmVjZW50QmxvY2toYXNoLCB0aGlzLmluc3RydWN0aW9ucyA9IGUuaW5zdHJ1Y3Rpb25zLCB0aGlzLmluc3RydWN0aW9ucy5mb3JFYWNoKCh0KSA9PiB0aGlzLmluZGV4VG9Qcm9ncmFtSWRzLnNldCh0LnByb2dyYW1JZEluZGV4LCB0aGlzLmFjY291bnRLZXlzW3QucHJvZ3JhbUlkSW5kZXhdKSk7XG4gIH1cbiAgZ2V0IHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIFwibGVnYWN5XCI7XG4gIH1cbiAgZ2V0IHN0YXRpY0FjY291bnRLZXlzKCkge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRLZXlzO1xuICB9XG4gIGdldCBjb21waWxlZEluc3RydWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbnMubWFwKChlKSA9PiAoe1xuICAgICAgcHJvZ3JhbUlkSW5kZXg6IGUucHJvZ3JhbUlkSW5kZXgsXG4gICAgICBhY2NvdW50S2V5SW5kZXhlczogZS5hY2NvdW50cyxcbiAgICAgIGRhdGE6IGFyLmRlY29kZShlLmRhdGEpXG4gICAgfSkpO1xuICB9XG4gIGdldCBhZGRyZXNzVGFibGVMb29rdXBzKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXRBY2NvdW50S2V5cygpIHtcbiAgICByZXR1cm4gbmV3IFZvKHRoaXMuc3RhdGljQWNjb3VudEtleXMpO1xuICB9XG4gIHN0YXRpYyBjb21waWxlKGUpIHtcbiAgICBjb25zdCB0ID0gZmEuY29tcGlsZShlLmluc3RydWN0aW9ucywgZS5wYXllcktleSksIFtyLCBuXSA9IHQuZ2V0TWVzc2FnZUNvbXBvbmVudHMoKSwgbyA9IG5ldyBWbyhuKS5jb21waWxlSW5zdHJ1Y3Rpb25zKGUuaW5zdHJ1Y3Rpb25zKS5tYXAoKGEpID0+ICh7XG4gICAgICBwcm9ncmFtSWRJbmRleDogYS5wcm9ncmFtSWRJbmRleCxcbiAgICAgIGFjY291bnRzOiBhLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgZGF0YTogYXIuZW5jb2RlKGEuZGF0YSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIG5ldyBNbih7XG4gICAgICBoZWFkZXI6IHIsXG4gICAgICBhY2NvdW50S2V5czogbixcbiAgICAgIHJlY2VudEJsb2NraGFzaDogZS5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBpbnN0cnVjdGlvbnM6IG9cbiAgICB9KTtcbiAgfVxuICBpc0FjY291bnRTaWduZXIoZSkge1xuICAgIHJldHVybiBlIDwgdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICB9XG4gIGlzQWNjb3VudFdyaXRhYmxlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICAgIGlmIChlID49IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcykge1xuICAgICAgY29uc3QgciA9IGUgLSB0LCBpID0gdGhpcy5hY2NvdW50S2V5cy5sZW5ndGggLSB0IC0gdGhpcy5oZWFkZXIubnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzO1xuICAgICAgcmV0dXJuIHIgPCBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByID0gdCAtIHRoaXMuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gZSA8IHI7XG4gICAgfVxuICB9XG4gIGlzUHJvZ3JhbUlkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleFRvUHJvZ3JhbUlkcy5oYXMoZSk7XG4gIH1cbiAgcHJvZ3JhbUlkcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuaW5kZXhUb1Byb2dyYW1JZHMudmFsdWVzKCldO1xuICB9XG4gIG5vblByb2dyYW1JZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudEtleXMuZmlsdGVyKChlLCB0KSA9PiAhdGhpcy5pc1Byb2dyYW1JZCh0KSk7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmFjY291bnRLZXlzLmxlbmd0aDtcbiAgICBsZXQgdCA9IFtdO1xuICAgIHhyKHQsIGUpO1xuICAgIGNvbnN0IHIgPSB0aGlzLmluc3RydWN0aW9ucy5tYXAoKGQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjb3VudHM6IGgsXG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmXG4gICAgICB9ID0gZCwgcCA9IEFycmF5LmZyb20oYXIuZGVjb2RlKGQuZGF0YSkpO1xuICAgICAgbGV0IHkgPSBbXTtcbiAgICAgIHhyKHksIGgubGVuZ3RoKTtcbiAgICAgIGxldCBFID0gW107XG4gICAgICByZXR1cm4geHIoRSwgcC5sZW5ndGgpLCB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmLFxuICAgICAgICBrZXlJbmRpY2VzQ291bnQ6IEhlLkJ1ZmZlci5mcm9tKHkpLFxuICAgICAgICBrZXlJbmRpY2VzOiBoLFxuICAgICAgICBkYXRhTGVuZ3RoOiBIZS5CdWZmZXIuZnJvbShFKSxcbiAgICAgICAgZGF0YTogcFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBsZXQgbiA9IFtdO1xuICAgIHhyKG4sIHIubGVuZ3RoKTtcbiAgICBsZXQgaSA9IEhlLkJ1ZmZlci5hbGxvYyh3bik7XG4gICAgSGUuQnVmZmVyLmZyb20obikuY29weShpKTtcbiAgICBsZXQgbyA9IG4ubGVuZ3RoO1xuICAgIHIuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgY29uc3QgZiA9IHouc3RydWN0KFt6LnU4KFwicHJvZ3JhbUlkSW5kZXhcIiksIHouYmxvYihkLmtleUluZGljZXNDb3VudC5sZW5ndGgsIFwia2V5SW5kaWNlc0NvdW50XCIpLCB6LnNlcSh6LnU4KFwia2V5SW5kZXhcIiksIGQua2V5SW5kaWNlcy5sZW5ndGgsIFwia2V5SW5kaWNlc1wiKSwgei5ibG9iKGQuZGF0YUxlbmd0aC5sZW5ndGgsIFwiZGF0YUxlbmd0aFwiKSwgei5zZXEoei51OChcInVzZXJkYXR1bVwiKSwgZC5kYXRhLmxlbmd0aCwgXCJkYXRhXCIpXSkuZW5jb2RlKGQsIGksIG8pO1xuICAgICAgbyArPSBmO1xuICAgIH0pLCBpID0gaS5zbGljZSgwLCBvKTtcbiAgICBjb25zdCBhID0gei5zdHJ1Y3QoW3ouYmxvYigxLCBcIm51bVJlcXVpcmVkU2lnbmF0dXJlc1wiKSwgei5ibG9iKDEsIFwibnVtUmVhZG9ubHlTaWduZWRBY2NvdW50c1wiKSwgei5ibG9iKDEsIFwibnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzXCIpLCB6LmJsb2IodC5sZW5ndGgsIFwia2V5Q291bnRcIiksIHouc2VxKFdlKFwia2V5XCIpLCBlLCBcImtleXNcIiksIFdlKFwicmVjZW50QmxvY2toYXNoXCIpXSksIGwgPSB7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IEhlLkJ1ZmZlci5mcm9tKFt0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXNdKSxcbiAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IEhlLkJ1ZmZlci5mcm9tKFt0aGlzLmhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzXSksXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IEhlLkJ1ZmZlci5mcm9tKFt0aGlzLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHNdKSxcbiAgICAgIGtleUNvdW50OiBIZS5CdWZmZXIuZnJvbSh0KSxcbiAgICAgIGtleXM6IHRoaXMuYWNjb3VudEtleXMubWFwKChkKSA9PiBydShkLnRvQnl0ZXMoKSkpLFxuICAgICAgcmVjZW50QmxvY2toYXNoOiBhci5kZWNvZGUodGhpcy5yZWNlbnRCbG9ja2hhc2gpXG4gICAgfTtcbiAgICBsZXQgYyA9IEhlLkJ1ZmZlci5hbGxvYygyMDQ4KTtcbiAgICBjb25zdCB1ID0gYS5lbmNvZGUobCwgYyk7XG4gICAgcmV0dXJuIGkuY29weShjLCB1KSwgYy5zbGljZSgwLCB1ICsgaS5sZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBEZWNvZGUgYSBjb21waWxlZCBtZXNzYWdlIGludG8gYSBNZXNzYWdlIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBmcm9tKGUpIHtcbiAgICBsZXQgdCA9IFsuLi5lXTtcbiAgICBjb25zdCByID0gZHModCk7XG4gICAgaWYgKHIgIT09IChyICYgc3UpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVmVyc2lvbmVkIG1lc3NhZ2VzIG11c3QgYmUgZGVzZXJpYWxpemVkIHdpdGggVmVyc2lvbmVkTWVzc2FnZS5kZXNlcmlhbGl6ZSgpXCIpO1xuICAgIGNvbnN0IG4gPSBkcyh0KSwgaSA9IGRzKHQpLCBvID0gRXIodCk7XG4gICAgbGV0IGEgPSBbXTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8IG87IGgrKykge1xuICAgICAgY29uc3QgZiA9IFNyKHQsIDAsIGtzKTtcbiAgICAgIGEucHVzaChuZXcgT2UoSGUuQnVmZmVyLmZyb20oZikpKTtcbiAgICB9XG4gICAgY29uc3QgbCA9IFNyKHQsIDAsIGtzKSwgYyA9IEVyKHQpO1xuICAgIGxldCB1ID0gW107XG4gICAgZm9yIChsZXQgaCA9IDA7IGggPCBjOyBoKyspIHtcbiAgICAgIGNvbnN0IGYgPSBkcyh0KSwgcCA9IEVyKHQpLCB5ID0gU3IodCwgMCwgcCksIEUgPSBFcih0KSwgYiA9IFNyKHQsIDAsIEUpLCBSID0gYXIuZW5jb2RlKEhlLkJ1ZmZlci5mcm9tKGIpKTtcbiAgICAgIHUucHVzaCh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmLFxuICAgICAgICBhY2NvdW50czogeSxcbiAgICAgICAgZGF0YTogUlxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGQgPSB7XG4gICAgICBoZWFkZXI6IHtcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiByLFxuICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiBuLFxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGlcbiAgICAgIH0sXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGFyLmVuY29kZShIZS5CdWZmZXIuZnJvbShsKSksXG4gICAgICBhY2NvdW50S2V5czogYSxcbiAgICAgIGluc3RydWN0aW9uczogdVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBNbihkKTtcbiAgfVxufVxuY2xhc3Mgam8ge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5oZWFkZXIgPSB2b2lkIDAsIHRoaXMuc3RhdGljQWNjb3VudEtleXMgPSB2b2lkIDAsIHRoaXMucmVjZW50QmxvY2toYXNoID0gdm9pZCAwLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gdm9pZCAwLCB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMgPSB2b2lkIDAsIHRoaXMuaGVhZGVyID0gZS5oZWFkZXIsIHRoaXMuc3RhdGljQWNjb3VudEtleXMgPSBlLnN0YXRpY0FjY291bnRLZXlzLCB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGUucmVjZW50QmxvY2toYXNoLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gZS5jb21waWxlZEluc3RydWN0aW9ucywgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzID0gZS5hZGRyZXNzVGFibGVMb29rdXBzO1xuICB9XG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBudW1BY2NvdW50S2V5c0Zyb21Mb29rdXBzKCkge1xuICAgIGxldCBlID0gMDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzKVxuICAgICAgZSArPSB0LnJlYWRvbmx5SW5kZXhlcy5sZW5ndGggKyB0LndyaXRhYmxlSW5kZXhlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZ2V0QWNjb3VudEtleXMoZSkge1xuICAgIGxldCB0O1xuICAgIGlmIChlICYmIFwiYWNjb3VudEtleXNGcm9tTG9va3Vwc1wiIGluIGUgJiYgZS5hY2NvdW50S2V5c0Zyb21Mb29rdXBzKSB7XG4gICAgICBpZiAodGhpcy5udW1BY2NvdW50S2V5c0Zyb21Mb29rdXBzICE9IGUuYWNjb3VudEtleXNGcm9tTG9va3Vwcy53cml0YWJsZS5sZW5ndGggKyBlLmFjY291bnRLZXlzRnJvbUxvb2t1cHMucmVhZG9ubHkubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGFjY291bnQga2V5cyBiZWNhdXNlIG9mIGEgbWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBhY2NvdW50IGtleXMgZnJvbSBsb29rdXBzXCIpO1xuICAgICAgdCA9IGUuYWNjb3VudEtleXNGcm9tTG9va3VwcztcbiAgICB9IGVsc2UgaWYgKGUgJiYgXCJhZGRyZXNzTG9va3VwVGFibGVBY2NvdW50c1wiIGluIGUgJiYgZS5hZGRyZXNzTG9va3VwVGFibGVBY2NvdW50cylcbiAgICAgIHQgPSB0aGlzLnJlc29sdmVBZGRyZXNzVGFibGVMb29rdXBzKGUuYWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudHMpO1xuICAgIGVsc2UgaWYgKHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcy5sZW5ndGggPiAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBhY2NvdW50IGtleXMgYmVjYXVzZSBhZGRyZXNzIHRhYmxlIGxvb2t1cHMgd2VyZSBub3QgcmVzb2x2ZWRcIik7XG4gICAgcmV0dXJuIG5ldyBWbyh0aGlzLnN0YXRpY0FjY291bnRLZXlzLCB0KTtcbiAgfVxuICBpc0FjY291bnRTaWduZXIoZSkge1xuICAgIHJldHVybiBlIDwgdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICB9XG4gIGlzQWNjb3VudFdyaXRhYmxlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLCByID0gdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGg7XG4gICAgaWYgKGUgPj0gcikge1xuICAgICAgY29uc3QgbiA9IGUgLSByLCBpID0gdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzLnJlZHVjZSgobywgYSkgPT4gbyArIGEud3JpdGFibGVJbmRleGVzLmxlbmd0aCwgMCk7XG4gICAgICByZXR1cm4gbiA8IGk7XG4gICAgfSBlbHNlIGlmIChlID49IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcykge1xuICAgICAgY29uc3QgbiA9IGUgLSB0LCBvID0gciAtIHQgLSB0aGlzLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gbiA8IG87XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG4gPSB0IC0gdGhpcy5oZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cztcbiAgICAgIHJldHVybiBlIDwgbjtcbiAgICB9XG4gIH1cbiAgcmVzb2x2ZUFkZHJlc3NUYWJsZUxvb2t1cHMoZSkge1xuICAgIGNvbnN0IHQgPSB7XG4gICAgICB3cml0YWJsZTogW10sXG4gICAgICByZWFkb25seTogW11cbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMpIHtcbiAgICAgIGNvbnN0IG4gPSBlLmZpbmQoKGkpID0+IGkua2V5LmVxdWFscyhyLmFjY291bnRLZXkpKTtcbiAgICAgIGlmICghbilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhZGRyZXNzIGxvb2t1cCB0YWJsZSBhY2NvdW50IGZvciB0YWJsZSBrZXkgJHtyLmFjY291bnRLZXkudG9CYXNlNTgoKX1gKTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiByLndyaXRhYmxlSW5kZXhlcylcbiAgICAgICAgaWYgKGkgPCBuLnN0YXRlLmFkZHJlc3Nlcy5sZW5ndGgpXG4gICAgICAgICAgdC53cml0YWJsZS5wdXNoKG4uc3RhdGUuYWRkcmVzc2VzW2ldKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgYWRkcmVzcyBmb3IgaW5kZXggJHtpfSBpbiBhZGRyZXNzIGxvb2t1cCB0YWJsZSAke3IuYWNjb3VudEtleS50b0Jhc2U1OCgpfWApO1xuICAgICAgZm9yIChjb25zdCBpIG9mIHIucmVhZG9ubHlJbmRleGVzKVxuICAgICAgICBpZiAoaSA8IG4uc3RhdGUuYWRkcmVzc2VzLmxlbmd0aClcbiAgICAgICAgICB0LnJlYWRvbmx5LnB1c2gobi5zdGF0ZS5hZGRyZXNzZXNbaV0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhZGRyZXNzIGZvciBpbmRleCAke2l9IGluIGFkZHJlc3MgbG9va3VwIHRhYmxlICR7ci5hY2NvdW50S2V5LnRvQmFzZTU4KCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0O1xuICB9XG4gIHN0YXRpYyBjb21waWxlKGUpIHtcbiAgICBjb25zdCB0ID0gZmEuY29tcGlsZShlLmluc3RydWN0aW9ucywgZS5wYXllcktleSksIHIgPSBuZXcgQXJyYXkoKSwgbiA9IHtcbiAgICAgIHdyaXRhYmxlOiBuZXcgQXJyYXkoKSxcbiAgICAgIHJlYWRvbmx5OiBuZXcgQXJyYXkoKVxuICAgIH0sIGkgPSBlLmFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgdSBvZiBpKSB7XG4gICAgICBjb25zdCBkID0gdC5leHRyYWN0VGFibGVMb29rdXAodSk7XG4gICAgICBpZiAoZCAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IFtoLCB7XG4gICAgICAgICAgd3JpdGFibGU6IGYsXG4gICAgICAgICAgcmVhZG9ubHk6IHBcbiAgICAgICAgfV0gPSBkO1xuICAgICAgICByLnB1c2goaCksIG4ud3JpdGFibGUucHVzaCguLi5mKSwgbi5yZWFkb25seS5wdXNoKC4uLnApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBbbywgYV0gPSB0LmdldE1lc3NhZ2VDb21wb25lbnRzKCksIGMgPSBuZXcgVm8oYSwgbikuY29tcGlsZUluc3RydWN0aW9ucyhlLmluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBqbyh7XG4gICAgICBoZWFkZXI6IG8sXG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogYSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogZS5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBjb21waWxlZEluc3RydWN0aW9uczogYyxcbiAgICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IHJcbiAgICB9KTtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgY29uc3QgZSA9IEFycmF5KCk7XG4gICAgeHIoZSwgdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGgpO1xuICAgIGNvbnN0IHQgPSB0aGlzLnNlcmlhbGl6ZUluc3RydWN0aW9ucygpLCByID0gQXJyYXkoKTtcbiAgICB4cihyLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCk7XG4gICAgY29uc3QgbiA9IHRoaXMuc2VyaWFsaXplQWRkcmVzc1RhYmxlTG9va3VwcygpLCBpID0gQXJyYXkoKTtcbiAgICB4cihpLCB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMubGVuZ3RoKTtcbiAgICBjb25zdCBvID0gei5zdHJ1Y3QoW3oudTgoXCJwcmVmaXhcIiksIHouc3RydWN0KFt6LnU4KFwibnVtUmVxdWlyZWRTaWduYXR1cmVzXCIpLCB6LnU4KFwibnVtUmVhZG9ubHlTaWduZWRBY2NvdW50c1wiKSwgei51OChcIm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c1wiKV0sIFwiaGVhZGVyXCIpLCB6LmJsb2IoZS5sZW5ndGgsIFwic3RhdGljQWNjb3VudEtleXNMZW5ndGhcIiksIHouc2VxKFdlKCksIHRoaXMuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoLCBcInN0YXRpY0FjY291bnRLZXlzXCIpLCBXZShcInJlY2VudEJsb2NraGFzaFwiKSwgei5ibG9iKHIubGVuZ3RoLCBcImluc3RydWN0aW9uc0xlbmd0aFwiKSwgei5ibG9iKHQubGVuZ3RoLCBcInNlcmlhbGl6ZWRJbnN0cnVjdGlvbnNcIiksIHouYmxvYihpLmxlbmd0aCwgXCJhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoXCIpLCB6LmJsb2Iobi5sZW5ndGgsIFwic2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHNcIildKSwgYSA9IG5ldyBVaW50OEFycmF5KHduKSwgYyA9IG8uZW5jb2RlKHtcbiAgICAgIHByZWZpeDogMTI4LFxuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlKSxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiB0aGlzLnN0YXRpY0FjY291bnRLZXlzLm1hcCgodSkgPT4gdS50b0J5dGVzKCkpLFxuICAgICAgcmVjZW50QmxvY2toYXNoOiBhci5kZWNvZGUodGhpcy5yZWNlbnRCbG9ja2hhc2gpLFxuICAgICAgaW5zdHJ1Y3Rpb25zTGVuZ3RoOiBuZXcgVWludDhBcnJheShyKSxcbiAgICAgIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnM6IHQsXG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoOiBuZXcgVWludDhBcnJheShpKSxcbiAgICAgIHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzOiBuXG4gICAgfSwgYSk7XG4gICAgcmV0dXJuIGEuc2xpY2UoMCwgYyk7XG4gIH1cbiAgc2VyaWFsaXplSW5zdHJ1Y3Rpb25zKCkge1xuICAgIGxldCBlID0gMDtcbiAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkod24pO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCBuID0gQXJyYXkoKTtcbiAgICAgIHhyKG4sIHIuYWNjb3VudEtleUluZGV4ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGkgPSBBcnJheSgpO1xuICAgICAgeHIoaSwgci5kYXRhLmxlbmd0aCk7XG4gICAgICBjb25zdCBvID0gei5zdHJ1Y3QoW3oudTgoXCJwcm9ncmFtSWRJbmRleFwiKSwgei5ibG9iKG4ubGVuZ3RoLCBcImVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aFwiKSwgei5zZXEoei51OCgpLCByLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCwgXCJhY2NvdW50S2V5SW5kZXhlc1wiKSwgei5ibG9iKGkubGVuZ3RoLCBcImVuY29kZWREYXRhTGVuZ3RoXCIpLCB6LmJsb2Ioci5kYXRhLmxlbmd0aCwgXCJkYXRhXCIpXSk7XG4gICAgICBlICs9IG8uZW5jb2RlKHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IHIucHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgIGVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkobiksXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiByLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICBlbmNvZGVkRGF0YUxlbmd0aDogbmV3IFVpbnQ4QXJyYXkoaSksXG4gICAgICAgIGRhdGE6IHIuZGF0YVxuICAgICAgfSwgdCwgZSk7XG4gICAgfVxuICAgIHJldHVybiB0LnNsaWNlKDAsIGUpO1xuICB9XG4gIHNlcmlhbGl6ZUFkZHJlc3NUYWJsZUxvb2t1cHMoKSB7XG4gICAgbGV0IGUgPSAwO1xuICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheSh3bik7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcykge1xuICAgICAgY29uc3QgbiA9IEFycmF5KCk7XG4gICAgICB4cihuLCByLndyaXRhYmxlSW5kZXhlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgaSA9IEFycmF5KCk7XG4gICAgICB4cihpLCByLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgbyA9IHouc3RydWN0KFtXZShcImFjY291bnRLZXlcIiksIHouYmxvYihuLmxlbmd0aCwgXCJlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoXCIpLCB6LnNlcSh6LnU4KCksIHIud3JpdGFibGVJbmRleGVzLmxlbmd0aCwgXCJ3cml0YWJsZUluZGV4ZXNcIiksIHouYmxvYihpLmxlbmd0aCwgXCJlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoXCIpLCB6LnNlcSh6LnU4KCksIHIucmVhZG9ubHlJbmRleGVzLmxlbmd0aCwgXCJyZWFkb25seUluZGV4ZXNcIildKTtcbiAgICAgIGUgKz0gby5lbmNvZGUoe1xuICAgICAgICBhY2NvdW50S2V5OiByLmFjY291bnRLZXkudG9CeXRlcygpLFxuICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShuKSxcbiAgICAgICAgd3JpdGFibGVJbmRleGVzOiByLndyaXRhYmxlSW5kZXhlcyxcbiAgICAgICAgZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkoaSksXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogci5yZWFkb25seUluZGV4ZXNcbiAgICAgIH0sIHQsIGUpO1xuICAgIH1cbiAgICByZXR1cm4gdC5zbGljZSgwLCBlKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZSkge1xuICAgIGxldCB0ID0gWy4uLmVdO1xuICAgIGNvbnN0IHIgPSBkcyh0KSwgbiA9IHIgJiBzdTtcbiAgICBLdChyICE9PSBuLCBcIkV4cGVjdGVkIHZlcnNpb25lZCBtZXNzYWdlIGJ1dCByZWNlaXZlZCBsZWdhY3kgbWVzc2FnZVwiKTtcbiAgICBjb25zdCBpID0gbjtcbiAgICBLdChpID09PSAwLCBgRXhwZWN0ZWQgdmVyc2lvbmVkIG1lc3NhZ2Ugd2l0aCB2ZXJzaW9uIDAgYnV0IGZvdW5kIHZlcnNpb24gJHtpfWApO1xuICAgIGNvbnN0IG8gPSB7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IGRzKHQpLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogZHModCksXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGRzKHQpXG4gICAgfSwgYSA9IFtdLCBsID0gRXIodCk7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCBsOyBwKyspXG4gICAgICBhLnB1c2gobmV3IE9lKFNyKHQsIDAsIGtzKSkpO1xuICAgIGNvbnN0IGMgPSBhci5lbmNvZGUoU3IodCwgMCwga3MpKSwgdSA9IEVyKHQpLCBkID0gW107XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCB1OyBwKyspIHtcbiAgICAgIGNvbnN0IHkgPSBkcyh0KSwgRSA9IEVyKHQpLCBiID0gU3IodCwgMCwgRSksIFIgPSBFcih0KSwgQSA9IG5ldyBVaW50OEFycmF5KFNyKHQsIDAsIFIpKTtcbiAgICAgIGQucHVzaCh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiB5LFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogYixcbiAgICAgICAgZGF0YTogQVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGggPSBFcih0KSwgZiA9IFtdO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgaDsgcCsrKSB7XG4gICAgICBjb25zdCB5ID0gbmV3IE9lKFNyKHQsIDAsIGtzKSksIEUgPSBFcih0KSwgYiA9IFNyKHQsIDAsIEUpLCBSID0gRXIodCksIEEgPSBTcih0LCAwLCBSKTtcbiAgICAgIGYucHVzaCh7XG4gICAgICAgIGFjY291bnRLZXk6IHksXG4gICAgICAgIHdyaXRhYmxlSW5kZXhlczogYixcbiAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBBXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBqbyh7XG4gICAgICBoZWFkZXI6IG8sXG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogYSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYyxcbiAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBkLFxuICAgICAgYWRkcmVzc1RhYmxlTG9va3VwczogZlxuICAgIH0pO1xuICB9XG59XG5jb25zdCBudSA9IHtcbiAgZGVzZXJpYWxpemVNZXNzYWdlVmVyc2lvbihzKSB7XG4gICAgY29uc3QgZSA9IHNbMF0sIHQgPSBlICYgc3U7XG4gICAgcmV0dXJuIHQgPT09IGUgPyBcImxlZ2FjeVwiIDogdDtcbiAgfSxcbiAgZGVzZXJpYWxpemU6IChzKSA9PiB7XG4gICAgY29uc3QgZSA9IG51LmRlc2VyaWFsaXplTWVzc2FnZVZlcnNpb24ocyk7XG4gICAgaWYgKGUgPT09IFwibGVnYWN5XCIpXG4gICAgICByZXR1cm4gTW4uZnJvbShzKTtcbiAgICBpZiAoZSA9PT0gMClcbiAgICAgIHJldHVybiBqby5kZXNlcmlhbGl6ZShzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uIG1lc3NhZ2UgdmVyc2lvbiAke2V9IGRlc2VyaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIH1cbn0sIG1FID0gSGUuQnVmZmVyLmFsbG9jKEdvKS5maWxsKDApO1xuY2xhc3MgVWQge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5rZXlzID0gdm9pZCAwLCB0aGlzLnByb2dyYW1JZCA9IHZvaWQgMCwgdGhpcy5kYXRhID0gSGUuQnVmZmVyLmFsbG9jKDApLCB0aGlzLnByb2dyYW1JZCA9IGUucHJvZ3JhbUlkLCB0aGlzLmtleXMgPSBlLmtleXMsIGUuZGF0YSAmJiAodGhpcy5kYXRhID0gZS5kYXRhKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IHRoaXMua2V5cy5tYXAoKHtcbiAgICAgICAgcHVia2V5OiBlLFxuICAgICAgICBpc1NpZ25lcjogdCxcbiAgICAgICAgaXNXcml0YWJsZTogclxuICAgICAgfSkgPT4gKHtcbiAgICAgICAgcHVia2V5OiBlLnRvSlNPTigpLFxuICAgICAgICBpc1NpZ25lcjogdCxcbiAgICAgICAgaXNXcml0YWJsZTogclxuICAgICAgfSkpLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZC50b0pTT04oKSxcbiAgICAgIGRhdGE6IFsuLi50aGlzLmRhdGFdXG4gICAgfTtcbiAgfVxufVxuY2xhc3MgS28ge1xuICAvKipcbiAgICogVGhlIGZpcnN0IChwYXllcikgVHJhbnNhY3Rpb24gc2lnbmF0dXJlXG4gICAqXG4gICAqIEByZXR1cm5zIHtCdWZmZXIgfCBudWxsfSBCdWZmZXIgb2YgcGF5ZXIncyBzaWduYXR1cmVcbiAgICovXG4gIGdldCBzaWduYXR1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlcy5sZW5ndGggPiAwID8gdGhpcy5zaWduYXR1cmVzWzBdLnNpZ25hdHVyZSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0cmFuc2FjdGlvbiBmZWUgcGF5ZXJcbiAgICovXG4gIC8vIENvbnN0cnVjdCBhIHRyYW5zYWN0aW9uIHdpdGggYSBibG9ja2hhc2ggYW5kIGxhc3RWYWxpZEJsb2NrSGVpZ2h0XG4gIC8vIENvbnN0cnVjdCBhIHRyYW5zYWN0aW9uIHVzaW5nIGEgZHVyYWJsZSBub25jZVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYFRyYW5zYWN0aW9uQ3RvckZpZWxkc2AgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIFBsZWFzZSBzdXBwbHkgYSBgVHJhbnNhY3Rpb25CbG9ja2hhc2hDdG9yYCBpbnN0ZWFkLlxuICAgKi9cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBlbXB0eSBUcmFuc2FjdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZXMgPSBbXSwgdGhpcy5mZWVQYXllciA9IHZvaWQgMCwgdGhpcy5pbnN0cnVjdGlvbnMgPSBbXSwgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDAsIHRoaXMubGFzdFZhbGlkQmxvY2tIZWlnaHQgPSB2b2lkIDAsIHRoaXMubm9uY2VJbmZvID0gdm9pZCAwLCB0aGlzLm1pbk5vbmNlQ29udGV4dFNsb3QgPSB2b2lkIDAsIHRoaXMuX21lc3NhZ2UgPSB2b2lkIDAsIHRoaXMuX2pzb24gPSB2b2lkIDAsICEhZSlcbiAgICAgIGlmIChlLmZlZVBheWVyICYmICh0aGlzLmZlZVBheWVyID0gZS5mZWVQYXllciksIGUuc2lnbmF0dXJlcyAmJiAodGhpcy5zaWduYXR1cmVzID0gZS5zaWduYXR1cmVzKSwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwibm9uY2VJbmZvXCIpKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtaW5Db250ZXh0U2xvdDogdCxcbiAgICAgICAgICBub25jZUluZm86IHJcbiAgICAgICAgfSA9IGU7XG4gICAgICAgIHRoaXMubWluTm9uY2VDb250ZXh0U2xvdCA9IHQsIHRoaXMubm9uY2VJbmZvID0gcjtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwibGFzdFZhbGlkQmxvY2tIZWlnaHRcIikpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGJsb2NraGFzaDogdCxcbiAgICAgICAgICBsYXN0VmFsaWRCbG9ja0hlaWdodDogclxuICAgICAgICB9ID0gZTtcbiAgICAgICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB0LCB0aGlzLmxhc3RWYWxpZEJsb2NrSGVpZ2h0ID0gcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByZWNlbnRCbG9ja2hhc2g6IHQsXG4gICAgICAgICAgbm9uY2VJbmZvOiByXG4gICAgICAgIH0gPSBlO1xuICAgICAgICByICYmICh0aGlzLm5vbmNlSW5mbyA9IHIpLCB0aGlzLnJlY2VudEJsb2NraGFzaCA9IHQ7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWNlbnRCbG9ja2hhc2g6IHRoaXMucmVjZW50QmxvY2toYXNoIHx8IG51bGwsXG4gICAgICBmZWVQYXllcjogdGhpcy5mZWVQYXllciA/IHRoaXMuZmVlUGF5ZXIudG9KU09OKCkgOiBudWxsLFxuICAgICAgbm9uY2VJbmZvOiB0aGlzLm5vbmNlSW5mbyA/IHtcbiAgICAgICAgbm9uY2U6IHRoaXMubm9uY2VJbmZvLm5vbmNlLFxuICAgICAgICBub25jZUluc3RydWN0aW9uOiB0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uLnRvSlNPTigpXG4gICAgICB9IDogbnVsbCxcbiAgICAgIGluc3RydWN0aW9uczogdGhpcy5pbnN0cnVjdGlvbnMubWFwKChlKSA9PiBlLnRvSlNPTigpKSxcbiAgICAgIHNpZ25lcnM6IHRoaXMuc2lnbmF0dXJlcy5tYXAoKHtcbiAgICAgICAgcHVibGljS2V5OiBlXG4gICAgICB9KSA9PiBlLnRvSlNPTigpKVxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMgdG8gdGhpcyBUcmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PCBUcmFuc2FjdGlvbiB8IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gfCBUcmFuc2FjdGlvbkluc3RydWN0aW9uQ3RvckZpZWxkcyA+fSBpdGVtcyAtIEluc3RydWN0aW9ucyB0byBhZGQgdG8gdGhlIFRyYW5zYWN0aW9uXG4gICAqL1xuICBhZGQoLi4uZSkge1xuICAgIGlmIChlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGluc3RydWN0aW9uc1wiKTtcbiAgICByZXR1cm4gZS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBcImluc3RydWN0aW9uc1wiIGluIHQgPyB0aGlzLmluc3RydWN0aW9ucyA9IHRoaXMuaW5zdHJ1Y3Rpb25zLmNvbmNhdCh0Lmluc3RydWN0aW9ucykgOiBcImRhdGFcIiBpbiB0ICYmIFwicHJvZ3JhbUlkXCIgaW4gdCAmJiBcImtleXNcIiBpbiB0ID8gdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh0KSA6IHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2gobmV3IFVkKHQpKTtcbiAgICB9KSwgdGhpcztcbiAgfVxuICAvKipcbiAgICogQ29tcGlsZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqL1xuICBjb21waWxlTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZSAmJiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fanNvbikpXG4gICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgICBsZXQgZSwgdDtcbiAgICBpZiAodGhpcy5ub25jZUluZm8gPyAoZSA9IHRoaXMubm9uY2VJbmZvLm5vbmNlLCB0aGlzLmluc3RydWN0aW9uc1swXSAhPSB0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uID8gdCA9IFt0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uLCAuLi50aGlzLmluc3RydWN0aW9uc10gOiB0ID0gdGhpcy5pbnN0cnVjdGlvbnMpIDogKGUgPSB0aGlzLnJlY2VudEJsb2NraGFzaCwgdCA9IHRoaXMuaW5zdHJ1Y3Rpb25zKSwgIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2FjdGlvbiByZWNlbnRCbG9ja2hhc2ggcmVxdWlyZWRcIik7XG4gICAgdC5sZW5ndGggPCAxICYmIGNvbnNvbGUud2FybihcIk5vIGluc3RydWN0aW9ucyBwcm92aWRlZFwiKTtcbiAgICBsZXQgcjtcbiAgICBpZiAodGhpcy5mZWVQYXllcilcbiAgICAgIHIgPSB0aGlzLmZlZVBheWVyO1xuICAgIGVsc2UgaWYgKHRoaXMuc2lnbmF0dXJlcy5sZW5ndGggPiAwICYmIHRoaXMuc2lnbmF0dXJlc1swXS5wdWJsaWNLZXkpXG4gICAgICByID0gdGhpcy5zaWduYXR1cmVzWzBdLnB1YmxpY0tleTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2FjdGlvbiBmZWUgcGF5ZXIgcmVxdWlyZWRcIik7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0Lmxlbmd0aDsgeSsrKVxuICAgICAgaWYgKHRbeV0ucHJvZ3JhbUlkID09PSB2b2lkIDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gaW5kZXggJHt5fSBoYXMgdW5kZWZpbmVkIHByb2dyYW0gaWRgKTtcbiAgICBjb25zdCBuID0gW10sIGkgPSBbXTtcbiAgICB0LmZvckVhY2goKHkpID0+IHtcbiAgICAgIHkua2V5cy5mb3JFYWNoKChiKSA9PiB7XG4gICAgICAgIGkucHVzaCh7XG4gICAgICAgICAgLi4uYlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgRSA9IHkucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICBuLmluY2x1ZGVzKEUpIHx8IG4ucHVzaChFKTtcbiAgICB9KSwgbi5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICBpLnB1c2goe1xuICAgICAgICBwdWJrZXk6IG5ldyBPZSh5KSxcbiAgICAgICAgaXNTaWduZXI6ICExLFxuICAgICAgICBpc1dyaXRhYmxlOiAhMVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbyA9IFtdO1xuICAgIGkuZm9yRWFjaCgoeSkgPT4ge1xuICAgICAgY29uc3QgRSA9IHkucHVia2V5LnRvU3RyaW5nKCksIGIgPSBvLmZpbmRJbmRleCgoUikgPT4gUi5wdWJrZXkudG9TdHJpbmcoKSA9PT0gRSk7XG4gICAgICBiID4gLTEgPyAob1tiXS5pc1dyaXRhYmxlID0gb1tiXS5pc1dyaXRhYmxlIHx8IHkuaXNXcml0YWJsZSwgb1tiXS5pc1NpZ25lciA9IG9bYl0uaXNTaWduZXIgfHwgeS5pc1NpZ25lcikgOiBvLnB1c2goeSk7XG4gICAgfSksIG8uc29ydChmdW5jdGlvbih5LCBFKSB7XG4gICAgICBpZiAoeS5pc1NpZ25lciAhPT0gRS5pc1NpZ25lcilcbiAgICAgICAgcmV0dXJuIHkuaXNTaWduZXIgPyAtMSA6IDE7XG4gICAgICBpZiAoeS5pc1dyaXRhYmxlICE9PSBFLmlzV3JpdGFibGUpXG4gICAgICAgIHJldHVybiB5LmlzV3JpdGFibGUgPyAtMSA6IDE7XG4gICAgICBjb25zdCBiID0ge1xuICAgICAgICBsb2NhbGVNYXRjaGVyOiBcImJlc3QgZml0XCIsXG4gICAgICAgIHVzYWdlOiBcInNvcnRcIixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IFwidmFyaWFudFwiLFxuICAgICAgICBpZ25vcmVQdW5jdHVhdGlvbjogITEsXG4gICAgICAgIG51bWVyaWM6ICExLFxuICAgICAgICBjYXNlRmlyc3Q6IFwibG93ZXJcIlxuICAgICAgfTtcbiAgICAgIHJldHVybiB5LnB1YmtleS50b0Jhc2U1OCgpLmxvY2FsZUNvbXBhcmUoRS5wdWJrZXkudG9CYXNlNTgoKSwgXCJlblwiLCBiKTtcbiAgICB9KTtcbiAgICBjb25zdCBhID0gby5maW5kSW5kZXgoKHkpID0+IHkucHVia2V5LmVxdWFscyhyKSk7XG4gICAgaWYgKGEgPiAtMSkge1xuICAgICAgY29uc3QgW3ldID0gby5zcGxpY2UoYSwgMSk7XG4gICAgICB5LmlzU2lnbmVyID0gITAsIHkuaXNXcml0YWJsZSA9ICEwLCBvLnVuc2hpZnQoeSk7XG4gICAgfSBlbHNlXG4gICAgICBvLnVuc2hpZnQoe1xuICAgICAgICBwdWJrZXk6IHIsXG4gICAgICAgIGlzU2lnbmVyOiAhMCxcbiAgICAgICAgaXNXcml0YWJsZTogITBcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgeSBvZiB0aGlzLnNpZ25hdHVyZXMpIHtcbiAgICAgIGNvbnN0IEUgPSBvLmZpbmRJbmRleCgoYikgPT4gYi5wdWJrZXkuZXF1YWxzKHkucHVibGljS2V5KSk7XG4gICAgICBpZiAoRSA+IC0xKVxuICAgICAgICBvW0VdLmlzU2lnbmVyIHx8IChvW0VdLmlzU2lnbmVyID0gITAsIGNvbnNvbGUud2FybihcIlRyYW5zYWN0aW9uIHJlZmVyZW5jZXMgYSBzaWduYXR1cmUgdGhhdCBpcyB1bm5lY2Vzc2FyeSwgb25seSB0aGUgZmVlIHBheWVyIGFuZCBpbnN0cnVjdGlvbiBzaWduZXIgYWNjb3VudHMgc2hvdWxkIHNpZ24gYSB0cmFuc2FjdGlvbi4gVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHRocm93IGFuIGVycm9yIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gcmVsZWFzZS5cIikpO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gc2lnbmVyOiAke3kucHVibGljS2V5LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuICAgIGxldCBsID0gMCwgYyA9IDAsIHUgPSAwO1xuICAgIGNvbnN0IGQgPSBbXSwgaCA9IFtdO1xuICAgIG8uZm9yRWFjaCgoe1xuICAgICAgcHVia2V5OiB5LFxuICAgICAgaXNTaWduZXI6IEUsXG4gICAgICBpc1dyaXRhYmxlOiBiXG4gICAgfSkgPT4ge1xuICAgICAgRSA/IChkLnB1c2goeS50b1N0cmluZygpKSwgbCArPSAxLCBiIHx8IChjICs9IDEpKSA6IChoLnB1c2goeS50b1N0cmluZygpKSwgYiB8fCAodSArPSAxKSk7XG4gICAgfSk7XG4gICAgY29uc3QgZiA9IGQuY29uY2F0KGgpLCBwID0gdC5tYXAoKHkpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogRSxcbiAgICAgICAgcHJvZ3JhbUlkOiBiXG4gICAgICB9ID0geTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmLmluZGV4T2YoYi50b1N0cmluZygpKSxcbiAgICAgICAgYWNjb3VudHM6IHkua2V5cy5tYXAoKFIpID0+IGYuaW5kZXhPZihSLnB1YmtleS50b1N0cmluZygpKSksXG4gICAgICAgIGRhdGE6IGFyLmVuY29kZShFKVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gcC5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICBLdCh5LnByb2dyYW1JZEluZGV4ID49IDApLCB5LmFjY291bnRzLmZvckVhY2goKEUpID0+IEt0KEUgPj0gMCkpO1xuICAgIH0pLCBuZXcgTW4oe1xuICAgICAgaGVhZGVyOiB7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogbCxcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogYyxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiB1XG4gICAgICB9LFxuICAgICAgYWNjb3VudEtleXM6IGYsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGUsXG4gICAgICBpbnN0cnVjdGlvbnM6IHBcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfY29tcGlsZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5jb21waWxlTWVzc2FnZSgpLCB0ID0gZS5hY2NvdW50S2V5cy5zbGljZSgwLCBlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMpO1xuICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZXMubGVuZ3RoID09PSB0Lmxlbmd0aCAmJiB0aGlzLnNpZ25hdHVyZXMuZXZlcnkoKG4sIGkpID0+IHRbaV0uZXF1YWxzKG4ucHVibGljS2V5KSkgfHwgKHRoaXMuc2lnbmF0dXJlcyA9IHQubWFwKChyKSA9PiAoe1xuICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgcHVibGljS2V5OiByXG4gICAgfSkpKSwgZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgYnVmZmVyIG9mIHRoZSBUcmFuc2FjdGlvbiBkYXRhIHRoYXQgbmVlZCB0byBiZSBjb3ZlcmVkIGJ5IHNpZ25hdHVyZXNcbiAgICovXG4gIHNlcmlhbGl6ZU1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGUoKS5zZXJpYWxpemUoKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBlc3RpbWF0ZWQgZmVlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubmVjdGlvbiBDb25uZWN0aW9uIHRvIFJQQyBFbmRwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IFRoZSBlc3RpbWF0ZWQgZmVlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGdldEVzdGltYXRlZEZlZShlKSB7XG4gICAgcmV0dXJuIChhd2FpdCBlLmdldEZlZUZvck1lc3NhZ2UodGhpcy5jb21waWxlTWVzc2FnZSgpKSkudmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHB1YmxpYyBrZXlzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzaWduIHRoZSBUcmFuc2FjdGlvbi5cbiAgICogVGhlIGZpcnN0IHNpZ25lciB3aWxsIGJlIHVzZWQgYXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBwYXllciBhY2NvdW50LlxuICAgKlxuICAgKiBTaWduYXR1cmVzIGNhbiBiZSBhZGRlZCB3aXRoIGVpdGhlciBgcGFydGlhbFNpZ25gIG9yIGBhZGRTaWduYXR1cmVgXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgdjAuODQuMC4gT25seSB0aGUgZmVlIHBheWVyIG5lZWRzIHRvIGJlXG4gICAqIHNwZWNpZmllZCBhbmQgaXQgY2FuIGJlIHNldCBpbiB0aGUgVHJhbnNhY3Rpb24gY29uc3RydWN0b3Igb3Igd2l0aCB0aGVcbiAgICogYGZlZVBheWVyYCBwcm9wZXJ0eS5cbiAgICovXG4gIHNldFNpZ25lcnMoLi4uZSkge1xuICAgIGlmIChlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNpZ25lcnNcIik7XG4gICAgY29uc3QgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgdGhpcy5zaWduYXR1cmVzID0gZS5maWx0ZXIoKHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByLnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4gdC5oYXMobikgPyAhMSA6ICh0LmFkZChuKSwgITApO1xuICAgIH0pLm1hcCgocikgPT4gKHtcbiAgICAgIHNpZ25hdHVyZTogbnVsbCxcbiAgICAgIHB1YmxpY0tleTogclxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogU2lnbiB0aGUgVHJhbnNhY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHNpZ25lcnMuIE11bHRpcGxlIHNpZ25hdHVyZXMgbWF5XG4gICAqIGJlIGFwcGxpZWQgdG8gYSBUcmFuc2FjdGlvbi4gVGhlIGZpcnN0IHNpZ25hdHVyZSBpcyBjb25zaWRlcmVkIFwicHJpbWFyeVwiXG4gICAqIGFuZCBpcyB1c2VkIGlkZW50aWZ5IGFuZCBjb25maXJtIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogSWYgdGhlIFRyYW5zYWN0aW9uIGBmZWVQYXllcmAgaXMgbm90IHNldCwgdGhlIGZpcnN0IHNpZ25lciB3aWxsIGJlIHVzZWRcbiAgICogYXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBwYXllciBhY2NvdW50LlxuICAgKlxuICAgKiBUcmFuc2FjdGlvbiBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBhZnRlciB0aGUgZmlyc3QgY2FsbCB0byBgc2lnbmAsXG4gICAqIGFzIGRvaW5nIHNvIG1heSBpbnZhbGlkYXRlIHRoZSBzaWduYXR1cmUgYW5kIGNhdXNlIHRoZSBUcmFuc2FjdGlvbiB0byBiZVxuICAgKiByZWplY3RlZC5cbiAgICpcbiAgICogVGhlIFRyYW5zYWN0aW9uIG11c3QgYmUgYXNzaWduZWQgYSB2YWxpZCBgcmVjZW50QmxvY2toYXNoYCBiZWZvcmUgaW52b2tpbmcgdGhpcyBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxTaWduZXI+fSBzaWduZXJzIEFycmF5IG9mIHNpZ25lcnMgdGhhdCB3aWxsIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBzaWduKC4uLmUpIHtcbiAgICBpZiAoZS5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzaWduZXJzXCIpO1xuICAgIGNvbnN0IHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCByID0gW107XG4gICAgZm9yIChjb25zdCBpIG9mIGUpIHtcbiAgICAgIGNvbnN0IG8gPSBpLnB1YmxpY0tleS50b1N0cmluZygpO1xuICAgICAgdC5oYXMobykgfHwgKHQuYWRkKG8pLCByLnB1c2goaSkpO1xuICAgIH1cbiAgICB0aGlzLnNpZ25hdHVyZXMgPSByLm1hcCgoaSkgPT4gKHtcbiAgICAgIHNpZ25hdHVyZTogbnVsbCxcbiAgICAgIHB1YmxpY0tleTogaS5wdWJsaWNLZXlcbiAgICB9KSk7XG4gICAgY29uc3QgbiA9IHRoaXMuX2NvbXBpbGUoKTtcbiAgICB0aGlzLl9wYXJ0aWFsU2lnbihuLCAuLi5yKTtcbiAgfVxuICAvKipcbiAgICogUGFydGlhbGx5IHNpZ24gYSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYWNjb3VudHMuIEFsbCBhY2NvdW50cyBtdXN0XG4gICAqIGNvcnJlc3BvbmQgdG8gZWl0aGVyIHRoZSBmZWUgcGF5ZXIgb3IgYSBzaWduZXIgYWNjb3VudCBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKlxuICAgKiBBbGwgdGhlIGNhdmVhdHMgZnJvbSB0aGUgYHNpZ25gIG1ldGhvZCBhcHBseSB0byBgcGFydGlhbFNpZ25gXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8U2lnbmVyPn0gc2lnbmVycyBBcnJheSBvZiBzaWduZXJzIHRoYXQgd2lsbCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcGFydGlhbFNpZ24oLi4uZSkge1xuICAgIGlmIChlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNpZ25lcnNcIik7XG4gICAgY29uc3QgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgZSkge1xuICAgICAgY29uc3QgbyA9IGkucHVibGljS2V5LnRvU3RyaW5nKCk7XG4gICAgICB0LmhhcyhvKSB8fCAodC5hZGQobyksIHIucHVzaChpKSk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSB0aGlzLl9jb21waWxlKCk7XG4gICAgdGhpcy5fcGFydGlhbFNpZ24obiwgLi4ucik7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3BhcnRpYWxTaWduKGUsIC4uLnQpIHtcbiAgICBjb25zdCByID0gZS5zZXJpYWxpemUoKTtcbiAgICB0LmZvckVhY2goKG4pID0+IHtcbiAgICAgIGNvbnN0IGkgPSBPMChyLCBuLnNlY3JldEtleSk7XG4gICAgICB0aGlzLl9hZGRTaWduYXR1cmUobi5wdWJsaWNLZXksIHJ1KGkpKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGFuIGV4dGVybmFsbHkgY3JlYXRlZCBzaWduYXR1cmUgdG8gYSB0cmFuc2FjdGlvbi4gVGhlIHB1YmxpYyBrZXlcbiAgICogbXVzdCBjb3JyZXNwb25kIHRvIGVpdGhlciB0aGUgZmVlIHBheWVyIG9yIGEgc2lnbmVyIGFjY291bnQgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWJsaWNLZXl9IHB1YmtleSBQdWJsaWMga2V5IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzaWduYXR1cmUgQW4gZXh0ZXJuYWxseSBjcmVhdGVkIHNpZ25hdHVyZSB0byBhZGQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYWRkU2lnbmF0dXJlKGUsIHQpIHtcbiAgICB0aGlzLl9jb21waWxlKCksIHRoaXMuX2FkZFNpZ25hdHVyZShlLCB0KTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfYWRkU2lnbmF0dXJlKGUsIHQpIHtcbiAgICBLdCh0Lmxlbmd0aCA9PT0gNjQpO1xuICAgIGNvbnN0IHIgPSB0aGlzLnNpZ25hdHVyZXMuZmluZEluZGV4KChuKSA9PiBlLmVxdWFscyhuLnB1YmxpY0tleSkpO1xuICAgIGlmIChyIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBzaWduZXI6ICR7ZS50b1N0cmluZygpfWApO1xuICAgIHRoaXMuc2lnbmF0dXJlc1tyXS5zaWduYXR1cmUgPSBIZS5CdWZmZXIuZnJvbSh0KTtcbiAgfVxuICAvKipcbiAgICogVmVyaWZ5IHNpZ25hdHVyZXMgb2YgYSBUcmFuc2FjdGlvblxuICAgKiBPcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGlmIHdlJ3JlIGV4cGVjdGluZyBhIGZ1bGx5IHNpZ25lZCBUcmFuc2FjdGlvbiBvciBhIHBhcnRpYWxseSBzaWduZWQgb25lLlxuICAgKiBJZiBubyBib29sZWFuIGlzIHByb3ZpZGVkLCB3ZSBleHBlY3QgYSBmdWxseSBzaWduZWQgVHJhbnNhY3Rpb24gYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVxdWlyZUFsbFNpZ25hdHVyZXM9dHJ1ZV0gUmVxdWlyZSBhIGZ1bGx5IHNpZ25lZCBUcmFuc2FjdGlvblxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlcyhlID0gITApIHtcbiAgICByZXR1cm4gIXRoaXMuX2dldE1lc3NhZ2VTaWduZWRuZXNzRXJyb3JzKHRoaXMuc2VyaWFsaXplTWVzc2FnZSgpLCBlKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZ2V0TWVzc2FnZVNpZ25lZG5lc3NFcnJvcnMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHNpZ25hdHVyZTogbixcbiAgICAgIHB1YmxpY0tleTogaVxuICAgIH0gb2YgdGhpcy5zaWduYXR1cmVzKVxuICAgICAgbiA9PT0gbnVsbCA/IHQgJiYgKHIubWlzc2luZyB8fCAoci5taXNzaW5nID0gW10pKS5wdXNoKGkpIDogYUUobiwgZSwgaS50b0J5dGVzKCkpIHx8IChyLmludmFsaWQgfHwgKHIuaW52YWxpZCA9IFtdKSkucHVzaChpKTtcbiAgICByZXR1cm4gci5pbnZhbGlkIHx8IHIubWlzc2luZyA/IHIgOiB2b2lkIDA7XG4gIH1cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgVHJhbnNhY3Rpb24gaW4gdGhlIHdpcmUgZm9ybWF0LlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW2NvbmZpZ10gQ29uZmlnIG9mIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBTaWduYXR1cmUgb2YgdHJhbnNhY3Rpb24gaW4gd2lyZSBmb3JtYXQuXG4gICAqL1xuICBzZXJpYWxpemUoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiB0LFxuICAgICAgdmVyaWZ5U2lnbmF0dXJlczogclxuICAgIH0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiAhMCxcbiAgICAgIHZlcmlmeVNpZ25hdHVyZXM6ICEwXG4gICAgfSwgZSksIG4gPSB0aGlzLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgaSA9IHRoaXMuX2dldE1lc3NhZ2VTaWduZWRuZXNzRXJyb3JzKG4sIHQpO1xuICAgICAgaWYgKGkpIHtcbiAgICAgICAgbGV0IG8gPSBcIlNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLlwiO1xuICAgICAgICB0aHJvdyBpLmludmFsaWQgJiYgKG8gKz0gYFxuSW52YWxpZCBzaWduYXR1cmUgZm9yIHB1YmxpYyBrZXkke2kuaW52YWxpZC5sZW5ndGggPT09IDEgPyBcIlwiIDogXCIocylcIn0gW1xcYCR7aS5pbnZhbGlkLm1hcCgoYSkgPT4gYS50b0Jhc2U1OCgpKS5qb2luKFwiYCwgYFwiKX1cXGBdLmApLCBpLm1pc3NpbmcgJiYgKG8gKz0gYFxuTWlzc2luZyBzaWduYXR1cmUgZm9yIHB1YmxpYyBrZXkke2kubWlzc2luZy5sZW5ndGggPT09IDEgPyBcIlwiIDogXCIocylcIn0gW1xcYCR7aS5taXNzaW5nLm1hcCgoYSkgPT4gYS50b0Jhc2U1OCgpKS5qb2luKFwiYCwgYFwiKX1cXGBdLmApLCBuZXcgRXJyb3Iobyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemUobik7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NlcmlhbGl6ZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2lnbmF0dXJlczogdFxuICAgIH0gPSB0aGlzLCByID0gW107XG4gICAgeHIociwgdC5sZW5ndGgpO1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aCArIHQubGVuZ3RoICogNjQgKyBlLmxlbmd0aCwgaSA9IEhlLkJ1ZmZlci5hbGxvYyhuKTtcbiAgICByZXR1cm4gS3QodC5sZW5ndGggPCAyNTYpLCBIZS5CdWZmZXIuZnJvbShyKS5jb3B5KGksIDApLCB0LmZvckVhY2goKHtcbiAgICAgIHNpZ25hdHVyZTogb1xuICAgIH0sIGEpID0+IHtcbiAgICAgIG8gIT09IG51bGwgJiYgKEt0KG8ubGVuZ3RoID09PSA2NCwgXCJzaWduYXR1cmUgaGFzIGludmFsaWQgbGVuZ3RoXCIpLCBIZS5CdWZmZXIuZnJvbShvKS5jb3B5KGksIHIubGVuZ3RoICsgYSAqIDY0KSk7XG4gICAgfSksIGUuY29weShpLCByLmxlbmd0aCArIHQubGVuZ3RoICogNjQpLCBLdChpLmxlbmd0aCA8PSB3biwgYFRyYW5zYWN0aW9uIHRvbyBsYXJnZTogJHtpLmxlbmd0aH0gPiAke3dufWApLCBpO1xuICB9XG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIG1ldGhvZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiBLdCh0aGlzLmluc3RydWN0aW9ucy5sZW5ndGggPT09IDEpLCB0aGlzLmluc3RydWN0aW9uc1swXS5rZXlzLm1hcCgoZSkgPT4gZS5wdWJrZXkpO1xuICB9XG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIG1ldGhvZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBwcm9ncmFtSWQoKSB7XG4gICAgcmV0dXJuIEt0KHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMSksIHRoaXMuaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZDtcbiAgfVxuICAvKipcbiAgICogRGVwcmVjYXRlZCBtZXRob2RcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gS3QodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoID09PSAxKSwgdGhpcy5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgfVxuICAvKipcbiAgICogUGFyc2UgYSB3aXJlIHRyYW5zYWN0aW9uIGludG8gYSBUcmFuc2FjdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheSB8IEFycmF5PG51bWJlcj59IGJ1ZmZlciBTaWduYXR1cmUgb2Ygd2lyZSBUcmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb259IFRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmF0dXJlXG4gICAqL1xuICBzdGF0aWMgZnJvbShlKSB7XG4gICAgbGV0IHQgPSBbLi4uZV07XG4gICAgY29uc3QgciA9IEVyKHQpO1xuICAgIGxldCBuID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBTcih0LCAwLCBHbyk7XG4gICAgICBuLnB1c2goYXIuZW5jb2RlKEhlLkJ1ZmZlci5mcm9tKG8pKSk7XG4gICAgfVxuICAgIHJldHVybiBLby5wb3B1bGF0ZShNbi5mcm9tKHQpLCBuKTtcbiAgfVxuICAvKipcbiAgICogUG9wdWxhdGUgVHJhbnNhY3Rpb24gb2JqZWN0IGZyb20gbWVzc2FnZSBhbmQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0ge01lc3NhZ2V9IG1lc3NhZ2UgTWVzc2FnZSBvZiB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHNpZ25hdHVyZXMgTGlzdCBvZiBzaWduYXR1cmVzIHRvIGFzc2lnbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9ufSBUaGUgcG9wdWxhdGVkIFRyYW5zYWN0aW9uXG4gICAqL1xuICBzdGF0aWMgcG9wdWxhdGUoZSwgdCA9IFtdKSB7XG4gICAgY29uc3QgciA9IG5ldyBLbygpO1xuICAgIHJldHVybiByLnJlY2VudEJsb2NraGFzaCA9IGUucmVjZW50QmxvY2toYXNoLCBlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMgPiAwICYmIChyLmZlZVBheWVyID0gZS5hY2NvdW50S2V5c1swXSksIHQuZm9yRWFjaCgobiwgaSkgPT4ge1xuICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgc2lnbmF0dXJlOiBuID09IGFyLmVuY29kZShtRSkgPyBudWxsIDogYXIuZGVjb2RlKG4pLFxuICAgICAgICBwdWJsaWNLZXk6IGUuYWNjb3VudEtleXNbaV1cbiAgICAgIH07XG4gICAgICByLnNpZ25hdHVyZXMucHVzaChvKTtcbiAgICB9KSwgZS5pbnN0cnVjdGlvbnMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgY29uc3QgaSA9IG4uYWNjb3VudHMubWFwKChvKSA9PiB7XG4gICAgICAgIGNvbnN0IGEgPSBlLmFjY291bnRLZXlzW29dO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHB1YmtleTogYSxcbiAgICAgICAgICBpc1NpZ25lcjogci5zaWduYXR1cmVzLnNvbWUoKGwpID0+IGwucHVibGljS2V5LnRvU3RyaW5nKCkgPT09IGEudG9TdHJpbmcoKSkgfHwgZS5pc0FjY291bnRTaWduZXIobyksXG4gICAgICAgICAgaXNXcml0YWJsZTogZS5pc0FjY291bnRXcml0YWJsZShvKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByLmluc3RydWN0aW9ucy5wdXNoKG5ldyBVZCh7XG4gICAgICAgIGtleXM6IGksXG4gICAgICAgIHByb2dyYW1JZDogZS5hY2NvdW50S2V5c1tuLnByb2dyYW1JZEluZGV4XSxcbiAgICAgICAgZGF0YTogYXIuZGVjb2RlKG4uZGF0YSlcbiAgICAgIH0pKTtcbiAgICB9KSwgci5fbWVzc2FnZSA9IGUsIHIuX2pzb24gPSByLnRvSlNPTigpLCByO1xuICB9XG59XG5jbGFzcyBpdSB7XG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2UudmVyc2lvbjtcbiAgfVxuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlcyA9IHZvaWQgMCwgdGhpcy5tZXNzYWdlID0gdm9pZCAwLCB0ICE9PSB2b2lkIDApXG4gICAgICBLdCh0Lmxlbmd0aCA9PT0gZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLCBcIkV4cGVjdGVkIHNpZ25hdHVyZXMgbGVuZ3RoIHRvIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgc2lnbmF0dXJlc1wiKSwgdGhpcy5zaWduYXR1cmVzID0gdDtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzOyBuKyspXG4gICAgICAgIHIucHVzaChuZXcgVWludDhBcnJheShHbykpO1xuICAgICAgdGhpcy5zaWduYXR1cmVzID0gcjtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlID0gZTtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVzc2FnZS5zZXJpYWxpemUoKSwgdCA9IEFycmF5KCk7XG4gICAgeHIodCwgdGhpcy5zaWduYXR1cmVzLmxlbmd0aCk7XG4gICAgY29uc3QgciA9IHouc3RydWN0KFt6LmJsb2IodC5sZW5ndGgsIFwiZW5jb2RlZFNpZ25hdHVyZXNMZW5ndGhcIiksIHouc2VxKGRFKCksIHRoaXMuc2lnbmF0dXJlcy5sZW5ndGgsIFwic2lnbmF0dXJlc1wiKSwgei5ibG9iKGUubGVuZ3RoLCBcInNlcmlhbGl6ZWRNZXNzYWdlXCIpXSksIG4gPSBuZXcgVWludDhBcnJheSgyMDQ4KSwgaSA9IHIuZW5jb2RlKHtcbiAgICAgIGVuY29kZWRTaWduYXR1cmVzTGVuZ3RoOiBuZXcgVWludDhBcnJheSh0KSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlcyxcbiAgICAgIHNlcmlhbGl6ZWRNZXNzYWdlOiBlXG4gICAgfSwgbik7XG4gICAgcmV0dXJuIG4uc2xpY2UoMCwgaSk7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGUpIHtcbiAgICBsZXQgdCA9IFsuLi5lXTtcbiAgICBjb25zdCByID0gW10sIG4gPSBFcih0KTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IG47IG8rKylcbiAgICAgIHIucHVzaChuZXcgVWludDhBcnJheShTcih0LCAwLCBHbykpKTtcbiAgICBjb25zdCBpID0gbnUuZGVzZXJpYWxpemUobmV3IFVpbnQ4QXJyYXkodCkpO1xuICAgIHJldHVybiBuZXcgaXUoaSwgcik7XG4gIH1cbiAgc2lnbihlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMubWVzc2FnZS5zZXJpYWxpemUoKSwgciA9IHRoaXMubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZSgwLCB0aGlzLm1lc3NhZ2UuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyk7XG4gICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgIGNvbnN0IGkgPSByLmZpbmRJbmRleCgobykgPT4gby5lcXVhbHMobi5wdWJsaWNLZXkpKTtcbiAgICAgIEt0KGkgPj0gMCwgYENhbm5vdCBzaWduIHdpdGggbm9uIHNpZ25lciBrZXkgJHtuLnB1YmxpY0tleS50b0Jhc2U1OCgpfWApLCB0aGlzLnNpZ25hdHVyZXNbaV0gPSBPMCh0LCBuLnNlY3JldEtleSk7XG4gICAgfVxuICB9XG4gIGFkZFNpZ25hdHVyZShlLCB0KSB7XG4gICAgS3QodC5ieXRlTGVuZ3RoID09PSA2NCwgXCJTaWduYXR1cmUgbXVzdCBiZSA2NCBieXRlcyBsb25nXCIpO1xuICAgIGNvbnN0IG4gPSB0aGlzLm1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXMuc2xpY2UoMCwgdGhpcy5tZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMpLmZpbmRJbmRleCgoaSkgPT4gaS5lcXVhbHMoZSkpO1xuICAgIEt0KG4gPj0gMCwgYENhbiBub3QgYWRkIHNpZ25hdHVyZTsgXFxgJHtlLnRvQmFzZTU4KCl9XFxgIGlzIG5vdCByZXF1aXJlZCB0byBzaWduIHRoaXMgdHJhbnNhY3Rpb25gKSwgdGhpcy5zaWduYXR1cmVzW25dID0gdDtcbiAgfVxufVxubmV3IE9lKFwiU3lzdmFyQzFvY2sxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIlN5c3ZhckVwb2NoU2NoZWR1MWUxMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5uZXcgT2UoXCJTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xubmV3IE9lKFwiU3lzdmFyUmVjZW50QjFvY2tIYXNoZXMxMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIlN5c3ZhclJlbnQxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5uZXcgT2UoXCJTeXN2YXJSZXdhcmRzMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xubmV3IE9lKFwiU3lzdmFyUzFvdEhhc2hlczExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIlN5c3ZhclMxb3RIaXN0b3J5MTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5uZXcgT2UoXCJTeXN2YXJTdGFrZUhpc3RvcnkxMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xuY29uc3QgeUUgPSB6Lm51NjQoXCJsYW1wb3J0c1BlclNpZ25hdHVyZVwiKSwgdkUgPSB6LnN0cnVjdChbei51MzIoXCJ2ZXJzaW9uXCIpLCB6LnUzMihcInN0YXRlXCIpLCBXZShcImF1dGhvcml6ZWRQdWJrZXlcIiksIFdlKFwibm9uY2VcIiksIHouc3RydWN0KFt5RV0sIFwiZmVlQ2FsY3VsYXRvclwiKV0pO1xudkUuc3BhbjtcbmZ1bmN0aW9uIE9uKHMpIHtcbiAgY29uc3QgZSA9IHouYmxvYig4LCBzKSwgdCA9IGUuZGVjb2RlLmJpbmQoZSksIHIgPSBlLmVuY29kZS5iaW5kKGUpLCBuID0gZSwgaSA9IHB2KCk7XG4gIHJldHVybiBuLmRlY29kZSA9IChvLCBhKSA9PiB7XG4gICAgY29uc3QgbCA9IHQobywgYSk7XG4gICAgcmV0dXJuIGkuZGVjb2RlKGwpO1xuICB9LCBuLmVuY29kZSA9IChvLCBhLCBsKSA9PiB7XG4gICAgY29uc3QgYyA9IGkuZW5jb2RlKG8pO1xuICAgIHJldHVybiByKGMsIGEsIGwpO1xuICB9LCBuO1xufVxuT2JqZWN0LmZyZWV6ZSh7XG4gIENyZWF0ZToge1xuICAgIGluZGV4OiAwLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIHoubnM2NChcImxhbXBvcnRzXCIpLCB6Lm5zNjQoXCJzcGFjZVwiKSwgV2UoXCJwcm9ncmFtSWRcIildKVxuICB9LFxuICBBc3NpZ246IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBXZShcInByb2dyYW1JZFwiKV0pXG4gIH0sXG4gIFRyYW5zZmVyOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgT24oXCJsYW1wb3J0c1wiKV0pXG4gIH0sXG4gIENyZWF0ZVdpdGhTZWVkOiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJiYXNlXCIpLCB4bihcInNlZWRcIiksIHoubnM2NChcImxhbXBvcnRzXCIpLCB6Lm5zNjQoXCJzcGFjZVwiKSwgV2UoXCJwcm9ncmFtSWRcIildKVxuICB9LFxuICBBZHZhbmNlTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDQsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH0sXG4gIFdpdGhkcmF3Tm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDUsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgei5uczY0KFwibGFtcG9ydHNcIildKVxuICB9LFxuICBJbml0aWFsaXplTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDYsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJhdXRob3JpemVkXCIpXSlcbiAgfSxcbiAgQXV0aG9yaXplTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDcsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJhdXRob3JpemVkXCIpXSlcbiAgfSxcbiAgQWxsb2NhdGU6IHtcbiAgICBpbmRleDogOCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCB6Lm5zNjQoXCJzcGFjZVwiKV0pXG4gIH0sXG4gIEFsbG9jYXRlV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogOSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBXZShcImJhc2VcIiksIHhuKFwic2VlZFwiKSwgei5uczY0KFwic3BhY2VcIiksIFdlKFwicHJvZ3JhbUlkXCIpXSlcbiAgfSxcbiAgQXNzaWduV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogMTAsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJiYXNlXCIpLCB4bihcInNlZWRcIiksIFdlKFwicHJvZ3JhbUlkXCIpXSlcbiAgfSxcbiAgVHJhbnNmZXJXaXRoU2VlZDoge1xuICAgIGluZGV4OiAxMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBPbihcImxhbXBvcnRzXCIpLCB4bihcInNlZWRcIiksIFdlKFwicHJvZ3JhbUlkXCIpXSlcbiAgfSxcbiAgVXBncmFkZU5vbmNlQWNjb3VudDoge1xuICAgIGluZGV4OiAxMixcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpXSlcbiAgfVxufSk7XG5uZXcgT2UoXCIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIkJQRkxvYWRlcjIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG56LnN0cnVjdChbXG4gIHoudTMyKFwidHlwZUluZGV4XCIpLFxuICBPbihcImRlYWN0aXZhdGlvblNsb3RcIiksXG4gIHoubnU2NChcImxhc3RFeHRlbmRlZFNsb3RcIiksXG4gIHoudTgoXCJsYXN0RXh0ZW5kZWRTdGFydEluZGV4XCIpLFxuICB6LnU4KCksXG4gIC8vIG9wdGlvblxuICB6LnNlcShXZSgpLCB6Lm9mZnNldCh6LnU4KCksIC0xKSwgXCJhdXRob3JpdHlcIilcbl0pO1xuY29uc3QgU3QgPSBEaShRYyhPZSksIGNlKCksIChzKSA9PiBuZXcgT2UocykpLCBOMCA9IGV1KFtjZSgpLCBwdChcImJhc2U2NFwiKV0pLCBvdSA9IERpKFFjKEhlLkJ1ZmZlciksIE4wLCAocykgPT4gSGUuQnVmZmVyLmZyb20oc1swXSwgXCJiYXNlNjRcIikpO1xuZnVuY3Rpb24gVTAocykge1xuICByZXR1cm4gdXIoW29lKHtcbiAgICBqc29ucnBjOiBwdChcIjIuMFwiKSxcbiAgICBpZDogY2UoKSxcbiAgICByZXN1bHQ6IHNcbiAgfSksIG9lKHtcbiAgICBqc29ucnBjOiBwdChcIjIuMFwiKSxcbiAgICBpZDogY2UoKSxcbiAgICBlcnJvcjogb2Uoe1xuICAgICAgY29kZTogR24oKSxcbiAgICAgIG1lc3NhZ2U6IGNlKCksXG4gICAgICBkYXRhOiBTZShidigpKVxuICAgIH0pXG4gIH0pXSk7XG59XG5jb25zdCBFRSA9IFUwKEduKCkpO1xuZnVuY3Rpb24gbHQocykge1xuICByZXR1cm4gRGkoVTAocyksIEVFLCAoZSkgPT4gXCJlcnJvclwiIGluIGUgPyBlIDoge1xuICAgIC4uLmUsXG4gICAgcmVzdWx0OiB0aShlLnJlc3VsdCwgcylcbiAgfSk7XG59XG5mdW5jdGlvbiBGcihzKSB7XG4gIHJldHVybiBsdChvZSh7XG4gICAgY29udGV4dDogb2Uoe1xuICAgICAgc2xvdDogdGUoKVxuICAgIH0pLFxuICAgIHZhbHVlOiBzXG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGdhKHMpIHtcbiAgcmV0dXJuIG9lKHtcbiAgICBjb250ZXh0OiBvZSh7XG4gICAgICBzbG90OiB0ZSgpXG4gICAgfSksXG4gICAgdmFsdWU6IHNcbiAgfSk7XG59XG5jb25zdCB4RSA9IG9lKHtcbiAgZm91bmRhdGlvbjogdGUoKSxcbiAgZm91bmRhdGlvblRlcm06IHRlKCksXG4gIGluaXRpYWw6IHRlKCksXG4gIHRhcGVyOiB0ZSgpLFxuICB0ZXJtaW5hbDogdGUoKVxufSk7XG5sdChmZShnZShvZSh7XG4gIGVwb2NoOiB0ZSgpLFxuICBlZmZlY3RpdmVTbG90OiB0ZSgpLFxuICBhbW91bnQ6IHRlKCksXG4gIHBvc3RCYWxhbmNlOiB0ZSgpLFxuICBjb21taXNzaW9uOiBTZShnZSh0ZSgpKSlcbn0pKSkpO1xuY29uc3QgU0UgPSBmZShvZSh7XG4gIHNsb3Q6IHRlKCksXG4gIHByaW9yaXRpemF0aW9uRmVlOiB0ZSgpXG59KSksIGJFID0gb2Uoe1xuICB0b3RhbDogdGUoKSxcbiAgdmFsaWRhdG9yOiB0ZSgpLFxuICBmb3VuZGF0aW9uOiB0ZSgpLFxuICBlcG9jaDogdGUoKVxufSksIFRFID0gb2Uoe1xuICBlcG9jaDogdGUoKSxcbiAgc2xvdEluZGV4OiB0ZSgpLFxuICBzbG90c0luRXBvY2g6IHRlKCksXG4gIGFic29sdXRlU2xvdDogdGUoKSxcbiAgYmxvY2tIZWlnaHQ6IFNlKHRlKCkpLFxuICB0cmFuc2FjdGlvbkNvdW50OiBTZSh0ZSgpKVxufSksIHdFID0gb2Uoe1xuICBzbG90c1BlckVwb2NoOiB0ZSgpLFxuICBsZWFkZXJTY2hlZHVsZVNsb3RPZmZzZXQ6IHRlKCksXG4gIHdhcm11cDogWHIoKSxcbiAgZmlyc3ROb3JtYWxFcG9jaDogdGUoKSxcbiAgZmlyc3ROb3JtYWxTbG90OiB0ZSgpXG59KSwgQUUgPSBUMChjZSgpLCBmZSh0ZSgpKSksIHJuID0gZ2UodXIoW29lKHt9KSwgY2UoKV0pKSwgSUUgPSBvZSh7XG4gIGVycjogcm5cbn0pLCBfRSA9IHB0KFwicmVjZWl2ZWRTaWduYXR1cmVcIik7XG5vZSh7XG4gIFwic29sYW5hLWNvcmVcIjogY2UoKSxcbiAgXCJmZWF0dXJlLXNldFwiOiBTZSh0ZSgpKVxufSk7XG5jb25zdCBSRSA9IG9lKHtcbiAgcHJvZ3JhbTogY2UoKSxcbiAgcHJvZ3JhbUlkOiBTdCxcbiAgcGFyc2VkOiBHbigpXG59KSwgTEUgPSBvZSh7XG4gIHByb2dyYW1JZDogU3QsXG4gIGFjY291bnRzOiBmZShTdCksXG4gIGRhdGE6IGNlKClcbn0pO1xuRnIob2Uoe1xuICBlcnI6IGdlKHVyKFtvZSh7fSksIGNlKCldKSksXG4gIGxvZ3M6IGdlKGZlKGNlKCkpKSxcbiAgYWNjb3VudHM6IFNlKGdlKGZlKGdlKG9lKHtcbiAgICBleGVjdXRhYmxlOiBYcigpLFxuICAgIG93bmVyOiBjZSgpLFxuICAgIGxhbXBvcnRzOiB0ZSgpLFxuICAgIGRhdGE6IGZlKGNlKCkpLFxuICAgIHJlbnRFcG9jaDogU2UodGUoKSlcbiAgfSkpKSkpLFxuICB1bml0c0NvbnN1bWVkOiBTZSh0ZSgpKSxcbiAgcmV0dXJuRGF0YTogU2UoZ2Uob2Uoe1xuICAgIHByb2dyYW1JZDogY2UoKSxcbiAgICBkYXRhOiBldShbY2UoKSwgcHQoXCJiYXNlNjRcIildKVxuICB9KSkpLFxuICBpbm5lckluc3RydWN0aW9uczogU2UoZ2UoZmUob2Uoe1xuICAgIGluZGV4OiB0ZSgpLFxuICAgIGluc3RydWN0aW9uczogZmUodXIoW1JFLCBMRV0pKVxuICB9KSkpKVxufSkpO1xuRnIob2Uoe1xuICBieUlkZW50aXR5OiBUMChjZSgpLCBmZSh0ZSgpKSksXG4gIHJhbmdlOiBvZSh7XG4gICAgZmlyc3RTbG90OiB0ZSgpLFxuICAgIGxhc3RTbG90OiB0ZSgpXG4gIH0pXG59KSk7XG5sdCh4RSk7XG5sdChiRSk7XG5sdChTRSk7XG5sdChURSk7XG5sdCh3RSk7XG5sdChBRSk7XG5sdCh0ZSgpKTtcbkZyKG9lKHtcbiAgdG90YWw6IHRlKCksXG4gIGNpcmN1bGF0aW5nOiB0ZSgpLFxuICBub25DaXJjdWxhdGluZzogdGUoKSxcbiAgbm9uQ2lyY3VsYXRpbmdBY2NvdW50czogZmUoU3QpXG59KSk7XG5jb25zdCBDRSA9IG9lKHtcbiAgYW1vdW50OiBjZSgpLFxuICB1aUFtb3VudDogZ2UodGUoKSksXG4gIGRlY2ltYWxzOiB0ZSgpLFxuICB1aUFtb3VudFN0cmluZzogU2UoY2UoKSlcbn0pO1xuRnIoZmUob2Uoe1xuICBhZGRyZXNzOiBTdCxcbiAgYW1vdW50OiBjZSgpLFxuICB1aUFtb3VudDogZ2UodGUoKSksXG4gIGRlY2ltYWxzOiB0ZSgpLFxuICB1aUFtb3VudFN0cmluZzogU2UoY2UoKSlcbn0pKSk7XG5GcihmZShvZSh7XG4gIHB1YmtleTogU3QsXG4gIGFjY291bnQ6IG9lKHtcbiAgICBleGVjdXRhYmxlOiBYcigpLFxuICAgIG93bmVyOiBTdCxcbiAgICBsYW1wb3J0czogdGUoKSxcbiAgICBkYXRhOiBvdSxcbiAgICByZW50RXBvY2g6IHRlKClcbiAgfSlcbn0pKSk7XG5jb25zdCByYyA9IG9lKHtcbiAgcHJvZ3JhbTogY2UoKSxcbiAgcGFyc2VkOiBHbigpLFxuICBzcGFjZTogdGUoKVxufSk7XG5GcihmZShvZSh7XG4gIHB1YmtleTogU3QsXG4gIGFjY291bnQ6IG9lKHtcbiAgICBleGVjdXRhYmxlOiBYcigpLFxuICAgIG93bmVyOiBTdCxcbiAgICBsYW1wb3J0czogdGUoKSxcbiAgICBkYXRhOiByYyxcbiAgICByZW50RXBvY2g6IHRlKClcbiAgfSlcbn0pKSk7XG5GcihmZShvZSh7XG4gIGxhbXBvcnRzOiB0ZSgpLFxuICBhZGRyZXNzOiBTdFxufSkpKTtcbmNvbnN0IGF1ID0gb2Uoe1xuICBleGVjdXRhYmxlOiBYcigpLFxuICBvd25lcjogU3QsXG4gIGxhbXBvcnRzOiB0ZSgpLFxuICBkYXRhOiBvdSxcbiAgcmVudEVwb2NoOiB0ZSgpXG59KTtcbm9lKHtcbiAgcHVia2V5OiBTdCxcbiAgYWNjb3VudDogYXVcbn0pO1xuY29uc3Qga0UgPSBEaSh1cihbUWMoSGUuQnVmZmVyKSwgcmNdKSwgdXIoW04wLCByY10pLCAocykgPT4gQXJyYXkuaXNBcnJheShzKSA/IHRpKHMsIG91KSA6IHMpLCBERSA9IG9lKHtcbiAgZXhlY3V0YWJsZTogWHIoKSxcbiAgb3duZXI6IFN0LFxuICBsYW1wb3J0czogdGUoKSxcbiAgZGF0YToga0UsXG4gIHJlbnRFcG9jaDogdGUoKVxufSk7XG5vZSh7XG4gIHB1YmtleTogU3QsXG4gIGFjY291bnQ6IERFXG59KTtcbm9lKHtcbiAgc3RhdGU6IHVyKFtwdChcImFjdGl2ZVwiKSwgcHQoXCJpbmFjdGl2ZVwiKSwgcHQoXCJhY3RpdmF0aW5nXCIpLCBwdChcImRlYWN0aXZhdGluZ1wiKV0pLFxuICBhY3RpdmU6IHRlKCksXG4gIGluYWN0aXZlOiB0ZSgpXG59KTtcbmx0KGZlKG9lKHtcbiAgc2lnbmF0dXJlOiBjZSgpLFxuICBzbG90OiB0ZSgpLFxuICBlcnI6IHJuLFxuICBtZW1vOiBnZShjZSgpKSxcbiAgYmxvY2tUaW1lOiBTZShnZSh0ZSgpKSlcbn0pKSk7XG5sdChmZShvZSh7XG4gIHNpZ25hdHVyZTogY2UoKSxcbiAgc2xvdDogdGUoKSxcbiAgZXJyOiBybixcbiAgbWVtbzogZ2UoY2UoKSksXG4gIGJsb2NrVGltZTogU2UoZ2UodGUoKSkpXG59KSkpO1xub2Uoe1xuICBzdWJzY3JpcHRpb246IHRlKCksXG4gIHJlc3VsdDogZ2EoYXUpXG59KTtcbmNvbnN0IFBFID0gb2Uoe1xuICBwdWJrZXk6IFN0LFxuICBhY2NvdW50OiBhdVxufSk7XG5vZSh7XG4gIHN1YnNjcmlwdGlvbjogdGUoKSxcbiAgcmVzdWx0OiBnYShQRSlcbn0pO1xuY29uc3QgTUUgPSBvZSh7XG4gIHBhcmVudDogdGUoKSxcbiAgc2xvdDogdGUoKSxcbiAgcm9vdDogdGUoKVxufSk7XG5vZSh7XG4gIHN1YnNjcmlwdGlvbjogdGUoKSxcbiAgcmVzdWx0OiBNRVxufSk7XG5jb25zdCBPRSA9IHVyKFtvZSh7XG4gIHR5cGU6IHVyKFtwdChcImZpcnN0U2hyZWRSZWNlaXZlZFwiKSwgcHQoXCJjb21wbGV0ZWRcIiksIHB0KFwib3B0aW1pc3RpY0NvbmZpcm1hdGlvblwiKSwgcHQoXCJyb290XCIpXSksXG4gIHNsb3Q6IHRlKCksXG4gIHRpbWVzdGFtcDogdGUoKVxufSksIG9lKHtcbiAgdHlwZTogcHQoXCJjcmVhdGVkQmFua1wiKSxcbiAgcGFyZW50OiB0ZSgpLFxuICBzbG90OiB0ZSgpLFxuICB0aW1lc3RhbXA6IHRlKClcbn0pLCBvZSh7XG4gIHR5cGU6IHB0KFwiZnJvemVuXCIpLFxuICBzbG90OiB0ZSgpLFxuICB0aW1lc3RhbXA6IHRlKCksXG4gIHN0YXRzOiBvZSh7XG4gICAgbnVtVHJhbnNhY3Rpb25FbnRyaWVzOiB0ZSgpLFxuICAgIG51bVN1Y2Nlc3NmdWxUcmFuc2FjdGlvbnM6IHRlKCksXG4gICAgbnVtRmFpbGVkVHJhbnNhY3Rpb25zOiB0ZSgpLFxuICAgIG1heFRyYW5zYWN0aW9uc1BlckVudHJ5OiB0ZSgpXG4gIH0pXG59KSwgb2Uoe1xuICB0eXBlOiBwdChcImRlYWRcIiksXG4gIHNsb3Q6IHRlKCksXG4gIHRpbWVzdGFtcDogdGUoKSxcbiAgZXJyOiBjZSgpXG59KV0pO1xub2Uoe1xuICBzdWJzY3JpcHRpb246IHRlKCksXG4gIHJlc3VsdDogT0Vcbn0pO1xub2Uoe1xuICBzdWJzY3JpcHRpb246IHRlKCksXG4gIHJlc3VsdDogZ2EodXIoW0lFLCBfRV0pKVxufSk7XG5vZSh7XG4gIHN1YnNjcmlwdGlvbjogdGUoKSxcbiAgcmVzdWx0OiB0ZSgpXG59KTtcbm9lKHtcbiAgcHVia2V5OiBjZSgpLFxuICBnb3NzaXA6IGdlKGNlKCkpLFxuICB0cHU6IGdlKGNlKCkpLFxuICBycGM6IGdlKGNlKCkpLFxuICB2ZXJzaW9uOiBnZShjZSgpKVxufSk7XG5jb25zdCAkZCA9IG9lKHtcbiAgdm90ZVB1YmtleTogY2UoKSxcbiAgbm9kZVB1YmtleTogY2UoKSxcbiAgYWN0aXZhdGVkU3Rha2U6IHRlKCksXG4gIGVwb2NoVm90ZUFjY291bnQ6IFhyKCksXG4gIGVwb2NoQ3JlZGl0czogZmUoZXUoW3RlKCksIHRlKCksIHRlKCldKSksXG4gIGNvbW1pc3Npb246IHRlKCksXG4gIGxhc3RWb3RlOiB0ZSgpLFxuICByb290U2xvdDogZ2UodGUoKSlcbn0pO1xubHQob2Uoe1xuICBjdXJyZW50OiBmZSgkZCksXG4gIGRlbGlucXVlbnQ6IGZlKCRkKVxufSkpO1xuY29uc3QgQkUgPSB1cihbcHQoXCJwcm9jZXNzZWRcIiksIHB0KFwiY29uZmlybWVkXCIpLCBwdChcImZpbmFsaXplZFwiKV0pLCBGRSA9IG9lKHtcbiAgc2xvdDogdGUoKSxcbiAgY29uZmlybWF0aW9uczogZ2UodGUoKSksXG4gIGVycjogcm4sXG4gIGNvbmZpcm1hdGlvblN0YXR1czogU2UoQkUpXG59KTtcbkZyKGZlKGdlKEZFKSkpO1xubHQodGUoKSk7XG5jb25zdCAkMCA9IG9lKHtcbiAgYWNjb3VudEtleTogU3QsXG4gIHdyaXRhYmxlSW5kZXhlczogZmUodGUoKSksXG4gIHJlYWRvbmx5SW5kZXhlczogZmUodGUoKSlcbn0pLCBsdSA9IG9lKHtcbiAgc2lnbmF0dXJlczogZmUoY2UoKSksXG4gIG1lc3NhZ2U6IG9lKHtcbiAgICBhY2NvdW50S2V5czogZmUoY2UoKSksXG4gICAgaGVhZGVyOiBvZSh7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IHRlKCksXG4gICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiB0ZSgpLFxuICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiB0ZSgpXG4gICAgfSksXG4gICAgaW5zdHJ1Y3Rpb25zOiBmZShvZSh7XG4gICAgICBhY2NvdW50czogZmUodGUoKSksXG4gICAgICBkYXRhOiBjZSgpLFxuICAgICAgcHJvZ3JhbUlkSW5kZXg6IHRlKClcbiAgICB9KSksXG4gICAgcmVjZW50QmxvY2toYXNoOiBjZSgpLFxuICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IFNlKGZlKCQwKSlcbiAgfSlcbn0pLCBHMCA9IG9lKHtcbiAgcHVia2V5OiBTdCxcbiAgc2lnbmVyOiBYcigpLFxuICB3cml0YWJsZTogWHIoKSxcbiAgc291cmNlOiBTZSh1cihbcHQoXCJ0cmFuc2FjdGlvblwiKSwgcHQoXCJsb29rdXBUYWJsZVwiKV0pKVxufSksIFYwID0gb2Uoe1xuICBhY2NvdW50S2V5czogZmUoRzApLFxuICBzaWduYXR1cmVzOiBmZShjZSgpKVxufSksIGowID0gb2Uoe1xuICBwYXJzZWQ6IEduKCksXG4gIHByb2dyYW06IGNlKCksXG4gIHByb2dyYW1JZDogU3Rcbn0pLCBLMCA9IG9lKHtcbiAgYWNjb3VudHM6IGZlKFN0KSxcbiAgZGF0YTogY2UoKSxcbiAgcHJvZ3JhbUlkOiBTdFxufSksIE5FID0gdXIoW0swLCBqMF0pLCBVRSA9IHVyKFtvZSh7XG4gIHBhcnNlZDogR24oKSxcbiAgcHJvZ3JhbTogY2UoKSxcbiAgcHJvZ3JhbUlkOiBjZSgpXG59KSwgb2Uoe1xuICBhY2NvdW50czogZmUoY2UoKSksXG4gIGRhdGE6IGNlKCksXG4gIHByb2dyYW1JZDogY2UoKVxufSldKSwgSDAgPSBEaShORSwgVUUsIChzKSA9PiBcImFjY291bnRzXCIgaW4gcyA/IHRpKHMsIEswKSA6IHRpKHMsIGowKSksIHEwID0gb2Uoe1xuICBzaWduYXR1cmVzOiBmZShjZSgpKSxcbiAgbWVzc2FnZTogb2Uoe1xuICAgIGFjY291bnRLZXlzOiBmZShHMCksXG4gICAgaW5zdHJ1Y3Rpb25zOiBmZShIMCksXG4gICAgcmVjZW50QmxvY2toYXNoOiBjZSgpLFxuICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IFNlKGdlKGZlKCQwKSkpXG4gIH0pXG59KSwgSG8gPSBvZSh7XG4gIGFjY291bnRJbmRleDogdGUoKSxcbiAgbWludDogY2UoKSxcbiAgb3duZXI6IFNlKGNlKCkpLFxuICBwcm9ncmFtSWQ6IFNlKGNlKCkpLFxuICB1aVRva2VuQW1vdW50OiBDRVxufSksIFcwID0gb2Uoe1xuICB3cml0YWJsZTogZmUoU3QpLFxuICByZWFkb25seTogZmUoU3QpXG59KSwgcGEgPSBvZSh7XG4gIGVycjogcm4sXG4gIGZlZTogdGUoKSxcbiAgaW5uZXJJbnN0cnVjdGlvbnM6IFNlKGdlKGZlKG9lKHtcbiAgICBpbmRleDogdGUoKSxcbiAgICBpbnN0cnVjdGlvbnM6IGZlKG9lKHtcbiAgICAgIGFjY291bnRzOiBmZSh0ZSgpKSxcbiAgICAgIGRhdGE6IGNlKCksXG4gICAgICBwcm9ncmFtSWRJbmRleDogdGUoKVxuICAgIH0pKVxuICB9KSkpKSxcbiAgcHJlQmFsYW5jZXM6IGZlKHRlKCkpLFxuICBwb3N0QmFsYW5jZXM6IGZlKHRlKCkpLFxuICBsb2dNZXNzYWdlczogU2UoZ2UoZmUoY2UoKSkpKSxcbiAgcHJlVG9rZW5CYWxhbmNlczogU2UoZ2UoZmUoSG8pKSksXG4gIHBvc3RUb2tlbkJhbGFuY2VzOiBTZShnZShmZShIbykpKSxcbiAgbG9hZGVkQWRkcmVzc2VzOiBTZShXMCksXG4gIGNvbXB1dGVVbml0c0NvbnN1bWVkOiBTZSh0ZSgpKSxcbiAgY29zdFVuaXRzOiBTZSh0ZSgpKVxufSksIGN1ID0gb2Uoe1xuICBlcnI6IHJuLFxuICBmZWU6IHRlKCksXG4gIGlubmVySW5zdHJ1Y3Rpb25zOiBTZShnZShmZShvZSh7XG4gICAgaW5kZXg6IHRlKCksXG4gICAgaW5zdHJ1Y3Rpb25zOiBmZShIMClcbiAgfSkpKSksXG4gIHByZUJhbGFuY2VzOiBmZSh0ZSgpKSxcbiAgcG9zdEJhbGFuY2VzOiBmZSh0ZSgpKSxcbiAgbG9nTWVzc2FnZXM6IFNlKGdlKGZlKGNlKCkpKSksXG4gIHByZVRva2VuQmFsYW5jZXM6IFNlKGdlKGZlKEhvKSkpLFxuICBwb3N0VG9rZW5CYWxhbmNlczogU2UoZ2UoZmUoSG8pKSksXG4gIGxvYWRlZEFkZHJlc3NlczogU2UoVzApLFxuICBjb21wdXRlVW5pdHNDb25zdW1lZDogU2UodGUoKSksXG4gIGNvc3RVbml0czogU2UodGUoKSlcbn0pLCBWbiA9IHVyKFtwdCgwKSwgcHQoXCJsZWdhY3lcIildKSwgc24gPSBvZSh7XG4gIHB1YmtleTogY2UoKSxcbiAgbGFtcG9ydHM6IHRlKCksXG4gIHBvc3RCYWxhbmNlOiBnZSh0ZSgpKSxcbiAgcmV3YXJkVHlwZTogZ2UoY2UoKSksXG4gIGNvbW1pc3Npb246IFNlKGdlKHRlKCkpKVxufSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHRyYW5zYWN0aW9uczogZmUob2Uoe1xuICAgIHRyYW5zYWN0aW9uOiBsdSxcbiAgICBtZXRhOiBnZShwYSksXG4gICAgdmVyc2lvbjogU2UoVm4pXG4gIH0pKSxcbiAgcmV3YXJkczogU2UoZmUoc24pKSxcbiAgYmxvY2tUaW1lOiBnZSh0ZSgpKSxcbiAgYmxvY2tIZWlnaHQ6IGdlKHRlKCkpXG59KSkpO1xubHQoZ2Uob2Uoe1xuICBibG9ja2hhc2g6IGNlKCksXG4gIHByZXZpb3VzQmxvY2toYXNoOiBjZSgpLFxuICBwYXJlbnRTbG90OiB0ZSgpLFxuICByZXdhcmRzOiBTZShmZShzbikpLFxuICBibG9ja1RpbWU6IGdlKHRlKCkpLFxuICBibG9ja0hlaWdodDogZ2UodGUoKSlcbn0pKSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHRyYW5zYWN0aW9uczogZmUob2Uoe1xuICAgIHRyYW5zYWN0aW9uOiBWMCxcbiAgICBtZXRhOiBnZShwYSksXG4gICAgdmVyc2lvbjogU2UoVm4pXG4gIH0pKSxcbiAgcmV3YXJkczogU2UoZmUoc24pKSxcbiAgYmxvY2tUaW1lOiBnZSh0ZSgpKSxcbiAgYmxvY2tIZWlnaHQ6IGdlKHRlKCkpXG59KSkpO1xubHQoZ2Uob2Uoe1xuICBibG9ja2hhc2g6IGNlKCksXG4gIHByZXZpb3VzQmxvY2toYXNoOiBjZSgpLFxuICBwYXJlbnRTbG90OiB0ZSgpLFxuICB0cmFuc2FjdGlvbnM6IGZlKG9lKHtcbiAgICB0cmFuc2FjdGlvbjogcTAsXG4gICAgbWV0YTogZ2UoY3UpLFxuICAgIHZlcnNpb246IFNlKFZuKVxuICB9KSksXG4gIHJld2FyZHM6IFNlKGZlKHNuKSksXG4gIGJsb2NrVGltZTogZ2UodGUoKSksXG4gIGJsb2NrSGVpZ2h0OiBnZSh0ZSgpKVxufSkpKTtcbmx0KGdlKG9lKHtcbiAgYmxvY2toYXNoOiBjZSgpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogY2UoKSxcbiAgcGFyZW50U2xvdDogdGUoKSxcbiAgdHJhbnNhY3Rpb25zOiBmZShvZSh7XG4gICAgdHJhbnNhY3Rpb246IFYwLFxuICAgIG1ldGE6IGdlKGN1KSxcbiAgICB2ZXJzaW9uOiBTZShWbilcbiAgfSkpLFxuICByZXdhcmRzOiBTZShmZShzbikpLFxuICBibG9ja1RpbWU6IGdlKHRlKCkpLFxuICBibG9ja0hlaWdodDogZ2UodGUoKSlcbn0pKSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHJld2FyZHM6IFNlKGZlKHNuKSksXG4gIGJsb2NrVGltZTogZ2UodGUoKSksXG4gIGJsb2NrSGVpZ2h0OiBnZSh0ZSgpKVxufSkpKTtcbmx0KGdlKG9lKHtcbiAgYmxvY2toYXNoOiBjZSgpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogY2UoKSxcbiAgcGFyZW50U2xvdDogdGUoKSxcbiAgdHJhbnNhY3Rpb25zOiBmZShvZSh7XG4gICAgdHJhbnNhY3Rpb246IGx1LFxuICAgIG1ldGE6IGdlKHBhKVxuICB9KSksXG4gIHJld2FyZHM6IFNlKGZlKHNuKSksXG4gIGJsb2NrVGltZTogZ2UodGUoKSlcbn0pKSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHNpZ25hdHVyZXM6IGZlKGNlKCkpLFxuICBibG9ja1RpbWU6IGdlKHRlKCkpXG59KSkpO1xubHQoZ2Uob2Uoe1xuICBzbG90OiB0ZSgpLFxuICBtZXRhOiBnZShwYSksXG4gIGJsb2NrVGltZTogU2UoZ2UodGUoKSkpLFxuICB0cmFuc2FjdGlvbjogbHUsXG4gIHZlcnNpb246IFNlKFZuKVxufSkpKTtcbmx0KGdlKG9lKHtcbiAgc2xvdDogdGUoKSxcbiAgdHJhbnNhY3Rpb246IHEwLFxuICBtZXRhOiBnZShjdSksXG4gIGJsb2NrVGltZTogU2UoZ2UodGUoKSkpLFxuICB2ZXJzaW9uOiBTZShWbilcbn0pKSk7XG5GcihvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgbGFzdFZhbGlkQmxvY2tIZWlnaHQ6IHRlKClcbn0pKTtcbkZyKFhyKCkpO1xuY29uc3QgJEUgPSBvZSh7XG4gIHNsb3Q6IHRlKCksXG4gIG51bVRyYW5zYWN0aW9uczogdGUoKSxcbiAgbnVtU2xvdHM6IHRlKCksXG4gIHNhbXBsZVBlcmlvZFNlY3M6IHRlKClcbn0pO1xubHQoZmUoJEUpKTtcbkZyKGdlKG9lKHtcbiAgZmVlQ2FsY3VsYXRvcjogb2Uoe1xuICAgIGxhbXBvcnRzUGVyU2lnbmF0dXJlOiB0ZSgpXG4gIH0pXG59KSkpO1xubHQoY2UoKSk7XG5sdChjZSgpKTtcbmNvbnN0IEdFID0gb2Uoe1xuICBlcnI6IHJuLFxuICBsb2dzOiBmZShjZSgpKSxcbiAgc2lnbmF0dXJlOiBjZSgpXG59KTtcbm9lKHtcbiAgcmVzdWx0OiBnYShHRSksXG4gIHN1YnNjcmlwdGlvbjogdGUoKVxufSk7XG5PYmplY3QuZnJlZXplKHtcbiAgQ3JlYXRlTG9va3VwVGFibGU6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBPbihcInJlY2VudFNsb3RcIiksIHoudTgoXCJidW1wU2VlZFwiKV0pXG4gIH0sXG4gIEZyZWV6ZUxvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDEsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH0sXG4gIEV4dGVuZExvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgT24oKSwgei5zZXEoV2UoKSwgei5vZmZzZXQoei51MzIoKSwgLTgpLCBcImFkZHJlc3Nlc1wiKV0pXG4gIH0sXG4gIERlYWN0aXZhdGVMb29rdXBUYWJsZToge1xuICAgIGluZGV4OiAzLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBDbG9zZUxvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDQsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH1cbn0pO1xubmV3IE9lKFwiQWRkcmVzc0xvb2t1cFRhYjFlMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbk9iamVjdC5mcmVlemUoe1xuICBSZXF1ZXN0VW5pdHM6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnU4KFwiaW5zdHJ1Y3Rpb25cIiksIHoudTMyKFwidW5pdHNcIiksIHoudTMyKFwiYWRkaXRpb25hbEZlZVwiKV0pXG4gIH0sXG4gIFJlcXVlc3RIZWFwRnJhbWU6IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnU4KFwiaW5zdHJ1Y3Rpb25cIiksIHoudTMyKFwiYnl0ZXNcIildKVxuICB9LFxuICBTZXRDb21wdXRlVW5pdExpbWl0OiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51OChcImluc3RydWN0aW9uXCIpLCB6LnUzMihcInVuaXRzXCIpXSlcbiAgfSxcbiAgU2V0Q29tcHV0ZVVuaXRQcmljZToge1xuICAgIGluZGV4OiAzLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTgoXCJpbnN0cnVjdGlvblwiKSwgT24oXCJtaWNyb0xhbXBvcnRzXCIpXSlcbiAgfVxufSk7XG5uZXcgT2UoXCJDb21wdXRlQnVkZ2V0MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xuei5zdHJ1Y3QoW3oudTgoXCJudW1TaWduYXR1cmVzXCIpLCB6LnU4KFwicGFkZGluZ1wiKSwgei51MTYoXCJzaWduYXR1cmVPZmZzZXRcIiksIHoudTE2KFwic2lnbmF0dXJlSW5zdHJ1Y3Rpb25JbmRleFwiKSwgei51MTYoXCJwdWJsaWNLZXlPZmZzZXRcIiksIHoudTE2KFwicHVibGljS2V5SW5zdHJ1Y3Rpb25JbmRleFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YU9mZnNldFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YVNpemVcIiksIHoudTE2KFwibWVzc2FnZUluc3RydWN0aW9uSW5kZXhcIildKTtcbm5ldyBPZShcIkVkMjU1MTlTaWdWZXJpZnkxMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5vRS51dGlscy5pc1ZhbGlkUHJpdmF0ZUtleTtcbnouc3RydWN0KFt6LnU4KFwibnVtU2lnbmF0dXJlc1wiKSwgei51MTYoXCJzaWduYXR1cmVPZmZzZXRcIiksIHoudTgoXCJzaWduYXR1cmVJbnN0cnVjdGlvbkluZGV4XCIpLCB6LnUxNihcImV0aEFkZHJlc3NPZmZzZXRcIiksIHoudTgoXCJldGhBZGRyZXNzSW5zdHJ1Y3Rpb25JbmRleFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YU9mZnNldFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YVNpemVcIiksIHoudTgoXCJtZXNzYWdlSW5zdHJ1Y3Rpb25JbmRleFwiKSwgei5ibG9iKDIwLCBcImV0aEFkZHJlc3NcIiksIHouYmxvYig2NCwgXCJzaWduYXR1cmVcIiksIHoudTgoXCJyZWNvdmVyeUlkXCIpXSk7XG5uZXcgT2UoXCJLZWNjYWtTZWNwMjU2azExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xudmFyIHowO1xubmV3IE9lKFwiU3Rha2VDb25maWcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbmNsYXNzIFkwIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBMb2NrdXAgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy51bml4VGltZXN0YW1wID0gdm9pZCAwLCB0aGlzLmVwb2NoID0gdm9pZCAwLCB0aGlzLmN1c3RvZGlhbiA9IHZvaWQgMCwgdGhpcy51bml4VGltZXN0YW1wID0gZSwgdGhpcy5lcG9jaCA9IHQsIHRoaXMuY3VzdG9kaWFuID0gcjtcbiAgfVxuICAvKipcbiAgICogRGVmYXVsdCwgaW5hY3RpdmUgTG9ja3VwIHZhbHVlXG4gICAqL1xufVxuejAgPSBZMDtcblkwLmRlZmF1bHQgPSBuZXcgejAoMCwgMCwgT2UuZGVmYXVsdCk7XG5PYmplY3QuZnJlZXplKHtcbiAgSW5pdGlhbGl6ZToge1xuICAgIGluZGV4OiAwLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIGhFKCksIGZFKCldKVxuICB9LFxuICBBdXRob3JpemU6IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBXZShcIm5ld0F1dGhvcml6ZWRcIiksIHoudTMyKFwic3Rha2VBdXRob3JpemF0aW9uVHlwZVwiKV0pXG4gIH0sXG4gIERlbGVnYXRlOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH0sXG4gIFNwbGl0OiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgei5uczY0KFwibGFtcG9ydHNcIildKVxuICB9LFxuICBXaXRoZHJhdzoge1xuICAgIGluZGV4OiA0LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIHoubnM2NChcImxhbXBvcnRzXCIpXSlcbiAgfSxcbiAgRGVhY3RpdmF0ZToge1xuICAgIGluZGV4OiA1LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBNZXJnZToge1xuICAgIGluZGV4OiA3LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBBdXRob3JpemVXaXRoU2VlZDoge1xuICAgIGluZGV4OiA4LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIFdlKFwibmV3QXV0aG9yaXplZFwiKSwgei51MzIoXCJzdGFrZUF1dGhvcml6YXRpb25UeXBlXCIpLCB4bihcImF1dGhvcml0eVNlZWRcIiksIFdlKFwiYXV0aG9yaXR5T3duZXJcIildKVxuICB9XG59KTtcbm5ldyBPZShcIlN0YWtlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5PYmplY3QuZnJlZXplKHtcbiAgSW5pdGlhbGl6ZUFjY291bnQ6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBnRSgpXSlcbiAgfSxcbiAgQXV0aG9yaXplOiB7XG4gICAgaW5kZXg6IDEsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJuZXdBdXRob3JpemVkXCIpLCB6LnUzMihcInZvdGVBdXRob3JpemF0aW9uVHlwZVwiKV0pXG4gIH0sXG4gIFdpdGhkcmF3OiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgei5uczY0KFwibGFtcG9ydHNcIildKVxuICB9LFxuICBVcGRhdGVWYWxpZGF0b3JJZGVudGl0eToge1xuICAgIGluZGV4OiA0LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBBdXRob3JpemVXaXRoU2VlZDoge1xuICAgIGluZGV4OiAxMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBwRSgpXSlcbiAgfVxufSk7XG5uZXcgT2UoXCJWb3RlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xubmV3IE9lKFwiVmExaWRhdG9yMW5mbzExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm9lKHtcbiAgbmFtZTogY2UoKSxcbiAgd2Vic2l0ZTogU2UoY2UoKSksXG4gIGRldGFpbHM6IFNlKGNlKCkpLFxuICBpY29uVXJsOiBTZShjZSgpKSxcbiAga2V5YmFzZVVzZXJuYW1lOiBTZShjZSgpKVxufSk7XG5uZXcgT2UoXCJWb3RlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xuei5zdHJ1Y3QoW1xuICBXZShcIm5vZGVQdWJrZXlcIiksXG4gIFdlKFwiYXV0aG9yaXplZFdpdGhkcmF3ZXJcIiksXG4gIHoudTgoXCJjb21taXNzaW9uXCIpLFxuICB6Lm51NjQoKSxcbiAgLy8gdm90ZXMubGVuZ3RoXG4gIHouc2VxKHouc3RydWN0KFt6Lm51NjQoXCJzbG90XCIpLCB6LnUzMihcImNvbmZpcm1hdGlvbkNvdW50XCIpXSksIHoub2Zmc2V0KHoudTMyKCksIC04KSwgXCJ2b3Rlc1wiKSxcbiAgei51OChcInJvb3RTbG90VmFsaWRcIiksXG4gIHoubnU2NChcInJvb3RTbG90XCIpLFxuICB6Lm51NjQoKSxcbiAgLy8gYXV0aG9yaXplZFZvdGVycy5sZW5ndGhcbiAgei5zZXEoei5zdHJ1Y3QoW3oubnU2NChcImVwb2NoXCIpLCBXZShcImF1dGhvcml6ZWRWb3RlclwiKV0pLCB6Lm9mZnNldCh6LnUzMigpLCAtOCksIFwiYXV0aG9yaXplZFZvdGVyc1wiKSxcbiAgei5zdHJ1Y3QoW3ouc2VxKHouc3RydWN0KFtXZShcImF1dGhvcml6ZWRQdWJrZXlcIiksIHoubnU2NChcImVwb2NoT2ZMYXN0QXV0aG9yaXplZFN3aXRjaFwiKSwgei5udTY0KFwidGFyZ2V0RXBvY2hcIildKSwgMzIsIFwiYnVmXCIpLCB6Lm51NjQoXCJpZHhcIiksIHoudTgoXCJpc0VtcHR5XCIpXSwgXCJwcmlvclZvdGVyc1wiKSxcbiAgei5udTY0KCksXG4gIC8vIGVwb2NoQ3JlZGl0cy5sZW5ndGhcbiAgei5zZXEoei5zdHJ1Y3QoW3oubnU2NChcImVwb2NoXCIpLCB6Lm51NjQoXCJjcmVkaXRzXCIpLCB6Lm51NjQoXCJwcmV2Q3JlZGl0c1wiKV0pLCB6Lm9mZnNldCh6LnUzMigpLCAtOCksIFwiZXBvY2hDcmVkaXRzXCIpLFxuICB6LnN0cnVjdChbei5udTY0KFwic2xvdFwiKSwgei5udTY0KFwidGltZXN0YW1wXCIpXSwgXCJsYXN0VGltZXN0YW1wXCIpXG5dKTtcbmNvbnN0IFZFID0gKHMpID0+ICh7XG4gIHJlcXVlc3Q6IHMsXG4gIHNpZ25NZXNzYWdlOiAoZSkgPT4gcyh7IG1ldGhvZDogXCJzaWduTWVzc2FnZVwiLCBwYXJhbXM6IHsgbWVzc2FnZTogZSB9IH0pLFxuICBzaWduVHJhbnNhY3Rpb246IChlKSA9PiBzKHsgbWV0aG9kOiBcInNpZ25UcmFuc2FjdGlvblwiLCBwYXJhbXM6IHsgdHJhbnNhY3Rpb246IGUgfSB9KSxcbiAgc2lnbkFuZFNlbmRUcmFuc2FjdGlvbjogKGUpID0+IHMoe1xuICAgIG1ldGhvZDogXCJzaWduQW5kU2VuZFRyYW5zYWN0aW9uXCIsXG4gICAgcGFyYW1zOiBlXG4gIH0pXG59KTtcbmZ1bmN0aW9uIEdkKHMpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHMuc2VyaWFsaXplKHtcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiAhMVxuICB9KSkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5mdW5jdGlvbiBqRShzKSB7XG4gIGNvbnN0IGUgPSBCdWZmZXIuZnJvbShzLCBcImJhc2U2NFwiKTtcbiAgcmV0dXJuIG51LmRlc2VyaWFsaXplTWVzc2FnZVZlcnNpb24oZSkgPT09IFwibGVnYWN5XCIgPyBpdS5kZXNlcmlhbGl6ZShlKSA6IEtvLmZyb20oZSk7XG59XG5mdW5jdGlvbiBLRShzKSB7XG4gIHJldHVybiBhc3luYyAodCkgPT4ge1xuICAgIGlmICh0Lm1ldGhvZCA9PT0gXCJjb25uZWN0XCIpXG4gICAgICByZXR1cm4gYXdhaXQgcyh0KTtcbiAgICBpZiAodC5tZXRob2QgPT09IFwic2lnbk1lc3NhZ2VcIilcbiAgICAgIHJldHVybiBhd2FpdCBzKHQpO1xuICAgIGlmICh0Lm1ldGhvZCA9PT0gXCJzaWduQW5kU2VuZFRyYW5zYWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNhY3Rpb246IHIgfSA9IHQucGFyYW1zLCBuID0ge1xuICAgICAgICB0cmFuc2FjdGlvbjogR2QocilcbiAgICAgIH07XG4gICAgICByZXR1cm4gYXdhaXQgcyh7XG4gICAgICAgIG1ldGhvZDogXCJzaWduQW5kU2VuZFRyYW5zYWN0aW9uXCIsXG4gICAgICAgIHBhcmFtczogblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0Lm1ldGhvZCA9PT0gXCJzaWduVHJhbnNhY3Rpb25cIikge1xuICAgICAgY29uc3QgeyB0cmFuc2FjdGlvbjogciB9ID0gdC5wYXJhbXMsIG4gPSB7XG4gICAgICAgIHRyYW5zYWN0aW9uOiBHZChyKVxuICAgICAgfSwgeyBzaWduZWRUcmFuc2FjdGlvbjogaSB9ID0gYXdhaXQgcyh7XG4gICAgICAgIG1ldGhvZDogXCJzaWduVHJhbnNhY3Rpb25cIixcbiAgICAgICAgcGFyYW1zOiBuXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNpZ25lZFRyYW5zYWN0aW9uOiBqRShpKSB9O1xuICAgIH1cbiAgfTtcbn1cbmNvbnN0IEhFID0gKHsgbWluaUFwcEhvc3Q6IHMsIGVtaXR0ZXI6IGUgfSkgPT4ge1xuICBsZXQgdCwgciA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgdmlzaWJsZTogITEsXG4gICAgZ2V0IG9uYmFjaygpIHtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgc2V0IG9uYmFjayhuKSB7XG4gICAgICByICYmIGUucmVtb3ZlTGlzdGVuZXIoXCJiYWNrTmF2aWdhdGlvblRyaWdnZXJlZFwiLCByKSwgciA9IG4sIG4gJiYgZS5hZGRMaXN0ZW5lcihcImJhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkXCIsIG4pO1xuICAgIH0sXG4gICAgYXN5bmMgc2hvdygpIHtcbiAgICAgIGF3YWl0IHMudXBkYXRlQmFja1N0YXRlKHtcbiAgICAgICAgdmlzaWJsZTogITBcbiAgICAgIH0pLCB0aGlzLnZpc2libGUgPSAhMDtcbiAgICB9LFxuICAgIGFzeW5jIGhpZGUoKSB7XG4gICAgICBhd2FpdCBzLnVwZGF0ZUJhY2tTdGF0ZSh7XG4gICAgICAgIHZpc2libGU6ICExXG4gICAgICB9KSwgdGhpcy52aXNpYmxlID0gITE7XG4gICAgfSxcbiAgICBhc3luYyBlbmFibGVXZWJOYXZpZ2F0aW9uKCkge1xuICAgICAgdCA9IHFFKHtcbiAgICAgICAgYmFjazogdGhpcyxcbiAgICAgICAgZW1pdHRlcjogZVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBhc3luYyBkaXNhYmxlV2ViTmF2aWdhdGlvbigpIHtcbiAgICAgIHQgPT0gbnVsbCB8fCB0KCksIHQgPSB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcbmZ1bmN0aW9uIHFFKHsgZW1pdHRlcjogcywgYmFjazogZSB9KSB7XG4gIGNvbnN0IHQgPSBXRSgpO1xuICBpZiAodClcbiAgICByZXR1cm4gekUoeyBlbWl0dGVyOiBzLCBiYWNrOiBlLCBuYXZpZ2F0aW9uOiB0IH0pO1xuICBpZiAodHlwZW9mIHdpbmRvdyA8IFwidVwiKVxuICAgIHJldHVybiBZRSh7IGVtaXR0ZXI6IHMsIGJhY2s6IGUsIHdpbmRvdyB9KTtcbn1cbmZ1bmN0aW9uIFdFKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA8IFwidVwiICYmIHdpbmRvdy5uYXZpZ2F0aW9uICE9PSB2b2lkIDApXG4gICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0aW9uO1xufVxuZnVuY3Rpb24gekUoeyBlbWl0dGVyOiBzLCBiYWNrOiBlLCBuYXZpZ2F0aW9uOiB0IH0pIHtcbiAgZnVuY3Rpb24gcigpIHtcbiAgICB0LmNhbkdvQmFjayA/IGUuc2hvdygpIDogZS5oaWRlKCk7XG4gIH1cbiAgZnVuY3Rpb24gbigpIHtcbiAgICBlLnZpc2libGUgJiYgdC5jYW5Hb0JhY2sgJiYgdC5iYWNrKCk7XG4gIH1cbiAgcmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm5hdmlnYXRlc3VjY2Vzc1wiLCByKSwgcy5hZGRMaXN0ZW5lcihcImJhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkXCIsIG4pLCAoKSA9PiB7XG4gICAgdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibmF2aWdhdGVzdWNjZXNzXCIsIHIpLCBzLnJlbW92ZUxpc3RlbmVyKFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIiwgbik7XG4gIH07XG59XG5mdW5jdGlvbiBZRSh7IGVtaXR0ZXI6IHMsIGJhY2s6IGUsIHdpbmRvdzogdCB9KSB7XG4gIGUuc2hvdygpO1xuICBmdW5jdGlvbiByKCkge1xuICAgIGUudmlzaWJsZSAmJiB0Lmhpc3RvcnkuYmFjaygpO1xuICB9XG4gIHJldHVybiBzLmFkZExpc3RlbmVyKFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIiwgciksICgpID0+IHtcbiAgICBzLnJlbW92ZUxpc3RlbmVyKFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIiwgcik7XG4gIH07XG59XG5jb25zdCBaRSA9IFwiMC4xLjFcIjtcbmZ1bmN0aW9uIFhFKCkge1xuICByZXR1cm4gWkU7XG59XG5sZXQgSkUgPSBjbGFzcyBzYyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSwgdCA9IHt9KSB7XG4gICAgY29uc3QgciA9ICgoKSA9PiB7XG4gICAgICB2YXIgbDtcbiAgICAgIGlmICh0LmNhdXNlIGluc3RhbmNlb2Ygc2MpIHtcbiAgICAgICAgaWYgKHQuY2F1c2UuZGV0YWlscylcbiAgICAgICAgICByZXR1cm4gdC5jYXVzZS5kZXRhaWxzO1xuICAgICAgICBpZiAodC5jYXVzZS5zaG9ydE1lc3NhZ2UpXG4gICAgICAgICAgcmV0dXJuIHQuY2F1c2Uuc2hvcnRNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChsID0gdC5jYXVzZSkgIT0gbnVsbCAmJiBsLm1lc3NhZ2UgPyB0LmNhdXNlLm1lc3NhZ2UgOiB0LmRldGFpbHM7XG4gICAgfSkoKSwgbiA9IHQuY2F1c2UgaW5zdGFuY2VvZiBzYyAmJiB0LmNhdXNlLmRvY3NQYXRoIHx8IHQuZG9jc1BhdGgsIG8gPSBgaHR0cHM6Ly9veGxpYi5zaCR7biA/PyBcIlwifWAsIGEgPSBbXG4gICAgICBlIHx8IFwiQW4gZXJyb3Igb2NjdXJyZWQuXCIsXG4gICAgICAuLi50Lm1ldGFNZXNzYWdlcyA/IFtcIlwiLCAuLi50Lm1ldGFNZXNzYWdlc10gOiBbXSxcbiAgICAgIC4uLnIgfHwgbiA/IFtcbiAgICAgICAgXCJcIixcbiAgICAgICAgciA/IGBEZXRhaWxzOiAke3J9YCA6IHZvaWQgMCxcbiAgICAgICAgbiA/IGBTZWU6ICR7b31gIDogdm9pZCAwXG4gICAgICBdIDogW11cbiAgICBdLmZpbHRlcigobCkgPT4gdHlwZW9mIGwgPT0gXCJzdHJpbmdcIikuam9pbihgXG5gKTtcbiAgICBzdXBlcihhLCB0LmNhdXNlID8geyBjYXVzZTogdC5jYXVzZSB9IDogdm9pZCAwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiZGV0YWlsc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRvY3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IHZvaWQgMFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJkb2NzUGF0aFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3J0TWVzc2FnZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNhdXNlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJCYXNlRXJyb3JcIlxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2ZXJzaW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBgb3hAJHtYRSgpfWBcbiAgICB9KSwgdGhpcy5jYXVzZSA9IHQuY2F1c2UsIHRoaXMuZGV0YWlscyA9IHIsIHRoaXMuZG9jcyA9IG8sIHRoaXMuZG9jc1BhdGggPSBuLCB0aGlzLnNob3J0TWVzc2FnZSA9IGU7XG4gIH1cbiAgd2FsayhlKSB7XG4gICAgcmV0dXJuIFowKHRoaXMsIGUpO1xuICB9XG59O1xuZnVuY3Rpb24gWjAocywgZSkge1xuICByZXR1cm4gZSAhPSBudWxsICYmIGUocykgPyBzIDogcyAmJiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiICYmIFwiY2F1c2VcIiBpbiBzICYmIHMuY2F1c2UgPyBaMChzLmNhdXNlLCBlKSA6IGUgPyBudWxsIDogcztcbn1cbmZ1bmN0aW9uIFgwKHMsIGUgPSB7fSkge1xuICBjb25zdCB7IHJhdzogdCA9ICExIH0gPSBlLCByID0gcztcbiAgaWYgKHQpXG4gICAgcmV0dXJuIHM7XG4gIGlmIChyLmVycm9yKSB7XG4gICAgY29uc3QgeyBjb2RlOiBuIH0gPSByLmVycm9yLCBpID0gbiA9PT0gQm4uY29kZSA/IEJuIDogbiA9PT0gcmkuY29kZSA/IHJpIDogbiA9PT0gZGkuY29kZSA/IGRpIDogbiA9PT0gY2kuY29kZSA/IGNpIDogbiA9PT0gYWkuY29kZSA/IGFpIDogbiA9PT0gdWkuY29kZSA/IHVpIDogbiA9PT0gb2kuY29kZSA/IG9pIDogbiA9PT0gaGkuY29kZSA/IGhpIDogbiA9PT0gc2kuY29kZSA/IHNpIDogbiA9PT0gbmkuY29kZSA/IG5pIDogbiA9PT0gaWkuY29kZSA/IGlpIDogbiA9PT0gbGkuY29kZSA/IGxpIDogbXI7XG4gICAgdGhyb3cgbmV3IGkoci5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHIucmVzdWx0O1xufVxubGV0IG1yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBjb25zdCB7IGNvZGU6IHQsIG1lc3NhZ2U6IHIsIGRhdGE6IG4gfSA9IGU7XG4gICAgc3VwZXIociksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUnBjUmVzcG9uc2UuQmFzZUVycm9yXCJcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRhdGFcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IHZvaWQgMFxuICAgIH0pLCB0aGlzLmNvZGUgPSB0LCB0aGlzLmRhdGEgPSBuO1xuICB9XG59O1xuY2xhc3MgcmkgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiTWlzc2luZyBvciBpbnZhbGlkIHBhcmFtZXRlcnMuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogcmkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzJlM1xuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLkludmFsaWRJbnB1dEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHJpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyZTNcbn0pO1xuY2xhc3Mgc2kgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiUmVxdWVzdGVkIHJlc291cmNlIG5vdCBmb3VuZC5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBzaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjAwMVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLlJlc291cmNlTm90Rm91bmRFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaSwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjAwMVxufSk7XG5jbGFzcyBuaSBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJSZXF1ZXN0ZWQgcmVzb3VyY2Ugbm90IGF2YWlsYWJsZS5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBuaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjAwMlxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLlJlc291cmNlVW5hdmFpbGFibGVFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShuaSwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjAwMlxufSk7XG5jbGFzcyBpaSBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJUcmFuc2FjdGlvbiBjcmVhdGlvbiBmYWlsZWQuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogaWkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzIwMDNcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5UcmFuc2FjdGlvblJlamVjdGVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaWksIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiAtMzIwMDNcbn0pO1xuY2xhc3Mgb2kgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBvaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjAwNFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLk1ldGhvZE5vdFN1cHBvcnRlZEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG9pLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyMDA0XG59KTtcbmNsYXNzIGFpIGV4dGVuZHMgbXIge1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIlJhdGUgbGltaXQgZXhjZWVkZWQuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogYWkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzIwMDVcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5MaW1pdEV4Y2VlZGVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYWksIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiAtMzIwMDVcbn0pO1xuY2xhc3MgbGkgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiSlNPTi1SUEMgdmVyc2lvbiBub3Qgc3VwcG9ydGVkLlwiLFxuICAgICAgLi4uZSxcbiAgICAgIGNvZGU6IGxpLmNvZGVcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogLTMyMDA2XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUnBjUmVzcG9uc2UuVmVyc2lvbk5vdFN1cHBvcnRlZEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyMDA2XG59KTtcbmNsYXNzIGNpIGV4dGVuZHMgbXIge1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIklucHV0IGlzIG5vdCBhIHZhbGlkIEpTT04tUlBDIHJlcXVlc3QuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogY2kuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzI2MDBcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5JbnZhbGlkUmVxdWVzdEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGNpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyNjAwXG59KTtcbmNsYXNzIHVpIGV4dGVuZHMgbXIge1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIk1ldGhvZCBkb2VzIG5vdCBleGlzdC5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiB1aS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjYwMVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLk1ldGhvZE5vdEZvdW5kRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkodWksIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiAtMzI2MDFcbn0pO1xuY2xhc3MgZGkgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBtZXRob2QgcGFyYW1ldGVycy5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBkaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjYwMlxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLkludmFsaWRQYXJhbXNFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaSwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjYwMlxufSk7XG5jbGFzcyBCbiBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJJbnRlcm5hbCBKU09OLVJQQyBlcnJvci5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBCbi5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjYwM1xuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLkludGVybmFsRXJyb3JFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbiwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjYwM1xufSk7XG5jbGFzcyBoaSBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcGFyc2UgSlNPTi1SUEMgcmVzcG9uc2UuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogaGkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzI3MDBcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5QYXJzZUVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGhpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyNzAwXG59KTtcbmNsYXNzIG5uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXJScGNFcnJvclwiXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IHZvaWQgMFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJkZXRhaWxzXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KSwgdGhpcy5jb2RlID0gZSwgdGhpcy5kZXRhaWxzID0gdDtcbiAgfVxufVxuY2xhc3MgSjAgZXh0ZW5kcyBubiB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZTogZSA9IFwiVGhlIHVzZXIgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDAwMSwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuVXNlclJlamVjdGVkUmVxdWVzdEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEowLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogNDAwMVxufSk7XG5jbGFzcyBRMCBleHRlbmRzIG5uIHtcbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlOiBlID0gXCJUaGUgcmVxdWVzdGVkIG1ldGhvZCBhbmQvb3IgYWNjb3VudCBoYXMgbm90IGJlZW4gYXV0aG9yaXplZCBieSB0aGUgdXNlci5cIiB9ID0ge30pIHtcbiAgICBzdXBlcig0MTAwLCBlKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJQcm92aWRlci5VbmF1dGhvcml6ZWRFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShRMCwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IDQxMDBcbn0pO1xuY2xhc3MgZWcgZXh0ZW5kcyBubiB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZTogZSA9IFwiVGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBtZXRob2QuXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDIwMCwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuVW5zdXBwb3J0ZWRNZXRob2RFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlZywgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IDQyMDBcbn0pO1xuY2xhc3MgdGcgZXh0ZW5kcyBubiB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZTogZSA9IFwiVGhlIHByb3ZpZGVyIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIGFsbCBjaGFpbnMuXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDkwMCwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuRGlzY29ubmVjdGVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkodGcsIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiA0OTAwXG59KTtcbmNsYXNzIHJnIGV4dGVuZHMgbm4ge1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2U6IGUgPSBcIlRoZSBwcm92aWRlciBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSByZXF1ZXN0ZWQgY2hhaW4uXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDkwMSwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuQ2hhaW5EaXNjb25uZWN0ZWRFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZywgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IDQ5MDFcbn0pO1xuZnVuY3Rpb24gUUUoKSB7XG4gIGNvbnN0IHMgPSBuZXcgTDAoKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQgZXZlbnROYW1lcygpIHtcbiAgICAgIHJldHVybiBzLmV2ZW50TmFtZXMuYmluZChzKTtcbiAgICB9LFxuICAgIGdldCBsaXN0ZW5lckNvdW50KCkge1xuICAgICAgcmV0dXJuIHMubGlzdGVuZXJDb3VudC5iaW5kKHMpO1xuICAgIH0sXG4gICAgZ2V0IGxpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiBzLmxpc3RlbmVycy5iaW5kKHMpO1xuICAgIH0sXG4gICAgYWRkTGlzdGVuZXI6IHMuYWRkTGlzdGVuZXIuYmluZChzKSxcbiAgICBlbWl0OiBzLmVtaXQuYmluZChzKSxcbiAgICBvZmY6IHMub2ZmLmJpbmQocyksXG4gICAgb246IHMub24uYmluZChzKSxcbiAgICBvbmNlOiBzLm9uY2UuYmluZChzKSxcbiAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IHMucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQocyksXG4gICAgcmVtb3ZlTGlzdGVuZXI6IHMucmVtb3ZlTGlzdGVuZXIuYmluZChzKVxuICB9O1xufVxuZnVuY3Rpb24gZXgocywgZSA9IHt9KSB7XG4gIHZhciByLCBuO1xuICBjb25zdCB7IGluY2x1ZGVFdmVudHM6IHQgPSAhMCB9ID0gZTtcbiAgaWYgKCFzKVxuICAgIHRocm93IG5ldyB0eCgpO1xuICByZXR1cm4ge1xuICAgIC4uLnQgPyB7XG4gICAgICBvbjogKHIgPSBzLm9uKSA9PSBudWxsID8gdm9pZCAwIDogci5iaW5kKHMpLFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IChuID0gcy5yZW1vdmVMaXN0ZW5lcikgPT0gbnVsbCA/IHZvaWQgMCA6IG4uYmluZChzKVxuICAgIH0gOiB7fSxcbiAgICBhc3luYyByZXF1ZXN0KGkpIHtcbiAgICAgIGNvbnN0IG8gPSBhd2FpdCBzLnJlcXVlc3QoaSk7XG4gICAgICByZXR1cm4gbyAmJiB0eXBlb2YgbyA9PSBcIm9iamVjdFwiICYmIFwianNvbnJwY1wiIGluIG8gPyBYMChvKSA6IG87XG4gICAgfVxuICB9O1xufVxuY2xhc3MgdHggZXh0ZW5kcyBKRSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiYHByb3ZpZGVyYCBpcyB1bmRlZmluZWQuXCIpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlByb3ZpZGVyLklzVW5kZWZpbmVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiByeChzID0ge30pIHtcbiAgbGV0IGUgPSBzLmlkID8/IDA7XG4gIHJldHVybiB7XG4gICAgcHJlcGFyZSh0KSB7XG4gICAgICByZXR1cm4gc3goe1xuICAgICAgICBpZDogZSsrLFxuICAgICAgICAuLi50XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldCBpZCgpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHN4KHMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zLFxuICAgIGpzb25ycGM6IFwiMi4wXCJcbiAgfTtcbn1cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IHNnID0gU3ltYm9sKFwiQ29tbGluay5wcm94eVwiKSwgbnggPSBTeW1ib2woXCJDb21saW5rLmVuZHBvaW50XCIpLCBpeCA9IFN5bWJvbChcIkNvbWxpbmsucmVsZWFzZVByb3h5XCIpLCBsbCA9IFN5bWJvbChcIkNvbWxpbmsuZmluYWxpemVyXCIpLCBobyA9IFN5bWJvbChcIkNvbWxpbmsudGhyb3duXCIpLCBuZyA9IChzKSA9PiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiICYmIHMgIT09IG51bGwgfHwgdHlwZW9mIHMgPT0gXCJmdW5jdGlvblwiLCBveCA9IHtcbiAgY2FuSGFuZGxlOiAocykgPT4gbmcocykgJiYgc1tzZ10sXG4gIHNlcmlhbGl6ZShzKSB7XG4gICAgY29uc3QgeyBwb3J0MTogZSwgcG9ydDI6IHQgfSA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHJldHVybiBvZyhzLCBlKSwgW3QsIFt0XV07XG4gIH0sXG4gIGRlc2VyaWFsaXplKHMpIHtcbiAgICByZXR1cm4gcy5zdGFydCgpLCBsZyhzKTtcbiAgfVxufSwgYXggPSB7XG4gIGNhbkhhbmRsZTogKHMpID0+IG5nKHMpICYmIGhvIGluIHMsXG4gIHNlcmlhbGl6ZSh7IHZhbHVlOiBzIH0pIHtcbiAgICBsZXQgZTtcbiAgICByZXR1cm4gcyBpbnN0YW5jZW9mIEVycm9yID8gZSA9IHtcbiAgICAgIGlzRXJyb3I6ICEwLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgbWVzc2FnZTogcy5tZXNzYWdlLFxuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHN0YWNrOiBzLnN0YWNrXG4gICAgICB9XG4gICAgfSA6IGUgPSB7IGlzRXJyb3I6ICExLCB2YWx1ZTogcyB9LCBbZSwgW11dO1xuICB9LFxuICBkZXNlcmlhbGl6ZShzKSB7XG4gICAgdGhyb3cgcy5pc0Vycm9yID8gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3Iocy52YWx1ZS5tZXNzYWdlKSwgcy52YWx1ZSkgOiBzLnZhbHVlO1xuICB9XG59LCBpZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKFtcbiAgW1wicHJveHlcIiwgb3hdLFxuICBbXCJ0aHJvd1wiLCBheF1cbl0pO1xuZnVuY3Rpb24gbHgocywgZSkge1xuICBmb3IgKGNvbnN0IHQgb2YgcylcbiAgICBpZiAoZSA9PT0gdCB8fCB0ID09PSBcIipcIiB8fCB0IGluc3RhbmNlb2YgUmVnRXhwICYmIHQudGVzdChlKSlcbiAgICAgIHJldHVybiAhMDtcbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gb2cocywgZSA9IGdsb2JhbFRoaXMsIHQgPSBbXCIqXCJdKSB7XG4gIGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZnVuY3Rpb24gcihuKSB7XG4gICAgaWYgKCFuIHx8ICFuLmRhdGEpXG4gICAgICByZXR1cm47XG4gICAgaWYgKCFseCh0LCBuLm9yaWdpbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gJyR7bi5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGlkOiBpLCB0eXBlOiBvLCBwYXRoOiBhIH0gPSBPYmplY3QuYXNzaWduKHsgcGF0aDogW10gfSwgbi5kYXRhKSwgbCA9IChuLmRhdGEuYXJndW1lbnRMaXN0IHx8IFtdKS5tYXAoJHMpO1xuICAgIGxldCBjO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1ID0gYS5zbGljZSgwLCAtMSkucmVkdWNlKChoLCBmKSA9PiBoW2ZdLCBzKSwgZCA9IGEucmVkdWNlKChoLCBmKSA9PiBoW2ZdLCBzKTtcbiAgICAgIHN3aXRjaCAobykge1xuICAgICAgICBjYXNlIFwiR0VUXCI6XG4gICAgICAgICAgYyA9IGQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJTRVRcIjpcbiAgICAgICAgICB1W2Euc2xpY2UoLTEpWzBdXSA9ICRzKG4uZGF0YS52YWx1ZSksIGMgPSAhMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFQUExZXCI6XG4gICAgICAgICAgYyA9IGQuYXBwbHkodSwgbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDT05TVFJVQ1RcIjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoID0gbmV3IGQoLi4ubCk7XG4gICAgICAgICAgICBjID0gZ3goaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRU5EUE9JTlRcIjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB7IHBvcnQxOiBoLCBwb3J0MjogZiB9ID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICBvZyhzLCBmKSwgYyA9IGZ4KGgsIFtoXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUkVMRUFTRVwiOlxuICAgICAgICAgIGMgPSB2b2lkIDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKHUpIHtcbiAgICAgIGMgPSB7IHZhbHVlOiB1LCBbaG9dOiAwIH07XG4gICAgfVxuICAgIFByb21pc2UucmVzb2x2ZShjKS5jYXRjaCgodSkgPT4gKHsgdmFsdWU6IHUsIFtob106IDAgfSkpLnRoZW4oKHUpID0+IHtcbiAgICAgIGNvbnN0IFtkLCBoXSA9IHpvKHUpO1xuICAgICAgZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGQpLCB7IGlkOiBpIH0pLCBoKSwgbyA9PT0gXCJSRUxFQVNFXCIgJiYgKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgciksIGFnKGUpLCBsbCBpbiBzICYmIHR5cGVvZiBzW2xsXSA9PSBcImZ1bmN0aW9uXCIgJiYgc1tsbF0oKSk7XG4gICAgfSkuY2F0Y2goKHUpID0+IHtcbiAgICAgIGNvbnN0IFtkLCBoXSA9IHpvKHtcbiAgICAgICAgdmFsdWU6IG5ldyBUeXBlRXJyb3IoXCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWVcIiksXG4gICAgICAgIFtob106IDBcbiAgICAgIH0pO1xuICAgICAgZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGQpLCB7IGlkOiBpIH0pLCBoKTtcbiAgICB9KTtcbiAgfSksIGUuc3RhcnQgJiYgZS5zdGFydCgpO1xufVxuZnVuY3Rpb24gY3gocykge1xuICByZXR1cm4gcy5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk1lc3NhZ2VQb3J0XCI7XG59XG5mdW5jdGlvbiBhZyhzKSB7XG4gIGN4KHMpICYmIHMuY2xvc2UoKTtcbn1cbmZ1bmN0aW9uIGxnKHMsIGUpIHtcbiAgY29uc3QgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIHJldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKG4pIHtcbiAgICBjb25zdCB7IGRhdGE6IGkgfSA9IG47XG4gICAgaWYgKCFpIHx8ICFpLmlkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSB0LmdldChpLmlkKTtcbiAgICBpZiAobylcbiAgICAgIHRyeSB7XG4gICAgICAgIG8oaSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0LmRlbGV0ZShpLmlkKTtcbiAgICAgIH1cbiAgfSksIG5jKHMsIHQsIFtdLCBlKTtcbn1cbmZ1bmN0aW9uIFZpKHMpIHtcbiAgaWYgKHMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlXCIpO1xufVxuZnVuY3Rpb24gY2cocykge1xuICByZXR1cm4geW4ocywgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwge1xuICAgIHR5cGU6IFwiUkVMRUFTRVwiXG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIGFnKHMpO1xuICB9KTtcbn1cbmNvbnN0IHFvID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksIFdvID0gXCJGaW5hbGl6YXRpb25SZWdpc3RyeVwiIGluIGdsb2JhbFRoaXMgJiYgbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChzKSA9PiB7XG4gIGNvbnN0IGUgPSAocW8uZ2V0KHMpIHx8IDApIC0gMTtcbiAgcW8uc2V0KHMsIGUpLCBlID09PSAwICYmIGNnKHMpO1xufSk7XG5mdW5jdGlvbiB1eChzLCBlKSB7XG4gIGNvbnN0IHQgPSAocW8uZ2V0KGUpIHx8IDApICsgMTtcbiAgcW8uc2V0KGUsIHQpLCBXbyAmJiBXby5yZWdpc3RlcihzLCBlLCBzKTtcbn1cbmZ1bmN0aW9uIGR4KHMpIHtcbiAgV28gJiYgV28udW5yZWdpc3RlcihzKTtcbn1cbmZ1bmN0aW9uIG5jKHMsIGUsIHQgPSBbXSwgciA9IGZ1bmN0aW9uKCkge1xufSkge1xuICBsZXQgbiA9ICExO1xuICBjb25zdCBpID0gbmV3IFByb3h5KHIsIHtcbiAgICBnZXQobywgYSkge1xuICAgICAgaWYgKFZpKG4pLCBhID09PSBpeClcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBkeChpKSwgY2cocyksIGUuY2xlYXIoKSwgbiA9ICEwO1xuICAgICAgICB9O1xuICAgICAgaWYgKGEgPT09IFwidGhlblwiKSB7XG4gICAgICAgIGlmICh0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICByZXR1cm4geyB0aGVuOiAoKSA9PiBpIH07XG4gICAgICAgIGNvbnN0IGwgPSB5bihzLCBlLCB7XG4gICAgICAgICAgdHlwZTogXCJHRVRcIixcbiAgICAgICAgICBwYXRoOiB0Lm1hcCgoYykgPT4gYy50b1N0cmluZygpKVxuICAgICAgICB9KS50aGVuKCRzKTtcbiAgICAgICAgcmV0dXJuIGwudGhlbi5iaW5kKGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5jKHMsIGUsIFsuLi50LCBhXSk7XG4gICAgfSxcbiAgICBzZXQobywgYSwgbCkge1xuICAgICAgVmkobik7XG4gICAgICBjb25zdCBbYywgdV0gPSB6byhsKTtcbiAgICAgIHJldHVybiB5bihzLCBlLCB7XG4gICAgICAgIHR5cGU6IFwiU0VUXCIsXG4gICAgICAgIHBhdGg6IFsuLi50LCBhXS5tYXAoKGQpID0+IGQudG9TdHJpbmcoKSksXG4gICAgICAgIHZhbHVlOiBjXG4gICAgICB9LCB1KS50aGVuKCRzKTtcbiAgICB9LFxuICAgIGFwcGx5KG8sIGEsIGwpIHtcbiAgICAgIFZpKG4pO1xuICAgICAgY29uc3QgYyA9IHRbdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjID09PSBueClcbiAgICAgICAgcmV0dXJuIHluKHMsIGUsIHtcbiAgICAgICAgICB0eXBlOiBcIkVORFBPSU5UXCJcbiAgICAgICAgfSkudGhlbigkcyk7XG4gICAgICBpZiAoYyA9PT0gXCJiaW5kXCIpXG4gICAgICAgIHJldHVybiBuYyhzLCBlLCB0LnNsaWNlKDAsIC0xKSk7XG4gICAgICBjb25zdCBbdSwgZF0gPSBWZChsKTtcbiAgICAgIHJldHVybiB5bihzLCBlLCB7XG4gICAgICAgIHR5cGU6IFwiQVBQTFlcIixcbiAgICAgICAgcGF0aDogdC5tYXAoKGgpID0+IGgudG9TdHJpbmcoKSksXG4gICAgICAgIGFyZ3VtZW50TGlzdDogdVxuICAgICAgfSwgZCkudGhlbigkcyk7XG4gICAgfSxcbiAgICBjb25zdHJ1Y3QobywgYSkge1xuICAgICAgVmkobik7XG4gICAgICBjb25zdCBbbCwgY10gPSBWZChhKTtcbiAgICAgIHJldHVybiB5bihzLCBlLCB7XG4gICAgICAgIHR5cGU6IFwiQ09OU1RSVUNUXCIsXG4gICAgICAgIHBhdGg6IHQubWFwKCh1KSA9PiB1LnRvU3RyaW5nKCkpLFxuICAgICAgICBhcmd1bWVudExpc3Q6IGxcbiAgICAgIH0sIGMpLnRoZW4oJHMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB1eChpLCBzKSwgaTtcbn1cbmZ1bmN0aW9uIGh4KHMpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHMpO1xufVxuZnVuY3Rpb24gVmQocykge1xuICBjb25zdCBlID0gcy5tYXAoem8pO1xuICByZXR1cm4gW2UubWFwKCh0KSA9PiB0WzBdKSwgaHgoZS5tYXAoKHQpID0+IHRbMV0pKV07XG59XG5jb25zdCB1ZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gZngocywgZSkge1xuICByZXR1cm4gdWcuc2V0KHMsIGUpLCBzO1xufVxuZnVuY3Rpb24gZ3gocykge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihzLCB7IFtzZ106ICEwIH0pO1xufVxuZnVuY3Rpb24gcHgocywgZSA9IGdsb2JhbFRoaXMsIHQgPSBcIipcIikge1xuICByZXR1cm4ge1xuICAgIHBvc3RNZXNzYWdlOiAociwgbikgPT4gcy5wb3N0TWVzc2FnZShyLCB0LCBuKSxcbiAgICBhZGRFdmVudExpc3RlbmVyOiBlLmFkZEV2ZW50TGlzdGVuZXIuYmluZChlKSxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChlKVxuICB9O1xufVxuZnVuY3Rpb24gem8ocykge1xuICBmb3IgKGNvbnN0IFtlLCB0XSBvZiBpZylcbiAgICBpZiAodC5jYW5IYW5kbGUocykpIHtcbiAgICAgIGNvbnN0IFtyLCBuXSA9IHQuc2VyaWFsaXplKHMpO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiSEFORExFUlwiLFxuICAgICAgICAgIG5hbWU6IGUsXG4gICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgfSxcbiAgICAgICAgblxuICAgICAgXTtcbiAgICB9XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdHlwZTogXCJSQVdcIixcbiAgICAgIHZhbHVlOiBzXG4gICAgfSxcbiAgICB1Zy5nZXQocykgfHwgW11cbiAgXTtcbn1cbmZ1bmN0aW9uICRzKHMpIHtcbiAgc3dpdGNoIChzLnR5cGUpIHtcbiAgICBjYXNlIFwiSEFORExFUlwiOlxuICAgICAgcmV0dXJuIGlnLmdldChzLm5hbWUpLmRlc2VyaWFsaXplKHMudmFsdWUpO1xuICAgIGNhc2UgXCJSQVdcIjpcbiAgICAgIHJldHVybiBzLnZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiB5bihzLCBlLCB0LCByKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgobikgPT4ge1xuICAgIGNvbnN0IGkgPSBteCgpO1xuICAgIGUuc2V0KGksIG4pLCBzLnN0YXJ0ICYmIHMuc3RhcnQoKSwgcy5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgaWQ6IGkgfSwgdCksIHIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIG14KCkge1xuICByZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oXCItXCIpO1xufVxuY29uc3QgeXggPSB7XG4gIHBvc3RNZXNzYWdlKCkge1xuICB9LFxuICBhZGRFdmVudExpc3RlbmVyOiAoKSA9PiB7XG4gIH0sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6ICgpID0+IHtcbiAgfVxufSwgdnggPSB7XG4gIHBvc3RNZXNzYWdlOiAocykgPT4ge1xuICAgIHdpbmRvdy5SZWFjdE5hdGl2ZVdlYlZpZXcucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkocykpO1xuICB9LFxuICBhZGRFdmVudExpc3RlbmVyOiAocywgZSwgLi4udCkgPT4ge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJGYXJjYXN0ZXJGcmFtZUNhbGxiYWNrXCIsIGUsIC4uLnQpO1xuICB9LFxuICByZW1vdmVFdmVudExpc3RlbmVyOiAocywgZSkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJGYXJjYXN0ZXJGcmFtZUNhbGxiYWNrXCIsIGUpO1xuICB9XG59LCBFeCA9IHR5cGVvZiB3aW5kb3cgPiBcInVcIiA/IHl4IDogd2luZG93ICE9IG51bGwgJiYgd2luZG93LlJlYWN0TmF0aXZlV2ViVmlldyA/IHZ4IDogcHgoKHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LnBhcmVudCkgPz8gd2luZG93KSwgTWUgPSBsZyhFeCksIHV1ID0gUUUoKSwgeHggPSByeCgpO1xuZnVuY3Rpb24gU3goeyBjb2RlOiBzLCBkZXRhaWxzOiBlIH0pIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSA0MDAxOlxuICAgICAgcmV0dXJuIG5ldyBKMCgpO1xuICAgIGNhc2UgNDEwMDpcbiAgICAgIHJldHVybiBuZXcgUTAoKTtcbiAgICBjYXNlIDQyMDA6XG4gICAgICByZXR1cm4gbmV3IGVnKCk7XG4gICAgY2FzZSA0OTAwOlxuICAgICAgcmV0dXJuIG5ldyB0ZygpO1xuICAgIGNhc2UgNDkwMTpcbiAgICAgIHJldHVybiBuZXcgcmcoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBubihzLCBlID8/IFwiVW5rbm93biBwcm92aWRlciBSUEMgZXJyb3JcIik7XG4gIH1cbn1cbmNvbnN0IGZpID0gZXgoe1xuICAuLi51dSxcbiAgYXN5bmMgcmVxdWVzdChzKSB7XG4gICAgY29uc3QgZSA9IHh4LnByZXBhcmUocyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBhd2FpdCBNZS5ldGhQcm92aWRlclJlcXVlc3RWMihlKS50aGVuKChyKSA9PiBYMChyLCB7IHJlcXVlc3Q6IGUsIHJhdzogITAgfSkpO1xuICAgICAgaWYgKHQuZXJyb3IpXG4gICAgICAgIHRocm93IFN4KHQuZXJyb3IpO1xuICAgICAgcmV0dXJuIHQucmVzdWx0O1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgRXJyb3IgJiYgdC5tZXNzYWdlLm1hdGNoKC9jYW5ub3QgcmVhZCBwcm9wZXJ0eSAnYXBwbHknL2kpKVxuICAgICAgICByZXR1cm4gYXdhaXQgTWUuZXRoUHJvdmlkZXJSZXF1ZXN0KGUpO1xuICAgICAgdGhyb3cgdCBpbnN0YW5jZW9mIG5uIHx8IHQgaW5zdGFuY2VvZiBtciA/IHQgOiBuZXcgQm4oe1xuICAgICAgICBtZXNzYWdlOiB0IGluc3RhbmNlb2YgRXJyb3IgPyB0Lm1lc3NhZ2UgOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSk7XG5hc3luYyBmdW5jdGlvbiBieCgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzID0gYXdhaXQgTWUuZ2V0Q2FwYWJpbGl0aWVzKCk7XG4gICAgcmV0dXJuICFzLmluY2x1ZGVzKFwid2FsbGV0LmdldEV0aGVyZXVtUHJvdmlkZXJcIikgJiYgIXMuaW5jbHVkZXMoXCJ3YWxsZXQuZ2V0RXZtUHJvdmlkZXJcIikgPyB2b2lkIDAgOiBmaTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZpO1xuICB9XG59XG5mdW5jdGlvbiBkZyhzKSB7XG4gIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJlaXA2OTYzOmFubm91bmNlUHJvdmlkZXJcIiwgeyBkZXRhaWw6IE9iamVjdC5mcmVlemUocykgfSk7XG4gIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGUpO1xuICBjb25zdCB0ID0gKCkgPT4gd2luZG93LmRpc3BhdGNoRXZlbnQoZSk7XG4gIHJldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVpcDY5NjM6cmVxdWVzdFByb3ZpZGVyXCIsIHQpLCAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVpcDY5NjM6cmVxdWVzdFByb3ZpZGVyXCIsIHQpO1xufVxudHlwZW9mIGRvY3VtZW50IDwgXCJ1XCIgJiYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJlaXA2OTYzOnJlcXVlc3RQcm92aWRlclwiLCAoKSA9PiB7XG4gIE1lLmVpcDY5NjNSZXF1ZXN0UHJvdmlkZXIoKTtcbn0pLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRmFyY2FzdGVyRnJhbWVFdGhQcm92aWRlckV2ZW50XCIsIChzKSA9PiB7XG4gIGlmIChzIGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YTtcbiAgICB1dS5lbWl0KGUuZXZlbnQsIC4uLmUucGFyYW1zKTtcbiAgfVxufSksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJGYXJjYXN0ZXJGcmFtZUV2ZW50XCIsIChzKSA9PiB7XG4gIGlmIChzIGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YTtcbiAgICBlLmV2ZW50ID09PSBcImVpcDY5NjM6YW5ub3VuY2VQcm92aWRlclwiICYmIGRnKHtcbiAgICAgIGluZm86IGUuaW5mbyxcbiAgICAgIHByb3ZpZGVyOiBmaVxuICAgIH0pO1xuICB9XG59KSk7XG50eXBlb2Ygd2luZG93IDwgXCJ1XCIgJiYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZWlwNjk2MzpyZXF1ZXN0UHJvdmlkZXJcIiwgKCkgPT4ge1xuICBNZS5laXA2OTYzUmVxdWVzdFByb3ZpZGVyKCk7XG59KSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChzKSA9PiB7XG4gIGlmIChzIGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50ICYmIHMuZGF0YS50eXBlID09PSBcImZyYW1lRXRoUHJvdmlkZXJFdmVudFwiKSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YTtcbiAgICB1dS5lbWl0KGUuZXZlbnQsIC4uLmUucGFyYW1zKTtcbiAgfVxufSksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAocykgPT4ge1xuICBpZiAocyBpbnN0YW5jZW9mIE1lc3NhZ2VFdmVudCAmJiBzLmRhdGEudHlwZSA9PT0gXCJmcmFtZUV2ZW50XCIpIHtcbiAgICBjb25zdCBlID0gcy5kYXRhLmV2ZW50O1xuICAgIGUuZXZlbnQgPT09IFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIgJiYgZGcoe1xuICAgICAgaW5mbzogZS5pbmZvLFxuICAgICAgcHJvdmlkZXI6IGZpXG4gICAgfSk7XG4gIH1cbn0pKTtcbm5ldyBUZXh0RW5jb2RlcigpO1xuY29uc3QgaGcgPSBuZXcgVGV4dERlY29kZXIoKSwgVHggPSAocykgPT4ge1xuICBjb25zdCBlID0gYXRvYihzKSwgdCA9IG5ldyBVaW50OEFycmF5KGUubGVuZ3RoKTtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKVxuICAgIHRbcl0gPSBlLmNoYXJDb2RlQXQocik7XG4gIHJldHVybiB0O1xufSwgd3ggPSAocykgPT4ge1xuICBsZXQgZSA9IHM7XG4gIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIChlID0gaGcuZGVjb2RlKGUpKSwgZSA9IGUucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIikucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xuICB0cnkge1xuICAgIHJldHVybiBUeChlKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7XG4gIH1cbn0sIEF4ID0gd3g7XG5mdW5jdGlvbiBJeChzKSB7XG4gIHJldHVybiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiICYmIHMgIT09IG51bGw7XG59XG5mdW5jdGlvbiBfeChzKSB7XG4gIGlmICghSXgocykgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKVxuICAgIHJldHVybiAhMTtcbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihzKSA9PT0gbnVsbClcbiAgICByZXR1cm4gITA7XG4gIGxldCBlID0gcztcbiAgZm9yICg7IE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSAhPT0gbnVsbDsgKVxuICAgIGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocykgPT09IGU7XG59XG5jbGFzcyBkciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHZhciByO1xuICAgIHN1cGVyKGUsIHQpLCB0aGlzLmNvZGUgPSBcIkVSUl9KT1NFX0dFTkVSSUNcIiwgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAociA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSA9PSBudWxsIHx8IHIuY2FsbChFcnJvciwgdGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cbmRyLmNvZGUgPSBcIkVSUl9KT1NFX0dFTkVSSUNcIjtcbmNsYXNzIFJ4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByID0gXCJ1bnNwZWNpZmllZFwiLCBuID0gXCJ1bnNwZWNpZmllZFwiKSB7XG4gICAgc3VwZXIoZSwgeyBjYXVzZTogeyBjbGFpbTogciwgcmVhc29uOiBuLCBwYXlsb2FkOiB0IH0gfSksIHRoaXMuY29kZSA9IFwiRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRFwiLCB0aGlzLmNsYWltID0gciwgdGhpcy5yZWFzb24gPSBuLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG59XG5SeC5jb2RlID0gXCJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEXCI7XG5jbGFzcyBMeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciA9IFwidW5zcGVjaWZpZWRcIiwgbiA9IFwidW5zcGVjaWZpZWRcIikge1xuICAgIHN1cGVyKGUsIHsgY2F1c2U6IHsgY2xhaW06IHIsIHJlYXNvbjogbiwgcGF5bG9hZDogdCB9IH0pLCB0aGlzLmNvZGUgPSBcIkVSUl9KV1RfRVhQSVJFRFwiLCB0aGlzLmNsYWltID0gciwgdGhpcy5yZWFzb24gPSBuLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG59XG5MeC5jb2RlID0gXCJFUlJfSldUX0VYUElSRURcIjtcbmNsYXNzIEN4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmNvZGUgPSBcIkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRFwiO1xuICB9XG59XG5DeC5jb2RlID0gXCJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRURcIjtcbmNsYXNzIGt4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmNvZGUgPSBcIkVSUl9KT1NFX05PVF9TVVBQT1JURURcIjtcbiAgfVxufVxua3guY29kZSA9IFwiRVJSX0pPU0VfTk9UX1NVUFBPUlRFRFwiO1xuY2xhc3MgRHggZXh0ZW5kcyBkciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcImRlY3J5cHRpb24gb3BlcmF0aW9uIGZhaWxlZFwiLCB0KSB7XG4gICAgc3VwZXIoZSwgdCksIHRoaXMuY29kZSA9IFwiRVJSX0pXRV9ERUNSWVBUSU9OX0ZBSUxFRFwiO1xuICB9XG59XG5EeC5jb2RlID0gXCJFUlJfSldFX0RFQ1JZUFRJT05fRkFJTEVEXCI7XG5jbGFzcyBQeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldFX0lOVkFMSURcIjtcbiAgfVxufVxuUHguY29kZSA9IFwiRVJSX0pXRV9JTlZBTElEXCI7XG5jbGFzcyBNeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldTX0lOVkFMSURcIjtcbiAgfVxufVxuTXguY29kZSA9IFwiRVJSX0pXU19JTlZBTElEXCI7XG5jbGFzcyBUcyBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldUX0lOVkFMSURcIjtcbiAgfVxufVxuVHMuY29kZSA9IFwiRVJSX0pXVF9JTlZBTElEXCI7XG5jbGFzcyBPeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldLX0lOVkFMSURcIjtcbiAgfVxufVxuT3guY29kZSA9IFwiRVJSX0pXS19JTlZBTElEXCI7XG5jbGFzcyBCeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldLU19JTlZBTElEXCI7XG4gIH1cbn1cbkJ4LmNvZGUgPSBcIkVSUl9KV0tTX0lOVkFMSURcIjtcbmNsYXNzIEZ4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcihlID0gXCJubyBhcHBsaWNhYmxlIGtleSBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldFwiLCB0KSB7XG4gICAgc3VwZXIoZSwgdCksIHRoaXMuY29kZSA9IFwiRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZXCI7XG4gIH1cbn1cbkZ4LmNvZGUgPSBcIkVSUl9KV0tTX05PX01BVENISU5HX0tFWVwiO1xuY2xhc3MgTnggZXh0ZW5kcyBkciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcIm11bHRpcGxlIG1hdGNoaW5nIGtleXMgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXRcIiwgdCkge1xuICAgIHN1cGVyKGUsIHQpLCB0aGlzLmNvZGUgPSBcIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVNcIjtcbiAgfVxufVxuTnguY29kZSA9IFwiRVJSX0pXS1NfTVVMVElQTEVfTUFUQ0hJTkdfS0VZU1wiO1xuY2xhc3MgVXggZXh0ZW5kcyBkciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcInJlcXVlc3QgdGltZWQgb3V0XCIsIHQpIHtcbiAgICBzdXBlcihlLCB0KSwgdGhpcy5jb2RlID0gXCJFUlJfSldLU19USU1FT1VUXCI7XG4gIH1cbn1cblV4LmNvZGUgPSBcIkVSUl9KV0tTX1RJTUVPVVRcIjtcbmNsYXNzICR4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcihlID0gXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZFwiLCB0KSB7XG4gICAgc3VwZXIoZSwgdCksIHRoaXMuY29kZSA9IFwiRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRFwiO1xuICB9XG59XG4keC5jb2RlID0gXCJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEXCI7XG5mdW5jdGlvbiBHeChzKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcInN0cmluZ1wiKVxuICAgIHRocm93IG5ldyBUcyhcIkpXVHMgbXVzdCB1c2UgQ29tcGFjdCBKV1Mgc2VyaWFsaXphdGlvbiwgSldUIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gIGNvbnN0IHsgMTogZSwgbGVuZ3RoOiB0IH0gPSBzLnNwbGl0KFwiLlwiKTtcbiAgaWYgKHQgPT09IDUpXG4gICAgdGhyb3cgbmV3IFRzKFwiT25seSBKV1RzIHVzaW5nIENvbXBhY3QgSldTIHNlcmlhbGl6YXRpb24gY2FuIGJlIGRlY29kZWRcIik7XG4gIGlmICh0ICE9PSAzKVxuICAgIHRocm93IG5ldyBUcyhcIkludmFsaWQgSldUXCIpO1xuICBpZiAoIWUpXG4gICAgdGhyb3cgbmV3IFRzKFwiSldUcyBtdXN0IGNvbnRhaW4gYSBwYXlsb2FkXCIpO1xuICBsZXQgcjtcbiAgdHJ5IHtcbiAgICByID0gQXgoZSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBUcyhcIkZhaWxlZCB0byBiYXNlNjR1cmwgZGVjb2RlIHRoZSBwYXlsb2FkXCIpO1xuICB9XG4gIGxldCBuO1xuICB0cnkge1xuICAgIG4gPSBKU09OLnBhcnNlKGhnLmRlY29kZShyKSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBUcyhcIkZhaWxlZCB0byBwYXJzZSB0aGUgZGVjb2RlZCBwYXlsb2FkIGFzIEpTT05cIik7XG4gIH1cbiAgaWYgKCFfeChuKSlcbiAgICB0aHJvdyBuZXcgVHMoXCJJbnZhbGlkIEpXVCBDbGFpbXMgU2V0XCIpO1xuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIFZ4KHMpIHtcbiAgcmV0dXJuIEd4KHMpO1xufVxuY2xhc3MgbWEgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQgPSB7fSkge1xuICAgIGNvbnN0IHIgPSAoKCkgPT4ge1xuICAgICAgdmFyIGk7XG4gICAgICBpZiAodC5jYXVzZSBpbnN0YW5jZW9mIG1hKSB7XG4gICAgICAgIGlmICh0LmNhdXNlLmRldGFpbHMpXG4gICAgICAgICAgcmV0dXJuIHQuY2F1c2UuZGV0YWlscztcbiAgICAgICAgaWYgKHQuY2F1c2Uuc2hvcnRNZXNzYWdlKVxuICAgICAgICAgIHJldHVybiB0LmNhdXNlLnNob3J0TWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0LmNhdXNlICYmIFwiZGV0YWlsc1wiIGluIHQuY2F1c2UgJiYgdHlwZW9mIHQuY2F1c2UuZGV0YWlscyA9PSBcInN0cmluZ1wiID8gdC5jYXVzZS5kZXRhaWxzIDogKGkgPSB0LmNhdXNlKSAhPSBudWxsICYmIGkubWVzc2FnZSA/IHQuY2F1c2UubWVzc2FnZSA6IHQuZGV0YWlscztcbiAgICB9KSgpLCBuID0gW1xuICAgICAgZSB8fCBcIkFuIGVycm9yIG9jY3VycmVkLlwiLFxuICAgICAgLi4udC5tZXRhTWVzc2FnZXMgPyBbXCJcIiwgLi4udC5tZXRhTWVzc2FnZXNdIDogW10sXG4gICAgICAuLi5yID8gW1xuICAgICAgICBcIlwiLFxuICAgICAgICByID8gYERldGFpbHM6ICR7cn1gIDogdm9pZCAwXG4gICAgICBdIDogW11cbiAgICBdLmZpbHRlcigoaSkgPT4gdHlwZW9mIGkgPT0gXCJzdHJpbmdcIikuam9pbihgXG5gKTtcbiAgICBzdXBlcihuLCB0LmNhdXNlID8geyBjYXVzZTogdC5jYXVzZSB9IDogdm9pZCAwKSwgdGhpcy5uYW1lID0gXCJCYXNlRXJyb3JcIiwgdGhpcy5jYXVzZSA9IHQuY2F1c2UsIHRoaXMuZGV0YWlscyA9IHIsIHRoaXMuc2hvcnRNZXNzYWdlID0gZTtcbiAgfVxufVxuY2xhc3MgZmcgZXh0ZW5kcyBtYSB7XG4gIGNvbnN0cnVjdG9yKHsgc3RhdHVzOiBlIH0pIHtcbiAgICBzdXBlcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtlfWApLCB0aGlzLm5hbWUgPSBcIlJlcXVlc3RGYWlsZWRFcnJvclwiO1xuICB9XG59XG5jbGFzcyBqeCBleHRlbmRzIG1hIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUpLCB0aGlzLm5hbWUgPSBcIkludmFsaWRUb2tlblwiO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBLeCh7IG9yaWdpbjogcyB9KSB7XG4gIGNvbnN0IGUgPSBhd2FpdCBmZXRjaChgJHtzfS9ub25jZWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiXG4gIH0pO1xuICBpZiAoIWUub2spXG4gICAgdGhyb3cgbmV3IGZnKHsgc3RhdHVzOiBlLnN0YXR1cyB9KTtcbiAgcmV0dXJuIGF3YWl0IGUuanNvbigpO1xufVxuYXN5bmMgZnVuY3Rpb24gSHgoeyBvcmlnaW46IHMgfSwgZSkge1xuICBjb25zdCB0ID0gYXdhaXQgZmV0Y2goYCR7c30vdmVyaWZ5LXNpd2ZgLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0pLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGUpXG4gIH0pO1xuICBpZiAoIXQub2spXG4gICAgdGhyb3cgbmV3IGZnKHsgc3RhdHVzOiB0LnN0YXR1cyB9KTtcbiAgY29uc3QgciA9IGF3YWl0IHQuanNvbigpO1xuICBpZiAoci52YWxpZCA9PT0gITEpXG4gICAgdGhyb3cgbmV3IGp4KHIubWVzc2FnZSA/PyBcInVua25vd25cIik7XG4gIHJldHVybiB7IHRva2VuOiByLnRva2VuIH07XG59XG5mdW5jdGlvbiBxeChzID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICBvcmlnaW46IHMub3JpZ2luID8/IFwiaHR0cHM6Ly9hdXRoLmZhcmNhc3Rlci54eXpcIlxuICB9O1xufVxuZnVuY3Rpb24gV3gocyA9IHt9KSB7XG4gIGNvbnN0IGUgPSBxeChzKTtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZU5vbmNlOiAoKSA9PiBLeChlKSxcbiAgICB2ZXJpZnlTaXdmOiAodCkgPT4gSHgoZSwgdClcbiAgfTtcbn1cbmNvbnN0IHp4ID0gL14oPzooPzxzY2hlbWU+W2EtekEtWl1bYS16QS1aMC05Ky0uXSopOlxcL1xcLyk/KD88ZG9tYWluPlthLXpBLVowLTkrLS5dKig/OjpbMC05XXsxLDV9KT8pICg/OndhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBFdGhlcmV1bSBhY2NvdW50OlxcbikoPzxhZGRyZXNzPjB4W2EtZkEtRjAtOV17NDB9KVxcblxcbig/Oig/PHN0YXRlbWVudD4uKilcXG5cXG4pPy8sIFl4ID0gLyg/OlVSSTogKD88dXJpPi4rKSlcXG4oPzpWZXJzaW9uOiAoPzx2ZXJzaW9uPi4rKSlcXG4oPzpDaGFpbiBJRDogKD88Y2hhaW5JZD5cXGQrKSlcXG4oPzpOb25jZTogKD88bm9uY2U+W2EtekEtWjAtOV0rKSlcXG4oPzpJc3N1ZWQgQXQ6ICg/PGlzc3VlZEF0Pi4rKSkoPzpcXG5FeHBpcmF0aW9uIFRpbWU6ICg/PGV4cGlyYXRpb25UaW1lPi4rKSk/KD86XFxuTm90IEJlZm9yZTogKD88bm90QmVmb3JlPi4rKSk/KD86XFxuUmVxdWVzdCBJRDogKD88cmVxdWVzdElkPi4rKSk/LztcbmZ1bmN0aW9uIFp4KHMpIHtcbiAgdmFyIGQsIGgsIGY7XG4gIGNvbnN0IHsgc2NoZW1lOiBlLCBzdGF0ZW1lbnQ6IHQsIC4uLnIgfSA9ICgoZCA9IHMubWF0Y2goengpKSA9PSBudWxsID8gdm9pZCAwIDogZC5ncm91cHMpID8/IHt9LCB7IGNoYWluSWQ6IG4sIGV4cGlyYXRpb25UaW1lOiBpLCBpc3N1ZWRBdDogbywgbm90QmVmb3JlOiBhLCByZXF1ZXN0SWQ6IGwsIC4uLmMgfSA9ICgoaCA9IHMubWF0Y2goWXgpKSA9PSBudWxsID8gdm9pZCAwIDogaC5ncm91cHMpID8/IHt9LCB1ID0gKGYgPSBzLnNwbGl0KFwiUmVzb3VyY2VzOlwiKVsxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGYuc3BsaXQoYFxuLSBgKS5zbGljZSgxKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yLFxuICAgIC4uLmMsXG4gICAgLi4ubiA/IHsgY2hhaW5JZDogTnVtYmVyKG4pIH0gOiB7fSxcbiAgICAuLi5pID8geyBleHBpcmF0aW9uVGltZTogbmV3IERhdGUoaSkgfSA6IHt9LFxuICAgIC4uLm8gPyB7IGlzc3VlZEF0OiBuZXcgRGF0ZShvKSB9IDoge30sXG4gICAgLi4uYSA/IHsgbm90QmVmb3JlOiBuZXcgRGF0ZShhKSB9IDoge30sXG4gICAgLi4ubCA/IHsgcmVxdWVzdElkOiBsIH0gOiB7fSxcbiAgICAuLi51ID8geyByZXNvdXJjZXM6IHUgfSA6IHt9LFxuICAgIC4uLmUgPyB7IHNjaGVtZTogZSB9IDoge30sXG4gICAgLi4udCA/IHsgc3RhdGVtZW50OiB0IH0gOiB7fVxuICB9O1xufVxuY29uc3QgamQgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgbGV0IHMsIGU7XG4gIGFzeW5jIGZ1bmN0aW9uIHQocikge1xuICAgIGNvbnN0IG4gPSBXeCh7XG4gICAgICBvcmlnaW46IHIucXVpY2tBdXRoU2VydmVyT3JpZ2luXG4gICAgfSksIHsgbm9uY2U6IGkgfSA9IGF3YWl0IG4uZ2VuZXJhdGVOb25jZSgpLCBvID0gYXdhaXQgTWUuc2lnbkluKHtcbiAgICAgIG5vbmNlOiBpLFxuICAgICAgYWNjZXB0QXV0aEFkZHJlc3M6ICEwXG4gICAgfSk7XG4gICAgaWYgKG8ucmVzdWx0KSB7XG4gICAgICBjb25zdCBhID0gWngoby5yZXN1bHQubWVzc2FnZSk7XG4gICAgICBpZiAoIWEuZG9tYWluKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGRvbWFpbiBvbiBTSVdFIG1lc3NhZ2VcIik7XG4gICAgICBjb25zdCBsID0gYXdhaXQgbi52ZXJpZnlTaXdmKHtcbiAgICAgICAgZG9tYWluOiBhLmRvbWFpbixcbiAgICAgICAgbWVzc2FnZTogby5yZXN1bHQubWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlOiBvLnJlc3VsdC5zaWduYXR1cmVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHMgPSB7XG4gICAgICAgIHRva2VuOiBsLnRva2VuLFxuICAgICAgICBwYXlsb2FkOiBWeChsLnRva2VuKVxuICAgICAgfSwgbDtcbiAgICB9XG4gICAgdGhyb3cgby5lcnJvci50eXBlID09PSBcInJlamVjdGVkX2J5X3VzZXJcIiA/IG5ldyBPZigpIDogbmV3IEVycm9yKFwiVW5yZWFjaGFibGVcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXQgdG9rZW4oKSB7XG4gICAgICBpZiAocyAmJiBuZXcgRGF0ZShzLnBheWxvYWQuZXhwICogMWUzKSA+IG5ldyBEYXRlKERhdGUubm93KCkgKyAxNWUzKSlcbiAgICAgICAgcmV0dXJuIHMudG9rZW47XG4gICAgfSxcbiAgICBhc3luYyBnZXRUb2tlbihyID0ge30pIHtcbiAgICAgIGNvbnN0IG4gPSByLmZvcmNlID8/ICExO1xuICAgICAgcmV0dXJuIHMgJiYgIW4gJiYgbmV3IERhdGUocy5wYXlsb2FkLmV4cCAqIDFlMykgPiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTVlMykgPyB7IHRva2VuOiBzLnRva2VuIH0gOiAoZSB8fCAoZSA9IHQocikpLCBlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBlID0gdm9pZCAwO1xuICAgICAgfSksIGUpO1xuICAgIH0sXG4gICAgYXN5bmMgZmV0Y2gociwgbikge1xuICAgICAgY29uc3QgeyB0b2tlbjogaSB9ID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpLCBvID0gbmV3IEhlYWRlcnMobiA9PSBudWxsID8gdm9pZCAwIDogbi5oZWFkZXJzKTtcbiAgICAgIHJldHVybiBvLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke2l9YCksIGZldGNoKHIsIHtcbiAgICAgICAgLi4ubixcbiAgICAgICAgaGVhZGVyczogb1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSkoKTtcbmZ1bmN0aW9uIFh4KCkge1xuICBjb25zdCBzID0gbmV3IEwwKCk7XG4gIHJldHVybiB7XG4gICAgZ2V0IGV2ZW50TmFtZXMoKSB7XG4gICAgICByZXR1cm4gcy5ldmVudE5hbWVzLmJpbmQocyk7XG4gICAgfSxcbiAgICBnZXQgbGlzdGVuZXJDb3VudCgpIHtcbiAgICAgIHJldHVybiBzLmxpc3RlbmVyQ291bnQuYmluZChzKTtcbiAgICB9LFxuICAgIGdldCBsaXN0ZW5lcnMoKSB7XG4gICAgICByZXR1cm4gcy5saXN0ZW5lcnMuYmluZChzKTtcbiAgICB9LFxuICAgIGFkZExpc3RlbmVyOiBzLmFkZExpc3RlbmVyLmJpbmQocyksXG4gICAgZW1pdDogcy5lbWl0LmJpbmQocyksXG4gICAgb2ZmOiBzLm9mZi5iaW5kKHMpLFxuICAgIG9uOiBzLm9uLmJpbmQocyksXG4gICAgb25jZTogcy5vbmNlLmJpbmQocyksXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBzLnJlbW92ZUFsbExpc3RlbmVycy5iaW5kKHMpLFxuICAgIHJlbW92ZUxpc3RlbmVyOiBzLnJlbW92ZUxpc3RlbmVyLmJpbmQocylcbiAgfTtcbn1cbmNvbnN0IG5yID0gWHgoKSwgeyBzb2xhbmFQcm92aWRlclJlcXVlc3Q6IEtkIH0gPSBNZTtcbmxldCBnZztcbktkICYmIChnZyA9IFZFKEtFKEtkKSkpO1xuYXN5bmMgZnVuY3Rpb24gSGQoKSB7XG4gIGxldCBzO1xuICB0cnkge1xuICAgIHMgPSBhd2FpdCBNZS5nZXRDYXBhYmlsaXRpZXMoKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgaWYgKHMgIT0gbnVsbCAmJiBzLmluY2x1ZGVzKFwid2FsbGV0LmdldFNvbGFuYVByb3ZpZGVyXCIpKVxuICAgIHJldHVybiBnZztcbn1cbmxldCBxZCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBKeChzID0gMWUzKSB7XG4gIGlmIChxZCA9PT0gITApXG4gICAgcmV0dXJuICEwO1xuICBpZiAodHlwZW9mIHdpbmRvdyA+IFwidVwiIHx8ICF3aW5kb3cuUmVhY3ROYXRpdmVXZWJWaWV3ICYmIHdpbmRvdyA9PT0gd2luZG93LnBhcmVudClcbiAgICByZXR1cm4gITE7XG4gIGNvbnN0IGUgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgIE1lLmNvbnRleHQudGhlbigodCkgPT4gISF0KSxcbiAgICAvLyBDaGVjayBpZiBjb250ZXh0IHJlc29sdmVzIHRvIHRydXRoeVxuICAgIG5ldyBQcm9taXNlKCh0KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHQoITEpLCBzKTtcbiAgICB9KVxuICBdKS5jYXRjaCgoKSA9PiAhMSk7XG4gIHJldHVybiBlICYmIChxZCA9ICEwKSwgZTtcbn1cbmNvbnN0IFdkID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBzID0gYXdhaXQgTWUuYWRkRnJhbWUoKTtcbiAgaWYgKHMucmVzdWx0KVxuICAgIHJldHVybiBzLnJlc3VsdDtcbiAgdGhyb3cgcy5lcnJvci50eXBlID09PSBcImludmFsaWRfZG9tYWluX21hbmlmZXN0XCIgPyBuZXcgVG0oKSA6IHMuZXJyb3IudHlwZSA9PT0gXCJyZWplY3RlZF9ieV91c2VyXCIgPyBuZXcgd20oKSA6IG5ldyBFcnJvcihcIlVucmVhY2hhYmxlXCIpO1xufSwgaHQgPSB7XG4gIC4uLm5yLFxuICBnZXRDYXBhYmlsaXRpZXM6IE1lLmdldENhcGFiaWxpdGllcyxcbiAgZ2V0Q2hhaW5zOiBNZS5nZXRDaGFpbnMsXG4gIGlzSW5NaW5pQXBwOiBKeCxcbiAgY29udGV4dDogTWUuY29udGV4dCxcbiAgYmFjazogSEUoeyBtaW5pQXBwSG9zdDogTWUsIGVtaXR0ZXI6IG5yIH0pLFxuICBxdWlja0F1dGg6IGpkLFxuICBhY3Rpb25zOiB7XG4gICAgc2V0UHJpbWFyeUJ1dHRvbjogTWUuc2V0UHJpbWFyeUJ1dHRvbi5iaW5kKE1lKSxcbiAgICByZWFkeTogYXN5bmMgKHMgPSB7fSkgPT4gYXdhaXQgTWUucmVhZHkocyksXG4gICAgY2xvc2U6IE1lLmNsb3NlLmJpbmQoTWUpLFxuICAgIHZpZXdDYXN0OiBNZS52aWV3Q2FzdC5iaW5kKE1lKSxcbiAgICB2aWV3UHJvZmlsZTogTWUudmlld1Byb2ZpbGUuYmluZChNZSksXG4gICAgb3Blbk1pbmlBcHA6IE1lLm9wZW5NaW5pQXBwLmJpbmQoTWUpLFxuICAgIHNpZ25JbjogYXN5bmMgKHMpID0+IHtcbiAgICAgIGNvbnN0IGUgPSBhd2FpdCBNZS5zaWduSW4ocyk7XG4gICAgICBpZiAoZS5yZXN1bHQpXG4gICAgICAgIHJldHVybiBlLnJlc3VsdDtcbiAgICAgIHRocm93IGUuZXJyb3IudHlwZSA9PT0gXCJyZWplY3RlZF9ieV91c2VyXCIgPyBuZXcgT2YoKSA6IG5ldyBFcnJvcihcIlVucmVhY2hhYmxlXCIpO1xuICAgIH0sXG4gICAgb3BlblVybDogKHMpID0+IHtcbiAgICAgIGNvbnN0IGUgPSB0eXBlb2YgcyA9PSBcInN0cmluZ1wiID8gcyA6IHMudXJsO1xuICAgICAgcmV0dXJuIE1lLm9wZW5VcmwoZS50cmltKCkpO1xuICAgIH0sXG4gICAgYWRkRnJhbWU6IFdkLFxuICAgIGFkZE1pbmlBcHA6IFdkLFxuICAgIGNvbXBvc2VDYXN0KHMgPSB7fSkge1xuICAgICAgcmV0dXJuIE1lLmNvbXBvc2VDYXN0KHMpO1xuICAgIH0sXG4gICAgdmlld1Rva2VuOiBNZS52aWV3VG9rZW4uYmluZChNZSksXG4gICAgc2VuZFRva2VuOiBNZS5zZW5kVG9rZW4uYmluZChNZSksXG4gICAgc3dhcFRva2VuOiBNZS5zd2FwVG9rZW4uYmluZChNZSksXG4gICAgcmVxdWVzdENhbWVyYUFuZE1pY3JvcGhvbmVBY2Nlc3M6IE1lLnJlcXVlc3RDYW1lcmFBbmRNaWNyb3Bob25lQWNjZXNzLmJpbmQoTWUpXG4gIH0sXG4gIGV4cGVyaW1lbnRhbDoge1xuICAgIGdldFNvbGFuYVByb3ZpZGVyOiBIZCxcbiAgICBzaWduTWFuaWZlc3Q6IGFzeW5jIChzKSA9PiB7XG4gICAgICBjb25zdCBlID0gYXdhaXQgTWUuc2lnbk1hbmlmZXN0KHMpO1xuICAgICAgaWYgKGUucmVzdWx0KVxuICAgICAgICByZXR1cm4gZS5yZXN1bHQ7XG4gICAgICB0aHJvdyBlLmVycm9yLnR5cGUgPT09IFwicmVqZWN0ZWRfYnlfdXNlclwiID8gbmV3IEFtKCkgOiBlLmVycm9yLnR5cGUgPT09IFwiaW52YWxpZF9kb21haW5cIiA/IG5ldyBJbSgpIDogZS5lcnJvci50eXBlID09PSBcImdlbmVyaWNfZXJyb3JcIiA/IG5ldyBfbShlLmVycm9yLm1lc3NhZ2UpIDogbmV3IEVycm9yKFwiVW5yZWFjaGFibGVcIik7XG4gICAgfSxcbiAgICBxdWlja0F1dGgocykge1xuICAgICAgcmV0dXJuIGpkLmdldFRva2VuKHMpO1xuICAgIH1cbiAgfSxcbiAgd2FsbGV0OiB7XG4gICAgZXRoUHJvdmlkZXI6IGZpLFxuICAgIGdldEV0aGVyZXVtUHJvdmlkZXI6IGJ4LFxuICAgIGdldFNvbGFuYVByb3ZpZGVyOiBIZFxuICB9LFxuICBoYXB0aWNzOiB7XG4gICAgaW1wYWN0T2NjdXJyZWQ6IE1lLmltcGFjdE9jY3VycmVkLmJpbmQoTWUpLFxuICAgIG5vdGlmaWNhdGlvbk9jY3VycmVkOiBNZS5ub3RpZmljYXRpb25PY2N1cnJlZC5iaW5kKE1lKSxcbiAgICBzZWxlY3Rpb25DaGFuZ2VkOiBNZS5zZWxlY3Rpb25DaGFuZ2VkLmJpbmQoTWUpXG4gIH1cbn07XG50eXBlb2YgZG9jdW1lbnQgPCBcInVcIiAmJiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRmFyY2FzdGVyRnJhbWVFdmVudFwiLCAocykgPT4ge1xuICBpZiAocyBpbnN0YW5jZW9mIE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IGUgPSBzLmRhdGE7XG4gICAgZS5ldmVudCA9PT0gXCJwcmltYXJ5X2J1dHRvbl9jbGlja2VkXCIgPyBuci5lbWl0KFwicHJpbWFyeUJ1dHRvbkNsaWNrZWRcIikgOiBlLmV2ZW50ID09PSBcIm1pbmlhcHBfYWRkZWRcIiA/IG5yLmVtaXQoXCJtaW5pQXBwQWRkZWRcIiwge1xuICAgICAgbm90aWZpY2F0aW9uRGV0YWlsczogZS5ub3RpZmljYXRpb25EZXRhaWxzXG4gICAgfSkgOiBlLmV2ZW50ID09PSBcIm1pbmlhcHBfYWRkX3JlamVjdGVkXCIgPyBuci5lbWl0KFwibWluaUFwcEFkZFJlamVjdGVkXCIsIHsgcmVhc29uOiBlLnJlYXNvbiB9KSA6IGUuZXZlbnQgPT09IFwibWluaWFwcF9yZW1vdmVkXCIgPyBuci5lbWl0KFwibWluaUFwcFJlbW92ZWRcIikgOiBlLmV2ZW50ID09PSBcIm5vdGlmaWNhdGlvbnNfZW5hYmxlZFwiID8gbnIuZW1pdChcIm5vdGlmaWNhdGlvbnNFbmFibGVkXCIsIHtcbiAgICAgIG5vdGlmaWNhdGlvbkRldGFpbHM6IGUubm90aWZpY2F0aW9uRGV0YWlsc1xuICAgIH0pIDogZS5ldmVudCA9PT0gXCJub3RpZmljYXRpb25zX2Rpc2FibGVkXCIgPyBuci5lbWl0KFwibm90aWZpY2F0aW9uc0Rpc2FibGVkXCIpIDogZS5ldmVudCA9PT0gXCJiYWNrX25hdmlnYXRpb25fdHJpZ2dlcmVkXCIgJiYgbnIuZW1pdChcImJhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkXCIpO1xuICB9XG59KTtcbnR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHMpID0+IHtcbiAgaWYgKHMgaW5zdGFuY2VvZiBNZXNzYWdlRXZlbnQgJiYgcy5kYXRhLnR5cGUgPT09IFwiZnJhbWVFdmVudFwiKSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YS5ldmVudDtcbiAgICBlLmV2ZW50ID09PSBcInByaW1hcnlfYnV0dG9uX2NsaWNrZWRcIiA/IG5yLmVtaXQoXCJwcmltYXJ5QnV0dG9uQ2xpY2tlZFwiKSA6IGUuZXZlbnQgPT09IFwibWluaWFwcF9hZGRlZFwiID8gbnIuZW1pdChcIm1pbmlBcHBBZGRlZFwiLCB7XG4gICAgICBub3RpZmljYXRpb25EZXRhaWxzOiBlLm5vdGlmaWNhdGlvbkRldGFpbHNcbiAgICB9KSA6IGUuZXZlbnQgPT09IFwibWluaWFwcF9hZGRfcmVqZWN0ZWRcIiA/IG5yLmVtaXQoXCJtaW5pQXBwQWRkUmVqZWN0ZWRcIiwgeyByZWFzb246IGUucmVhc29uIH0pIDogZS5ldmVudCA9PT0gXCJtaW5pYXBwX3JlbW92ZWRcIiA/IG5yLmVtaXQoXCJtaW5pQXBwUmVtb3ZlZFwiKSA6IGUuZXZlbnQgPT09IFwibm90aWZpY2F0aW9uc19lbmFibGVkXCIgPyBuci5lbWl0KFwibm90aWZpY2F0aW9uc0VuYWJsZWRcIiwge1xuICAgICAgbm90aWZpY2F0aW9uRGV0YWlsczogZS5ub3RpZmljYXRpb25EZXRhaWxzXG4gICAgfSkgOiBlLmV2ZW50ID09PSBcIm5vdGlmaWNhdGlvbnNfZGlzYWJsZWRcIiA/IG5yLmVtaXQoXCJub3RpZmljYXRpb25zRGlzYWJsZWRcIikgOiBlLmV2ZW50ID09PSBcImJhY2tfbmF2aWdhdGlvbl90cmlnZ2VyZWRcIiAmJiBuci5lbWl0KFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIik7XG4gIH1cbn0pO1xuZnVuY3Rpb24gUXgocykge1xuICBpZiAodHlwZW9mIHdpbmRvdyA+IFwidVwiKVxuICAgIHJldHVybjtcbiAgY29uc3QgZSA9ICh0KSA9PiBzKHQuZGV0YWlsKTtcbiAgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIsIGUpLCB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJlaXA2OTYzOnJlcXVlc3RQcm92aWRlclwiKSksICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIsIGUpO1xufVxuZnVuY3Rpb24gZVMoKSB7XG4gIGNvbnN0IHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgZSA9IFtdO1xuICBjb25zdCB0ID0gKCkgPT4gUXgoKG4pID0+IHtcbiAgICBlLnNvbWUoKHsgaW5mbzogaSB9KSA9PiBpLnV1aWQgPT09IG4uaW5mby51dWlkKSB8fCAoZSA9IFsuLi5lLCBuXSwgcy5mb3JFYWNoKChpKSA9PiBpKGUsIHsgYWRkZWQ6IFtuXSB9KSkpO1xuICB9KTtcbiAgbGV0IHIgPSB0KCk7XG4gIHJldHVybiB7XG4gICAgX2xpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBzLmZvckVhY2goKG4pID0+IG4oW10sIHsgcmVtb3ZlZDogWy4uLmVdIH0pKSwgZSA9IFtdO1xuICAgIH0sXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIHRoaXMuY2xlYXIoKSwgcy5jbGVhcigpLCByID09IG51bGwgfHwgcigpO1xuICAgIH0sXG4gICAgZmluZFByb3ZpZGVyKHsgcmRuczogbiB9KSB7XG4gICAgICByZXR1cm4gZS5maW5kKChpKSA9PiBpLmluZm8ucmRucyA9PT0gbik7XG4gICAgfSxcbiAgICBnZXRQcm92aWRlcnMoKSB7XG4gICAgICByZXR1cm4gZTtcbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5jbGVhcigpLCByID09IG51bGwgfHwgcigpLCByID0gdCgpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKG4sIHsgZW1pdEltbWVkaWF0ZWx5OiBpIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIHMuYWRkKG4pLCBpICYmIG4oZSwgeyBhZGRlZDogZSB9KSwgKCkgPT4gcy5kZWxldGUobik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdFMocywgZSA9IHt9LCB0KSB7XG4gIGlmICghdCB8fCB0ID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhcIkFtcGxpdHVkZTogU2tpcHBpbmcgZXZlbnQgdHJhY2tpbmcgLSBubyB1c2VySWQgYXZhaWxhYmxlIHlldFwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgciA9IHtcbiAgICBldmVudF90eXBlOiBzLFxuICAgIGFwaV9rZXk6IFwiMGM0ZmU0NjE3MWI5YmI4ZWNhMmNhNjFlYjcxZjJlMTlcIixcbiAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgIHVzZXJfaWQ6IHQsXG4gICAgLi4uT2JqZWN0LmtleXMoZSkubGVuZ3RoICYmIHtcbiAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IGVcbiAgICB9XG4gIH07XG4gIGZldGNoKFwiaHR0cHM6Ly9hcGkyLmFtcGxpdHVkZS5jb20vMi9odHRwYXBpXCIsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBhcGlfa2V5OiBcIjBjNGZlNDYxNzFiOWJiOGVjYTJjYTYxZWI3MWYyZTE5XCIsXG4gICAgICBldmVudHM6IFtyXVxuICAgIH0pXG4gIH0pLnRoZW4oKG4pID0+IHtcbiAgICBuLm9rIHx8IGNvbnNvbGUuZGVidWcoXCJBbXBsaXR1ZGUgcmVzcG9uc2UgZXJyb3I6XCIsIG4uc3RhdHVzLCBuLnN0YXR1c1RleHQpO1xuICB9KS5jYXRjaCgobikgPT4ge1xuICAgIGNvbnNvbGUuZGVidWcoXCJBbXBsaXR1ZGUgdHJhY2tpbmcgZXJyb3I6XCIsIG4pO1xuICB9KTtcbn1cbmNvbnN0IHBnID0gYWEoe1xuICBhbmFseXRpY3NFbmFibGVkOiAhMSxcbiAgYmFja0J1dHRvbkVuYWJsZWQ6ICExLFxuICByZXR1cm5Vcmw6IHZvaWQgMFxufSksIG1nID0gc3QuY3JlYXRlQ29udGV4dCh2b2lkIDApO1xuZnVuY3Rpb24gclMoKSB7XG4gIGNvbnN0IHtcbiAgICBhbmFseXRpY3NFbmFibGVkOiBzLFxuICAgIGJhY2tCdXR0b25FbmFibGVkOiBlLFxuICAgIHJldHVyblVybDogdFxuICB9ID0gQWkocGcpLCBbciwgbl0gPSBxZSghMSksIFtpLCBvXSA9IHFlKG51bGwpLCBbYSwgbF0gPSBxZSghMSksIFtjLCB1XSA9IHFlKG51bGwpLCBbZCwgaF0gPSBxZShcIlwiKSwgW2YsIHBdID0gcWUoe30pLCBbeSwgRV0gPSBxZShcIlwiKSwgW2IsIFJdID0gcWUoW10pLCBbQSwgRl0gPSBxZShcIlwiKSwgTSA9IGJ0KC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLCBIID0gYnQoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSksIEsgPSBidCh7fSksIGogPSBidChcIlwiKTtcbiAgSy5jdXJyZW50ID0gZiwgai5jdXJyZW50ID0geTtcbiAgY29uc3QgQyA9IHV0KChtLCB2ID0ge30sIFApID0+IHtcbiAgICBzICYmIHRTKG0sIHYsIFApO1xuICB9LCBbc10pLCBrID0gdXQoKG0pID0+IHtcbiAgICBSKCh2KSA9PiB7XG4gICAgICBjb25zdCBQID0gWy4uLnYsIG1dO1xuICAgICAgcmV0dXJuIEMoXCJuYXZpZ2F0aW9uLnNldEFjdGl2ZVRhYlwiLCB7XG4gICAgICAgIC4uLksuY3VycmVudCxcbiAgICAgICAgdG9UYWI6IG0sXG4gICAgICAgIGhpc3RvcnlMZW5ndGg6IFAubGVuZ3RoXG4gICAgICB9LCBqLmN1cnJlbnQpLCBQO1xuICAgIH0pLCBGKG0pO1xuICB9LCBbQ10pLCAkID0gdXQoYXN5bmMgKG0pID0+IHtcbiAgICBjb25zdCB2ID0gdHlwZW9mIG0gPT0gXCJzdHJpbmdcIiA/IG0gOiBtLnVybDtcbiAgICBhd2FpdCBodC5pc0luTWluaUFwcCgpID8gYXdhaXQgaHQuYWN0aW9ucy5vcGVuVXJsKHYpIDogd2luZG93Lm9wZW4odiwgXCJfYmxhbmtcIik7XG4gIH0sIFtdKSwgVyA9IHV0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBodC5pc0luTWluaUFwcCgpID8gYXdhaXQgaHQuYWN0aW9ucy5jbG9zZSgpIDogd2luZG93LmNsb3NlKCk7XG4gIH0sIFtdKSwgXyA9IHV0KCgpID0+IHtcbiAgICBSKChtKSA9PiB7XG4gICAgICBpZiAobS5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiB0ICYmICQodCksIG07XG4gICAgICBjb25zdCB2ID0gbS5zbGljZSgwLCAtMSksIFAgPSB2Lmxlbmd0aCA+IDAgPyB2W3YubGVuZ3RoIC0gMV0gOiBcIlwiO1xuICAgICAgcmV0dXJuIEYoUCksIEMoXCJuYXZpZ2F0aW9uLm5hdkJhY2tcIiwge1xuICAgICAgICAuLi5LLmN1cnJlbnQsXG4gICAgICAgIGZyb21UYWI6IG1bbS5sZW5ndGggLSAxXSxcbiAgICAgICAgdG9UYWI6IFAsXG4gICAgICAgIGhpc3RvcnlMZW5ndGg6IHYubGVuZ3RoXG4gICAgICB9LCBqLmN1cnJlbnQpLCB2O1xuICAgIH0pO1xuICB9LCBbQywgdCwgJF0pLCBnID0gdXQoKG0pID0+IHtcbiAgICBSKFttXSksIEYobSksIEMoXCJuYXZpZ2F0aW9uLnNldEluaXRpYWxUYWJcIiwge1xuICAgICAgLi4uSy5jdXJyZW50LFxuICAgICAgdGFiOiBtXG4gICAgfSwgai5jdXJyZW50KTtcbiAgfSwgW0NdKSwgeCA9IHV0KGFzeW5jIChtKSA9PiAoQyhcImhhcHRpY3MuaW1wYWN0T2NjdXJyZWRcIiwge1xuICAgIC4uLksuY3VycmVudCxcbiAgICBoYXB0aWNUeXBlOiBtXG4gIH0sIGouY3VycmVudCksIGh0LmhhcHRpY3MuaW1wYWN0T2NjdXJyZWQobSkpLCBbQ10pLCB3ID0gdXQoYXN5bmMgKG0pID0+IChDKFwiaGFwdGljcy5ub3RpZmljYXRpb25PY2N1cnJlZFwiLCB7XG4gICAgLi4uSy5jdXJyZW50LFxuICAgIGhhcHRpY1R5cGU6IG1cbiAgfSwgai5jdXJyZW50KSwgaHQuaGFwdGljcy5ub3RpZmljYXRpb25PY2N1cnJlZChtKSksIFtDXSksIEQgPSB1dChhc3luYyAoKSA9PiAoQyhcImhhcHRpY3Muc2VsZWN0aW9uQ2hhbmdlZFwiLCB7XG4gICAgLi4uSy5jdXJyZW50XG4gIH0sIGouY3VycmVudCksIGh0LmhhcHRpY3Muc2VsZWN0aW9uQ2hhbmdlZCgpKSwgW0NdKSwgTyA9IHV0KGFzeW5jIChtLCB2KSA9PiAodiAmJiBzICYmIEMoXCJjYXN0LmNvbXBvc2VkXCIsIHtcbiAgICAuLi5LLmN1cnJlbnQsXG4gICAgY2FzdFRleHQ6IG0gPT0gbnVsbCA/IHZvaWQgMCA6IG0udGV4dCxcbiAgICBzb3VyY2U6IHZcbiAgfSwgai5jdXJyZW50KSwgaHQuYWN0aW9ucy5jb21wb3NlQ2FzdChtKSksIFtzLCBDXSksIFUgPSBidChfKTtcbiAgVS5jdXJyZW50ID0gXywgZnQoKCkgPT4ge1xuICAgIGlmIChyKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBtID0gITAsIHYgPSBudWxsO1xuICAgIGNvbnN0IFAgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBOID0gYXdhaXQgaHQuY29udGV4dDtcbiAgICAgIGlmICghbSkgcmV0dXJuO1xuICAgICAgaWYgKG8oTiksIGh0Lm9uKFwibWluaUFwcEFkZGVkXCIsICh7XG4gICAgICAgIG5vdGlmaWNhdGlvbkRldGFpbHM6IGVlXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGwoITApLCB1KGVlID8/IG51bGwpLCBoKFwiRnJhbWUgYWRkZWRcIiksIEMoXCJmcmFtZS5hZGRlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgaHQub24oXCJtaW5pQXBwQWRkUmVqZWN0ZWRcIiwgKHtcbiAgICAgICAgcmVhc29uOiBlZVxuICAgICAgfSkgPT4ge1xuICAgICAgICBsKCExKSwgaChgRnJhbWUgYWRkIHJlamVjdGVkOiAke2VlfWApLCBDKFwiZnJhbWUuYWRkLnJlamVjdGVkXCIsIEsuY3VycmVudCwgai5jdXJyZW50KTtcbiAgICAgIH0pLCBodC5vbihcIm1pbmlBcHBSZW1vdmVkXCIsICgpID0+IHtcbiAgICAgICAgbCghMSksIGgoXCJGcmFtZSByZW1vdmVkXCIpLCBDKFwiZnJhbWUucmVtb3ZlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgaHQub24oXCJub3RpZmljYXRpb25zRW5hYmxlZFwiLCAoe1xuICAgICAgICBub3RpZmljYXRpb25EZXRhaWxzOiBlZVxuICAgICAgfSkgPT4ge1xuICAgICAgICB1KGVlID8/IG51bGwpLCBoKFwiTm90aWZpY2F0aW9ucyBlbmFibGVkXCIpLCBDKFwibm90aWZpY2F0aW9ucy5lbmFibGVkXCIsIEsuY3VycmVudCwgai5jdXJyZW50KTtcbiAgICAgIH0pLCBodC5vbihcIm5vdGlmaWNhdGlvbnNEaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICAgIHUobnVsbCksIGgoXCJOb3RpZmljYXRpb25zIGRpc2FibGVkXCIpLCBDKFwibm90aWZpY2F0aW9ucy5kaXNhYmxlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgaHQub24oXCJwcmltYXJ5QnV0dG9uQ2xpY2tlZFwiLCAoKSA9PiB7XG4gICAgICAgIGgoXCJQcmltYXJ5IGJ1dHRvbiBjbGlja2VkXCIpLCBDKFwicHJpbWFyeS1idXR0b24uY2xpY2tlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgdiA9IGVTKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIH0pLCBhd2FpdCBodC5hY3Rpb25zLnJlYWR5KCksIGUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaHQuYmFjay5vbmJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBDKFwiYmFjay1idXR0b24uY2xpY2tlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCksIFUuY3VycmVudCgpO1xuICAgICAgICAgIH0sIGF3YWl0IGh0LmJhY2suc2hvdygpO1xuICAgICAgICB9IGNhdGNoIChlZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIkJhY2sgYnV0dG9uIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjbGllbnQ6XCIsIGVlKTtcbiAgICAgICAgfVxuICAgICAgbSAmJiBuKCEwKTtcbiAgICB9O1xuICAgIGlmIChodClcbiAgICAgIHJldHVybiBQKCksICgpID0+IHtcbiAgICAgICAgbSA9ICExLCBodC5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgaHQuYmFjay5vbmJhY2sgPSBudWxsLCBodC5iYWNrLmhpZGUoKSwgdiAmJiB2KCksIEguY3VycmVudC5mb3JFYWNoKChOKSA9PiBjbGVhclRpbWVvdXQoTikpLCBILmN1cnJlbnQuY2xlYXIoKSwgTS5jdXJyZW50LmNsZWFyKCk7XG4gICAgICB9O1xuICB9LCBbXG4gICAgLy8gT25seSBpbmNsdWRlIHN0YWJsZSByZWZlcmVuY2VzIHRoYXQgd29uJ3QgY2hhbmdlXG4gICAgZSxcbiAgICBDXG4gIF0pLCBmdCgoKSA9PiB7XG4gICAgaSAhPSBudWxsICYmIGkudXNlciAmJiAoaSAhPSBudWxsICYmIGkuY2xpZW50KSAmJiAocCh7XG4gICAgICB1c2VybmFtZTogaS51c2VyLnVzZXJuYW1lLFxuICAgICAgY2xpZW50RmlkOiBpLmNsaWVudC5jbGllbnRGaWRcbiAgICB9KSwgRShgJHtpLnVzZXIuZmlkfWApLCBDKFwiZnJhbWUub3BlbmVkXCIsIHtcbiAgICAgIHVzZXJuYW1lOiBpLnVzZXIudXNlcm5hbWUsXG4gICAgICBjbGllbnRGaWQ6IGkuY2xpZW50LmNsaWVudEZpZCxcbiAgICAgIGxvY2F0aW9uOiBpLmxvY2F0aW9uLFxuICAgICAgYWRkZWQ6IGkuY2xpZW50LmFkZGVkXG4gICAgfSwgYCR7aS51c2VyLmZpZH1gKSk7XG4gIH0sIFtpLCBDXSk7XG4gIGNvbnN0IFtWLCBMXSA9IHFlKFwiXCIpO1xuICByZXR1cm4gZnQoKCkgPT4ge1xuICAgIGNvbnN0IG0gPSAoKSA9PiB7XG4gICAgICBMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICB9O1xuICAgIG0oKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBtKTtcbiAgICBjb25zdCB2ID0gd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlLCBQID0gd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlO1xuICAgIHJldHVybiB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiguLi5OKSB7XG4gICAgICB2LmFwcGx5KHdpbmRvdy5oaXN0b3J5LCBOKSwgbSgpO1xuICAgIH0sIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uKC4uLk4pIHtcbiAgICAgIFAuYXBwbHkod2luZG93Lmhpc3RvcnksIE4pLCBtKCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBtKSwgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlID0gdiwgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gUDtcbiAgICB9O1xuICB9LCBbXSksIGZ0KCgpID0+IHtcbiAgICB2YXIgWSwgZWU7XG4gICAgaWYgKCEoKFkgPSBpID09IG51bGwgPyB2b2lkIDAgOiBpLnVzZXIpICE9IG51bGwgJiYgWS5maWQpIHx8ICEoKGVlID0gaSA9PSBudWxsID8gdm9pZCAwIDogaS5jbGllbnQpICE9IG51bGwgJiYgZWUuY2xpZW50RmlkKSB8fCAhVilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBtID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSwgdiA9IG0uZ2V0KFwidXRtX3NvdXJjZVwiKSwgUCA9IG0uZ2V0KFwidXRtX21lZGl1bVwiKSwgTiA9IG0uZ2V0KFwidXRtX2NhbXBhaWduXCIpO1xuICAgIGlmICh2ID09PSBcIm5leW5hclwiICYmIChQICE9IG51bGwgJiYgUC5zdGFydHNXaXRoKFwic2hhcmUtY2FzdC1cIikpKSB7XG4gICAgICBjb25zdCBpZSA9IFAucmVwbGFjZShcInNoYXJlLWNhc3QtXCIsIFwiXCIpO1xuICAgICAgQyhcImNhc3Quc2hhcmVkXCIsIHtcbiAgICAgICAgdXNlcm5hbWU6IGkudXNlci51c2VybmFtZSxcbiAgICAgICAgY2xpZW50RmlkOiBpLmNsaWVudC5jbGllbnRGaWQsXG4gICAgICAgIHNoYXJlZEJ5RmlkOiBpZVxuICAgICAgfSwgYCR7aS51c2VyLmZpZH1gKTtcbiAgICB9XG4gICAgaWYgKHYgPT09IFwibmV5bmFyXCIgJiYgTikge1xuICAgICAgY29uc3QgaWUgPSBgJHtOfV8ke2kudXNlci5maWR9XyR7RGF0ZS5ub3coKX1gO1xuICAgICAgaWYgKE0uY3VycmVudC5oYXMoaWUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBUZSA9IEguY3VycmVudC5nZXQoaWUpO1xuICAgICAgVGUgJiYgY2xlYXJUaW1lb3V0KFRlKSwgTS5jdXJyZW50LmFkZChpZSk7XG4gICAgICBjb25zdCBEZSA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHplID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5uZXluYXIuY29tL3YyL2ZhcmNhc3Rlci9mcmFtZS9ub3RpZmljYXRpb25zL29wZW5cIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGNhbXBhaWduX2lkOiBOLFxuICAgICAgICAgICAgICBmaWQ6IGkudXNlci5maWQsXG4gICAgICAgICAgICAgIGFwcF9maWQ6IGkuY2xpZW50LmNsaWVudEZpZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB6ZS5vayB8fCBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIG1hcmsgbm90aWZpY2F0aW9uIGFzIG9wZW5lZDogXCIsIGF3YWl0IHplLnRleHQoKSk7XG4gICAgICAgIH0gY2F0Y2ggKHplKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIG1hcmtpbmcgbm90aWZpY2F0aW9uIGFzIG9wZW5lZDogXCIsIHplKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBNLmN1cnJlbnQuZGVsZXRlKGllKSwgSC5jdXJyZW50LmRlbGV0ZShpZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDFlMyk7XG4gICAgICBILmN1cnJlbnQuc2V0KGllLCBEZSk7XG4gICAgfVxuICB9LCBbaSwgQywgVl0pLCB7XG4gICAgLi4uaHQsXG4gICAgaXNTREtMb2FkZWQ6IHIsXG4gICAgY29udGV4dDogaSxcbiAgICBhZGRlZDogYSxcbiAgICBub3RpZmljYXRpb25EZXRhaWxzOiBjLFxuICAgIGxhc3RFdmVudDogZCxcbiAgICBjdXJyZW50VGFiOiBBLFxuICAgIHNldEFjdGl2ZVRhYjogayxcbiAgICBzZXRJbml0aWFsVGFiOiBnLFxuICAgIGhhcHRpY3M6IHtcbiAgICAgIGltcGFjdE9jY3VycmVkOiB4LFxuICAgICAgbm90aWZpY2F0aW9uT2NjdXJyZWQ6IHcsXG4gICAgICBzZWxlY3Rpb25DaGFuZ2VkOiBEXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICAuLi5odC5hY3Rpb25zLFxuICAgICAgb3BlblVybDogJCxcbiAgICAgIGNsb3NlOiBXLFxuICAgICAgY29tcG9zZUNhc3Q6IE9cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBzUyh7XG4gIGNoaWxkcmVuOiBzXG59KSB7XG4gIGNvbnN0IGUgPSByUygpO1xuICByZXR1cm4gZS5pc1NES0xvYWRlZCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtZy5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBlLFxuICAgIGNoaWxkcmVuOiBzXG4gIH0pIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGRSKHtcbiAgY2hpbGRyZW46IHMsXG4gIGFuYWx5dGljc0VuYWJsZWQ6IGUgPSAhMSxcbiAgYmFja0J1dHRvbkVuYWJsZWQ6IHQgPSAhMSxcbiAgcmV0dXJuVXJsOiByXG59KSB7XG4gIGNvbnN0IG4gPSBacigoKSA9PiAoe1xuICAgIGFuYWx5dGljc0VuYWJsZWQ6IGUsXG4gICAgYmFja0J1dHRvbkVuYWJsZWQ6IHQsXG4gICAgcmV0dXJuVXJsOiByXG4gIH0pLCBbZSwgdCwgcl0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KHBnLlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG4sXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChzUywge1xuICAgICAgY2hpbGRyZW46IHNcbiAgICB9KVxuICB9KTtcbn1cbmZ1bmN0aW9uIGhSKCkge1xuICBjb25zdCBzID0gQWkobWcpO1xuICBpZiAocyA9PT0gdm9pZCAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcInVzZU1pbmlBcHAgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIE1pbmlBcHBQcm92aWRlclwiKTtcbiAgcmV0dXJuIHM7XG59XG52YXIgeWcgPSAvKiBAX19QVVJFX18gKi8gKChzKSA9PiAocy5MaWdodCA9IFwibGlnaHRcIiwgcy5EYXJrID0gXCJkYXJrXCIsIHMpKSh5ZyB8fCB7fSksIGdzID0gLyogQF9fUFVSRV9fICovICgocykgPT4gKHMuRkFSQ0FTVEVSID0gXCJmYXJjYXN0ZXJcIiwgcy5ORVlOQVIgPSBcIm5leW5hclwiLCBzLldBUlBDQVNUID0gXCJ3YXJwY2FzdFwiLCBzKSkoZ3MgfHwge30pO1xuZnVuY3Rpb24gZHUocywgZSA9IFwiXCIsIHtcbiAgc2VyaWFsaXplOiB0ID0gSlNPTi5zdHJpbmdpZnksXG4gIGRlc2VyaWFsaXplOiByID0gSlNPTi5wYXJzZVxufSA9IHt9KSB7XG4gIGNvbnN0IFtuLCBpXSA9IHFlKCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA+IFwidVwiKVxuICAgICAgcmV0dXJuIGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGwgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0ocyk7XG4gICAgICByZXR1cm4gbCA/IHIobCkgOiBlO1xuICAgIH0gY2F0Y2ggKGwpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyBmcm9tIGxvY2FsU3RvcmFnZVwiLCBsKSwgZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW24sIChsKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGMgPSBsIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBsKG4pIDogbDtcbiAgICAgIGkoYyksIHR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0ocywgdChjKSk7XG4gICAgfSBjYXRjaCAoYykge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdyaXRpbmcgdG8gbG9jYWxTdG9yYWdlXCIsIGMpO1xuICAgIH1cbiAgfSwgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocyksIGkoZSk7XG4gICAgfSBjYXRjaCAobCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlbW92aW5nIGZyb20gbG9jYWxTdG9yYWdlXCIsIGwpO1xuICAgIH1cbiAgfV07XG59XG52YXIgam4gPSAvKiBAX19QVVJFX18gKi8gKChzKSA9PiAocy5ORVlOQVJfQVVUSEVOVElDQVRFRF9VU0VSID0gXCJuZXluYXJfYXV0aGVudGljYXRlZF91c2VyXCIsIHMpKShqbiB8fCB7fSk7XG5jb25zdCB2ZyA9IGFhKHZvaWQgMCksIG5TID0gKHtcbiAgY2hpbGRyZW46IHMsXG4gIF9zZXRJc0F1dGhlbnRpY2F0ZWQ6IGUsXG4gIF9zZXRVc2VyOiB0LFxuICBfb25BdXRoU3VjY2VzczogcixcbiAgX29uU2lnbm91dDogblxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgaXNBdXRoZW50aWNhdGVkOiBpXG4gIH0gPSB0cygpLCBbbywgYV0gPSBxZSghMSksIFtsLCBjXSA9IHFlKG51bGwpLCBbdV0gPSBkdShqbi5ORVlOQVJfQVVUSEVOVElDQVRFRF9VU0VSKTtcbiAgZnQoKCkgPT4ge1xuICAgIGUobyk7XG4gIH0sIFtvXSksIGZ0KCgpID0+IHtcbiAgICBhKGkpO1xuICB9LCBbaV0pLCBmdCgoKSA9PiB7XG4gICAgdSA/IChjKHUpLCBhKCEwKSkgOiAoYyhudWxsKSwgYSghMSkpO1xuICB9LCBbXSksIGZ0KCgpID0+IHtcbiAgICB0KGwpO1xuICB9LCBbbF0pO1xuICBjb25zdCBkID0gKHApID0+IHtcbiAgICByICYmIHIocCk7XG4gIH0sIGggPSAocCkgPT4ge1xuICAgIG4gJiYgbihwKTtcbiAgfSwgZiA9IFpyKCgpID0+ICh7XG4gICAgaXNBdXRoZW50aWNhdGVkOiBvLFxuICAgIHVzZXI6IGwsXG4gICAgc2V0SXNBdXRoZW50aWNhdGVkOiBhLFxuICAgIHNldFVzZXI6IGMsXG4gICAgb25BdXRoU3VjY2VzczogZCxcbiAgICBvblNpZ25vdXQ6IGhcbiAgfSksIFtvLCBsXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3godmcuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZixcbiAgICBjaGlsZHJlbjogc1xuICB9KTtcbn0sIEVnID0gKCkgPT4ge1xuICBjb25zdCBzID0gQWkodmcpO1xuICBpZiAoIXMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlQXV0aCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgQXV0aENvbnRleHRQcm92aWRlclwiKTtcbiAgcmV0dXJuIHM7XG59LCBpUyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInRiYW9tN2NcIl1cbn0pLCBvUyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInQxZmY0NHppXCJdLFxuICB2YXJpYW50czogW3tcbiAgICBwcm9wczoge1xuICAgICAgdHlwZTogXCJzdWNjZXNzXCJcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJ0MWZmNDR6aS0xXCJcbiAgfSwge1xuICAgIHByb3BzOiB7XG4gICAgICB0eXBlOiBcImVycm9yXCJcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJ0MWZmNDR6aS0yXCJcbiAgfSwge1xuICAgIHByb3BzOiB7XG4gICAgICB0eXBlOiBcIndhcm5pbmdcIlxuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBcInQxZmY0NHppLTNcIlxuICB9LCB7XG4gICAgcHJvcHM6IHtcbiAgICAgIHR5cGU6IFwiaW5mb1wiXG4gICAgfSxcbiAgICBjbGFzc05hbWU6IFwidDFmZjQ0emktNFwiXG4gIH1dXG59KTtcbnZhciB4ZyA9IC8qIEBfX1BVUkVfXyAqLyAoKHMpID0+IChzLlN1Y2Nlc3MgPSBcInN1Y2Nlc3NcIiwgcy5FcnJvciA9IFwiZXJyb3JcIiwgcy5XYXJuaW5nID0gXCJ3YXJuaW5nXCIsIHMuSW5mbyA9IFwiaW5mb1wiLCBzKSkoeGcgfHwge30pO1xuY29uc3QgU2cgPSBhYSh2b2lkIDApLCBmUiA9ICh7XG4gIGNoaWxkcmVuOiBzLFxuICBzZXR0aW5nczoge1xuICAgIGNsaWVudElkOiBlLFxuICAgIGRlZmF1bHRUaGVtZTogdCA9IHlnLkxpZ2h0LFxuICAgIGV2ZW50c0NhbGxiYWNrczogclxuICB9XG59KSA9PiB7XG4gIGNvbnN0IFtuXSA9IHFlKGUpLCBbaSwgb10gPSBxZSghMSksIFthLCBsXSA9IHFlKHQpLCBbYywgdV0gPSBxZShbXSksIFtkLCBoXSA9IHFlKG51bGwpLCBmID0gKEEsIEYpID0+IHtcbiAgICBjb25zdCBNID0ge1xuICAgICAgdHlwZTogQSxcbiAgICAgIG1lc3NhZ2U6IEZcbiAgICB9O1xuICAgIHUoKEgpID0+IFsuLi5ILCBNXSksIHNldFRpbWVvdXQoKCkgPT4gcChNKSwgNWUzKTtcbiAgfSwgcCA9IChBKSA9PiB7XG4gICAgdSgoRikgPT4gRi5maWx0ZXIoKE0pID0+IE0gIT09IEEpKTtcbiAgfTtcbiAgZnQoKCkgPT4ge1xuICAgIGNvbnN0IEEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiOnJvb3RcIik7XG4gICAgQSAmJiAoYSA9PT0gXCJsaWdodFwiID8gKEEuY2xhc3NMaXN0LmFkZChcInRoZW1lLWxpZ2h0XCIpLCBBLmNsYXNzTGlzdC5yZW1vdmUoXCJ0aGVtZS1kYXJrXCIpKSA6IGEgPT09IFwiZGFya1wiICYmIChBLmNsYXNzTGlzdC5hZGQoXCJ0aGVtZS1kYXJrXCIpLCBBLmNsYXNzTGlzdC5yZW1vdmUoXCJ0aGVtZS1saWdodFwiKSkpO1xuICB9LCBbYV0pO1xuICBjb25zdCB5ID0gKEEpID0+IHtcbiAgICBvKEEpO1xuICB9LCBFID0gKEEpID0+IHtcbiAgICBoKEEpO1xuICB9LCBiID0gKCkgPT4ge1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNpZ25lcl91dWlkOiBBLFxuICAgICAgICAuLi5GXG4gICAgICB9ID0gZDtcbiAgICAgIGgobnVsbCksIG8oITEpLCBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShqbi5ORVlOQVJfQVVUSEVOVElDQVRFRF9VU0VSKSwgciAhPSBudWxsICYmIHIub25TaWdub3V0ICYmIHIub25TaWdub3V0KEYpO1xuICAgIH1cbiAgfSwgUiA9IFpyKCgpID0+ICh7XG4gICAgY2xpZW50X2lkOiBuLFxuICAgIHRoZW1lOiBhLFxuICAgIGlzQXV0aGVudGljYXRlZDogaSxcbiAgICB1c2VyOiBkLFxuICAgIHNldFRoZW1lOiBsLFxuICAgIHNob3dUb2FzdDogZixcbiAgICBsb2dvdXRVc2VyOiBiXG4gIH0pLCBbbiwgYSwgaSwgZCwgbCwgZiwgYl0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFNnLlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFIsXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoblMsIHtcbiAgICAgIF9zZXRJc0F1dGhlbnRpY2F0ZWQ6IHksXG4gICAgICBfc2V0VXNlcjogRSxcbiAgICAgIF9vbkF1dGhTdWNjZXNzOiByID09IG51bGwgPyB2b2lkIDAgOiByLm9uQXV0aFN1Y2Nlc3MsXG4gICAgICBfb25TaWdub3V0OiByID09IG51bGwgPyB2b2lkIDAgOiByLm9uU2lnbm91dCxcbiAgICAgIGNoaWxkcmVuOiBbcywgLyogQF9fUFVSRV9fICovIHEuanN4KGlTLCB7XG4gICAgICAgIGNoaWxkcmVuOiBjLm1hcCgoQSwgRikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KG9TLCB7XG4gICAgICAgICAgdHlwZTogQS50eXBlLFxuICAgICAgICAgIGNoaWxkcmVuOiBBLm1lc3NhZ2VcbiAgICAgICAgfSwgRikpXG4gICAgICB9KV1cbiAgICB9KVxuICB9KTtcbn0sIHRzID0gKCkgPT4ge1xuICBjb25zdCBzID0gQWkoU2cpO1xuICBpZiAoIXMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlTmV5bmFyQ29udGV4dCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgTmV5bmFyQ29udGV4dFByb3ZpZGVyXCIpO1xuICByZXR1cm4gcztcbn0sIGFTID0gKCkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjE4XCIsXG4gIGhlaWdodDogXCIxN1wiLFxuICB2aWV3Qm94OiBcIjAgMCAxOCAxN1wiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMy43MjIyIDBINC4yNzc3OEMyLjE5MTM3IDAgMC41IDEuNjkxMzcgMC41IDMuNzc3NzhWMTMuMjIyMkMwLjUgMTUuMzA4NiAyLjE5MTM3IDE3IDQuMjc3NzggMTdIMTMuNzIyMkMxNS44MDg2IDE3IDE3LjUgMTUuMzA4NiAxNy41IDEzLjIyMjJWMy43Nzc3OEMxNy41IDEuNjkxMzcgMTUuODA4NiAwIDEzLjcyMjIgMFpcIixcbiAgICBmaWxsOiBcIiM4NTVEQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNC44ODI4MSAyLjY0NDUzSDEzLjExODRWMTQuMzU1NkgxMS45MDk1VjguOTkxMkgxMS44OTc2QzExLjc2NCA3LjUwODU5IDEwLjUxOCA2LjM0Njc1IDkuMDAwNTkgNi4zNDY3NUM3LjQ4MzIgNi4zNDY3NSA2LjIzNzE3IDcuNTA4NTkgNi4xMDM1NiA4Ljk5MTJINi4wOTE3VjE0LjM1NTZINC44ODI4MVYyLjY0NDUzWlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMi42OTE0MSA0LjMwNjY0TDMuMTgyNTIgNS45Njg4NkgzLjU5ODA3VjEyLjY5MzNDMy4zODk0MyAxMi42OTMzIDMuMjIwMyAxMi44NjI1IDMuMjIwMyAxMy4wNzExVjEzLjUyNDRIMy4xNDQ3NEMyLjkzNjEgMTMuNTI0NCAyLjc2Njk2IDEzLjY5MzYgMi43NjY5NiAxMy45MDIyVjE0LjM1NTVINi45OTgwN1YxMy45MDIyQzYuOTk4MDcgMTMuNjkzNiA2LjgyODkzIDEzLjUyNDQgNi42MjAzIDEzLjUyNDRINi41NDQ3NFYxMy4wNzExQzYuNTQ0NzQgMTIuODYyNSA2LjM3NTYgMTIuNjkzMyA2LjE2Njk2IDEyLjY5MzNINS43MTM2M1Y0LjMwNjY0SDIuNjkxNDFaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMS45ODU0IDEyLjY5MzNDMTEuNzc2OCAxMi42OTMzIDExLjYwNzYgMTIuODYyNSAxMS42MDc2IDEzLjA3MTFWMTMuNTI0NEgxMS41MzIxQzExLjMyMzUgMTMuNTI0NCAxMS4xNTQzIDEzLjY5MzYgMTEuMTU0MyAxMy45MDIyVjE0LjM1NTVIMTUuMzg1NFYxMy45MDIyQzE1LjM4NTQgMTMuNjkzNiAxNS4yMTYyIDEzLjUyNDQgMTUuMDA3NiAxMy41MjQ0SDE0LjkzMjFWMTMuMDcxMUMxNC45MzIxIDEyLjg2MjUgMTQuNzYyOSAxMi42OTMzIDE0LjU1NDMgMTIuNjkzM1Y1Ljk2ODg2SDE0Ljk2OTlMMTUuNDYxIDQuMzA2NjRIMTIuNDM4N1YxMi42OTMzSDExLjk4NTRaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pXVxufSksIHpkID0gKCkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjMyXCIsXG4gIGhlaWdodDogXCIxN1wiLFxuICB2aWV3Qm94OiBcIjAgMCA1MCAyOFwiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTM4LjM3NDQgMTMuNzMxMUMzOC4zNzQ0IDE2LjEyMDkgMzcuNzYzOSAxOC4zNjggMzYuNjkwNCAyMC4zMjUyQzMyLjU2ODUgMTkuODUyNSAyNy44NDcgMTguOTUwMyAyMi44OTk5IDE3LjYyNDdDMjAuNDA1OCAxNi45NTY0IDE4LjAxNTEgMTYuMjIzNiAxNS43Njk3IDE1LjQ0OTVMMTUuNzY5MyAxNS40NDg2QzE1Ljc1NzkgMTUuNDQ1IDE1Ljc0NjUgMTUuNDQxMyAxNS43MzUxIDE1LjQzNzZDMTUuNjQ0OCAxNS40MDY0IDE1LjU1NDcgMTUuMzc1MiAxNS40NjQ5IDE1LjM0MzlDMTIuODk3OCAxNC4zOTkgMTEuMjM1NiAxMi4yMDU2IDExLjQxNjggMTAuMDMxNUwxMS40NDgyIDEwLjAzOTlMMTEuNDIxNSAxMC4wMTMzQzEzLjA0MjcgNC4yMzYxMiAxOC4zNDgzIDAgMjQuNjQzNCAwQzMyLjIyNjggMCAzOC4zNzQ0IDYuMTQ3NjIgMzguMzc0NCAxMy43MzExWlwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMS4zODA0IDE3LjI5ODdDMTIuNDg4MiAxNi41MzEzIDEzLjk2NTggMTYuMTgwNCAxNS41MDAyIDE2LjM5NTNDMTcuNzczMSAxNy4xNTYgMjAuMTY4MiAxNy44NzgyIDIyLjY1MzUgMTguNTQ0MUMyNy4zOTcgMTkuODE1MSAzMS45NTg0IDIwLjc0NDQgMzYuMDgzMyAyMS4zMjc1QzMzLjYyMyAyNS4wMjUyIDI5LjQxNzcgMjcuNDYxOSAyNC42NDM0IDI3LjQ2MTlDMTguMjk0IDI3LjQ2MTkgMTIuOTUxMSAyMy4xNTI0IDExLjM4MDQgMTcuMjk4N1pcIixcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNDMuMDkxNyAxMy40NDU4QzQxLjY0NjEgMTIuNjY0OCAzOS45NzU2IDExLjg3NTkgMzguMTIzMyAxMS4xMDI5QzM4LjAzNjMgMTAuNjU0NCAzNy45Mjc1IDEwLjIxMzYgMzcuNzk4MSA5Ljc4MTc0QzM5Ljk4MDYgMTAuNjY0OCA0MS45NDAzIDExLjU3NTIgNDMuNjEzOSAxMi40Nzk0QzQ1LjcwMDcgMTMuNjA2OSA0Ny4zNzAzIDE0LjczOTQgNDguNDcxNCAxNS44MTZDNDkuNTM1NiAxNi44NTY2IDUwLjIyOTUgMTguMDA2MyA0OS45MyAxOS4xMjQxQzQ5LjYzMDQgMjAuMjQxOSA0OC40NTQ3IDIwLjg5MDYgNDcuMDEyOCAyMS4yNTk3QzQ1LjUyMDkgMjEuNjQxNSA0My41MDg3IDIxLjc4NzUgNDEuMTM3NyAyMS43MjA2QzM5LjYwNDYgMjEuNjc3MyAzNy45MDgyIDIxLjU0NDQgMzYuMDg2NCAyMS4zMjM0QzM2LjMwODYgMjAuOTg5MSAzNi41MTY1IDIwLjY0NDYgMzYuNzA5NCAyMC4yOTA2QzM4LjMxMzQgMjAuNDczMyAzOS44MDkxIDIwLjU4NDEgNDEuMTY4NyAyMC42MjI1QzQzLjQ5NDYgMjAuNjg4MiA0NS4zOTA4IDIwLjU0MDkgNDYuNzQwNCAyMC4xOTU1QzQ4LjE0IDE5LjgzNzMgNDguNzM4OSAxOS4zMjQ5IDQ4Ljg2ODkgMTguODM5OEM0OC45OTg5IDE4LjM1NDcgNDguNzM2NCAxNy42MTE1IDQ3LjcwMzQgMTYuNjAxNUM0Ni43MDczIDE1LjYyNzUgNDUuMTM4OCAxNC41NTE5IDQzLjA5MTcgMTMuNDQ1OFpNOC44NjIyOSAzLjE2NzcyQzEwLjc1ODMgMy4yMjEyOCAxMi45MDM4IDMuNDExNzcgMTUuMjI3OCAzLjczNjYxQzE0Ljg5NzQgNC4wNDgwMyAxNC41ODI0IDQuMzc1NjYgMTQuMjg0MSA0LjcxODIyQzEyLjMwMTYgNC40NjMxNCAxMC40Njc4IDQuMzEyIDguODMxMjcgNC4yNjU3N0M2LjUwNTQxIDQuMjAwMDYgNC42MDkyIDQuMzQ3MzcgMy4yNTk1OCA0LjY5Mjc5QzEuODYwMDEgNS4wNTA5OSAxLjI2MTA3IDUuNTYzNDIgMS4xMzEwOSA2LjA0ODQ5QzEuMDAxMTIgNi41MzM1NiAxLjI2MzYgNy4yNzY4MSAyLjI5NjU3IDguMjg2OEMzLjI5MjY3IDkuMjYwNzUgNC44NjExOCAxMC4zMzY0IDYuOTA4MjggMTEuNDQyNUM2Ljk0MTgxIDExLjQ2MDYgNi45NzU0NiAxMS40Nzg3IDcuMDA5MjMgMTEuNDk2OEM2Ljg0MjUxIDExLjU5MzggNi43MjU3NCAxMS43MTYxIDYuNjYzNTMgMTEuODY0NUM2LjU3NzkxIDEyLjA2ODggNi42MDAxMyAxMi4zMTIxIDYuNzIwMTMgMTIuNTg3NEM2LjYwNzU3IDEyLjUyNzkgNi40OTYyMyAxMi40Njg0IDYuMzg2MTIgMTIuNDA4OUM0LjI5OTI2IDExLjI4MTQgMi42Mjk3MSAxMC4xNDg5IDEuNTI4NiA5LjA3MjIzQzAuNDY0MzY3IDguMDMxNjYgLTAuMjI5NDg1IDYuODgyIDAuMDcwMDM1NCA1Ljc2NDE4QzAuMzY5NTU2IDQuNjQ2MzUgMS41NDUyOCAzLjk5NzY0IDIuOTg3MjIgMy42Mjg2QzQuNDc5MTEgMy4yNDY3NyA2LjQ5MTI2IDMuMTAwNzQgOC44NjIyOSAzLjE2NzcyWlwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwiZWxsaXBzZVwiLCB7XG4gICAgY3g6IFwiNS45NDg2NlwiLFxuICAgIGN5OiBcIjExLjUzMDlcIixcbiAgICByeDogXCIzLjc2MDA5XCIsXG4gICAgcnk6IFwiMC41NzU4MzJcIixcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKDI5LjI4MjQgNS45NDg2NiAxMS41MzA5KVwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KV1cbn0pLCBsUyA9ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzdmdcIiwge1xuICB3aWR0aDogXCIxN1wiLFxuICBoZWlnaHQ6IFwiMTdcIixcbiAgdmlld0JveDogXCIwIDAgMTcgMTdcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KFwibWFza1wiLCB7XG4gICAgaWQ6IFwibWFzazBfODc1XzQ4XCIsXG4gICAgbWFza1VuaXRzOiBcInVzZXJTcGFjZU9uVXNlXCIsXG4gICAgeDogXCIwXCIsXG4gICAgeTogXCIwXCIsXG4gICAgd2lkdGg6IFwiMTdcIixcbiAgICBoZWlnaHQ6IFwiMTdcIixcbiAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgICBkOiBcIk0xNi45OTQ3IDBIMFYxNi45OTQ3SDE2Ljk5NDdWMFpcIixcbiAgICAgIGZpbGw6IFwid2hpdGVcIlxuICAgIH0pXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwiZ1wiLCB7XG4gICAgbWFzazogXCJ1cmwoI21hc2swXzg3NV80OClcIixcbiAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgICAgZDogXCJNMTIuNzg3MSAxNi45OTQ3SDQuMjA3NjVDMS44ODc1NSAxNi45OTQ3IDAgMTUuMTA3MyAwIDEyLjc4NzFWNC4yMDc3MUMwIDEuODg3NTYgMS44ODc1NSAwIDQuMjA3NjUgMEgxMi43ODcxQzE1LjEwNzIgMCAxNi45OTQ3IDEuODg3NTYgMTYuOTk0NyA0LjIwNzcxVjEyLjc4NzFDMTYuOTk0NyAxNS4xMDczIDE1LjEwNzIgMTYuOTk0NyAxMi43ODcxIDE2Ljk5NDdaXCIsXG4gICAgICBmaWxsOiBcIiM0NzJBOTFcIlxuICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICAgIGQ6IFwiTTExLjE1MjMgNS4zNzg5MUwxMC4zMTQzIDguNTI2MDFMOS40NzM2NCA1LjM3ODkxSDcuNTM4OTNMNi42OTAxNyA4LjU0OTE5TDUuODQ0MTkgNS4zNzg5MUgzLjY0MDYyTDUuNjg4MjMgMTIuMzM3MUg3LjU4OTMxTDguNDk4MzUgOS4xMDU5OUw5LjQwNzM2IDEyLjMzNzFIMTEuMzEyNUwxMy4zNTU3IDUuMzc4OTFIMTEuMTUyM1pcIixcbiAgICAgIGZpbGw6IFwid2hpdGVcIlxuICAgIH0pXVxuICB9KV1cbn0pO1xudmFyIGNTID0ge307XG5jb25zdCBpYyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImltZ1wiKSh7XG4gIGNsYXNzZXM6IFtcImlwcGZzcXJcIl1cbn0pLCB1UyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImJ1dHRvblwiKSh7XG4gIGNsYXNzZXM6IFtcImIxeXpzc2piXCJdXG59KSwgZFMgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJtMXhuOGIyZVwiXVxufSksIGhTID0gLyogQF9fUFVSRV9fICovIGRlKFwiYnV0dG9uXCIpKHtcbiAgY2xhc3NlczogW1wibXd1aXF5Z1wiXVxufSksIGZTID0gKHMsIGUpID0+IHtcbiAgaWYgKGUpXG4gICAgcmV0dXJuIGU7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgZ3MuRkFSQ0FTVEVSOlxuICAgICAgcmV0dXJuIFwiU2lnbiBpbiB3aXRoIEZhcmNhc3RlclwiO1xuICAgIGNhc2UgZ3MuTkVZTkFSOlxuICAgICAgcmV0dXJuIFwiU2lnbiBpbiB3aXRoIE5leW5hclwiO1xuICAgIGNhc2UgZ3MuV0FSUENBU1Q6XG4gICAgICByZXR1cm4gXCJTaWduIGluIHdpdGggV2FycGNhc3RcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiU2lnbiBpbiB3aXRoIE5leW5hclwiO1xuICB9XG59LCBnUyA9IChzLCBlLCB0KSA9PiB7XG4gIGlmIChlKVxuICAgIHJldHVybiBlO1xuICBpZiAodClcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KGljLCB7XG4gICAgICBzcmM6IHQsXG4gICAgICBhbHQ6IFwiQ3VzdG9tIGxvZ29cIlxuICAgIH0pO1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIGdzLkZBUkNBU1RFUjpcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goYVMsIHt9KTtcbiAgICBjYXNlIGdzLk5FWU5BUjpcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goemQsIHt9KTtcbiAgICBjYXNlIGdzLldBUlBDQVNUOlxuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChsUywge30pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KHpkLCB7fSk7XG4gIH1cbn0sIHBTID0gKHtcbiAgY2hpbGRyZW46IHMsXG4gIGxhYmVsOiBlLFxuICB2YXJpYW50OiB0ID0gZ3MuTkVZTkFSLFxuICBpY29uOiByLFxuICBjdXN0b21Mb2dvVXJsOiBuLFxuICBtb2RhbFN0eWxlOiBpID0ge30sXG4gIG1vZGFsQnV0dG9uU3R5bGU6IG8gPSB7fSxcbiAgLi4uYVxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgY2xpZW50X2lkOiBsLFxuICAgIHVzZXI6IGMsXG4gICAgaXNBdXRoZW50aWNhdGVkOiB1XG4gIH0gPSB0cygpLCB7XG4gICAgc2V0SXNBdXRoZW50aWNhdGVkOiBkLFxuICAgIHNldFVzZXI6IGgsXG4gICAgb25BdXRoU3VjY2VzczogZixcbiAgICBvblNpZ25vdXQ6IHBcbiAgfSA9IEVnKCksIFt5LCBFLCBiXSA9IGR1KGpuLk5FWU5BUl9BVVRIRU5USUNBVEVEX1VTRVIpLCBbUiwgQV0gPSBxZSghMSksIEYgPSBidChudWxsKSwgTSA9IGAke2NTLk5FWU5BUl9MT0dJTl9VUkwgPz8gXCJodHRwczovL2FwcC5uZXluYXIuY29tL2xvZ2luXCJ9P2NsaWVudF9pZD0ke2x9YCwgSCA9IG5ldyBVUkwoTSkub3JpZ2luLCBLID0gYnQobnVsbCksIGogPSB1dChhc3luYyAoZykgPT4ge1xuICAgIHZhciB4O1xuICAgIGlmIChnLm9yaWdpbiA9PT0gSCAmJiBnLmRhdGEgJiYgZy5kYXRhLmlzX2F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIGQoITApLCAoeCA9IEYuY3VycmVudCkgPT0gbnVsbCB8fCB4LmNsb3NlKCksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBqKTtcbiAgICAgIGNvbnN0IHcgPSB7XG4gICAgICAgIHNpZ25lcl91dWlkOiBnLmRhdGEuc2lnbmVyX3V1aWQsXG4gICAgICAgIC4uLmcuZGF0YS51c2VyXG4gICAgICB9O1xuICAgICAgRSh3KSwgaCh3KSwgZih7XG4gICAgICAgIHVzZXI6IHdcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2wsIGRdKSwgQyA9IHV0KCgpID0+IHtcbiAgICBjb25zdCB3ID0gd2luZG93LnNjcmVlbi53aWR0aCAvIDIgLSAzMDAsIE8gPSBgd2lkdGg9NjAwLGhlaWdodD03MDAsdG9wPSR7d2luZG93LnNjcmVlbi5oZWlnaHQgLyAyIC0gNzAwIC8gMn0sbGVmdD0ke3d9YDtcbiAgICBpZiAoRi5jdXJyZW50ID0gd2luZG93Lm9wZW4oTSwgXCJfYmxhbmtcIiwgTyksICFGLmN1cnJlbnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gb3BlbiB0aGUgYXV0aGVudGljYXRpb24gd2luZG93LiBQbGVhc2UgY2hlY2sgeW91ciBwb3AtdXAgYmxvY2tlciBzZXR0aW5ncy5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBqLCAhMSk7XG4gIH0sIFtsLCBqXSksIGsgPSAoKSA9PiB7XG4gICAgaWYgKGMpIHtcbiAgICAgIGNvbnN0IGcgPSBjO1xuICAgICAgYigpLCBkKCExKSwgVygpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaWduZXJfdXVpZDogeCxcbiAgICAgICAgLi4ud1xuICAgICAgfSA9IGc7XG4gICAgICBwKHcpO1xuICAgIH1cbiAgfSwgJCA9ICgpID0+IEEoITApLCBXID0gKCkgPT4gQSghMSk7XG4gIGZ0KCgpID0+ICgpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaik7XG4gIH0sIFtqXSk7XG4gIGNvbnN0IF8gPSB1dCgoZykgPT4ge1xuICAgIEsuY3VycmVudCAmJiAhSy5jdXJyZW50LmNvbnRhaW5zKGcudGFyZ2V0KSAmJiBXKCk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGZ0KCgpID0+IChSID8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBfKSA6IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgXyksICgpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIF8pO1xuICB9KSwgW1IsIF9dKSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhxLkZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFtSICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoZFMsIHtcbiAgICAgIHN0eWxlOiBpLFxuICAgICAgcmVmOiBLLFxuICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goaWMsIHtcbiAgICAgICAgc3JjOiBjID09IG51bGwgPyB2b2lkIDAgOiBjLnBmcF91cmwsXG4gICAgICAgIGFsdDogYyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzcGFuXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IFtcIkBcIiwgYyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZV1cbiAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goaFMsIHtcbiAgICAgICAgc3R5bGU6IG8sXG4gICAgICAgIG9uQ2xpY2s6IGssXG4gICAgICAgIGNoaWxkcmVuOiBcIlNpZ24gb3V0XCJcbiAgICAgIH0pXVxuICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3godVMsIHtcbiAgICAgIG9uQ2xpY2s6IHUgPyAkIDogQyxcbiAgICAgIC4uLmEsXG4gICAgICBjaGlsZHJlbjogdSA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocS5GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChpYywge1xuICAgICAgICAgIHNyYzogYyA9PSBudWxsID8gdm9pZCAwIDogYy5wZnBfdXJsLFxuICAgICAgICAgIGFsdDogYCR7YyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZX0gcHJvZmlsZSBwaWN0dXJlYFxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhcInNwYW5cIiwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW46IFtcIkBcIiwgYyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZV1cbiAgICAgICAgfSldXG4gICAgICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocS5GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogW2dTKHQsIHIsIG4pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgbWFyZ2luTGVmdDogXCI1cHhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW46IGZTKHQsIGUpXG4gICAgICAgIH0pXVxuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59LCBZbyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImltZ1wiKSh7XG4gIGNsYXNzZXM6IFtcImExMXB0MHhwXCJdLFxuICB2YXJzOiB7XG4gICAgXCJhMTFwdDB4cC0wXCI6IFsocywgZSA9IEdyKSA9PiBzLndpZHRoIHx8IFwiNDVweFwiLCAhMV0sXG4gICAgXCJhMTFwdDB4cC0xXCI6IFsocywgZSA9IEdyKSA9PiBzLndpZHRoIHx8IFwiNDVweFwiLCAhMV1cbiAgfVxufSksIFlkID0gXCJodHRwczovL2ZhcmNhc3Rlci54eXpcIiwgYmcgPSAvKF58XFxzKVxcL1xcdysvZywgVGcgPSAvQFxcdysoXFwuZXRoKT8vZywgd2cgPSAvKChodHRwcz86XFwvXFwvKT8oW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0pKFxcL1teXFxzXSopPykvZywgWmQgPSBuZXcgUmVnRXhwKGAoJHtiZy5zb3VyY2V9KXwoJHtUZy5zb3VyY2V9KXwoJHt3Zy5zb3VyY2V9KWAsIFwiZ1wiKSwgbVMgPSAocykgPT4gYmcudGVzdChzKSA/IGAke1lkfS9+L2NoYW5uZWwke3MudHJpbSgpfWAgOiBUZy50ZXN0KHMpID8gYCR7WWR9LyR7cy5zdWJzdHJpbmcoMSl9YCA6IHdnLnRlc3QocykgPyBzLnN0YXJ0c1dpdGgoXCJodHRwXCIpID8gcyA6IGBodHRwOi8vJHtzfWAgOiBcIlwiLCB5UyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImFcIikoe1xuICBjbGFzc2VzOiBbXCJzNHh5bXFzXCJdXG59KSwgdlMgPSAocykgPT4gcy5maWx0ZXIoKGUpID0+IGUudXJsKS5tYXAoKGUpID0+IGUudXJsKSwgRVMgPSAocywgZSkgPT4ge1xuICBpZiAoIXMpIHJldHVybiBbXTtcbiAgY29uc3QgdCA9IHZTKGUpLCByID0gW107XG4gIGxldCBuID0gMCwgaTtcbiAgZm9yICg7IChpID0gWmQuZXhlYyhzKSkgIT09IG51bGw7ICkge1xuICAgIGNvbnN0IG8gPSBpLmluZGV4O1xuICAgIG4gPCBvICYmIHIucHVzaChzLnNsaWNlKG4sIG8pKTtcbiAgICBjb25zdCBhID0gaVswXS50cmltKCk7XG4gICAgaWYgKHQuaW5jbHVkZXMoYSkpXG4gICAgICByLnB1c2goYSk7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBsID0gbVMoYSk7XG4gICAgICByLnB1c2goLyogQF9fUFVSRV9fICovIHEuanN4KHlTLCB7XG4gICAgICAgIGhyZWY6IGwsXG4gICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgY2hpbGRyZW46IGFcbiAgICAgIH0sIG8pKTtcbiAgICB9XG4gICAgbiA9IFpkLmxhc3RJbmRleDtcbiAgfVxuICByZXR1cm4gbiA8IHMubGVuZ3RoICYmIHIucHVzaChzLnNsaWNlKG4pKSwgcjtcbn0sIElyID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiYmU4N20wbVwiXSxcbiAgdmFyczoge1xuICAgIFwiYmU4N20wbS0wXCI6IFsocywgZSA9IEdyKSA9PiBzLmFsaWduSXRlbXMgfHwgXCJmbGV4LXN0YXJ0XCIsICExXSxcbiAgICBcImJlODdtMG0tMVwiOiBbKHMsIGUgPSBHcikgPT4gcy5qdXN0aWZ5Q29udGVudCB8fCBcImZsZXgtc3RhcnRcIiwgITFdLFxuICAgIFwiYmU4N20wbS0yXCI6IFsocywgZSA9IEdyKSA9PiBzLmZsZXhHcm93IHx8IFwiaW5pdGlhbFwiLCAhMF0sXG4gICAgXCJiZTg3bTBtLTNcIjogWyhzLCBlID0gR3IpID0+IHMuZmxleFNocmluayB8fCBcImluaXRpYWxcIiwgITBdLFxuICAgIFwiYmU4N20wbS00XCI6IFsocywgZSA9IEdyKSA9PiBzLnNwYWNpbmcgPz8gcy5zcGFjaW5nVmVydGljYWwgPz8gcy5zcGFjaW5nVG9wID8/IFwiMHB4XCIsICExXSxcbiAgICBcImJlODdtMG0tNVwiOiBbKHMsIGUgPSBHcikgPT4gcy5zcGFjaW5nID8/IHMuc3BhY2luZ0hvcml6b250YWwgPz8gcy5zcGFjaW5nUmlnaHQgPz8gXCIwcHhcIiwgITFdLFxuICAgIFwiYmU4N20wbS02XCI6IFsocywgZSA9IEdyKSA9PiBzLnNwYWNpbmcgPz8gcy5zcGFjaW5nVmVydGljYWwgPz8gcy5zcGFjaW5nQm90dG9tID8/IFwiMHB4XCIsICExXSxcbiAgICBcImJlODdtMG0tN1wiOiBbKHMsIGUgPSBHcikgPT4gcy5zcGFjaW5nID8/IHMuc3BhY2luZ0hvcml6b250YWwgPz8gcy5zcGFjaW5nTGVmdCA/PyBcIjBweFwiLCAhMV1cbiAgfVxufSksIHhTID0gKCkgPT4gSXIsIFByID0gLyogQF9fUFVSRV9fICovIGRlKHhTKCkpKHtcbiAgY2xhc3NlczogW1wiaGExZHZwaVwiXVxufSksIHVlID0gTnVtYmVyLmlzRmluaXRlIHx8IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUocyk7XG59LCBTUyA9IE51bWJlci5pc1NhZmVJbnRlZ2VyIHx8IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwibnVtYmVyXCIgJiYgTWF0aC5hYnMocykgPD0gYlM7XG59LCBiUyA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IDkwMDcxOTkyNTQ3NDA5OTE7XG5sZXQgdmUgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMuTkVUV09SS19FUlJPUiA9IFwibmV0d29ya0Vycm9yXCIsIHMuTUVESUFfRVJST1IgPSBcIm1lZGlhRXJyb3JcIiwgcy5LRVlfU1lTVEVNX0VSUk9SID0gXCJrZXlTeXN0ZW1FcnJvclwiLCBzLk1VWF9FUlJPUiA9IFwibXV4RXJyb3JcIiwgcy5PVEhFUl9FUlJPUiA9IFwib3RoZXJFcnJvclwiLCBzO1xufSkoe30pLCBKID0gLyogQF9fUFVSRV9fICovIChmdW5jdGlvbihzKSB7XG4gIHJldHVybiBzLktFWV9TWVNURU1fTk9fS0VZUyA9IFwia2V5U3lzdGVtTm9LZXlzXCIsIHMuS0VZX1NZU1RFTV9OT19BQ0NFU1MgPSBcImtleVN5c3RlbU5vQWNjZXNzXCIsIHMuS0VZX1NZU1RFTV9OT19TRVNTSU9OID0gXCJrZXlTeXN0ZW1Ob1Nlc3Npb25cIiwgcy5LRVlfU1lTVEVNX05PX0NPTkZJR1VSRURfTElDRU5TRSA9IFwia2V5U3lzdGVtTm9Db25maWd1cmVkTGljZW5zZVwiLCBzLktFWV9TWVNURU1fTElDRU5TRV9SRVFVRVNUX0ZBSUxFRCA9IFwia2V5U3lzdGVtTGljZW5zZVJlcXVlc3RGYWlsZWRcIiwgcy5LRVlfU1lTVEVNX1NFUlZFUl9DRVJUSUZJQ0FURV9SRVFVRVNUX0ZBSUxFRCA9IFwia2V5U3lzdGVtU2VydmVyQ2VydGlmaWNhdGVSZXF1ZXN0RmFpbGVkXCIsIHMuS0VZX1NZU1RFTV9TRVJWRVJfQ0VSVElGSUNBVEVfVVBEQVRFX0ZBSUxFRCA9IFwia2V5U3lzdGVtU2VydmVyQ2VydGlmaWNhdGVVcGRhdGVGYWlsZWRcIiwgcy5LRVlfU1lTVEVNX1NFU1NJT05fVVBEQVRFX0ZBSUxFRCA9IFwia2V5U3lzdGVtU2Vzc2lvblVwZGF0ZUZhaWxlZFwiLCBzLktFWV9TWVNURU1fU1RBVFVTX09VVFBVVF9SRVNUUklDVEVEID0gXCJrZXlTeXN0ZW1TdGF0dXNPdXRwdXRSZXN0cmljdGVkXCIsIHMuS0VZX1NZU1RFTV9TVEFUVVNfSU5URVJOQUxfRVJST1IgPSBcImtleVN5c3RlbVN0YXR1c0ludGVybmFsRXJyb3JcIiwgcy5LRVlfU1lTVEVNX0RFU1RST1lfTUVESUFfS0VZU19FUlJPUiA9IFwia2V5U3lzdGVtRGVzdHJveU1lZGlhS2V5c0Vycm9yXCIsIHMuS0VZX1NZU1RFTV9ERVNUUk9ZX0NMT1NFX1NFU1NJT05fRVJST1IgPSBcImtleVN5c3RlbURlc3Ryb3lDbG9zZVNlc3Npb25FcnJvclwiLCBzLktFWV9TWVNURU1fREVTVFJPWV9SRU1PVkVfU0VTU0lPTl9FUlJPUiA9IFwia2V5U3lzdGVtRGVzdHJveVJlbW92ZVNlc3Npb25FcnJvclwiLCBzLk1BTklGRVNUX0xPQURfRVJST1IgPSBcIm1hbmlmZXN0TG9hZEVycm9yXCIsIHMuTUFOSUZFU1RfTE9BRF9USU1FT1VUID0gXCJtYW5pZmVzdExvYWRUaW1lT3V0XCIsIHMuTUFOSUZFU1RfUEFSU0lOR19FUlJPUiA9IFwibWFuaWZlc3RQYXJzaW5nRXJyb3JcIiwgcy5NQU5JRkVTVF9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SID0gXCJtYW5pZmVzdEluY29tcGF0aWJsZUNvZGVjc0Vycm9yXCIsIHMuTEVWRUxfRU1QVFlfRVJST1IgPSBcImxldmVsRW1wdHlFcnJvclwiLCBzLkxFVkVMX0xPQURfRVJST1IgPSBcImxldmVsTG9hZEVycm9yXCIsIHMuTEVWRUxfTE9BRF9USU1FT1VUID0gXCJsZXZlbExvYWRUaW1lT3V0XCIsIHMuTEVWRUxfUEFSU0lOR19FUlJPUiA9IFwibGV2ZWxQYXJzaW5nRXJyb3JcIiwgcy5MRVZFTF9TV0lUQ0hfRVJST1IgPSBcImxldmVsU3dpdGNoRXJyb3JcIiwgcy5BVURJT19UUkFDS19MT0FEX0VSUk9SID0gXCJhdWRpb1RyYWNrTG9hZEVycm9yXCIsIHMuQVVESU9fVFJBQ0tfTE9BRF9USU1FT1VUID0gXCJhdWRpb1RyYWNrTG9hZFRpbWVPdXRcIiwgcy5TVUJUSVRMRV9MT0FEX0VSUk9SID0gXCJzdWJ0aXRsZVRyYWNrTG9hZEVycm9yXCIsIHMuU1VCVElUTEVfVFJBQ0tfTE9BRF9USU1FT1VUID0gXCJzdWJ0aXRsZVRyYWNrTG9hZFRpbWVPdXRcIiwgcy5GUkFHX0xPQURfRVJST1IgPSBcImZyYWdMb2FkRXJyb3JcIiwgcy5GUkFHX0xPQURfVElNRU9VVCA9IFwiZnJhZ0xvYWRUaW1lT3V0XCIsIHMuRlJBR19ERUNSWVBUX0VSUk9SID0gXCJmcmFnRGVjcnlwdEVycm9yXCIsIHMuRlJBR19QQVJTSU5HX0VSUk9SID0gXCJmcmFnUGFyc2luZ0Vycm9yXCIsIHMuRlJBR19HQVAgPSBcImZyYWdHYXBcIiwgcy5SRU1VWF9BTExPQ19FUlJPUiA9IFwicmVtdXhBbGxvY0Vycm9yXCIsIHMuS0VZX0xPQURfRVJST1IgPSBcImtleUxvYWRFcnJvclwiLCBzLktFWV9MT0FEX1RJTUVPVVQgPSBcImtleUxvYWRUaW1lT3V0XCIsIHMuQlVGRkVSX0FERF9DT0RFQ19FUlJPUiA9IFwiYnVmZmVyQWRkQ29kZWNFcnJvclwiLCBzLkJVRkZFUl9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SID0gXCJidWZmZXJJbmNvbXBhdGlibGVDb2RlY3NFcnJvclwiLCBzLkJVRkZFUl9BUFBFTkRfRVJST1IgPSBcImJ1ZmZlckFwcGVuZEVycm9yXCIsIHMuQlVGRkVSX0FQUEVORElOR19FUlJPUiA9IFwiYnVmZmVyQXBwZW5kaW5nRXJyb3JcIiwgcy5CVUZGRVJfU1RBTExFRF9FUlJPUiA9IFwiYnVmZmVyU3RhbGxlZEVycm9yXCIsIHMuQlVGRkVSX0ZVTExfRVJST1IgPSBcImJ1ZmZlckZ1bGxFcnJvclwiLCBzLkJVRkZFUl9TRUVLX09WRVJfSE9MRSA9IFwiYnVmZmVyU2Vla092ZXJIb2xlXCIsIHMuQlVGRkVSX05VREdFX09OX1NUQUxMID0gXCJidWZmZXJOdWRnZU9uU3RhbGxcIiwgcy5BU1NFVF9MSVNUX0xPQURfRVJST1IgPSBcImFzc2V0TGlzdExvYWRFcnJvclwiLCBzLkFTU0VUX0xJU1RfTE9BRF9USU1FT1VUID0gXCJhc3NldExpc3RMb2FkVGltZW91dFwiLCBzLkFTU0VUX0xJU1RfUEFSU0lOR19FUlJPUiA9IFwiYXNzZXRMaXN0UGFyc2luZ0Vycm9yXCIsIHMuSU5URVJTVElUSUFMX0FTU0VUX0lURU1fRVJST1IgPSBcImludGVyc3RpdGlhbEFzc2V0SXRlbUVycm9yXCIsIHMuSU5URVJOQUxfRVhDRVBUSU9OID0gXCJpbnRlcm5hbEV4Y2VwdGlvblwiLCBzLklOVEVSTkFMX0FCT1JURUQgPSBcImFib3J0ZWRcIiwgcy5BVFRBQ0hfTUVESUFfRVJST1IgPSBcImF0dGFjaE1lZGlhRXJyb3JcIiwgcy5VTktOT1dOID0gXCJ1bmtub3duXCIsIHM7XG59KSh7fSksIEkgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMuTUVESUFfQVRUQUNISU5HID0gXCJobHNNZWRpYUF0dGFjaGluZ1wiLCBzLk1FRElBX0FUVEFDSEVEID0gXCJobHNNZWRpYUF0dGFjaGVkXCIsIHMuTUVESUFfREVUQUNISU5HID0gXCJobHNNZWRpYURldGFjaGluZ1wiLCBzLk1FRElBX0RFVEFDSEVEID0gXCJobHNNZWRpYURldGFjaGVkXCIsIHMuTUVESUFfRU5ERUQgPSBcImhsc01lZGlhRW5kZWRcIiwgcy5TVEFMTF9SRVNPTFZFRCA9IFwiaGxzU3RhbGxSZXNvbHZlZFwiLCBzLkJVRkZFUl9SRVNFVCA9IFwiaGxzQnVmZmVyUmVzZXRcIiwgcy5CVUZGRVJfQ09ERUNTID0gXCJobHNCdWZmZXJDb2RlY3NcIiwgcy5CVUZGRVJfQ1JFQVRFRCA9IFwiaGxzQnVmZmVyQ3JlYXRlZFwiLCBzLkJVRkZFUl9BUFBFTkRJTkcgPSBcImhsc0J1ZmZlckFwcGVuZGluZ1wiLCBzLkJVRkZFUl9BUFBFTkRFRCA9IFwiaGxzQnVmZmVyQXBwZW5kZWRcIiwgcy5CVUZGRVJfRU9TID0gXCJobHNCdWZmZXJFb3NcIiwgcy5CVUZGRVJFRF9UT19FTkQgPSBcImhsc0J1ZmZlcmVkVG9FbmRcIiwgcy5CVUZGRVJfRkxVU0hJTkcgPSBcImhsc0J1ZmZlckZsdXNoaW5nXCIsIHMuQlVGRkVSX0ZMVVNIRUQgPSBcImhsc0J1ZmZlckZsdXNoZWRcIiwgcy5NQU5JRkVTVF9MT0FESU5HID0gXCJobHNNYW5pZmVzdExvYWRpbmdcIiwgcy5NQU5JRkVTVF9MT0FERUQgPSBcImhsc01hbmlmZXN0TG9hZGVkXCIsIHMuTUFOSUZFU1RfUEFSU0VEID0gXCJobHNNYW5pZmVzdFBhcnNlZFwiLCBzLkxFVkVMX1NXSVRDSElORyA9IFwiaGxzTGV2ZWxTd2l0Y2hpbmdcIiwgcy5MRVZFTF9TV0lUQ0hFRCA9IFwiaGxzTGV2ZWxTd2l0Y2hlZFwiLCBzLkxFVkVMX0xPQURJTkcgPSBcImhsc0xldmVsTG9hZGluZ1wiLCBzLkxFVkVMX0xPQURFRCA9IFwiaGxzTGV2ZWxMb2FkZWRcIiwgcy5MRVZFTF9VUERBVEVEID0gXCJobHNMZXZlbFVwZGF0ZWRcIiwgcy5MRVZFTF9QVFNfVVBEQVRFRCA9IFwiaGxzTGV2ZWxQdHNVcGRhdGVkXCIsIHMuTEVWRUxTX1VQREFURUQgPSBcImhsc0xldmVsc1VwZGF0ZWRcIiwgcy5BVURJT19UUkFDS1NfVVBEQVRFRCA9IFwiaGxzQXVkaW9UcmFja3NVcGRhdGVkXCIsIHMuQVVESU9fVFJBQ0tfU1dJVENISU5HID0gXCJobHNBdWRpb1RyYWNrU3dpdGNoaW5nXCIsIHMuQVVESU9fVFJBQ0tfU1dJVENIRUQgPSBcImhsc0F1ZGlvVHJhY2tTd2l0Y2hlZFwiLCBzLkFVRElPX1RSQUNLX0xPQURJTkcgPSBcImhsc0F1ZGlvVHJhY2tMb2FkaW5nXCIsIHMuQVVESU9fVFJBQ0tfTE9BREVEID0gXCJobHNBdWRpb1RyYWNrTG9hZGVkXCIsIHMuQVVESU9fVFJBQ0tfVVBEQVRFRCA9IFwiaGxzQXVkaW9UcmFja1VwZGF0ZWRcIiwgcy5TVUJUSVRMRV9UUkFDS1NfVVBEQVRFRCA9IFwiaGxzU3VidGl0bGVUcmFja3NVcGRhdGVkXCIsIHMuU1VCVElUTEVfVFJBQ0tTX0NMRUFSRUQgPSBcImhsc1N1YnRpdGxlVHJhY2tzQ2xlYXJlZFwiLCBzLlNVQlRJVExFX1RSQUNLX1NXSVRDSCA9IFwiaGxzU3VidGl0bGVUcmFja1N3aXRjaFwiLCBzLlNVQlRJVExFX1RSQUNLX0xPQURJTkcgPSBcImhsc1N1YnRpdGxlVHJhY2tMb2FkaW5nXCIsIHMuU1VCVElUTEVfVFJBQ0tfTE9BREVEID0gXCJobHNTdWJ0aXRsZVRyYWNrTG9hZGVkXCIsIHMuU1VCVElUTEVfVFJBQ0tfVVBEQVRFRCA9IFwiaGxzU3VidGl0bGVUcmFja1VwZGF0ZWRcIiwgcy5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCA9IFwiaGxzU3VidGl0bGVGcmFnUHJvY2Vzc2VkXCIsIHMuQ1VFU19QQVJTRUQgPSBcImhsc0N1ZXNQYXJzZWRcIiwgcy5OT05fTkFUSVZFX1RFWFRfVFJBQ0tTX0ZPVU5EID0gXCJobHNOb25OYXRpdmVUZXh0VHJhY2tzRm91bmRcIiwgcy5JTklUX1BUU19GT1VORCA9IFwiaGxzSW5pdFB0c0ZvdW5kXCIsIHMuRlJBR19MT0FESU5HID0gXCJobHNGcmFnTG9hZGluZ1wiLCBzLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCA9IFwiaGxzRnJhZ0xvYWRFbWVyZ2VuY3lBYm9ydGVkXCIsIHMuRlJBR19MT0FERUQgPSBcImhsc0ZyYWdMb2FkZWRcIiwgcy5GUkFHX0RFQ1JZUFRFRCA9IFwiaGxzRnJhZ0RlY3J5cHRlZFwiLCBzLkZSQUdfUEFSU0lOR19JTklUX1NFR01FTlQgPSBcImhsc0ZyYWdQYXJzaW5nSW5pdFNlZ21lbnRcIiwgcy5GUkFHX1BBUlNJTkdfVVNFUkRBVEEgPSBcImhsc0ZyYWdQYXJzaW5nVXNlcmRhdGFcIiwgcy5GUkFHX1BBUlNJTkdfTUVUQURBVEEgPSBcImhsc0ZyYWdQYXJzaW5nTWV0YWRhdGFcIiwgcy5GUkFHX1BBUlNFRCA9IFwiaGxzRnJhZ1BhcnNlZFwiLCBzLkZSQUdfQlVGRkVSRUQgPSBcImhsc0ZyYWdCdWZmZXJlZFwiLCBzLkZSQUdfQ0hBTkdFRCA9IFwiaGxzRnJhZ0NoYW5nZWRcIiwgcy5GUFNfRFJPUCA9IFwiaGxzRnBzRHJvcFwiLCBzLkZQU19EUk9QX0xFVkVMX0NBUFBJTkcgPSBcImhsc0Zwc0Ryb3BMZXZlbENhcHBpbmdcIiwgcy5NQVhfQVVUT19MRVZFTF9VUERBVEVEID0gXCJobHNNYXhBdXRvTGV2ZWxVcGRhdGVkXCIsIHMuRVJST1IgPSBcImhsc0Vycm9yXCIsIHMuREVTVFJPWUlORyA9IFwiaGxzRGVzdHJveWluZ1wiLCBzLktFWV9MT0FESU5HID0gXCJobHNLZXlMb2FkaW5nXCIsIHMuS0VZX0xPQURFRCA9IFwiaGxzS2V5TG9hZGVkXCIsIHMuTElWRV9CQUNLX0JVRkZFUl9SRUFDSEVEID0gXCJobHNMaXZlQmFja0J1ZmZlclJlYWNoZWRcIiwgcy5CQUNLX0JVRkZFUl9SRUFDSEVEID0gXCJobHNCYWNrQnVmZmVyUmVhY2hlZFwiLCBzLlNURUVSSU5HX01BTklGRVNUX0xPQURFRCA9IFwiaGxzU3RlZXJpbmdNYW5pZmVzdExvYWRlZFwiLCBzLkFTU0VUX0xJU1RfTE9BRElORyA9IFwiaGxzQXNzZXRMaXN0TG9hZGluZ1wiLCBzLkFTU0VUX0xJU1RfTE9BREVEID0gXCJobHNBc3NldExpc3RMb2FkZWRcIiwgcy5JTlRFUlNUSVRJQUxTX1VQREFURUQgPSBcImhsc0ludGVyc3RpdGlhbHNVcGRhdGVkXCIsIHMuSU5URVJTVElUSUFMU19CVUZGRVJFRF9UT19CT1VOREFSWSA9IFwiaGxzSW50ZXJzdGl0aWFsc0J1ZmZlcmVkVG9Cb3VuZGFyeVwiLCBzLklOVEVSU1RJVElBTF9BU1NFVF9QTEFZRVJfQ1JFQVRFRCA9IFwiaGxzSW50ZXJzdGl0aWFsQXNzZXRQbGF5ZXJDcmVhdGVkXCIsIHMuSU5URVJTVElUSUFMX1NUQVJURUQgPSBcImhsc0ludGVyc3RpdGlhbFN0YXJ0ZWRcIiwgcy5JTlRFUlNUSVRJQUxfQVNTRVRfU1RBUlRFRCA9IFwiaGxzSW50ZXJzdGl0aWFsQXNzZXRTdGFydGVkXCIsIHMuSU5URVJTVElUSUFMX0FTU0VUX0VOREVEID0gXCJobHNJbnRlcnN0aXRpYWxBc3NldEVuZGVkXCIsIHMuSU5URVJTVElUSUFMX0FTU0VUX0VSUk9SID0gXCJobHNJbnRlcnN0aXRpYWxBc3NldEVycm9yXCIsIHMuSU5URVJTVElUSUFMX0VOREVEID0gXCJobHNJbnRlcnN0aXRpYWxFbmRlZFwiLCBzLklOVEVSU1RJVElBTFNfUFJJTUFSWV9SRVNVTUVEID0gXCJobHNJbnRlcnN0aXRpYWxzUHJpbWFyeVJlc3VtZWRcIiwgcy5QTEFZT1VUX0xJTUlUX1JFQUNIRUQgPSBcImhsc1BsYXlvdXRMaW1pdFJlYWNoZWRcIiwgcy5FVkVOVF9DVUVfRU5URVIgPSBcImhsc0V2ZW50Q3VlRW50ZXJcIiwgcztcbn0pKHt9KTtcbnZhciBLZSA9IHtcbiAgTUFOSUZFU1Q6IFwibWFuaWZlc3RcIixcbiAgTEVWRUw6IFwibGV2ZWxcIixcbiAgQVVESU9fVFJBQ0s6IFwiYXVkaW9UcmFja1wiLFxuICBTVUJUSVRMRV9UUkFDSzogXCJzdWJ0aXRsZVRyYWNrXCJcbn0sIHBlID0ge1xuICBNQUlOOiBcIm1haW5cIixcbiAgQVVESU86IFwiYXVkaW9cIixcbiAgU1VCVElUTEU6IFwic3VidGl0bGVcIlxufTtcbmNsYXNzIGhuIHtcbiAgLy8gIEFib3V0IGhhbGYgb2YgdGhlIGVzdGltYXRlZCB2YWx1ZSB3aWxsIGJlIGZyb20gdGhlIGxhc3QgfGhhbGZMaWZlfCBzYW1wbGVzIGJ5IHdlaWdodC5cbiAgY29uc3RydWN0b3IoZSwgdCA9IDAsIHIgPSAwKSB7XG4gICAgdGhpcy5oYWxmTGlmZSA9IHZvaWQgMCwgdGhpcy5hbHBoYV8gPSB2b2lkIDAsIHRoaXMuZXN0aW1hdGVfID0gdm9pZCAwLCB0aGlzLnRvdGFsV2VpZ2h0XyA9IHZvaWQgMCwgdGhpcy5oYWxmTGlmZSA9IGUsIHRoaXMuYWxwaGFfID0gZSA/IE1hdGguZXhwKE1hdGgubG9nKDAuNSkgLyBlKSA6IDAsIHRoaXMuZXN0aW1hdGVfID0gdCwgdGhpcy50b3RhbFdlaWdodF8gPSByO1xuICB9XG4gIHNhbXBsZShlLCB0KSB7XG4gICAgY29uc3QgciA9IE1hdGgucG93KHRoaXMuYWxwaGFfLCBlKTtcbiAgICB0aGlzLmVzdGltYXRlXyA9IHQgKiAoMSAtIHIpICsgciAqIHRoaXMuZXN0aW1hdGVfLCB0aGlzLnRvdGFsV2VpZ2h0XyArPSBlO1xuICB9XG4gIGdldFRvdGFsV2VpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnRvdGFsV2VpZ2h0XztcbiAgfVxuICBnZXRFc3RpbWF0ZSgpIHtcbiAgICBpZiAodGhpcy5hbHBoYV8pIHtcbiAgICAgIGNvbnN0IGUgPSAxIC0gTWF0aC5wb3codGhpcy5hbHBoYV8sIHRoaXMudG90YWxXZWlnaHRfKTtcbiAgICAgIGlmIChlKVxuICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZV8gLyBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZV87XG4gIH1cbn1cbmNsYXNzIFRTIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciwgbiA9IDEwMCkge1xuICAgIHRoaXMuZGVmYXVsdEVzdGltYXRlXyA9IHZvaWQgMCwgdGhpcy5taW5XZWlnaHRfID0gdm9pZCAwLCB0aGlzLm1pbkRlbGF5TXNfID0gdm9pZCAwLCB0aGlzLnNsb3dfID0gdm9pZCAwLCB0aGlzLmZhc3RfID0gdm9pZCAwLCB0aGlzLmRlZmF1bHRUVEZCXyA9IHZvaWQgMCwgdGhpcy50dGZiXyA9IHZvaWQgMCwgdGhpcy5kZWZhdWx0RXN0aW1hdGVfID0gciwgdGhpcy5taW5XZWlnaHRfID0gMWUtMywgdGhpcy5taW5EZWxheU1zXyA9IDUwLCB0aGlzLnNsb3dfID0gbmV3IGhuKGUpLCB0aGlzLmZhc3RfID0gbmV3IGhuKHQpLCB0aGlzLmRlZmF1bHRUVEZCXyA9IG4sIHRoaXMudHRmYl8gPSBuZXcgaG4oZSk7XG4gIH1cbiAgdXBkYXRlKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzbG93XzogcixcbiAgICAgIGZhc3RfOiBuLFxuICAgICAgdHRmYl86IGlcbiAgICB9ID0gdGhpcztcbiAgICByLmhhbGZMaWZlICE9PSBlICYmICh0aGlzLnNsb3dfID0gbmV3IGhuKGUsIHIuZ2V0RXN0aW1hdGUoKSwgci5nZXRUb3RhbFdlaWdodCgpKSksIG4uaGFsZkxpZmUgIT09IHQgJiYgKHRoaXMuZmFzdF8gPSBuZXcgaG4odCwgbi5nZXRFc3RpbWF0ZSgpLCBuLmdldFRvdGFsV2VpZ2h0KCkpKSwgaS5oYWxmTGlmZSAhPT0gZSAmJiAodGhpcy50dGZiXyA9IG5ldyBobihlLCBpLmdldEVzdGltYXRlKCksIGkuZ2V0VG90YWxXZWlnaHQoKSkpO1xuICB9XG4gIHNhbXBsZShlLCB0KSB7XG4gICAgZSA9IE1hdGgubWF4KGUsIHRoaXMubWluRGVsYXlNc18pO1xuICAgIGNvbnN0IHIgPSA4ICogdCwgbiA9IGUgLyAxZTMsIGkgPSByIC8gbjtcbiAgICB0aGlzLmZhc3RfLnNhbXBsZShuLCBpKSwgdGhpcy5zbG93Xy5zYW1wbGUobiwgaSk7XG4gIH1cbiAgc2FtcGxlVFRGQihlKSB7XG4gICAgY29uc3QgdCA9IGUgLyAxZTMsIHIgPSBNYXRoLnNxcnQoMikgKiBNYXRoLmV4cCgtTWF0aC5wb3codCwgMikgLyAyKTtcbiAgICB0aGlzLnR0ZmJfLnNhbXBsZShyLCBNYXRoLm1heChlLCA1KSk7XG4gIH1cbiAgY2FuRXN0aW1hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmFzdF8uZ2V0VG90YWxXZWlnaHQoKSA+PSB0aGlzLm1pbldlaWdodF87XG4gIH1cbiAgZ2V0RXN0aW1hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FuRXN0aW1hdGUoKSA/IE1hdGgubWluKHRoaXMuZmFzdF8uZ2V0RXN0aW1hdGUoKSwgdGhpcy5zbG93Xy5nZXRFc3RpbWF0ZSgpKSA6IHRoaXMuZGVmYXVsdEVzdGltYXRlXztcbiAgfVxuICBnZXRFc3RpbWF0ZVRURkIoKSB7XG4gICAgcmV0dXJuIHRoaXMudHRmYl8uZ2V0VG90YWxXZWlnaHQoKSA+PSB0aGlzLm1pbldlaWdodF8gPyB0aGlzLnR0ZmJfLmdldEVzdGltYXRlKCkgOiB0aGlzLmRlZmF1bHRUVEZCXztcbiAgfVxuICBnZXQgZGVmYXVsdEVzdGltYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRFc3RpbWF0ZV87XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgfVxufVxuZnVuY3Rpb24gd1MocywgZSwgdCkge1xuICByZXR1cm4gKGUgPSBJUyhlKSkgaW4gcyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCBlLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBzW2VdID0gdCwgcztcbn1cbmZ1bmN0aW9uIG50KCkge1xuICByZXR1cm4gbnQgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbihzKSB7XG4gICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHtcbiAgICAgIHZhciB0ID0gYXJndW1lbnRzW2VdO1xuICAgICAgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKHNbcl0gPSB0W3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH0sIG50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBYZChzLCBlKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMocyk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO1xuICAgIGUgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLCBuKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIHIpO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gdHQocykge1xuICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgIHZhciB0ID0gYXJndW1lbnRzW2VdICE9IG51bGwgPyBhcmd1bWVudHNbZV0gOiB7fTtcbiAgICBlICUgMiA/IFhkKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24ocikge1xuICAgICAgd1MocywgciwgdFtyXSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHMsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IFhkKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihyKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBBUyhzLCBlKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcIm9iamVjdFwiIHx8ICFzKSByZXR1cm4gcztcbiAgdmFyIHQgPSBzW1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh0ICE9PSB2b2lkIDApIHtcbiAgICB2YXIgciA9IHQuY2FsbChzLCBlKTtcbiAgICBpZiAodHlwZW9mIHIgIT0gXCJvYmplY3RcIikgcmV0dXJuIHI7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoZSA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikocyk7XG59XG5mdW5jdGlvbiBJUyhzKSB7XG4gIHZhciBlID0gQVMocywgXCJzdHJpbmdcIik7XG4gIHJldHVybiB0eXBlb2YgZSA9PSBcInN5bWJvbFwiID8gZSA6IGUgKyBcIlwiO1xufVxuY2xhc3MgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy50cmFjZSA9IHZvaWQgMCwgdGhpcy5kZWJ1ZyA9IHZvaWQgMCwgdGhpcy5sb2cgPSB2b2lkIDAsIHRoaXMud2FybiA9IHZvaWQgMCwgdGhpcy5pbmZvID0gdm9pZCAwLCB0aGlzLmVycm9yID0gdm9pZCAwO1xuICAgIGNvbnN0IHIgPSBgWyR7ZX1dOmA7XG4gICAgdGhpcy50cmFjZSA9IEFzLCB0aGlzLmRlYnVnID0gdC5kZWJ1Zy5iaW5kKG51bGwsIHIpLCB0aGlzLmxvZyA9IHQubG9nLmJpbmQobnVsbCwgciksIHRoaXMud2FybiA9IHQud2Fybi5iaW5kKG51bGwsIHIpLCB0aGlzLmluZm8gPSB0LmluZm8uYmluZChudWxsLCByKSwgdGhpcy5lcnJvciA9IHQuZXJyb3IuYmluZChudWxsLCByKTtcbiAgfVxufVxuY29uc3QgQXMgPSBmdW5jdGlvbigpIHtcbn0sIF9TID0ge1xuICB0cmFjZTogQXMsXG4gIGRlYnVnOiBBcyxcbiAgbG9nOiBBcyxcbiAgd2FybjogQXMsXG4gIGluZm86IEFzLFxuICBlcnJvcjogQXNcbn07XG5mdW5jdGlvbiBvYygpIHtcbiAgcmV0dXJuIG50KHt9LCBfUyk7XG59XG5mdW5jdGlvbiBSUyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBzZWxmLmNvbnNvbGVbc107XG4gIHJldHVybiB0ID8gdC5iaW5kKHNlbGYuY29uc29sZSwgYCR7ZSA/IFwiW1wiICsgZSArIFwiXSBcIiA6IFwiXCJ9WyR7c31dID5gKSA6IEFzO1xufVxuZnVuY3Rpb24gSmQocywgZSwgdCkge1xuICByZXR1cm4gZVtzXSA/IGVbc10uYmluZChlKSA6IFJTKHMsIHQpO1xufVxuY29uc3QgYWMgPSBvYygpO1xuZnVuY3Rpb24gTFMocywgZSwgdCkge1xuICBjb25zdCByID0gb2MoKTtcbiAgaWYgKHR5cGVvZiBjb25zb2xlID09IFwib2JqZWN0XCIgJiYgcyA9PT0gITAgfHwgdHlwZW9mIHMgPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG4gPSBbXG4gICAgICAvLyBSZW1vdmUgb3V0IGZyb20gbGlzdCBoZXJlIHRvIGhhcmQtZGlzYWJsZSBhIGxvZy1sZXZlbFxuICAgICAgLy8gJ3RyYWNlJyxcbiAgICAgIFwiZGVidWdcIixcbiAgICAgIFwibG9nXCIsXG4gICAgICBcImluZm9cIixcbiAgICAgIFwid2FyblwiLFxuICAgICAgXCJlcnJvclwiXG4gICAgXTtcbiAgICBuLmZvckVhY2goKGkpID0+IHtcbiAgICAgIHJbaV0gPSBKZChpLCBzLCB0KTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgci5sb2coYERlYnVnIGxvZ3MgZW5hYmxlZCBmb3IgXCIke2V9XCIgaW4gaGxzLmpzIHZlcnNpb24gMS42LjEyYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gb2MoKTtcbiAgICB9XG4gICAgbi5mb3JFYWNoKChpKSA9PiB7XG4gICAgICBhY1tpXSA9IEpkKGksIHMpO1xuICAgIH0pO1xuICB9IGVsc2VcbiAgICBudChhYywgcik7XG4gIHJldHVybiByO1xufVxuY29uc3QgcnQgPSBhYztcbmZ1bmN0aW9uIE1zKHMgPSAhMCkge1xuICByZXR1cm4gdHlwZW9mIHNlbGYgPiBcInVcIiA/IHZvaWQgMCA6IChzIHx8ICFzZWxmLk1lZGlhU291cmNlKSAmJiBzZWxmLk1hbmFnZWRNZWRpYVNvdXJjZSB8fCBzZWxmLk1lZGlhU291cmNlIHx8IHNlbGYuV2ViS2l0TWVkaWFTb3VyY2U7XG59XG5mdW5jdGlvbiBDUyhzKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZiA8IFwidVwiICYmIHMgPT09IHNlbGYuTWFuYWdlZE1lZGlhU291cmNlO1xufVxuZnVuY3Rpb24gQWcocywgZSkge1xuICBjb25zdCB0ID0gT2JqZWN0LmtleXMocyksIHIgPSBPYmplY3Qua2V5cyhlKSwgbiA9IHQubGVuZ3RoLCBpID0gci5sZW5ndGg7XG4gIHJldHVybiAhbiB8fCAhaSB8fCBuID09PSBpICYmICF0LnNvbWUoKG8pID0+IHIuaW5kZXhPZihvKSA9PT0gLTEpO1xufVxuZnVuY3Rpb24gVHIocywgZSA9ICExKSB7XG4gIGlmICh0eXBlb2YgVGV4dERlY29kZXIgPCBcInVcIikge1xuICAgIGNvbnN0IGMgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKS5kZWNvZGUocyk7XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHUgPSBjLmluZGV4T2YoXCJcXDBcIik7XG4gICAgICByZXR1cm4gdSAhPT0gLTEgPyBjLnN1YnN0cmluZygwLCB1KSA6IGM7XG4gICAgfVxuICAgIHJldHVybiBjLnJlcGxhY2UoL1xcMC9nLCBcIlwiKTtcbiAgfVxuICBjb25zdCB0ID0gcy5sZW5ndGg7XG4gIGxldCByLCBuLCBpLCBvID0gXCJcIiwgYSA9IDA7XG4gIGZvciAoOyBhIDwgdDsgKSB7XG4gICAgaWYgKHIgPSBzW2ErK10sIHIgPT09IDAgJiYgZSlcbiAgICAgIHJldHVybiBvO1xuICAgIGlmIChyID09PSAwIHx8IHIgPT09IDMpXG4gICAgICBjb250aW51ZTtcbiAgICBzd2l0Y2ggKHIgPj4gNCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAyOlxuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSA1OlxuICAgICAgY2FzZSA2OlxuICAgICAgY2FzZSA3OlxuICAgICAgICBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjpcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIG4gPSBzW2ErK10sIG8gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgociAmIDMxKSA8PCA2IHwgbiAmIDYzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE0OlxuICAgICAgICBuID0gc1thKytdLCBpID0gc1thKytdLCBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHIgJiAxNSkgPDwgMTIgfCAobiAmIDYzKSA8PCA2IHwgKGkgJiA2MykgPDwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIGZyKHMpIHtcbiAgbGV0IGUgPSBcIlwiO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IHMubGVuZ3RoOyB0KyspIHtcbiAgICBsZXQgciA9IHNbdF0udG9TdHJpbmcoMTYpO1xuICAgIHIubGVuZ3RoIDwgMiAmJiAociA9IFwiMFwiICsgciksIGUgKz0gcjtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIElnKHMpIHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShzLnJlcGxhY2UoL14weC8sIFwiXCIpLnJlcGxhY2UoLyhbXFxkYS1mQS1GXXsyfSkgPy9nLCBcIjB4JDEgXCIpLnJlcGxhY2UoLyArJC8sIFwiXCIpLnNwbGl0KFwiIFwiKSkuYnVmZmVyO1xufVxuZnVuY3Rpb24ga1Mocykge1xuICByZXR1cm4gcyAmJiBzLl9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIFwiZGVmYXVsdFwiKSA/IHMuZGVmYXVsdCA6IHM7XG59XG52YXIgY2wgPSB7IGV4cG9ydHM6IHt9IH0sIFFkO1xuZnVuY3Rpb24gRFMoKSB7XG4gIHJldHVybiBRZCB8fCAoUWQgPSAxLCAoZnVuY3Rpb24ocywgZSkge1xuICAgIChmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgciA9IC9eKD89KCg/OlthLXpBLVowLTkrXFwtLl0rOik/KSlcXDEoPz0oKD86XFwvXFwvW15cXC8/I10qKT8pKVxcMig/PSgoPzooPzpbXj8jXFwvXSpcXC8pKlteOz8jXFwvXSopPykpXFwzKCg/OjtbXj8jXSopPykoXFw/W14jXSopPygjW15dKik/JC8sIG4gPSAvXig/PShbXlxcLz8jXSopKVxcMShbXl0qKSQvLCBpID0gLyg/OlxcL3xeKVxcLig/PVxcLykvZywgbyA9IC8oPzpcXC98XilcXC5cXC5cXC8oPyFcXC5cXC5cXC8pW15cXC9dKig/PVxcLykvZywgYSA9IHtcbiAgICAgICAgLy8gSWYgb3B0cy5hbHdheXNOb3JtYWxpemUgaXMgdHJ1ZSB0aGVuIHRoZSBwYXRoIHdpbGwgYWx3YXlzIGJlIG5vcm1hbGl6ZWQgZXZlbiB3aGVuIGl0IHN0YXJ0cyB3aXRoIC8gb3IgLy9cbiAgICAgICAgLy8gRS5nXG4gICAgICAgIC8vIFdpdGggb3B0cy5hbHdheXNOb3JtYWxpemUgPSBmYWxzZSAoZGVmYXVsdCwgc3BlYyBjb21wbGlhbnQpXG4gICAgICAgIC8vIGh0dHA6Ly9hLmNvbS9iL2NkICsgL2UvZi8uLi9nID0+IGh0dHA6Ly9hLmNvbS9lL2YvLi4vZ1xuICAgICAgICAvLyBXaXRoIG9wdHMuYWx3YXlzTm9ybWFsaXplID0gdHJ1ZSAobm90IHNwZWMgY29tcGxpYW50KVxuICAgICAgICAvLyBodHRwOi8vYS5jb20vYi9jZCArIC9lL2YvLi4vZyA9PiBodHRwOi8vYS5jb20vZS9nXG4gICAgICAgIGJ1aWxkQWJzb2x1dGVVUkw6IGZ1bmN0aW9uKGwsIGMsIHUpIHtcbiAgICAgICAgICBpZiAodSA9IHUgfHwge30sIGwgPSBsLnRyaW0oKSwgYyA9IGMudHJpbSgpLCAhYykge1xuICAgICAgICAgICAgaWYgKCF1LmFsd2F5c05vcm1hbGl6ZSlcbiAgICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgICAgICB2YXIgZCA9IGEucGFyc2VVUkwobCk7XG4gICAgICAgICAgICBpZiAoIWQpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHRyeWluZyB0byBwYXJzZSBiYXNlIFVSTC5cIik7XG4gICAgICAgICAgICByZXR1cm4gZC5wYXRoID0gYS5ub3JtYWxpemVQYXRoKFxuICAgICAgICAgICAgICBkLnBhdGhcbiAgICAgICAgICAgICksIGEuYnVpbGRVUkxGcm9tUGFydHMoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBoID0gYS5wYXJzZVVSTChjKTtcbiAgICAgICAgICBpZiAoIWgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgcmVsYXRpdmUgVVJMLlwiKTtcbiAgICAgICAgICBpZiAoaC5zY2hlbWUpXG4gICAgICAgICAgICByZXR1cm4gdS5hbHdheXNOb3JtYWxpemUgPyAoaC5wYXRoID0gYS5ub3JtYWxpemVQYXRoKGgucGF0aCksIGEuYnVpbGRVUkxGcm9tUGFydHMoaCkpIDogYztcbiAgICAgICAgICB2YXIgZiA9IGEucGFyc2VVUkwobCk7XG4gICAgICAgICAgaWYgKCFmKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIGJhc2UgVVJMLlwiKTtcbiAgICAgICAgICBpZiAoIWYubmV0TG9jICYmIGYucGF0aCAmJiBmLnBhdGhbMF0gIT09IFwiL1wiKSB7XG4gICAgICAgICAgICB2YXIgcCA9IG4uZXhlYyhmLnBhdGgpO1xuICAgICAgICAgICAgZi5uZXRMb2MgPSBwWzFdLCBmLnBhdGggPSBwWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmLm5ldExvYyAmJiAhZi5wYXRoICYmIChmLnBhdGggPSBcIi9cIik7XG4gICAgICAgICAgdmFyIHkgPSB7XG4gICAgICAgICAgICAvLyAyYykgT3RoZXJ3aXNlLCB0aGUgZW1iZWRkZWQgVVJMIGluaGVyaXRzIHRoZSBzY2hlbWUgb2ZcbiAgICAgICAgICAgIC8vIHRoZSBiYXNlIFVSTC5cbiAgICAgICAgICAgIHNjaGVtZTogZi5zY2hlbWUsXG4gICAgICAgICAgICBuZXRMb2M6IGgubmV0TG9jLFxuICAgICAgICAgICAgcGF0aDogbnVsbCxcbiAgICAgICAgICAgIHBhcmFtczogaC5wYXJhbXMsXG4gICAgICAgICAgICBxdWVyeTogaC5xdWVyeSxcbiAgICAgICAgICAgIGZyYWdtZW50OiBoLmZyYWdtZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoIWgubmV0TG9jICYmICh5Lm5ldExvYyA9IGYubmV0TG9jLCBoLnBhdGhbMF0gIT09IFwiL1wiKSlcbiAgICAgICAgICAgIGlmICghaC5wYXRoKVxuICAgICAgICAgICAgICB5LnBhdGggPSBmLnBhdGgsIGgucGFyYW1zIHx8ICh5LnBhcmFtcyA9IGYucGFyYW1zLCBoLnF1ZXJ5IHx8ICh5LnF1ZXJ5ID0gZi5xdWVyeSkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBFID0gZi5wYXRoLCBiID0gRS5zdWJzdHJpbmcoMCwgRS5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSArIGgucGF0aDtcbiAgICAgICAgICAgICAgeS5wYXRoID0gYS5ub3JtYWxpemVQYXRoKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB5LnBhdGggPT09IG51bGwgJiYgKHkucGF0aCA9IHUuYWx3YXlzTm9ybWFsaXplID8gYS5ub3JtYWxpemVQYXRoKGgucGF0aCkgOiBoLnBhdGgpLCBhLmJ1aWxkVVJMRnJvbVBhcnRzKHkpO1xuICAgICAgICB9LFxuICAgICAgICBwYXJzZVVSTDogZnVuY3Rpb24obCkge1xuICAgICAgICAgIHZhciBjID0gci5leGVjKGwpO1xuICAgICAgICAgIHJldHVybiBjID8ge1xuICAgICAgICAgICAgc2NoZW1lOiBjWzFdIHx8IFwiXCIsXG4gICAgICAgICAgICBuZXRMb2M6IGNbMl0gfHwgXCJcIixcbiAgICAgICAgICAgIHBhdGg6IGNbM10gfHwgXCJcIixcbiAgICAgICAgICAgIHBhcmFtczogY1s0XSB8fCBcIlwiLFxuICAgICAgICAgICAgcXVlcnk6IGNbNV0gfHwgXCJcIixcbiAgICAgICAgICAgIGZyYWdtZW50OiBjWzZdIHx8IFwiXCJcbiAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgbm9ybWFsaXplUGF0aDogZnVuY3Rpb24obCkge1xuICAgICAgICAgIGZvciAobCA9IGwuc3BsaXQoXCJcIikucmV2ZXJzZSgpLmpvaW4oXCJcIikucmVwbGFjZShpLCBcIlwiKTsgbC5sZW5ndGggIT09IChsID0gbC5yZXBsYWNlKG8sIFwiXCIpKS5sZW5ndGg7IClcbiAgICAgICAgICAgIDtcbiAgICAgICAgICByZXR1cm4gbC5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgYnVpbGRVUkxGcm9tUGFydHM6IGZ1bmN0aW9uKGwpIHtcbiAgICAgICAgICByZXR1cm4gbC5zY2hlbWUgKyBsLm5ldExvYyArIGwucGF0aCArIGwucGFyYW1zICsgbC5xdWVyeSArIGwuZnJhZ21lbnQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzLmV4cG9ydHMgPSBhO1xuICAgIH0pKCk7XG4gIH0pKGNsKSksIGNsLmV4cG9ydHM7XG59XG52YXIgaHUgPSBEUygpO1xuY2xhc3MgZnUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFib3J0ZWQgPSAhMSwgdGhpcy5sb2FkZWQgPSAwLCB0aGlzLnJldHJ5ID0gMCwgdGhpcy50b3RhbCA9IDAsIHRoaXMuY2h1bmtDb3VudCA9IDAsIHRoaXMuYndFc3RpbWF0ZSA9IDAsIHRoaXMubG9hZGluZyA9IHtcbiAgICAgIHN0YXJ0OiAwLFxuICAgICAgZmlyc3Q6IDAsXG4gICAgICBlbmQ6IDBcbiAgICB9LCB0aGlzLnBhcnNpbmcgPSB7XG4gICAgICBzdGFydDogMCxcbiAgICAgIGVuZDogMFxuICAgIH0sIHRoaXMuYnVmZmVyaW5nID0ge1xuICAgICAgc3RhcnQ6IDAsXG4gICAgICBmaXJzdDogMCxcbiAgICAgIGVuZDogMFxuICAgIH07XG4gIH1cbn1cbnZhciBvdCA9IHtcbiAgQVVESU86IFwiYXVkaW9cIixcbiAgVklERU86IFwidmlkZW9cIixcbiAgQVVESU9WSURFTzogXCJhdWRpb3ZpZGVvXCJcbn07XG5jbGFzcyBfZyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLl9ieXRlUmFuZ2UgPSBudWxsLCB0aGlzLl91cmwgPSBudWxsLCB0aGlzLl9zdGF0cyA9IG51bGwsIHRoaXMuX3N0cmVhbXMgPSBudWxsLCB0aGlzLmJhc2UgPSB2b2lkIDAsIHRoaXMucmVsdXJsID0gdm9pZCAwLCB0eXBlb2YgZSA9PSBcInN0cmluZ1wiICYmIChlID0ge1xuICAgICAgdXJsOiBlXG4gICAgfSksIHRoaXMuYmFzZSA9IGUsIE1TKHRoaXMsIFwic3RhdHNcIik7XG4gIH1cbiAgLy8gc2V0Qnl0ZVJhbmdlIGNvbnZlcnRzIGEgRVhULVgtQllURVJBTkdFIGF0dHJpYnV0ZSBpbnRvIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAgc2V0Qnl0ZVJhbmdlKGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5zcGxpdChcIkBcIiwgMik7XG4gICAgbGV0IG47XG4gICAgci5sZW5ndGggPT09IDEgPyBuID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuYnl0ZVJhbmdlRW5kT2Zmc2V0KSB8fCAwIDogbiA9IHBhcnNlSW50KHJbMV0pLCB0aGlzLl9ieXRlUmFuZ2UgPSBbbiwgcGFyc2VJbnQoclswXSkgKyBuXTtcbiAgfVxuICBnZXQgYmFzZXVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlLnVybDtcbiAgfVxuICBnZXQgYnl0ZVJhbmdlKCkge1xuICAgIHJldHVybiB0aGlzLl9ieXRlUmFuZ2UgPT09IG51bGwgPyBbXSA6IHRoaXMuX2J5dGVSYW5nZTtcbiAgfVxuICBnZXQgYnl0ZVJhbmdlU3RhcnRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnl0ZVJhbmdlWzBdO1xuICB9XG4gIGdldCBieXRlUmFuZ2VFbmRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnl0ZVJhbmdlWzFdO1xuICB9XG4gIGdldCBlbGVtZW50YXJ5U3RyZWFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtcyA9PT0gbnVsbCAmJiAodGhpcy5fc3RyZWFtcyA9IHtcbiAgICAgIFtvdC5BVURJT106IG51bGwsXG4gICAgICBbb3QuVklERU9dOiBudWxsLFxuICAgICAgW290LkFVRElPVklERU9dOiBudWxsXG4gICAgfSksIHRoaXMuX3N0cmVhbXM7XG4gIH1cbiAgc2V0IGVsZW1lbnRhcnlTdHJlYW1zKGUpIHtcbiAgICB0aGlzLl9zdHJlYW1zID0gZTtcbiAgfVxuICBnZXQgaGFzU3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRzICE9PSBudWxsO1xuICB9XG4gIGdldCBoYXNTdHJlYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW1zICE9PSBudWxsO1xuICB9XG4gIGdldCBzdGF0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHMgPT09IG51bGwgJiYgKHRoaXMuX3N0YXRzID0gbmV3IGZ1KCkpLCB0aGlzLl9zdGF0cztcbiAgfVxuICBzZXQgc3RhdHMoZSkge1xuICAgIHRoaXMuX3N0YXRzID0gZTtcbiAgfVxuICBnZXQgdXJsKCkge1xuICAgIHJldHVybiAhdGhpcy5fdXJsICYmIHRoaXMuYmFzZXVybCAmJiB0aGlzLnJlbHVybCAmJiAodGhpcy5fdXJsID0gaHUuYnVpbGRBYnNvbHV0ZVVSTCh0aGlzLmJhc2V1cmwsIHRoaXMucmVsdXJsLCB7XG4gICAgICBhbHdheXNOb3JtYWxpemU6ICEwXG4gICAgfSkpLCB0aGlzLl91cmwgfHwgXCJcIjtcbiAgfVxuICBzZXQgdXJsKGUpIHtcbiAgICB0aGlzLl91cmwgPSBlO1xuICB9XG4gIGNsZWFyRWxlbWVudGFyeVN0cmVhbUluZm8oKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudGFyeVN0cmVhbXM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlW290LkFVRElPXSA9IG51bGwsIGVbb3QuVklERU9dID0gbnVsbCwgZVtvdC5BVURJT1ZJREVPXSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIFZ0KHMpIHtcbiAgcmV0dXJuIHMuc24gIT09IFwiaW5pdFNlZ21lbnRcIjtcbn1cbmNsYXNzIHVsIGV4dGVuZHMgX2cge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCksIHRoaXMuX2RlY3J5cHRkYXRhID0gbnVsbCwgdGhpcy5fcHJvZ3JhbURhdGVUaW1lID0gbnVsbCwgdGhpcy5fcmVmID0gbnVsbCwgdGhpcy5fYml0cmF0ZSA9IHZvaWQgMCwgdGhpcy5yYXdQcm9ncmFtRGF0ZVRpbWUgPSBudWxsLCB0aGlzLnRhZ0xpc3QgPSBbXSwgdGhpcy5kdXJhdGlvbiA9IDAsIHRoaXMuc24gPSAwLCB0aGlzLmxldmVsa2V5cyA9IHZvaWQgMCwgdGhpcy50eXBlID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IG51bGwsIHRoaXMua2V5TG9hZGVyID0gbnVsbCwgdGhpcy5sZXZlbCA9IC0xLCB0aGlzLmNjID0gMCwgdGhpcy5zdGFydFBUUyA9IHZvaWQgMCwgdGhpcy5lbmRQVFMgPSB2b2lkIDAsIHRoaXMuc3RhcnREVFMgPSB2b2lkIDAsIHRoaXMuZW5kRFRTID0gdm9pZCAwLCB0aGlzLnN0YXJ0ID0gMCwgdGhpcy5wbGF5bGlzdE9mZnNldCA9IDAsIHRoaXMuZGVsdGFQVFMgPSB2b2lkIDAsIHRoaXMubWF4U3RhcnRQVFMgPSB2b2lkIDAsIHRoaXMubWluRW5kUFRTID0gdm9pZCAwLCB0aGlzLmRhdGEgPSB2b2lkIDAsIHRoaXMuYml0cmF0ZVRlc3QgPSAhMSwgdGhpcy50aXRsZSA9IG51bGwsIHRoaXMuaW5pdFNlZ21lbnQgPSBudWxsLCB0aGlzLmVuZExpc3QgPSB2b2lkIDAsIHRoaXMuZ2FwID0gdm9pZCAwLCB0aGlzLnVybElkID0gMCwgdGhpcy50eXBlID0gZTtcbiAgfVxuICBnZXQgYnl0ZUxlbmd0aCgpIHtcbiAgICBpZiAodGhpcy5oYXNTdGF0cykge1xuICAgICAgY29uc3QgZSA9IHRoaXMuc3RhdHMudG90YWw7XG4gICAgICBpZiAoZSlcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ5dGVSYW5nZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmJ5dGVSYW5nZVswXSwgdCA9IHRoaXMuYnl0ZVJhbmdlWzFdO1xuICAgICAgaWYgKHVlKGUpICYmIHVlKHQpKVxuICAgICAgICByZXR1cm4gdCAtIGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBiaXRyYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVMZW5ndGggPyB0aGlzLmJ5dGVMZW5ndGggKiA4IC8gdGhpcy5kdXJhdGlvbiA6IHRoaXMuX2JpdHJhdGUgPyB0aGlzLl9iaXRyYXRlIDogbnVsbDtcbiAgfVxuICBzZXQgYml0cmF0ZShlKSB7XG4gICAgdGhpcy5fYml0cmF0ZSA9IGU7XG4gIH1cbiAgZ2V0IGRlY3J5cHRkYXRhKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsa2V5czogZVxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSAmJiAhdGhpcy5fZGVjcnlwdGRhdGEpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuX2RlY3J5cHRkYXRhICYmIHRoaXMubGV2ZWxrZXlzICYmICF0aGlzLmxldmVsa2V5cy5OT05FKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sZXZlbGtleXMuaWRlbnRpdHk7XG4gICAgICBpZiAodClcbiAgICAgICAgdGhpcy5fZGVjcnlwdGRhdGEgPSB0LmdldERlY3J5cHREYXRhKHRoaXMuc24pO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHIgPSBPYmplY3Qua2V5cyh0aGlzLmxldmVsa2V5cyk7XG4gICAgICAgIGlmIChyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kZWNyeXB0ZGF0YSA9IHRoaXMubGV2ZWxrZXlzW3JbMF1dIHx8IG51bGw7XG4gICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICByZXR1cm4gbi5nZXREZWNyeXB0RGF0YSh0aGlzLnNuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGVjcnlwdGRhdGE7XG4gIH1cbiAgZ2V0IGVuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydCArIHRoaXMuZHVyYXRpb247XG4gIH1cbiAgZ2V0IGVuZFByb2dyYW1EYXRlVGltZSgpIHtcbiAgICBpZiAodGhpcy5wcm9ncmFtRGF0ZVRpbWUgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBlID0gdWUodGhpcy5kdXJhdGlvbikgPyB0aGlzLmR1cmF0aW9uIDogMDtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtRGF0ZVRpbWUgKyBlICogMWUzO1xuICB9XG4gIGdldCBlbmNyeXB0ZWQoKSB7XG4gICAgdmFyIGU7XG4gICAgaWYgKChlID0gdGhpcy5fZGVjcnlwdGRhdGEpICE9IG51bGwgJiYgZS5lbmNyeXB0ZWQpXG4gICAgICByZXR1cm4gITA7XG4gICAgaWYgKHRoaXMubGV2ZWxrZXlzKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIGNvbnN0IHIgPSBPYmplY3Qua2V5cyh0aGlzLmxldmVsa2V5cyksIG4gPSByLmxlbmd0aDtcbiAgICAgIGlmIChuID4gMSB8fCBuID09PSAxICYmICh0ID0gdGhpcy5sZXZlbGtleXNbclswXV0pICE9IG51bGwgJiYgdC5lbmNyeXB0ZWQpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGdldCBwcm9ncmFtRGF0ZVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2dyYW1EYXRlVGltZSA9PT0gbnVsbCAmJiB0aGlzLnJhd1Byb2dyYW1EYXRlVGltZSAmJiAodGhpcy5wcm9ncmFtRGF0ZVRpbWUgPSBEYXRlLnBhcnNlKHRoaXMucmF3UHJvZ3JhbURhdGVUaW1lKSksIHRoaXMuX3Byb2dyYW1EYXRlVGltZTtcbiAgfVxuICBzZXQgcHJvZ3JhbURhdGVUaW1lKGUpIHtcbiAgICBpZiAoIXVlKGUpKSB7XG4gICAgICB0aGlzLl9wcm9ncmFtRGF0ZVRpbWUgPSB0aGlzLnJhd1Byb2dyYW1EYXRlVGltZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3Byb2dyYW1EYXRlVGltZSA9IGU7XG4gIH1cbiAgZ2V0IHJlZigpIHtcbiAgICByZXR1cm4gVnQodGhpcykgPyAodGhpcy5fcmVmIHx8ICh0aGlzLl9yZWYgPSB7XG4gICAgICBiYXNlOiB0aGlzLmJhc2UsXG4gICAgICBzdGFydDogdGhpcy5zdGFydCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgc246IHRoaXMuc24sXG4gICAgICBwcm9ncmFtRGF0ZVRpbWU6IHRoaXMucHJvZ3JhbURhdGVUaW1lXG4gICAgfSksIHRoaXMuX3JlZikgOiBudWxsO1xuICB9XG4gIGFkZFN0YXJ0KGUpIHtcbiAgICB0aGlzLnNldFN0YXJ0KHRoaXMuc3RhcnQgKyBlKTtcbiAgfVxuICBzZXRTdGFydChlKSB7XG4gICAgdGhpcy5zdGFydCA9IGUsIHRoaXMuX3JlZiAmJiAodGhpcy5fcmVmLnN0YXJ0ID0gZSk7XG4gIH1cbiAgc2V0RHVyYXRpb24oZSkge1xuICAgIHRoaXMuZHVyYXRpb24gPSBlLCB0aGlzLl9yZWYgJiYgKHRoaXMuX3JlZi5kdXJhdGlvbiA9IGUpO1xuICB9XG4gIHNldEtleUZvcm1hdChlKSB7XG4gICAgaWYgKHRoaXMubGV2ZWxrZXlzKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sZXZlbGtleXNbZV07XG4gICAgICB0ICYmICF0aGlzLl9kZWNyeXB0ZGF0YSAmJiAodGhpcy5fZGVjcnlwdGRhdGEgPSB0LmdldERlY3J5cHREYXRhKHRoaXMuc24pKTtcbiAgICB9XG4gIH1cbiAgYWJvcnRSZXF1ZXN0cygpIHtcbiAgICB2YXIgZSwgdDtcbiAgICAoZSA9IHRoaXMubG9hZGVyKSA9PSBudWxsIHx8IGUuYWJvcnQoKSwgKHQgPSB0aGlzLmtleUxvYWRlcikgPT0gbnVsbCB8fCB0LmFib3J0KCk7XG4gIH1cbiAgc2V0RWxlbWVudGFyeVN0cmVhbUluZm8oZSwgdCwgciwgbiwgaSwgbyA9ICExKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudGFyeVN0cmVhbXM6IGFcbiAgICB9ID0gdGhpcywgbCA9IGFbZV07XG4gICAgaWYgKCFsKSB7XG4gICAgICBhW2VdID0ge1xuICAgICAgICBzdGFydFBUUzogdCxcbiAgICAgICAgZW5kUFRTOiByLFxuICAgICAgICBzdGFydERUUzogbixcbiAgICAgICAgZW5kRFRTOiBpLFxuICAgICAgICBwYXJ0aWFsOiBvXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsLnN0YXJ0UFRTID0gTWF0aC5taW4obC5zdGFydFBUUywgdCksIGwuZW5kUFRTID0gTWF0aC5tYXgobC5lbmRQVFMsIHIpLCBsLnN0YXJ0RFRTID0gTWF0aC5taW4obC5zdGFydERUUywgbiksIGwuZW5kRFRTID0gTWF0aC5tYXgobC5lbmREVFMsIGkpO1xuICB9XG59XG5jbGFzcyBQUyBleHRlbmRzIF9nIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciwgbiwgaSkge1xuICAgIHN1cGVyKHIpLCB0aGlzLmZyYWdPZmZzZXQgPSAwLCB0aGlzLmR1cmF0aW9uID0gMCwgdGhpcy5nYXAgPSAhMSwgdGhpcy5pbmRlcGVuZGVudCA9ICExLCB0aGlzLnJlbHVybCA9IHZvaWQgMCwgdGhpcy5mcmFnbWVudCA9IHZvaWQgMCwgdGhpcy5pbmRleCA9IHZvaWQgMCwgdGhpcy5kdXJhdGlvbiA9IGUuZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJEVVJBVElPTlwiKSwgdGhpcy5nYXAgPSBlLmJvb2woXCJHQVBcIiksIHRoaXMuaW5kZXBlbmRlbnQgPSBlLmJvb2woXCJJTkRFUEVOREVOVFwiKSwgdGhpcy5yZWx1cmwgPSBlLmVudW1lcmF0ZWRTdHJpbmcoXCJVUklcIiksIHRoaXMuZnJhZ21lbnQgPSB0LCB0aGlzLmluZGV4ID0gbjtcbiAgICBjb25zdCBvID0gZS5lbnVtZXJhdGVkU3RyaW5nKFwiQllURVJBTkdFXCIpO1xuICAgIG8gJiYgdGhpcy5zZXRCeXRlUmFuZ2UobywgaSksIGkgJiYgKHRoaXMuZnJhZ09mZnNldCA9IGkuZnJhZ09mZnNldCArIGkuZHVyYXRpb24pO1xuICB9XG4gIGdldCBzdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcmFnbWVudC5zdGFydCArIHRoaXMuZnJhZ09mZnNldDtcbiAgfVxuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ICsgdGhpcy5kdXJhdGlvbjtcbiAgfVxuICBnZXQgbG9hZGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnRhcnlTdHJlYW1zOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuICEhKGUuYXVkaW8gfHwgZS52aWRlbyB8fCBlLmF1ZGlvdmlkZW8pO1xuICB9XG59XG5mdW5jdGlvbiBSZyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yocyk7XG4gIGlmICh0KSB7XG4gICAgY29uc3QgciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgZSk7XG4gICAgcmV0dXJuIHIgfHwgUmcodCwgZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIE1TKHMsIGUpIHtcbiAgY29uc3QgdCA9IFJnKHMsIGUpO1xuICB0ICYmICh0LmVudW1lcmFibGUgPSAhMCwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsIGUsIHQpKTtcbn1cbmNvbnN0IGVoID0gTWF0aC5wb3coMiwgMzIpIC0gMSwgT1MgPSBbXS5wdXNoLCBMZyA9IHtcbiAgdmlkZW86IDEsXG4gIGF1ZGlvOiAyLFxuICBpZDM6IDMsXG4gIHRleHQ6IDRcbn07XG5mdW5jdGlvbiBqdChzKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHMpO1xufVxuZnVuY3Rpb24gQ2cocywgZSkge1xuICBjb25zdCB0ID0gc1tlXSA8PCA4IHwgc1tlICsgMV07XG4gIHJldHVybiB0IDwgMCA/IDY1NTM2ICsgdCA6IHQ7XG59XG5mdW5jdGlvbiBJZShzLCBlKSB7XG4gIGNvbnN0IHQgPSBrZyhzLCBlKTtcbiAgcmV0dXJuIHQgPCAwID8gNDI5NDk2NzI5NiArIHQgOiB0O1xufVxuZnVuY3Rpb24gdGgocywgZSkge1xuICBsZXQgdCA9IEllKHMsIGUpO1xuICByZXR1cm4gdCAqPSBNYXRoLnBvdygyLCAzMiksIHQgKz0gSWUocywgZSArIDQpLCB0O1xufVxuZnVuY3Rpb24ga2cocywgZSkge1xuICByZXR1cm4gc1tlXSA8PCAyNCB8IHNbZSArIDFdIDw8IDE2IHwgc1tlICsgMl0gPDwgOCB8IHNbZSArIDNdO1xufVxuZnVuY3Rpb24gQlMocykge1xuICBjb25zdCBlID0gcy5ieXRlTGVuZ3RoO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IGU7ICkge1xuICAgIGNvbnN0IHIgPSBJZShzLCB0KTtcbiAgICBpZiAociA+IDggJiYgc1t0ICsgNF0gPT09IDEwOSAmJiBzW3QgKyA1XSA9PT0gMTExICYmIHNbdCArIDZdID09PSAxMTEgJiYgc1t0ICsgN10gPT09IDEwMilcbiAgICAgIHJldHVybiAhMDtcbiAgICB0ID0gciA+IDEgPyB0ICsgciA6IGU7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gR2UocywgZSkge1xuICBjb25zdCB0ID0gW107XG4gIGlmICghZS5sZW5ndGgpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSBzLmJ5dGVMZW5ndGg7XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgcjsgKSB7XG4gICAgY29uc3QgaSA9IEllKHMsIG4pLCBvID0ganQocy5zdWJhcnJheShuICsgNCwgbiArIDgpKSwgYSA9IGkgPiAxID8gbiArIGkgOiByO1xuICAgIGlmIChvID09PSBlWzBdKVxuICAgICAgaWYgKGUubGVuZ3RoID09PSAxKVxuICAgICAgICB0LnB1c2gocy5zdWJhcnJheShuICsgOCwgYSkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGwgPSBHZShzLnN1YmFycmF5KG4gKyA4LCBhKSwgZS5zbGljZSgxKSk7XG4gICAgICAgIGwubGVuZ3RoICYmIE9TLmFwcGx5KHQsIGwpO1xuICAgICAgfVxuICAgIG4gPSBhO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gRlMocykge1xuICBjb25zdCBlID0gW10sIHQgPSBzWzBdO1xuICBsZXQgciA9IDg7XG4gIGNvbnN0IG4gPSBJZShzLCByKTtcbiAgciArPSA0O1xuICBsZXQgaSA9IDAsIG8gPSAwO1xuICB0ID09PSAwID8gKGkgPSBJZShzLCByKSwgbyA9IEllKHMsIHIgKyA0KSwgciArPSA4KSA6IChpID0gdGgocywgciksIG8gPSB0aChzLCByICsgOCksIHIgKz0gMTYpLCByICs9IDI7XG4gIGxldCBhID0gcy5sZW5ndGggKyBvO1xuICBjb25zdCBsID0gQ2cocywgcik7XG4gIHIgKz0gMjtcbiAgZm9yIChsZXQgYyA9IDA7IGMgPCBsOyBjKyspIHtcbiAgICBsZXQgdSA9IHI7XG4gICAgY29uc3QgZCA9IEllKHMsIHUpO1xuICAgIHUgKz0gNDtcbiAgICBjb25zdCBoID0gZCAmIDIxNDc0ODM2NDc7XG4gICAgaWYgKChkICYgMjE0NzQ4MzY0OCkgPj4+IDMxID09PSAxKVxuICAgICAgcmV0dXJuIHJ0Lndhcm4oXCJTSURYIGhhcyBoaWVyYXJjaGljYWwgcmVmZXJlbmNlcyAobm90IHN1cHBvcnRlZClcIiksIG51bGw7XG4gICAgY29uc3QgcCA9IEllKHMsIHUpO1xuICAgIHUgKz0gNCwgZS5wdXNoKHtcbiAgICAgIHJlZmVyZW5jZVNpemU6IGgsXG4gICAgICBzdWJzZWdtZW50RHVyYXRpb246IHAsXG4gICAgICAvLyB1bnNjYWxlZFxuICAgICAgaW5mbzoge1xuICAgICAgICBkdXJhdGlvbjogcCAvIG4sXG4gICAgICAgIHN0YXJ0OiBhLFxuICAgICAgICBlbmQ6IGEgKyBoIC0gMVxuICAgICAgfVxuICAgIH0pLCBhICs9IGgsIHUgKz0gNCwgciA9IHU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU6IGksXG4gICAgdGltZXNjYWxlOiBuLFxuICAgIHZlcnNpb246IHQsXG4gICAgcmVmZXJlbmNlc0NvdW50OiBsLFxuICAgIHJlZmVyZW5jZXM6IGVcbiAgfTtcbn1cbmZ1bmN0aW9uIERnKHMpIHtcbiAgY29uc3QgZSA9IFtdLCB0ID0gR2UocywgW1wibW9vdlwiLCBcInRyYWtcIl0pO1xuICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyBuKyspIHtcbiAgICBjb25zdCBpID0gdFtuXSwgbyA9IEdlKGksIFtcInRraGRcIl0pWzBdO1xuICAgIGlmIChvKSB7XG4gICAgICBsZXQgYSA9IG9bMF07XG4gICAgICBjb25zdCBsID0gSWUobywgYSA9PT0gMCA/IDEyIDogMjApLCBjID0gR2UoaSwgW1wibWRpYVwiLCBcIm1kaGRcIl0pWzBdO1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgYSA9IGNbMF07XG4gICAgICAgIGNvbnN0IHUgPSBJZShjLCBhID09PSAwID8gMTIgOiAyMCksIGQgPSBHZShpLCBbXCJtZGlhXCIsIFwiaGRsclwiXSlbMF07XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgY29uc3QgaCA9IGp0KGQuc3ViYXJyYXkoOCwgMTIpKSwgZiA9IHtcbiAgICAgICAgICAgIHNvdW46IG90LkFVRElPLFxuICAgICAgICAgICAgdmlkZTogb3QuVklERU9cbiAgICAgICAgICB9W2hdLCBwID0gR2UoaSwgW1wibWRpYVwiLCBcIm1pbmZcIiwgXCJzdGJsXCIsIFwic3RzZFwiXSlbMF0sIHkgPSBOUyhwKTtcbiAgICAgICAgICBmID8gKGVbbF0gPSB7XG4gICAgICAgICAgICB0aW1lc2NhbGU6IHUsXG4gICAgICAgICAgICB0eXBlOiBmLFxuICAgICAgICAgICAgc3RzZDogeVxuICAgICAgICAgIH0sIGVbZl0gPSB0dCh7XG4gICAgICAgICAgICB0aW1lc2NhbGU6IHUsXG4gICAgICAgICAgICBpZDogbFxuICAgICAgICAgIH0sIHkpKSA6IGVbbF0gPSB7XG4gICAgICAgICAgICB0aW1lc2NhbGU6IHUsXG4gICAgICAgICAgICB0eXBlOiBoLFxuICAgICAgICAgICAgc3RzZDogeVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEdlKHMsIFtcIm1vb3ZcIiwgXCJtdmV4XCIsIFwidHJleFwiXSkuZm9yRWFjaCgobikgPT4ge1xuICAgIGNvbnN0IGkgPSBJZShuLCA0KSwgbyA9IGVbaV07XG4gICAgbyAmJiAoby5kZWZhdWx0ID0ge1xuICAgICAgZHVyYXRpb246IEllKG4sIDEyKSxcbiAgICAgIGZsYWdzOiBJZShuLCAyMClcbiAgICB9KTtcbiAgfSksIGU7XG59XG5mdW5jdGlvbiBOUyhzKSB7XG4gIGNvbnN0IGUgPSBzLnN1YmFycmF5KDgpLCB0ID0gZS5zdWJhcnJheSg4NiksIHIgPSBqdChlLnN1YmFycmF5KDQsIDgpKTtcbiAgbGV0IG4gPSByLCBpO1xuICBjb25zdCBvID0gciA9PT0gXCJlbmNhXCIgfHwgciA9PT0gXCJlbmN2XCI7XG4gIGlmIChvKSB7XG4gICAgY29uc3QgYyA9IEdlKGUsIFtyXSlbMF0uc3ViYXJyYXkociA9PT0gXCJlbmNhXCIgPyAyOCA6IDc4KTtcbiAgICBHZShjLCBbXCJzaW5mXCJdKS5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBjb25zdCBoID0gR2UoZCwgW1wic2NobVwiXSlbMF07XG4gICAgICBpZiAoaCkge1xuICAgICAgICBjb25zdCBmID0ganQoaC5zdWJhcnJheSg0LCA4KSk7XG4gICAgICAgIGlmIChmID09PSBcImNiY3NcIiB8fCBmID09PSBcImNlbmNcIikge1xuICAgICAgICAgIGNvbnN0IHAgPSBHZShkLCBbXCJmcm1hXCJdKVswXTtcbiAgICAgICAgICBwICYmIChuID0ganQocCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYSA9IG47XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgXCJhdmMxXCI6XG4gICAgY2FzZSBcImF2YzJcIjpcbiAgICBjYXNlIFwiYXZjM1wiOlxuICAgIGNhc2UgXCJhdmM0XCI6IHtcbiAgICAgIGNvbnN0IGwgPSBHZSh0LCBbXCJhdmNDXCJdKVswXTtcbiAgICAgIGwgJiYgbC5sZW5ndGggPiAzICYmIChuICs9IFwiLlwiICsgS2kobFsxXSkgKyBLaShsWzJdKSArIEtpKGxbM10pLCBpID0gamkoYSA9PT0gXCJhdmMxXCIgPyBcImR2YTFcIiA6IFwiZHZhdlwiLCB0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcIm1wNGFcIjoge1xuICAgICAgY29uc3QgbCA9IEdlKGUsIFtyXSlbMF0sIGMgPSBHZShsLnN1YmFycmF5KDI4KSwgW1wiZXNkc1wiXSlbMF07XG4gICAgICBpZiAoYyAmJiBjLmxlbmd0aCA+IDcpIHtcbiAgICAgICAgbGV0IHUgPSA0O1xuICAgICAgICBpZiAoY1t1KytdICE9PSAzKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB1ID0gZGwoYywgdSksIHUgKz0gMjtcbiAgICAgICAgY29uc3QgZCA9IGNbdSsrXTtcbiAgICAgICAgaWYgKGQgJiAxMjggJiYgKHUgKz0gMiksIGQgJiA2NCAmJiAodSArPSBjW3UrK10pLCBjW3UrK10gIT09IDQpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIHUgPSBkbChjLCB1KTtcbiAgICAgICAgY29uc3QgaCA9IGNbdSsrXTtcbiAgICAgICAgaWYgKGggPT09IDY0KVxuICAgICAgICAgIG4gKz0gXCIuXCIgKyBLaShoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAodSArPSAxMiwgY1t1KytdICE9PSA1KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB1ID0gZGwoYywgdSk7XG4gICAgICAgIGNvbnN0IGYgPSBjW3UrK107XG4gICAgICAgIGxldCBwID0gKGYgJiAyNDgpID4+IDM7XG4gICAgICAgIHAgPT09IDMxICYmIChwICs9IDEgKyAoKGYgJiA3KSA8PCAzKSArICgoY1t1XSAmIDIyNCkgPj4gNSkpLCBuICs9IFwiLlwiICsgcDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiaHZjMVwiOlxuICAgIGNhc2UgXCJoZXYxXCI6IHtcbiAgICAgIGNvbnN0IGwgPSBHZSh0LCBbXCJodmNDXCJdKVswXTtcbiAgICAgIGlmIChsICYmIGwubGVuZ3RoID4gMTIpIHtcbiAgICAgICAgY29uc3QgYyA9IGxbMV0sIHUgPSBbXCJcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIl1bYyA+PiA2XSwgZCA9IGMgJiAzMSwgaCA9IEllKGwsIDIpLCBmID0gKGMgJiAzMikgPj4gNSA/IFwiSFwiIDogXCJMXCIsIHAgPSBsWzEyXSwgeSA9IGwuc3ViYXJyYXkoNiwgMTIpO1xuICAgICAgICBuICs9IFwiLlwiICsgdSArIGQsIG4gKz0gXCIuXCIgKyBVUyhoKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSwgbiArPSBcIi5cIiArIGYgKyBwO1xuICAgICAgICBsZXQgRSA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGIgPSB5Lmxlbmd0aDsgYi0tOyApIHtcbiAgICAgICAgICBjb25zdCBSID0geVtiXTtcbiAgICAgICAgICAoUiB8fCBFKSAmJiAoRSA9IFwiLlwiICsgUi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIEUpO1xuICAgICAgICB9XG4gICAgICAgIG4gKz0gRTtcbiAgICAgIH1cbiAgICAgIGkgPSBqaShhID09IFwiaGV2MVwiID8gXCJkdmhlXCIgOiBcImR2aDFcIiwgdCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImR2aDFcIjpcbiAgICBjYXNlIFwiZHZoZVwiOlxuICAgIGNhc2UgXCJkdmF2XCI6XG4gICAgY2FzZSBcImR2YTFcIjpcbiAgICBjYXNlIFwiZGF2MVwiOiB7XG4gICAgICBuID0gamkobiwgdCkgfHwgbjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwidnAwOVwiOiB7XG4gICAgICBjb25zdCBsID0gR2UodCwgW1widnBjQ1wiXSlbMF07XG4gICAgICBpZiAobCAmJiBsLmxlbmd0aCA+IDYpIHtcbiAgICAgICAgY29uc3QgYyA9IGxbNF0sIHUgPSBsWzVdLCBkID0gbFs2XSA+PiA0ICYgMTU7XG4gICAgICAgIG4gKz0gXCIuXCIgKyBWcihjKSArIFwiLlwiICsgVnIodSkgKyBcIi5cIiArIFZyKGQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJhdjAxXCI6IHtcbiAgICAgIGNvbnN0IGwgPSBHZSh0LCBbXCJhdjFDXCJdKVswXTtcbiAgICAgIGlmIChsICYmIGwubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBjID0gbFsxXSA+Pj4gNSwgdSA9IGxbMV0gJiAzMSwgZCA9IGxbMl0gPj4+IDcgPyBcIkhcIiA6IFwiTVwiLCBoID0gKGxbMl0gJiA2NCkgPj4gNiwgZiA9IChsWzJdICYgMzIpID4+IDUsIHAgPSBjID09PSAyICYmIGggPyBmID8gMTIgOiAxMCA6IGggPyAxMCA6IDgsIHkgPSAobFsyXSAmIDE2KSA+PiA0LCBFID0gKGxbMl0gJiA4KSA+PiAzLCBiID0gKGxbMl0gJiA0KSA+PiAyLCBSID0gbFsyXSAmIDM7XG4gICAgICAgIG4gKz0gXCIuXCIgKyBjICsgXCIuXCIgKyBWcih1KSArIGQgKyBcIi5cIiArIFZyKHApICsgXCIuXCIgKyB5ICsgXCIuXCIgKyBFICsgYiArIFIgKyBcIi5cIiArIFZyKDEpICsgXCIuXCIgKyBWcigxKSArIFwiLlwiICsgVnIoMSkgKyBcIi5cIiArIDAsIGkgPSBqaShcImRhdjFcIiwgdCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2RlYzogbixcbiAgICBlbmNyeXB0ZWQ6IG8sXG4gICAgc3VwcGxlbWVudGFsOiBpXG4gIH07XG59XG5mdW5jdGlvbiBqaShzLCBlKSB7XG4gIGNvbnN0IHQgPSBHZShlLCBbXCJkdnZDXCJdKSwgciA9IHQubGVuZ3RoID8gdFswXSA6IEdlKGUsIFtcImR2Y0NcIl0pWzBdO1xuICBpZiAocikge1xuICAgIGNvbnN0IG4gPSByWzJdID4+IDEgJiAxMjcsIGkgPSByWzJdIDw8IDUgJiAzMiB8IHJbM10gPj4gMyAmIDMxO1xuICAgIHJldHVybiBzICsgXCIuXCIgKyBWcihuKSArIFwiLlwiICsgVnIoaSk7XG4gIH1cbn1cbmZ1bmN0aW9uIFVTKHMpIHtcbiAgbGV0IGUgPSAwO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IDMyOyB0KyspXG4gICAgZSB8PSAocyA+PiB0ICYgMSkgPDwgMzEgLSB0O1xuICByZXR1cm4gZSA+Pj4gMDtcbn1cbmZ1bmN0aW9uIGRsKHMsIGUpIHtcbiAgY29uc3QgdCA9IGUgKyA1O1xuICBmb3IgKDsgc1tlKytdICYgMTI4ICYmIGUgPCB0OyApXG4gICAgO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIEtpKHMpIHtcbiAgcmV0dXJuIChcIjBcIiArIHMudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC0yKTtcbn1cbmZ1bmN0aW9uIFZyKHMpIHtcbiAgcmV0dXJuIChzIDwgMTAgPyBcIjBcIiA6IFwiXCIpICsgcztcbn1cbmZ1bmN0aW9uICRTKHMsIGUpIHtcbiAgaWYgKCFzIHx8ICFlKVxuICAgIHJldHVybjtcbiAgY29uc3QgdCA9IGUua2V5SWQ7XG4gIHQgJiYgZS5pc0NvbW1vbkVuY3J5cHRpb24gJiYgR2UocywgW1wibW9vdlwiLCBcInRyYWtcIl0pLmZvckVhY2goKG4pID0+IHtcbiAgICBjb25zdCBvID0gR2UobiwgW1wibWRpYVwiLCBcIm1pbmZcIiwgXCJzdGJsXCIsIFwic3RzZFwiXSlbMF0uc3ViYXJyYXkoOCk7XG4gICAgbGV0IGEgPSBHZShvLCBbXCJlbmNhXCJdKTtcbiAgICBjb25zdCBsID0gYS5sZW5ndGggPiAwO1xuICAgIGwgfHwgKGEgPSBHZShvLCBbXCJlbmN2XCJdKSksIGEuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgY29uc3QgdSA9IGwgPyBjLnN1YmFycmF5KDI4KSA6IGMuc3ViYXJyYXkoNzgpO1xuICAgICAgR2UodSwgW1wic2luZlwiXSkuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICBjb25zdCBmID0gUGcoaCk7XG4gICAgICAgIGlmIChmKSB7XG4gICAgICAgICAgY29uc3QgcCA9IGYuc3ViYXJyYXkoOCwgMjQpO1xuICAgICAgICAgIHAuc29tZSgoeSkgPT4geSAhPT0gMCkgfHwgKHJ0LmxvZyhgW2VtZV0gUGF0Y2hpbmcga2V5SWQgaW4gJ2VuYyR7bCA/IFwiYVwiIDogXCJ2XCJ9PnNpbmY+PnRlbmMnIGJveDogJHtmcihwKX0gLT4gJHtmcih0KX1gKSwgZi5zZXQodCwgOCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBQZyhzKSB7XG4gIGNvbnN0IGUgPSBHZShzLCBbXCJzY2htXCJdKVswXTtcbiAgaWYgKGUpIHtcbiAgICBjb25zdCB0ID0ganQoZS5zdWJhcnJheSg0LCA4KSk7XG4gICAgaWYgKHQgPT09IFwiY2Jjc1wiIHx8IHQgPT09IFwiY2VuY1wiKVxuICAgICAgcmV0dXJuIEdlKHMsIFtcInNjaGlcIiwgXCJ0ZW5jXCJdKVswXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIEdTKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHt9LCBuID0gR2UocywgW1wibW9vZlwiLCBcInRyYWZcIl0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvID0gbltpXSwgYSA9IEdlKG8sIFtcInRmaGRcIl0pWzBdLCBsID0gSWUoYSwgNCksIGMgPSBlW2xdO1xuICAgIGlmICghYylcbiAgICAgIGNvbnRpbnVlO1xuICAgIHJbbF0gfHwgKHJbbF0gPSB7XG4gICAgICBzdGFydDogTmFOLFxuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBzYW1wbGVDb3VudDogMCxcbiAgICAgIHRpbWVzY2FsZTogYy50aW1lc2NhbGUsXG4gICAgICB0eXBlOiBjLnR5cGVcbiAgICB9KTtcbiAgICBjb25zdCB1ID0gcltsXSwgZCA9IEdlKG8sIFtcInRmZHRcIl0pWzBdO1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zdCBBID0gZFswXTtcbiAgICAgIGxldCBGID0gSWUoZCwgNCk7XG4gICAgICBBID09PSAxICYmIChGID09PSBlaCA/IHQud2FybihcIlttcDQtZGVtdXhlcl06IElnbm9yaW5nIGFzc3VtZWQgaW52YWxpZCBzaWduZWQgNjQtYml0IHRyYWNrIGZyYWdtZW50IGRlY29kZSB0aW1lXCIpIDogKEYgKj0gZWggKyAxLCBGICs9IEllKGQsIDgpKSksIHVlKEYpICYmICghdWUodS5zdGFydCkgfHwgRiA8IHUuc3RhcnQpICYmICh1LnN0YXJ0ID0gRik7XG4gICAgfVxuICAgIGNvbnN0IGggPSBjLmRlZmF1bHQsIGYgPSBJZShhLCAwKSB8IChoID09IG51bGwgPyB2b2lkIDAgOiBoLmZsYWdzKTtcbiAgICBsZXQgcCA9IChoID09IG51bGwgPyB2b2lkIDAgOiBoLmR1cmF0aW9uKSB8fCAwO1xuICAgIGYgJiA4ICYmIChmICYgMiA/IHAgPSBJZShhLCAxMikgOiBwID0gSWUoYSwgOCkpO1xuICAgIGNvbnN0IHkgPSBHZShvLCBbXCJ0cnVuXCJdKTtcbiAgICBsZXQgRSA9IHUuc3RhcnQgfHwgMCwgYiA9IDAsIFIgPSBwO1xuICAgIGZvciAobGV0IEEgPSAwOyBBIDwgeS5sZW5ndGg7IEErKykge1xuICAgICAgY29uc3QgRiA9IHlbQV0sIE0gPSBJZShGLCA0KSwgSCA9IHUuc2FtcGxlQ291bnQ7XG4gICAgICB1LnNhbXBsZUNvdW50ICs9IE07XG4gICAgICBjb25zdCBLID0gRlszXSAmIDEsIGogPSBGWzNdICYgNCwgQyA9IEZbMl0gJiAxLCBrID0gRlsyXSAmIDIsICQgPSBGWzJdICYgNCwgVyA9IEZbMl0gJiA4O1xuICAgICAgbGV0IF8gPSA4LCBnID0gTTtcbiAgICAgIGZvciAoSyAmJiAoXyArPSA0KSwgaiAmJiBNICYmICghKEZbXyArIDFdICYgMSkgJiYgdS5rZXlGcmFtZUluZGV4ID09PSB2b2lkIDAgJiYgKHUua2V5RnJhbWVJbmRleCA9IEgpLCBfICs9IDQsIEMgPyAoUiA9IEllKEYsIF8pLCBfICs9IDQpIDogUiA9IHAsIGsgJiYgKF8gKz0gNCksIFcgJiYgKF8gKz0gNCksIEUgKz0gUiwgYiArPSBSLCBnLS0pOyBnLS07IClcbiAgICAgICAgQyA/IChSID0gSWUoRiwgXyksIF8gKz0gNCkgOiBSID0gcCwgayAmJiAoXyArPSA0KSwgJCAmJiAoRltfICsgMV0gJiAxIHx8IHUua2V5RnJhbWVJbmRleCA9PT0gdm9pZCAwICYmICh1LmtleUZyYW1lSW5kZXggPSB1LnNhbXBsZUNvdW50IC0gKGcgKyAxKSwgdS5rZXlGcmFtZVN0YXJ0ID0gRSksIF8gKz0gNCksIFcgJiYgKF8gKz0gNCksIEUgKz0gUiwgYiArPSBSO1xuICAgICAgIWIgJiYgcCAmJiAoYiArPSBwICogTSk7XG4gICAgfVxuICAgIHUuZHVyYXRpb24gKz0gYjtcbiAgfVxuICBpZiAoIU9iamVjdC5rZXlzKHIpLnNvbWUoKGkpID0+IHJbaV0uZHVyYXRpb24pKSB7XG4gICAgbGV0IGkgPSAxIC8gMCwgbyA9IDA7XG4gICAgY29uc3QgYSA9IEdlKHMsIFtcInNpZHhcIl0pO1xuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgYS5sZW5ndGg7IGwrKykge1xuICAgICAgY29uc3QgYyA9IEZTKGFbbF0pO1xuICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgaSA9IE1hdGgubWluKGksIGMuZWFybGllc3RQcmVzZW50YXRpb25UaW1lIC8gYy50aW1lc2NhbGUpO1xuICAgICAgICBjb25zdCB1ID0gYy5yZWZlcmVuY2VzLnJlZHVjZSgoZCwgaCkgPT4gZCArIGguaW5mby5kdXJhdGlvbiB8fCAwLCAwKTtcbiAgICAgICAgbyA9IE1hdGgubWF4KG8sIHUgKyBjLmVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSAvIGMudGltZXNjYWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbyAmJiB1ZShvKSAmJiBPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICByW2xdLmR1cmF0aW9uIHx8IChyW2xdLmR1cmF0aW9uID0gbyAqIHJbbF0udGltZXNjYWxlIC0gcltsXS5zdGFydCk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBWUyhzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgdmFsaWQ6IG51bGwsXG4gICAgcmVtYWluZGVyOiBudWxsXG4gIH0sIHQgPSBHZShzLCBbXCJtb29mXCJdKTtcbiAgaWYgKHQubGVuZ3RoIDwgMilcbiAgICByZXR1cm4gZS5yZW1haW5kZXIgPSBzLCBlO1xuICBjb25zdCByID0gdFt0Lmxlbmd0aCAtIDFdO1xuICByZXR1cm4gZS52YWxpZCA9IHMuc2xpY2UoMCwgci5ieXRlT2Zmc2V0IC0gOCksIGUucmVtYWluZGVyID0gcy5zbGljZShyLmJ5dGVPZmZzZXQgLSA4KSwgZTtcbn1cbmZ1bmN0aW9uIF9yKHMsIGUpIHtcbiAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoICsgZS5sZW5ndGgpO1xuICByZXR1cm4gdC5zZXQocyksIHQuc2V0KGUsIHMubGVuZ3RoKSwgdDtcbn1cbmZ1bmN0aW9uIHJoKHMsIGUpIHtcbiAgY29uc3QgdCA9IFtdLCByID0gZS5zYW1wbGVzLCBuID0gZS50aW1lc2NhbGUsIGkgPSBlLmlkO1xuICBsZXQgbyA9ICExO1xuICByZXR1cm4gR2UociwgW1wibW9vZlwiXSkubWFwKChsKSA9PiB7XG4gICAgY29uc3QgYyA9IGwuYnl0ZU9mZnNldCAtIDg7XG4gICAgR2UobCwgW1widHJhZlwiXSkubWFwKChkKSA9PiB7XG4gICAgICBjb25zdCBoID0gR2UoZCwgW1widGZkdFwiXSkubWFwKChmKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBmWzBdO1xuICAgICAgICBsZXQgeSA9IEllKGYsIDQpO1xuICAgICAgICByZXR1cm4gcCA9PT0gMSAmJiAoeSAqPSBNYXRoLnBvdygyLCAzMiksIHkgKz0gSWUoZiwgOCkpLCB5IC8gbjtcbiAgICAgIH0pWzBdO1xuICAgICAgcmV0dXJuIGggIT09IHZvaWQgMCAmJiAocyA9IGgpLCBHZShkLCBbXCJ0ZmhkXCJdKS5tYXAoKGYpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IEllKGYsIDQpLCB5ID0gSWUoZiwgMCkgJiAxNjc3NzIxNSwgRSA9ICh5ICYgMSkgIT09IDAsIGIgPSAoeSAmIDIpICE9PSAwLCBSID0gKHkgJiA4KSAhPT0gMDtcbiAgICAgICAgbGV0IEEgPSAwO1xuICAgICAgICBjb25zdCBGID0gKHkgJiAxNikgIT09IDA7XG4gICAgICAgIGxldCBNID0gMDtcbiAgICAgICAgY29uc3QgSCA9ICh5ICYgMzIpICE9PSAwO1xuICAgICAgICBsZXQgSyA9IDg7XG4gICAgICAgIHAgPT09IGkgJiYgKEUgJiYgKEsgKz0gOCksIGIgJiYgKEsgKz0gNCksIFIgJiYgKEEgPSBJZShmLCBLKSwgSyArPSA0KSwgRiAmJiAoTSA9IEllKGYsIEspLCBLICs9IDQpLCBIICYmIChLICs9IDQpLCBlLnR5cGUgPT09IFwidmlkZW9cIiAmJiAobyA9IHlhKGUuY29kZWMpKSwgR2UoZCwgW1widHJ1blwiXSkubWFwKChqKSA9PiB7XG4gICAgICAgICAgY29uc3QgQyA9IGpbMF0sIGsgPSBJZShqLCAwKSAmIDE2Nzc3MjE1LCAkID0gKGsgJiAxKSAhPT0gMDtcbiAgICAgICAgICBsZXQgVyA9IDA7XG4gICAgICAgICAgY29uc3QgXyA9IChrICYgNCkgIT09IDAsIGcgPSAoayAmIDI1NikgIT09IDA7XG4gICAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICAgIGNvbnN0IHcgPSAoayAmIDUxMikgIT09IDA7XG4gICAgICAgICAgbGV0IEQgPSAwO1xuICAgICAgICAgIGNvbnN0IE8gPSAoayAmIDEwMjQpICE9PSAwLCBVID0gKGsgJiAyMDQ4KSAhPT0gMDtcbiAgICAgICAgICBsZXQgViA9IDA7XG4gICAgICAgICAgY29uc3QgTCA9IEllKGosIDQpO1xuICAgICAgICAgIGxldCBtID0gODtcbiAgICAgICAgICAkICYmIChXID0gSWUoaiwgbSksIG0gKz0gNCksIF8gJiYgKG0gKz0gNCk7XG4gICAgICAgICAgbGV0IHYgPSBXICsgYztcbiAgICAgICAgICBmb3IgKGxldCBQID0gMDsgUCA8IEw7IFArKykge1xuICAgICAgICAgICAgaWYgKGcgPyAoeCA9IEllKGosIG0pLCBtICs9IDQpIDogeCA9IEEsIHcgPyAoRCA9IEllKGosIG0pLCBtICs9IDQpIDogRCA9IE0sIE8gJiYgKG0gKz0gNCksIFUgJiYgKEMgPT09IDAgPyBWID0gSWUoaiwgbSkgOiBWID0ga2coaiwgbSksIG0gKz0gNCksIGUudHlwZSA9PT0gb3QuVklERU8pIHtcbiAgICAgICAgICAgICAgbGV0IE4gPSAwO1xuICAgICAgICAgICAgICBmb3IgKDsgTiA8IEQ7ICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFkgPSBJZShyLCB2KTtcbiAgICAgICAgICAgICAgICBpZiAodiArPSA0LCBqUyhvLCByW3ZdKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWUgPSByLnN1YmFycmF5KHYsIHYgKyBZKTtcbiAgICAgICAgICAgICAgICAgIGd1KGVlLCBvID8gMiA6IDEsIHMgKyBWIC8gbiwgdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYgKz0gWSwgTiArPSBZICsgNDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcyArPSB4IC8gbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KSwgdDtcbn1cbmZ1bmN0aW9uIHlhKHMpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiAhMTtcbiAgY29uc3QgZSA9IHMuc3Vic3RyaW5nKDAsIDQpO1xuICByZXR1cm4gZSA9PT0gXCJodmMxXCIgfHwgZSA9PT0gXCJoZXYxXCIgfHwgLy8gRG9sYnkgVmlzaW9uXG4gIGUgPT09IFwiZHZoMVwiIHx8IGUgPT09IFwiZHZoZVwiO1xufVxuZnVuY3Rpb24galMocywgZSkge1xuICBpZiAocykge1xuICAgIGNvbnN0IHQgPSBlID4+IDEgJiA2MztcbiAgICByZXR1cm4gdCA9PT0gMzkgfHwgdCA9PT0gNDA7XG4gIH0gZWxzZVxuICAgIHJldHVybiAoZSAmIDMxKSA9PT0gNjtcbn1cbmZ1bmN0aW9uIGd1KHMsIGUsIHQsIHIpIHtcbiAgY29uc3QgbiA9IE1nKHMpO1xuICBsZXQgaSA9IDA7XG4gIGkgKz0gZTtcbiAgbGV0IG8gPSAwLCBhID0gMCwgbCA9IDA7XG4gIGZvciAoOyBpIDwgbi5sZW5ndGg7ICkge1xuICAgIG8gPSAwO1xuICAgIGRvIHtcbiAgICAgIGlmIChpID49IG4ubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGwgPSBuW2krK10sIG8gKz0gbDtcbiAgICB9IHdoaWxlIChsID09PSAyNTUpO1xuICAgIGEgPSAwO1xuICAgIGRvIHtcbiAgICAgIGlmIChpID49IG4ubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGwgPSBuW2krK10sIGEgKz0gbDtcbiAgICB9IHdoaWxlIChsID09PSAyNTUpO1xuICAgIGNvbnN0IGMgPSBuLmxlbmd0aCAtIGk7XG4gICAgbGV0IHUgPSBpO1xuICAgIGlmIChhIDwgYylcbiAgICAgIGkgKz0gYTtcbiAgICBlbHNlIGlmIChhID4gYykge1xuICAgICAgcnQuZXJyb3IoYE1hbGZvcm1lZCBTRUkgcGF5bG9hZC4gJHthfSBpcyB0b28gc21hbGwsIG9ubHkgJHtjfSBieXRlcyBsZWZ0IHRvIHBhcnNlLmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvID09PSA0KSB7XG4gICAgICBpZiAoblt1KytdID09PSAxODEpIHtcbiAgICAgICAgY29uc3QgaCA9IENnKG4sIHUpO1xuICAgICAgICBpZiAodSArPSAyLCBoID09PSA0OSkge1xuICAgICAgICAgIGNvbnN0IGYgPSBJZShuLCB1KTtcbiAgICAgICAgICBpZiAodSArPSA0LCBmID09PSAxMTk1NDU2ODIwKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gblt1KytdO1xuICAgICAgICAgICAgaWYgKHAgPT09IDMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeSA9IG5bdSsrXSwgRSA9IDMxICYgeSwgYiA9IDY0ICYgeSwgUiA9IGIgPyAyICsgRSAqIDMgOiAwLCBBID0gbmV3IFVpbnQ4QXJyYXkoUik7XG4gICAgICAgICAgICAgIGlmIChiKSB7XG4gICAgICAgICAgICAgICAgQVswXSA9IHk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgRiA9IDE7IEYgPCBSOyBGKyspXG4gICAgICAgICAgICAgICAgICBBW0ZdID0gblt1KytdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogcCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkVHlwZTogbyxcbiAgICAgICAgICAgICAgICBwdHM6IHQsXG4gICAgICAgICAgICAgICAgYnl0ZXM6IEFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvID09PSA1ICYmIGEgPiAxNikge1xuICAgICAgY29uc3QgZCA9IFtdO1xuICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCAxNjsgcCsrKSB7XG4gICAgICAgIGNvbnN0IHkgPSBuW3UrK10udG9TdHJpbmcoMTYpO1xuICAgICAgICBkLnB1c2goeS5sZW5ndGggPT0gMSA/IFwiMFwiICsgeSA6IHkpLCAocCA9PT0gMyB8fCBwID09PSA1IHx8IHAgPT09IDcgfHwgcCA9PT0gOSkgJiYgZC5wdXNoKFwiLVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGggPSBhIC0gMTYsIGYgPSBuZXcgVWludDhBcnJheShoKTtcbiAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgaDsgcCsrKVxuICAgICAgICBmW3BdID0gblt1KytdO1xuICAgICAgci5wdXNoKHtcbiAgICAgICAgcGF5bG9hZFR5cGU6IG8sXG4gICAgICAgIHB0czogdCxcbiAgICAgICAgdXVpZDogZC5qb2luKFwiXCIpLFxuICAgICAgICB1c2VyRGF0YTogVHIoZiksXG4gICAgICAgIHVzZXJEYXRhQnl0ZXM6IGZcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gTWcocykge1xuICBjb25zdCBlID0gcy5ieXRlTGVuZ3RoLCB0ID0gW107XG4gIGxldCByID0gMTtcbiAgZm9yICg7IHIgPCBlIC0gMjsgKVxuICAgIHNbcl0gPT09IDAgJiYgc1tyICsgMV0gPT09IDAgJiYgc1tyICsgMl0gPT09IDMgPyAodC5wdXNoKHIgKyAyKSwgciArPSAyKSA6IHIrKztcbiAgaWYgKHQubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBzO1xuICBjb25zdCBuID0gZSAtIHQubGVuZ3RoLCBpID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGxldCBvID0gMDtcbiAgZm9yIChyID0gMDsgciA8IG47IG8rKywgcisrKVxuICAgIG8gPT09IHRbMF0gJiYgKG8rKywgdC5zaGlmdCgpKSwgaVtyXSA9IHNbb107XG4gIHJldHVybiBpO1xufVxuZnVuY3Rpb24gS1Mocykge1xuICBjb25zdCBlID0gc1swXTtcbiAgbGV0IHQgPSBcIlwiLCByID0gXCJcIiwgbiA9IDAsIGkgPSAwLCBvID0gMCwgYSA9IDAsIGwgPSAwLCBjID0gMDtcbiAgaWYgKGUgPT09IDApIHtcbiAgICBmb3IgKDsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICB0ICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIGZvciAodCArPSBqdChzLnN1YmFycmF5KGMsIGMgKyAxKSksIGMgKz0gMTsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICByICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIHIgKz0ganQocy5zdWJhcnJheShjLCBjICsgMSkpLCBjICs9IDEsIG4gPSBJZShzLCAxMiksIGkgPSBJZShzLCAxNiksIGEgPSBJZShzLCAyMCksIGwgPSBJZShzLCAyNCksIGMgPSAyODtcbiAgfSBlbHNlIGlmIChlID09PSAxKSB7XG4gICAgYyArPSA0LCBuID0gSWUocywgYyksIGMgKz0gNDtcbiAgICBjb25zdCBkID0gSWUocywgYyk7XG4gICAgYyArPSA0O1xuICAgIGNvbnN0IGggPSBJZShzLCBjKTtcbiAgICBmb3IgKGMgKz0gNCwgbyA9IDIgKiogMzIgKiBkICsgaCwgU1MobykgfHwgKG8gPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgcnQud2FybihcIlByZXNlbnRhdGlvbiB0aW1lIGV4Y2VlZHMgc2FmZSBpbnRlZ2VyIGxpbWl0IGFuZCB3cmFwcGVkIHRvIG1heCBzYWZlIGludGVnZXIgaW4gcGFyc2luZyBlbXNnIGJveFwiKSksIGEgPSBJZShzLCBjKSwgYyArPSA0LCBsID0gSWUocywgYyksIGMgKz0gNDsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICB0ICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIGZvciAodCArPSBqdChzLnN1YmFycmF5KGMsIGMgKyAxKSksIGMgKz0gMTsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICByICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIHIgKz0ganQocy5zdWJhcnJheShjLCBjICsgMSkpLCBjICs9IDE7XG4gIH1cbiAgY29uc3QgdSA9IHMuc3ViYXJyYXkoYywgcy5ieXRlTGVuZ3RoKTtcbiAgcmV0dXJuIHtcbiAgICBzY2hlbWVJZFVyaTogdCxcbiAgICB2YWx1ZTogcixcbiAgICB0aW1lU2NhbGU6IG4sXG4gICAgcHJlc2VudGF0aW9uVGltZTogbyxcbiAgICBwcmVzZW50YXRpb25UaW1lRGVsdGE6IGksXG4gICAgZXZlbnREdXJhdGlvbjogYSxcbiAgICBpZDogbCxcbiAgICBwYXlsb2FkOiB1XG4gIH07XG59XG5mdW5jdGlvbiBIUyhzLCAuLi5lKSB7XG4gIGNvbnN0IHQgPSBlLmxlbmd0aDtcbiAgbGV0IHIgPSA4LCBuID0gdDtcbiAgZm9yICg7IG4tLTsgKVxuICAgIHIgKz0gZVtuXS5ieXRlTGVuZ3RoO1xuICBjb25zdCBpID0gbmV3IFVpbnQ4QXJyYXkocik7XG4gIGZvciAoaVswXSA9IHIgPj4gMjQgJiAyNTUsIGlbMV0gPSByID4+IDE2ICYgMjU1LCBpWzJdID0gciA+PiA4ICYgMjU1LCBpWzNdID0gciAmIDI1NSwgaS5zZXQocywgNCksIG4gPSAwLCByID0gODsgbiA8IHQ7IG4rKylcbiAgICBpLnNldChlW25dLCByKSwgciArPSBlW25dLmJ5dGVMZW5ndGg7XG4gIHJldHVybiBpO1xufVxuZnVuY3Rpb24gcVMocywgZSwgdCkge1xuICBpZiAocy5ieXRlTGVuZ3RoICE9PSAxNilcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgc3lzdGVtIGlkXCIpO1xuICBsZXQgciwgbjtcbiAgciA9IDAsIG4gPSBuZXcgVWludDhBcnJheSgpO1xuICBsZXQgaTtcbiAgciA+IDAgPyAoaSA9IG5ldyBVaW50OEFycmF5KDQpLCBlLmxlbmd0aCA+IDAgJiYgbmV3IERhdGFWaWV3KGkuYnVmZmVyKS5zZXRVaW50MzIoMCwgZS5sZW5ndGgsICExKSkgOiBpID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgY29uc3QgbyA9IG5ldyBVaW50OEFycmF5KDQpO1xuICByZXR1cm4gdC5ieXRlTGVuZ3RoID4gMCAmJiBuZXcgRGF0YVZpZXcoby5idWZmZXIpLnNldFVpbnQzMigwLCB0LmJ5dGVMZW5ndGgsICExKSwgSFMoXG4gICAgWzExMiwgMTE1LCAxMTUsIDEwNF0sXG4gICAgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgcixcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gRmxhZ3NcbiAgICBdKSxcbiAgICBzLFxuICAgIC8vIDE2IGJ5dGVzXG4gICAgaSxcbiAgICBuLFxuICAgIG8sXG4gICAgdFxuICApO1xufVxuZnVuY3Rpb24gV1Mocykge1xuICBjb25zdCBlID0gW107XG4gIGlmIChzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICBjb25zdCB0ID0gcy5ieXRlTGVuZ3RoO1xuICAgIGxldCByID0gMDtcbiAgICBmb3IgKDsgciArIDMyIDwgdDsgKSB7XG4gICAgICBjb25zdCBuID0gbmV3IERhdGFWaWV3KHMsIHIpLCBpID0gelMobik7XG4gICAgICBlLnB1c2goaSksIHIgKz0gaS5zaXplO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHpTKHMpIHtcbiAgY29uc3QgZSA9IHMuZ2V0VWludDMyKDApLCB0ID0gcy5ieXRlT2Zmc2V0LCByID0gcy5ieXRlTGVuZ3RoO1xuICBpZiAociA8IGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldDogdCxcbiAgICAgIHNpemU6IHJcbiAgICB9O1xuICBpZiAocy5nZXRVaW50MzIoNCkgIT09IDE4ODY2MTQzNzYpXG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldDogdCxcbiAgICAgIHNpemU6IGVcbiAgICB9O1xuICBjb25zdCBpID0gcy5nZXRVaW50MzIoOCkgPj4+IDI0O1xuICBpZiAoaSAhPT0gMCAmJiBpICE9PSAxKVxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXQ6IHQsXG4gICAgICBzaXplOiBlXG4gICAgfTtcbiAgY29uc3QgbyA9IHMuYnVmZmVyLCBhID0gZnIobmV3IFVpbnQ4QXJyYXkobywgdCArIDEyLCAxNikpO1xuICBsZXQgbCA9IG51bGwsIGMgPSBudWxsLCB1ID0gMDtcbiAgaWYgKGkgPT09IDApXG4gICAgdSA9IDI4O1xuICBlbHNlIHtcbiAgICBjb25zdCBoID0gcy5nZXRVaW50MzIoMjgpO1xuICAgIGlmICghaCB8fCByIDwgMzIgKyBoICogMTYpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBvZmZzZXQ6IHQsXG4gICAgICAgIHNpemU6IGVcbiAgICAgIH07XG4gICAgbCA9IFtdO1xuICAgIGZvciAobGV0IGYgPSAwOyBmIDwgaDsgZisrKVxuICAgICAgbC5wdXNoKG5ldyBVaW50OEFycmF5KG8sIHQgKyAzMiArIGYgKiAxNiwgMTYpKTtcbiAgICB1ID0gMzIgKyBoICogMTY7XG4gIH1cbiAgaWYgKCF1KVxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXQ6IHQsXG4gICAgICBzaXplOiBlXG4gICAgfTtcbiAgY29uc3QgZCA9IHMuZ2V0VWludDMyKHUpO1xuICByZXR1cm4gZSAtIDMyIDwgZCA/IHtcbiAgICBvZmZzZXQ6IHQsXG4gICAgc2l6ZTogZVxuICB9IDogKGMgPSBuZXcgVWludDhBcnJheShvLCB0ICsgdSArIDQsIGQpLCB7XG4gICAgdmVyc2lvbjogaSxcbiAgICBzeXN0ZW1JZDogYSxcbiAgICBraWRzOiBsLFxuICAgIGRhdGE6IGMsXG4gICAgb2Zmc2V0OiB0LFxuICAgIHNpemU6IGVcbiAgfSk7XG59XG5jb25zdCBPZyA9ICgpID0+IC9cXChXaW5kb3dzLitGaXJlZm94XFwvL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSwgRm4gPSB7XG4gIGF1ZGlvOiB7XG4gICAgYTNkczogMSxcbiAgICBcImFjLTNcIjogMC45NSxcbiAgICBcImFjLTRcIjogMSxcbiAgICBhbGFjOiAwLjksXG4gICAgYWxhdzogMSxcbiAgICBkcmExOiAxLFxuICAgIFwiZHRzK1wiOiAxLFxuICAgIFwiZHRzLVwiOiAxLFxuICAgIGR0c2M6IDEsXG4gICAgZHRzZTogMSxcbiAgICBkdHNoOiAxLFxuICAgIFwiZWMtM1wiOiAwLjksXG4gICAgZW5jYTogMSxcbiAgICBmTGFDOiAwLjksXG4gICAgLy8gTVA0LVJBIGxpc3RlZCBjb2RlYyBlbnRyeSBmb3IgRkxBQ1xuICAgIGZsYWM6IDAuOSxcbiAgICAvLyBsZWdhY3kgYnJvd3NlciBjb2RlYyBuYW1lIGZvciBGTEFDXG4gICAgRkxBQzogMC45LFxuICAgIC8vIHNvbWUgbWFuaWZlc3RzIG1heSBsaXN0IFwiRkxBQ1wiIHdpdGggQXBwbGUncyB0b29sc1xuICAgIGc3MTk6IDEsXG4gICAgZzcyNjogMSxcbiAgICBtNGFlOiAxLFxuICAgIG1oYTE6IDEsXG4gICAgbWhhMjogMSxcbiAgICBtaG0xOiAxLFxuICAgIG1obTI6IDEsXG4gICAgbWxwYTogMSxcbiAgICBtcDRhOiAxLFxuICAgIFwicmF3IFwiOiAxLFxuICAgIE9wdXM6IDEsXG4gICAgb3B1czogMSxcbiAgICAvLyBicm93c2VycyBleHBlY3QgdGhpcyB0byBiZSBsb3dlcmNhc2UgZGVzcGl0ZSBNUDRSQSBzYXlzICdPcHVzJ1xuICAgIHNhbXI6IDEsXG4gICAgc2F3YjogMSxcbiAgICBzYXdwOiAxLFxuICAgIHNldmM6IDEsXG4gICAgc3FjcDogMSxcbiAgICBzc212OiAxLFxuICAgIHR3b3M6IDEsXG4gICAgdWxhdzogMVxuICB9LFxuICB2aWRlbzoge1xuICAgIGF2YzE6IDEsXG4gICAgYXZjMjogMSxcbiAgICBhdmMzOiAxLFxuICAgIGF2YzQ6IDEsXG4gICAgYXZjcDogMSxcbiAgICBhdjAxOiAwLjgsXG4gICAgZGF2MTogMC44LFxuICAgIGRyYWM6IDEsXG4gICAgZHZhMTogMSxcbiAgICBkdmF2OiAxLFxuICAgIGR2aDE6IDAuNyxcbiAgICBkdmhlOiAwLjcsXG4gICAgZW5jdjogMSxcbiAgICBoZXYxOiAwLjc1LFxuICAgIGh2YzE6IDAuNzUsXG4gICAgbWpwMjogMSxcbiAgICBtcDR2OiAxLFxuICAgIG12YzE6IDEsXG4gICAgbXZjMjogMSxcbiAgICBtdmMzOiAxLFxuICAgIG12YzQ6IDEsXG4gICAgcmVzdjogMSxcbiAgICBydjYwOiAxLFxuICAgIHMyNjM6IDEsXG4gICAgc3ZjMTogMSxcbiAgICBzdmMyOiAxLFxuICAgIFwidmMtMVwiOiAxLFxuICAgIHZwMDg6IDEsXG4gICAgdnAwOTogMC45XG4gIH0sXG4gIHRleHQ6IHtcbiAgICBzdHBwOiAxLFxuICAgIHd2dHQ6IDFcbiAgfVxufTtcbmZ1bmN0aW9uIHB1KHMsIGUpIHtcbiAgY29uc3QgdCA9IEZuW2VdO1xuICByZXR1cm4gISF0ICYmICEhdFtzLnNsaWNlKDAsIDQpXTtcbn1cbmZ1bmN0aW9uIGdpKHMsIGUsIHQgPSAhMCkge1xuICByZXR1cm4gIXMuc3BsaXQoXCIsXCIpLnNvbWUoKHIpID0+ICFtdShyLCBlLCB0KSk7XG59XG5mdW5jdGlvbiBtdShzLCBlLCB0ID0gITApIHtcbiAgdmFyIHI7XG4gIGNvbnN0IG4gPSBNcyh0KTtcbiAgcmV0dXJuIChyID0gbiA9PSBudWxsID8gdm9pZCAwIDogbi5pc1R5cGVTdXBwb3J0ZWQocGkocywgZSkpKSAhPSBudWxsID8gciA6ICExO1xufVxuZnVuY3Rpb24gcGkocywgZSkge1xuICByZXR1cm4gYCR7ZX0vbXA0O2NvZGVjcz0ke3N9YDtcbn1cbmZ1bmN0aW9uIHNoKHMpIHtcbiAgaWYgKHMpIHtcbiAgICBjb25zdCBlID0gcy5zdWJzdHJpbmcoMCwgNCk7XG4gICAgcmV0dXJuIEZuLnZpZGVvW2VdO1xuICB9XG4gIHJldHVybiAyO1xufVxuZnVuY3Rpb24gWm8ocykge1xuICBjb25zdCBlID0gT2coKTtcbiAgcmV0dXJuIHMuc3BsaXQoXCIsXCIpLnJlZHVjZSgodCwgcikgPT4ge1xuICAgIGNvbnN0IGkgPSBlICYmIHlhKHIpID8gOSA6IEZuLnZpZGVvW3JdO1xuICAgIHJldHVybiBpID8gKGkgKiAyICsgdCkgLyAodCA/IDMgOiAyKSA6IChGbi5hdWRpb1tyXSArIHQpIC8gKHQgPyAyIDogMSk7XG4gIH0sIDApO1xufVxuY29uc3QgaGwgPSB7fTtcbmZ1bmN0aW9uIFlTKHMsIGUgPSAhMCkge1xuICBpZiAoaGxbc10pXG4gICAgcmV0dXJuIGhsW3NdO1xuICBjb25zdCB0ID0ge1xuICAgIC8vIElkZWFseSBmTGFDIGFuZCBPcHVzIHdvdWxkIGJlIGZpcnN0IChzcGVjLWNvbXBsaWFudCkgYnV0XG4gICAgLy8gc29tZSBicm93c2VycyB3aWxsIHJlcG9ydCB0aGF0IGZMYUMgaXMgc3VwcG9ydGVkIHRoZW4gZmFpbC5cbiAgICAvLyBzZWU6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE0MjI3MjhcbiAgICBmbGFjOiBbXCJmbGFjXCIsIFwiZkxhQ1wiLCBcIkZMQUNcIl0sXG4gICAgb3B1czogW1wib3B1c1wiLCBcIk9wdXNcIl0sXG4gICAgLy8gUmVwbGFjZSBhdWRpbyBjb2RlYyBpbmZvIGlmIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBtcDRhLjQwLjM0LFxuICAgIC8vIGFuZCBkZW11eGVyIGNhbiBmYWxsYmFjayB0byAnYXVkaW8vbXBlZycgb3IgJ2F1ZGlvL21wNDtjb2RlY3M9XCJtcDNcIidcbiAgICBcIm1wNGEuNDAuMzRcIjogW1wibXAzXCJdXG4gIH1bc107XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgIHZhciByO1xuICAgIGlmIChtdSh0W25dLCBcImF1ZGlvXCIsIGUpKVxuICAgICAgcmV0dXJuIGhsW3NdID0gdFtuXSwgdFtuXTtcbiAgICBpZiAodFtuXSA9PT0gXCJtcDNcIiAmJiAociA9IE1zKGUpKSAhPSBudWxsICYmIHIuaXNUeXBlU3VwcG9ydGVkKFwiYXVkaW8vbXBlZ1wiKSlcbiAgICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHJldHVybiBzO1xufVxuY29uc3QgWlMgPSAvZmxhY3xvcHVzfG1wNGFcXC40MFxcLjM0L2k7XG5mdW5jdGlvbiBYbyhzLCBlID0gITApIHtcbiAgcmV0dXJuIHMucmVwbGFjZShaUywgKHQpID0+IFlTKHQudG9Mb3dlckNhc2UoKSwgZSkpO1xufVxuZnVuY3Rpb24gWFMocywgZSkge1xuICBjb25zdCB0ID0gW107XG4gIGlmIChzKSB7XG4gICAgY29uc3QgciA9IHMuc3BsaXQoXCIsXCIpO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgci5sZW5ndGg7IG4rKylcbiAgICAgIHB1KHJbbl0sIFwidmlkZW9cIikgfHwgdC5wdXNoKHJbbl0pO1xuICB9XG4gIHJldHVybiBlICYmIHQucHVzaChlKSwgdC5qb2luKFwiLFwiKTtcbn1cbmZ1bmN0aW9uIGZvKHMsIGUpIHtcbiAgaWYgKHMgJiYgKHMubGVuZ3RoID4gNCB8fCBbXCJhYy0zXCIsIFwiZWMtM1wiLCBcImFsYWNcIiwgXCJmTGFDXCIsIFwiT3B1c1wiXS5pbmRleE9mKHMpICE9PSAtMSkgJiYgKG5oKHMsIFwiYXVkaW9cIikgfHwgbmgocywgXCJ2aWRlb1wiKSkpXG4gICAgcmV0dXJuIHM7XG4gIGlmIChlKSB7XG4gICAgY29uc3QgdCA9IGUuc3BsaXQoXCIsXCIpO1xuICAgIGlmICh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChzKSB7XG4gICAgICAgIGZvciAobGV0IHIgPSB0Lmxlbmd0aDsgci0tOyApXG4gICAgICAgICAgaWYgKHRbcl0uc3Vic3RyaW5nKDAsIDQpID09PSBzLnN1YnN0cmluZygwLCA0KSlcbiAgICAgICAgICAgIHJldHVybiB0W3JdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRbMF07XG4gICAgfVxuICB9XG4gIHJldHVybiBlIHx8IHM7XG59XG5mdW5jdGlvbiBuaChzLCBlKSB7XG4gIHJldHVybiBwdShzLCBlKSAmJiBtdShzLCBlKTtcbn1cbmZ1bmN0aW9uIEpTKHMpIHtcbiAgY29uc3QgZSA9IHMuc3BsaXQoXCIsXCIpO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIHtcbiAgICBjb25zdCByID0gZVt0XS5zcGxpdChcIi5cIik7XG4gICAgci5sZW5ndGggPiAyICYmIHJbMF0gPT09IFwiYXZjMVwiICYmIChlW3RdID0gYGF2YzEuJHtwYXJzZUludChyWzFdKS50b1N0cmluZygxNil9JHsoXCIwMDBcIiArIHBhcnNlSW50KHJbMl0pLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfWApO1xuICB9XG4gIHJldHVybiBlLmpvaW4oXCIsXCIpO1xufVxuZnVuY3Rpb24gUVMocykge1xuICBpZiAocy5zdGFydHNXaXRoKFwiYXYwMS5cIikpIHtcbiAgICBjb25zdCBlID0gcy5zcGxpdChcIi5cIiksIHQgPSBbXCIwXCIsIFwiMTExXCIsIFwiMDFcIiwgXCIwMVwiLCBcIjAxXCIsIFwiMFwiXTtcbiAgICBmb3IgKGxldCByID0gZS5sZW5ndGg7IHIgPiA0ICYmIHIgPCAxMDsgcisrKVxuICAgICAgZVtyXSA9IHRbciAtIDRdO1xuICAgIHJldHVybiBlLmpvaW4oXCIuXCIpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gaWgocykge1xuICBjb25zdCBlID0gTXMocykgfHwge1xuICAgIGlzVHlwZVN1cHBvcnRlZDogKCkgPT4gITFcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtcGVnOiBlLmlzVHlwZVN1cHBvcnRlZChcImF1ZGlvL21wZWdcIiksXG4gICAgbXAzOiBlLmlzVHlwZVN1cHBvcnRlZCgnYXVkaW8vbXA0OyBjb2RlY3M9XCJtcDNcIicpLFxuICAgIGFjMzogZS5pc1R5cGVTdXBwb3J0ZWQoJ2F1ZGlvL21wNDsgY29kZWNzPVwiYWMtM1wiJylcbiAgfTtcbn1cbmZ1bmN0aW9uIGxjKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXi4rY29kZWNzPVtcIiddPyhbXlwiJ10rKS4qJC8sIFwiJDFcIik7XG59XG5jb25zdCBlYiA9IHtcbiAgc3VwcG9ydGVkOiAhMCxcbiAgcG93ZXJFZmZpY2llbnQ6ICEwLFxuICBzbW9vdGg6ICEwXG4gIC8vIGtleVN5c3RlbUFjY2VzczogbnVsbCxcbn0sIHRiID0ge1xuICBzdXBwb3J0ZWQ6ICExLFxuICBzbW9vdGg6ICExLFxuICBwb3dlckVmZmljaWVudDogITFcbiAgLy8ga2V5U3lzdGVtQWNjZXNzOiBudWxsLFxufSwgQmcgPSB7XG4gIHN1cHBvcnRlZDogITAsXG4gIGNvbmZpZ3VyYXRpb25zOiBbXSxcbiAgZGVjb2RpbmdJbmZvUmVzdWx0czogW2ViXVxufTtcbmZ1bmN0aW9uIEZnKHMsIGUpIHtcbiAgcmV0dXJuIHtcbiAgICBzdXBwb3J0ZWQ6ICExLFxuICAgIGNvbmZpZ3VyYXRpb25zOiBlLFxuICAgIGRlY29kaW5nSW5mb1Jlc3VsdHM6IFt0Yl0sXG4gICAgZXJyb3I6IHNcbiAgfTtcbn1cbmZ1bmN0aW9uIHJiKHMsIGUsIHQsIHIsIG4sIGkpIHtcbiAgY29uc3QgbyA9IHMudmlkZW9Db2RlYywgYSA9IHMuYXVkaW9Db2RlYyA/IHMuYXVkaW9Hcm91cHMgOiBudWxsLCBsID0gaSA9PSBudWxsID8gdm9pZCAwIDogaS5hdWRpb0NvZGVjLCBjID0gaSA9PSBudWxsID8gdm9pZCAwIDogaS5jaGFubmVscywgdSA9IGMgPyBwYXJzZUludChjKSA6IGwgPyAxIC8gMCA6IDI7XG4gIGxldCBkID0gbnVsbDtcbiAgaWYgKGEgIT0gbnVsbCAmJiBhLmxlbmd0aClcbiAgICB0cnkge1xuICAgICAgYS5sZW5ndGggPT09IDEgJiYgYVswXSA/IGQgPSBlLmdyb3Vwc1thWzBdXS5jaGFubmVscyA6IGQgPSBhLnJlZHVjZSgoaCwgZikgPT4ge1xuICAgICAgICBpZiAoZikge1xuICAgICAgICAgIGNvbnN0IHAgPSBlLmdyb3Vwc1tmXTtcbiAgICAgICAgICBpZiAoIXApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1ZGlvIHRyYWNrIGdyb3VwICR7Zn0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgT2JqZWN0LmtleXMocC5jaGFubmVscykuZm9yRWFjaCgoeSkgPT4ge1xuICAgICAgICAgICAgaFt5XSA9IChoW3ldIHx8IDApICsgcC5jaGFubmVsc1t5XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaDtcbiAgICAgIH0sIHtcbiAgICAgICAgMjogMFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICByZXR1cm4gbyAhPT0gdm9pZCAwICYmIC8vIEZvcmNlIG1lZGlhIGNhcGFiaWxpdGllcyBjaGVjayBmb3IgSEVWQyB0byBhdm9pZCBmYWlsdXJlIG9uIFdpbmRvd3NcbiAgKG8uc3BsaXQoXCIsXCIpLnNvbWUoKGgpID0+IHlhKGgpKSB8fCBzLndpZHRoID4gMTkyMCAmJiBzLmhlaWdodCA+IDEwODggfHwgcy5oZWlnaHQgPiAxOTIwICYmIHMud2lkdGggPiAxMDg4IHx8IHMuZnJhbWVSYXRlID4gTWF0aC5tYXgociwgMzApIHx8IHMudmlkZW9SYW5nZSAhPT0gXCJTRFJcIiAmJiBzLnZpZGVvUmFuZ2UgIT09IHQgfHwgcy5iaXRyYXRlID4gTWF0aC5tYXgobiwgOGU2KSkgfHwgISFkICYmIHVlKHUpICYmIE9iamVjdC5rZXlzKGQpLnNvbWUoKGgpID0+IHBhcnNlSW50KGgpID4gdSk7XG59XG5mdW5jdGlvbiBOZyhzLCBlLCB0LCByID0ge30pIHtcbiAgY29uc3QgbiA9IHMudmlkZW9Db2RlYztcbiAgaWYgKCFuICYmICFzLmF1ZGlvQ29kZWMgfHwgIXQpXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShCZyk7XG4gIGNvbnN0IGkgPSBbXSwgbyA9IHNiKHMpLCBhID0gby5sZW5ndGgsIGwgPSBuYihzLCBlLCBhID4gMCksIGMgPSBsLmxlbmd0aDtcbiAgZm9yIChsZXQgdSA9IGEgfHwgMSAqIGMgfHwgMTsgdS0tOyApIHtcbiAgICBjb25zdCBkID0ge1xuICAgICAgdHlwZTogXCJtZWRpYS1zb3VyY2VcIlxuICAgIH07XG4gICAgaWYgKGEgJiYgKGQudmlkZW8gPSBvW3UgJSBhXSksIGMpIHtcbiAgICAgIGQuYXVkaW8gPSBsW3UgJSBjXTtcbiAgICAgIGNvbnN0IGggPSBkLmF1ZGlvLmJpdHJhdGU7XG4gICAgICBkLnZpZGVvICYmIGggJiYgKGQudmlkZW8uYml0cmF0ZSAtPSBoKTtcbiAgICB9XG4gICAgaS5wdXNoKGQpO1xuICB9XG4gIGlmIChuKSB7XG4gICAgY29uc3QgdSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgaWYgKG4uc3BsaXQoXCIsXCIpLnNvbWUoKGQpID0+IHlhKGQpKSAmJiBPZygpKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShGZyhuZXcgRXJyb3IoYE92ZXJyaWRpbmcgV2luZG93cyBGaXJlZm94IEhFVkMgTWVkaWFDYXBhYmlsaXRpZXMgcmVzdWx0IGJhc2VkIG9uIHVzZXItYWdlbnQgc3RyaW5nOiAoJHt1fSlgKSwgaSkpO1xuICB9XG4gIHJldHVybiBQcm9taXNlLmFsbChpLm1hcCgodSkgPT4ge1xuICAgIGNvbnN0IGQgPSBvYih1KTtcbiAgICByZXR1cm4gcltkXSB8fCAocltkXSA9IHQuZGVjb2RpbmdJbmZvKHUpKTtcbiAgfSkpLnRoZW4oKHUpID0+ICh7XG4gICAgc3VwcG9ydGVkOiAhdS5zb21lKChkKSA9PiAhZC5zdXBwb3J0ZWQpLFxuICAgIGNvbmZpZ3VyYXRpb25zOiBpLFxuICAgIGRlY29kaW5nSW5mb1Jlc3VsdHM6IHVcbiAgfSkpLmNhdGNoKCh1KSA9PiAoe1xuICAgIHN1cHBvcnRlZDogITEsXG4gICAgY29uZmlndXJhdGlvbnM6IGksXG4gICAgZGVjb2RpbmdJbmZvUmVzdWx0czogW10sXG4gICAgZXJyb3I6IHVcbiAgfSkpO1xufVxuZnVuY3Rpb24gc2Iocykge1xuICB2YXIgZTtcbiAgY29uc3QgdCA9IChlID0gcy52aWRlb0NvZGVjKSA9PSBudWxsID8gdm9pZCAwIDogZS5zcGxpdChcIixcIiksIHIgPSBVZyhzKSwgbiA9IHMud2lkdGggfHwgNjQwLCBpID0gcy5oZWlnaHQgfHwgNDgwLCBvID0gcy5mcmFtZVJhdGUgfHwgMzAsIGEgPSBzLnZpZGVvUmFuZ2UudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHQgPyB0Lm1hcCgobCkgPT4ge1xuICAgIGNvbnN0IGMgPSB7XG4gICAgICBjb250ZW50VHlwZTogcGkoUVMobCksIFwidmlkZW9cIiksXG4gICAgICB3aWR0aDogbixcbiAgICAgIGhlaWdodDogaSxcbiAgICAgIGJpdHJhdGU6IHIsXG4gICAgICBmcmFtZXJhdGU6IG9cbiAgICB9O1xuICAgIHJldHVybiBhICE9PSBcInNkclwiICYmIChjLnRyYW5zZmVyRnVuY3Rpb24gPSBhKSwgYztcbiAgfSkgOiBbXTtcbn1cbmZ1bmN0aW9uIG5iKHMsIGUsIHQpIHtcbiAgdmFyIHI7XG4gIGNvbnN0IG4gPSAociA9IHMuYXVkaW9Db2RlYykgPT0gbnVsbCA/IHZvaWQgMCA6IHIuc3BsaXQoXCIsXCIpLCBpID0gVWcocyk7XG4gIHJldHVybiBuICYmIHMuYXVkaW9Hcm91cHMgPyBzLmF1ZGlvR3JvdXBzLnJlZHVjZSgobywgYSkgPT4ge1xuICAgIHZhciBsO1xuICAgIGNvbnN0IGMgPSBhID8gKGwgPSBlLmdyb3Vwc1thXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGwudHJhY2tzIDogbnVsbDtcbiAgICByZXR1cm4gYyA/IGMucmVkdWNlKCh1LCBkKSA9PiB7XG4gICAgICBpZiAoZC5ncm91cElkID09PSBhKSB7XG4gICAgICAgIGNvbnN0IGggPSBwYXJzZUZsb2F0KGQuY2hhbm5lbHMgfHwgXCJcIik7XG4gICAgICAgIG4uZm9yRWFjaCgoZikgPT4ge1xuICAgICAgICAgIGNvbnN0IHAgPSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZTogcGkoZiwgXCJhdWRpb1wiKSxcbiAgICAgICAgICAgIGJpdHJhdGU6IHQgPyBpYihmLCBpKSA6IGlcbiAgICAgICAgICB9O1xuICAgICAgICAgIGggJiYgKHAuY2hhbm5lbHMgPSBcIlwiICsgaCksIHUucHVzaChwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdTtcbiAgICB9LCBvKSA6IG87XG4gIH0sIFtdKSA6IFtdO1xufVxuZnVuY3Rpb24gaWIocywgZSkge1xuICBpZiAoZSA8PSAxKVxuICAgIHJldHVybiAxO1xuICBsZXQgdCA9IDEyOGUzO1xuICByZXR1cm4gcyA9PT0gXCJlYy0zXCIgPyB0ID0gNzY4ZTMgOiBzID09PSBcImFjLTNcIiAmJiAodCA9IDY0ZTQpLCBNYXRoLm1pbihlIC8gMiwgdCk7XG59XG5mdW5jdGlvbiBVZyhzKSB7XG4gIHJldHVybiBNYXRoLmNlaWwoTWF0aC5tYXgocy5iaXRyYXRlICogMC45LCBzLmF2ZXJhZ2VCaXRyYXRlKSAvIDFlMykgKiAxZTMgfHwgMTtcbn1cbmZ1bmN0aW9uIG9iKHMpIHtcbiAgbGV0IGUgPSBcIlwiO1xuICBjb25zdCB7XG4gICAgYXVkaW86IHQsXG4gICAgdmlkZW86IHJcbiAgfSA9IHM7XG4gIGlmIChyKSB7XG4gICAgY29uc3QgbiA9IGxjKHIuY29udGVudFR5cGUpO1xuICAgIGUgKz0gYCR7bn1fciR7ci5oZWlnaHR9eCR7ci53aWR0aH1mJHtNYXRoLmNlaWwoci5mcmFtZXJhdGUpfSR7ci50cmFuc2ZlckZ1bmN0aW9uIHx8IFwic2RcIn1fJHtNYXRoLmNlaWwoci5iaXRyYXRlIC8gMWU1KX1gO1xuICB9XG4gIGlmICh0KSB7XG4gICAgY29uc3QgbiA9IGxjKHQuY29udGVudFR5cGUpO1xuICAgIGUgKz0gYCR7ciA/IFwiX1wiIDogXCJcIn0ke259X2Mke3QuY2hhbm5lbHN9YDtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmNvbnN0IGNjID0gW1wiTk9ORVwiLCBcIlRZUEUtMFwiLCBcIlRZUEUtMVwiLCBudWxsXTtcbmZ1bmN0aW9uIGFiKHMpIHtcbiAgcmV0dXJuIGNjLmluZGV4T2YocykgPiAtMTtcbn1cbmNvbnN0IEpvID0gW1wiU0RSXCIsIFwiUFFcIiwgXCJITEdcIl07XG5mdW5jdGlvbiBsYihzKSB7XG4gIHJldHVybiAhIXMgJiYgSm8uaW5kZXhPZihzKSA+IC0xO1xufVxudmFyIGdvID0ge1xuICBObzogXCJcIixcbiAgWWVzOiBcIllFU1wiLFxuICB2MjogXCJ2MlwiXG59O1xuZnVuY3Rpb24gb2gocykge1xuICBjb25zdCB7XG4gICAgY2FuU2tpcFVudGlsOiBlLFxuICAgIGNhblNraXBEYXRlUmFuZ2VzOiB0LFxuICAgIGFnZTogclxuICB9ID0gcywgbiA9IHIgPCBlIC8gMjtcbiAgcmV0dXJuIGUgJiYgbiA/IHQgPyBnby52MiA6IGdvLlllcyA6IGdvLk5vO1xufVxuY2xhc3MgYWgge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy5tc24gPSB2b2lkIDAsIHRoaXMucGFydCA9IHZvaWQgMCwgdGhpcy5za2lwID0gdm9pZCAwLCB0aGlzLm1zbiA9IGUsIHRoaXMucGFydCA9IHQsIHRoaXMuc2tpcCA9IHI7XG4gIH1cbiAgYWRkRGlyZWN0aXZlcyhlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBzZWxmLlVSTChlKTtcbiAgICByZXR1cm4gdGhpcy5tc24gIT09IHZvaWQgMCAmJiB0LnNlYXJjaFBhcmFtcy5zZXQoXCJfSExTX21zblwiLCB0aGlzLm1zbi50b1N0cmluZygpKSwgdGhpcy5wYXJ0ICE9PSB2b2lkIDAgJiYgdC5zZWFyY2hQYXJhbXMuc2V0KFwiX0hMU19wYXJ0XCIsIHRoaXMucGFydC50b1N0cmluZygpKSwgdGhpcy5za2lwICYmIHQuc2VhcmNoUGFyYW1zLnNldChcIl9ITFNfc2tpcFwiLCB0aGlzLnNraXApLCB0LmhyZWY7XG4gIH1cbn1cbmNsYXNzIG1pIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIGlmICh0aGlzLl9hdHRycyA9IHZvaWQgMCwgdGhpcy5hdWRpb0NvZGVjID0gdm9pZCAwLCB0aGlzLmJpdHJhdGUgPSB2b2lkIDAsIHRoaXMuY29kZWNTZXQgPSB2b2lkIDAsIHRoaXMudXJsID0gdm9pZCAwLCB0aGlzLmZyYW1lUmF0ZSA9IHZvaWQgMCwgdGhpcy5oZWlnaHQgPSB2b2lkIDAsIHRoaXMuaWQgPSB2b2lkIDAsIHRoaXMubmFtZSA9IHZvaWQgMCwgdGhpcy5zdXBwbGVtZW50YWwgPSB2b2lkIDAsIHRoaXMudmlkZW9Db2RlYyA9IHZvaWQgMCwgdGhpcy53aWR0aCA9IHZvaWQgMCwgdGhpcy5kZXRhaWxzID0gdm9pZCAwLCB0aGlzLmZyYWdtZW50RXJyb3IgPSAwLCB0aGlzLmxvYWRFcnJvciA9IDAsIHRoaXMubG9hZGVkID0gdm9pZCAwLCB0aGlzLnJlYWxCaXRyYXRlID0gMCwgdGhpcy5zdXBwb3J0ZWRQcm9taXNlID0gdm9pZCAwLCB0aGlzLnN1cHBvcnRlZFJlc3VsdCA9IHZvaWQgMCwgdGhpcy5fYXZnQml0cmF0ZSA9IDAsIHRoaXMuX2F1ZGlvR3JvdXBzID0gdm9pZCAwLCB0aGlzLl9zdWJ0aXRsZUdyb3VwcyA9IHZvaWQgMCwgdGhpcy5fdXJsSWQgPSAwLCB0aGlzLnVybCA9IFtlLnVybF0sIHRoaXMuX2F0dHJzID0gW2UuYXR0cnNdLCB0aGlzLmJpdHJhdGUgPSBlLmJpdHJhdGUsIGUuZGV0YWlscyAmJiAodGhpcy5kZXRhaWxzID0gZS5kZXRhaWxzKSwgdGhpcy5pZCA9IGUuaWQgfHwgMCwgdGhpcy5uYW1lID0gZS5uYW1lLCB0aGlzLndpZHRoID0gZS53aWR0aCB8fCAwLCB0aGlzLmhlaWdodCA9IGUuaGVpZ2h0IHx8IDAsIHRoaXMuZnJhbWVSYXRlID0gZS5hdHRycy5vcHRpb25hbEZsb2F0KFwiRlJBTUUtUkFURVwiLCAwKSwgdGhpcy5fYXZnQml0cmF0ZSA9IGUuYXR0cnMuZGVjaW1hbEludGVnZXIoXCJBVkVSQUdFLUJBTkRXSURUSFwiKSwgdGhpcy5hdWRpb0NvZGVjID0gZS5hdWRpb0NvZGVjLCB0aGlzLnZpZGVvQ29kZWMgPSBlLnZpZGVvQ29kZWMsIHRoaXMuY29kZWNTZXQgPSBbZS52aWRlb0NvZGVjLCBlLmF1ZGlvQ29kZWNdLmZpbHRlcigocikgPT4gISFyKS5tYXAoKHIpID0+IHIuc3Vic3RyaW5nKDAsIDQpKS5qb2luKFwiLFwiKSwgXCJzdXBwbGVtZW50YWxcIiBpbiBlKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIHRoaXMuc3VwcGxlbWVudGFsID0gZS5zdXBwbGVtZW50YWw7XG4gICAgICBjb25zdCByID0gKHQgPSBlLnN1cHBsZW1lbnRhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IHQudmlkZW9Db2RlYztcbiAgICAgIHIgJiYgciAhPT0gZS52aWRlb0NvZGVjICYmICh0aGlzLmNvZGVjU2V0ICs9IGAsJHtyLnN1YnN0cmluZygwLCA0KX1gKTtcbiAgICB9XG4gICAgdGhpcy5hZGRHcm91cElkKFwiYXVkaW9cIiwgZS5hdHRycy5BVURJTyksIHRoaXMuYWRkR3JvdXBJZChcInRleHRcIiwgZS5hdHRycy5TVUJUSVRMRVMpO1xuICB9XG4gIGdldCBtYXhCaXRyYXRlKCkge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnJlYWxCaXRyYXRlLCB0aGlzLmJpdHJhdGUpO1xuICB9XG4gIGdldCBhdmVyYWdlQml0cmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXZnQml0cmF0ZSB8fCB0aGlzLnJlYWxCaXRyYXRlIHx8IHRoaXMuYml0cmF0ZTtcbiAgfVxuICBnZXQgYXR0cnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJzWzBdO1xuICB9XG4gIGdldCBjb2RlY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cnMuQ09ERUNTIHx8IFwiXCI7XG4gIH1cbiAgZ2V0IHBhdGh3YXlJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyc1tcIlBBVEhXQVktSURcIl0gfHwgXCIuXCI7XG4gIH1cbiAgZ2V0IHZpZGVvUmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cnNbXCJWSURFTy1SQU5HRVwiXSB8fCBcIlNEUlwiO1xuICB9XG4gIGdldCBzY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRycy5vcHRpb25hbEZsb2F0KFwiU0NPUkVcIiwgMCk7XG4gIH1cbiAgZ2V0IHVyaSgpIHtcbiAgICByZXR1cm4gdGhpcy51cmxbMF0gfHwgXCJcIjtcbiAgfVxuICBoYXNBdWRpb0dyb3VwKGUpIHtcbiAgICByZXR1cm4gbGgodGhpcy5fYXVkaW9Hcm91cHMsIGUpO1xuICB9XG4gIGhhc1N1YnRpdGxlR3JvdXAoZSkge1xuICAgIHJldHVybiBsaCh0aGlzLl9zdWJ0aXRsZUdyb3VwcywgZSk7XG4gIH1cbiAgZ2V0IGF1ZGlvR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0dyb3VwcztcbiAgfVxuICBnZXQgc3VidGl0bGVHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRpdGxlR3JvdXBzO1xuICB9XG4gIGFkZEdyb3VwSWQoZSwgdCkge1xuICAgIGlmICh0KSB7XG4gICAgICBpZiAoZSA9PT0gXCJhdWRpb1wiKSB7XG4gICAgICAgIGxldCByID0gdGhpcy5fYXVkaW9Hcm91cHM7XG4gICAgICAgIHIgfHwgKHIgPSB0aGlzLl9hdWRpb0dyb3VwcyA9IFtdKSwgci5pbmRleE9mKHQpID09PSAtMSAmJiByLnB1c2godCk7XG4gICAgICB9IGVsc2UgaWYgKGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGxldCByID0gdGhpcy5fc3VidGl0bGVHcm91cHM7XG4gICAgICAgIHIgfHwgKHIgPSB0aGlzLl9zdWJ0aXRsZUdyb3VwcyA9IFtdKSwgci5pbmRleE9mKHQpID09PSAtMSAmJiByLnB1c2godCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIERlcHJlY2F0ZWQgbWV0aG9kcyAocmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICBnZXQgdXJsSWQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgc2V0IHVybElkKGUpIHtcbiAgfVxuICBnZXQgYXVkaW9Hcm91cElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb0dyb3VwcyA/IFt0aGlzLmF1ZGlvR3JvdXBJZF0gOiB2b2lkIDA7XG4gIH1cbiAgZ2V0IHRleHRHcm91cElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJ0aXRsZUdyb3VwcyA/IFt0aGlzLnRleHRHcm91cElkXSA6IHZvaWQgMDtcbiAgfVxuICBnZXQgYXVkaW9Hcm91cElkKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoZSA9IHRoaXMuYXVkaW9Hcm91cHMpID09IG51bGwgPyB2b2lkIDAgOiBlWzBdO1xuICB9XG4gIGdldCB0ZXh0R3JvdXBJZCgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gKGUgPSB0aGlzLnN1YnRpdGxlR3JvdXBzKSA9PSBudWxsID8gdm9pZCAwIDogZVswXTtcbiAgfVxuICBhZGRGYWxsYmFjaygpIHtcbiAgfVxufVxuZnVuY3Rpb24gbGgocywgZSkge1xuICByZXR1cm4gIWUgfHwgIXMgPyAhMSA6IHMuaW5kZXhPZihlKSAhPT0gLTE7XG59XG5mdW5jdGlvbiBjYigpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaE1lZGlhID09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHMgPSBtYXRjaE1lZGlhKFwiKGR5bmFtaWMtcmFuZ2U6IGhpZ2gpXCIpLCBlID0gbWF0Y2hNZWRpYShcImJhZCBxdWVyeVwiKTtcbiAgICBpZiAocy5tZWRpYSAhPT0gZS5tZWRpYSlcbiAgICAgIHJldHVybiBzLm1hdGNoZXMgPT09ICEwO1xuICB9XG4gIHJldHVybiAhMTtcbn1cbmZ1bmN0aW9uIHViKHMsIGUpIHtcbiAgbGV0IHQgPSAhMSwgciA9IFtdO1xuICBpZiAocyAmJiAodCA9IHMgIT09IFwiU0RSXCIsIHIgPSBbc10pLCBlKSB7XG4gICAgciA9IGUuYWxsb3dlZFZpZGVvUmFuZ2VzIHx8IEpvLnNsaWNlKDApO1xuICAgIGNvbnN0IG4gPSByLmpvaW4oXCJcIikgIT09IFwiU0RSXCIgJiYgIWUudmlkZW9Db2RlYztcbiAgICB0ID0gZS5wcmVmZXJIRFIgIT09IHZvaWQgMCA/IGUucHJlZmVySERSIDogbiAmJiBjYigpLCB0IHx8IChyID0gW1wiU0RSXCJdKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHByZWZlckhEUjogdCxcbiAgICBhbGxvd2VkVmlkZW9SYW5nZXM6IHJcbiAgfTtcbn1cbmNvbnN0IGRiID0gKHMpID0+IHtcbiAgY29uc3QgZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICByZXR1cm4gKHQsIHIpID0+IHtcbiAgICBpZiAocyAmJiAociA9IHModCwgcikpLCB0eXBlb2YgciA9PSBcIm9iamVjdFwiICYmIHIgIT09IG51bGwpIHtcbiAgICAgIGlmIChlLmhhcyhyKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5hZGQocik7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xufSwgYXQgPSAocywgZSkgPT4gSlNPTi5zdHJpbmdpZnkocywgZGIoZSkpO1xuZnVuY3Rpb24gaGIocywgZSwgdCwgciwgbikge1xuICBjb25zdCBpID0gT2JqZWN0LmtleXMocyksIG8gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmNoYW5uZWxzLCBhID0gciA9PSBudWxsID8gdm9pZCAwIDogci5hdWRpb0NvZGVjLCBsID0gbiA9PSBudWxsID8gdm9pZCAwIDogbi52aWRlb0NvZGVjLCBjID0gbyAmJiBwYXJzZUludChvKSA9PT0gMjtcbiAgbGV0IHUgPSAhMSwgZCA9ICExLCBoID0gMSAvIDAsIGYgPSAxIC8gMCwgcCA9IDEgLyAwLCB5ID0gMSAvIDAsIEUgPSAwLCBiID0gW107XG4gIGNvbnN0IHtcbiAgICBwcmVmZXJIRFI6IFIsXG4gICAgYWxsb3dlZFZpZGVvUmFuZ2VzOiBBXG4gIH0gPSB1YihlLCBuKTtcbiAgZm9yIChsZXQgaiA9IGkubGVuZ3RoOyBqLS07ICkge1xuICAgIGNvbnN0IEMgPSBzW2lbal1dO1xuICAgIHUgfHwgKHUgPSBDLmNoYW5uZWxzWzJdID4gMCksIGggPSBNYXRoLm1pbihoLCBDLm1pbkhlaWdodCksIGYgPSBNYXRoLm1pbihmLCBDLm1pbkZyYW1lcmF0ZSksIHAgPSBNYXRoLm1pbihwLCBDLm1pbkJpdHJhdGUpLCBBLmZpbHRlcigoJCkgPT4gQy52aWRlb1Jhbmdlc1skXSA+IDApLmxlbmd0aCA+IDAgJiYgKGQgPSAhMCk7XG4gIH1cbiAgaCA9IHVlKGgpID8gaCA6IDAsIGYgPSB1ZShmKSA/IGYgOiAwO1xuICBjb25zdCBGID0gTWF0aC5tYXgoMTA4MCwgaCksIE0gPSBNYXRoLm1heCgzMCwgZik7XG4gIHAgPSB1ZShwKSA/IHAgOiB0LCB0ID0gTWF0aC5tYXgocCwgdCksIGQgfHwgKGUgPSB2b2lkIDApO1xuICBjb25zdCBIID0gaS5sZW5ndGggPiAxO1xuICByZXR1cm4ge1xuICAgIGNvZGVjU2V0OiBpLnJlZHVjZSgoaiwgQykgPT4ge1xuICAgICAgY29uc3QgayA9IHNbQ107XG4gICAgICBpZiAoQyA9PT0gailcbiAgICAgICAgcmV0dXJuIGo7XG4gICAgICBpZiAoYiA9IGQgPyBBLmZpbHRlcigoJCkgPT4gay52aWRlb1Jhbmdlc1skXSA+IDApIDogW10sIEgpIHtcbiAgICAgICAgaWYgKGsubWluQml0cmF0ZSA+IHQpXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGBtaW4gYml0cmF0ZSBvZiAke2subWluQml0cmF0ZX0gPiBjdXJyZW50IGVzdGltYXRlIG9mICR7dH1gKSwgajtcbiAgICAgICAgaWYgKCFrLmhhc0RlZmF1bHRBdWRpbylcbiAgICAgICAgICByZXR1cm4gVXIoQywgXCJubyByZW5kaXRpb25zIHdpdGggZGVmYXVsdCBvciBhdXRvLXNlbGVjdCBzb3VuZCBmb3VuZFwiKSwgajtcbiAgICAgICAgaWYgKGEgJiYgQy5pbmRleE9mKGEuc3Vic3RyaW5nKDAsIDQpKSAlIDUgIT09IDApXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGBhdWRpbyBjb2RlYyBwcmVmZXJlbmNlIFwiJHthfVwiIG5vdCBmb3VuZGApLCBqO1xuICAgICAgICBpZiAobyAmJiAhYykge1xuICAgICAgICAgIGlmICghay5jaGFubmVsc1tvXSlcbiAgICAgICAgICAgIHJldHVybiBVcihDLCBgbm8gcmVuZGl0aW9ucyB3aXRoICR7b30gY2hhbm5lbCBzb3VuZCBmb3VuZCAoY2hhbm5lbHMgb3B0aW9uczogJHtPYmplY3Qua2V5cyhrLmNoYW5uZWxzKX0pYCksIGo7XG4gICAgICAgIH0gZWxzZSBpZiAoKCFhIHx8IGMpICYmIHUgJiYgay5jaGFubmVsc1syXSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gVXIoQywgXCJubyByZW5kaXRpb25zIHdpdGggc3RlcmVvIHNvdW5kIGZvdW5kXCIpLCBqO1xuICAgICAgICBpZiAoay5taW5IZWlnaHQgPiBGKVxuICAgICAgICAgIHJldHVybiBVcihDLCBgbWluIHJlc29sdXRpb24gb2YgJHtrLm1pbkhlaWdodH0gPiBtYXhpbXVtIG9mICR7Rn1gKSwgajtcbiAgICAgICAgaWYgKGsubWluRnJhbWVyYXRlID4gTSlcbiAgICAgICAgICByZXR1cm4gVXIoQywgYG1pbiBmcmFtZXJhdGUgb2YgJHtrLm1pbkZyYW1lcmF0ZX0gPiBtYXhpbXVtIG9mICR7TX1gKSwgajtcbiAgICAgICAgaWYgKCFiLnNvbWUoKCQpID0+IGsudmlkZW9SYW5nZXNbJF0gPiAwKSlcbiAgICAgICAgICByZXR1cm4gVXIoQywgYG5vIHZhcmlhbnRzIHdpdGggVklERU8tUkFOR0Ugb2YgJHthdChiKX0gZm91bmRgKSwgajtcbiAgICAgICAgaWYgKGwgJiYgQy5pbmRleE9mKGwuc3Vic3RyaW5nKDAsIDQpKSAlIDUgIT09IDApXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGB2aWRlbyBjb2RlYyBwcmVmZXJlbmNlIFwiJHtsfVwiIG5vdCBmb3VuZGApLCBqO1xuICAgICAgICBpZiAoay5tYXhTY29yZSA8IEUpXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGBtYXggc2NvcmUgb2YgJHtrLm1heFNjb3JlfSA8IHNlbGVjdGVkIG1heCBvZiAke0V9YCksIGo7XG4gICAgICB9XG4gICAgICByZXR1cm4gaiAmJiAoWm8oQykgPj0gWm8oaikgfHwgay5mcmFnbWVudEVycm9yID4gc1tqXS5mcmFnbWVudEVycm9yKSA/IGogOiAoeSA9IGsubWluSW5kZXgsIEUgPSBrLm1heFNjb3JlLCBDKTtcbiAgICB9LCB2b2lkIDApLFxuICAgIHZpZGVvUmFuZ2VzOiBiLFxuICAgIHByZWZlckhEUjogUixcbiAgICBtaW5GcmFtZXJhdGU6IGYsXG4gICAgbWluQml0cmF0ZTogcCxcbiAgICBtaW5JbmRleDogeVxuICB9O1xufVxuZnVuY3Rpb24gVXIocywgZSkge1xuICBydC5sb2coYFthYnJdIHN0YXJ0IGNhbmRpZGF0ZXMgd2l0aCBcIiR7c31cIiBpZ25vcmVkIGJlY2F1c2UgJHtlfWApO1xufVxuZnVuY3Rpb24gJGcocykge1xuICByZXR1cm4gcy5yZWR1Y2UoKGUsIHQpID0+IHtcbiAgICBsZXQgciA9IGUuZ3JvdXBzW3QuZ3JvdXBJZF07XG4gICAgciB8fCAociA9IGUuZ3JvdXBzW3QuZ3JvdXBJZF0gPSB7XG4gICAgICB0cmFja3M6IFtdLFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgMjogMFxuICAgICAgfSxcbiAgICAgIGhhc0RlZmF1bHQ6ICExLFxuICAgICAgaGFzQXV0b1NlbGVjdDogITFcbiAgICB9KSwgci50cmFja3MucHVzaCh0KTtcbiAgICBjb25zdCBuID0gdC5jaGFubmVscyB8fCBcIjJcIjtcbiAgICByZXR1cm4gci5jaGFubmVsc1tuXSA9IChyLmNoYW5uZWxzW25dIHx8IDApICsgMSwgci5oYXNEZWZhdWx0ID0gci5oYXNEZWZhdWx0IHx8IHQuZGVmYXVsdCwgci5oYXNBdXRvU2VsZWN0ID0gci5oYXNBdXRvU2VsZWN0IHx8IHQuYXV0b3NlbGVjdCwgci5oYXNEZWZhdWx0ICYmIChlLmhhc0RlZmF1bHRBdWRpbyA9ICEwKSwgci5oYXNBdXRvU2VsZWN0ICYmIChlLmhhc0F1dG9TZWxlY3RBdWRpbyA9ICEwKSwgZTtcbiAgfSwge1xuICAgIGhhc0RlZmF1bHRBdWRpbzogITEsXG4gICAgaGFzQXV0b1NlbGVjdEF1ZGlvOiAhMSxcbiAgICBncm91cHM6IHt9XG4gIH0pO1xufVxuZnVuY3Rpb24gZmIocywgZSwgdCwgcikge1xuICByZXR1cm4gcy5zbGljZSh0LCByICsgMSkucmVkdWNlKChuLCBpLCBvKSA9PiB7XG4gICAgaWYgKCFpLmNvZGVjU2V0KVxuICAgICAgcmV0dXJuIG47XG4gICAgY29uc3QgYSA9IGkuYXVkaW9Hcm91cHM7XG4gICAgbGV0IGwgPSBuW2kuY29kZWNTZXRdO1xuICAgIGwgfHwgKG5baS5jb2RlY1NldF0gPSBsID0ge1xuICAgICAgbWluQml0cmF0ZTogMSAvIDAsXG4gICAgICBtaW5IZWlnaHQ6IDEgLyAwLFxuICAgICAgbWluRnJhbWVyYXRlOiAxIC8gMCxcbiAgICAgIG1pbkluZGV4OiBvLFxuICAgICAgbWF4U2NvcmU6IDAsXG4gICAgICB2aWRlb1Jhbmdlczoge1xuICAgICAgICBTRFI6IDBcbiAgICAgIH0sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICAyOiAwXG4gICAgICB9LFxuICAgICAgaGFzRGVmYXVsdEF1ZGlvOiAhYSxcbiAgICAgIGZyYWdtZW50RXJyb3I6IDBcbiAgICB9KSwgbC5taW5CaXRyYXRlID0gTWF0aC5taW4obC5taW5CaXRyYXRlLCBpLmJpdHJhdGUpO1xuICAgIGNvbnN0IGMgPSBNYXRoLm1pbihpLmhlaWdodCwgaS53aWR0aCk7XG4gICAgcmV0dXJuIGwubWluSGVpZ2h0ID0gTWF0aC5taW4obC5taW5IZWlnaHQsIGMpLCBsLm1pbkZyYW1lcmF0ZSA9IE1hdGgubWluKGwubWluRnJhbWVyYXRlLCBpLmZyYW1lUmF0ZSksIGwubWluSW5kZXggPSBNYXRoLm1pbihsLm1pbkluZGV4LCBvKSwgbC5tYXhTY29yZSA9IE1hdGgubWF4KGwubWF4U2NvcmUsIGkuc2NvcmUpLCBsLmZyYWdtZW50RXJyb3IgKz0gaS5mcmFnbWVudEVycm9yLCBsLnZpZGVvUmFuZ2VzW2kudmlkZW9SYW5nZV0gPSAobC52aWRlb1Jhbmdlc1tpLnZpZGVvUmFuZ2VdIHx8IDApICsgMSwgYSAmJiBhLmZvckVhY2goKHUpID0+IHtcbiAgICAgIGlmICghdSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgZCA9IGUuZ3JvdXBzW3VdO1xuICAgICAgZCAmJiAobC5oYXNEZWZhdWx0QXVkaW8gPSBsLmhhc0RlZmF1bHRBdWRpbyB8fCBlLmhhc0RlZmF1bHRBdWRpbyA/IGQuaGFzRGVmYXVsdCA6IGQuaGFzQXV0b1NlbGVjdCB8fCAhZS5oYXNEZWZhdWx0QXVkaW8gJiYgIWUuaGFzQXV0b1NlbGVjdEF1ZGlvLCBPYmplY3Qua2V5cyhkLmNoYW5uZWxzKS5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgIGwuY2hhbm5lbHNbaF0gPSAobC5jaGFubmVsc1toXSB8fCAwKSArIGQuY2hhbm5lbHNbaF07XG4gICAgICB9KSk7XG4gICAgfSksIG47XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIGNoKHMpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiBzO1xuICBjb25zdCB7XG4gICAgbGFuZzogZSxcbiAgICBhc3NvY0xhbmc6IHQsXG4gICAgY2hhcmFjdGVyaXN0aWNzOiByLFxuICAgIGNoYW5uZWxzOiBuLFxuICAgIGF1ZGlvQ29kZWM6IGlcbiAgfSA9IHM7XG4gIHJldHVybiB7XG4gICAgbGFuZzogZSxcbiAgICBhc3NvY0xhbmc6IHQsXG4gICAgY2hhcmFjdGVyaXN0aWNzOiByLFxuICAgIGNoYW5uZWxzOiBuLFxuICAgIGF1ZGlvQ29kZWM6IGlcbiAgfTtcbn1cbmZ1bmN0aW9uIFdyKHMsIGUsIHQpIHtcbiAgaWYgKFwiYXR0cnNcIiBpbiBzKSB7XG4gICAgY29uc3QgciA9IGUuaW5kZXhPZihzKTtcbiAgICBpZiAociAhPT0gLTEpXG4gICAgICByZXR1cm4gcjtcbiAgfVxuICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHtcbiAgICBjb25zdCBuID0gZVtyXTtcbiAgICBpZiAocXMocywgbiwgdCkpXG4gICAgICByZXR1cm4gcjtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBxcyhzLCBlLCB0KSB7XG4gIGNvbnN0IHtcbiAgICBncm91cElkOiByLFxuICAgIG5hbWU6IG4sXG4gICAgbGFuZzogaSxcbiAgICBhc3NvY0xhbmc6IG8sXG4gICAgZGVmYXVsdDogYVxuICB9ID0gcywgbCA9IHMuZm9yY2VkO1xuICByZXR1cm4gKHIgPT09IHZvaWQgMCB8fCBlLmdyb3VwSWQgPT09IHIpICYmIChuID09PSB2b2lkIDAgfHwgZS5uYW1lID09PSBuKSAmJiAoaSA9PT0gdm9pZCAwIHx8IGdiKGksIGUubGFuZykpICYmIChpID09PSB2b2lkIDAgfHwgZS5hc3NvY0xhbmcgPT09IG8pICYmIChhID09PSB2b2lkIDAgfHwgZS5kZWZhdWx0ID09PSBhKSAmJiAobCA9PT0gdm9pZCAwIHx8IGUuZm9yY2VkID09PSBsKSAmJiAoIShcImNoYXJhY3RlcmlzdGljc1wiIGluIHMpIHx8IHBiKHMuY2hhcmFjdGVyaXN0aWNzIHx8IFwiXCIsIGUuY2hhcmFjdGVyaXN0aWNzKSkgJiYgKHQgPT09IHZvaWQgMCB8fCB0KHMsIGUpKTtcbn1cbmZ1bmN0aW9uIGdiKHMsIGUgPSBcIi0tXCIpIHtcbiAgcmV0dXJuIHMubGVuZ3RoID09PSBlLmxlbmd0aCA/IHMgPT09IGUgOiBzLnN0YXJ0c1dpdGgoZSkgfHwgZS5zdGFydHNXaXRoKHMpO1xufVxuZnVuY3Rpb24gcGIocywgZSA9IFwiXCIpIHtcbiAgY29uc3QgdCA9IHMuc3BsaXQoXCIsXCIpLCByID0gZS5zcGxpdChcIixcIik7XG4gIHJldHVybiB0Lmxlbmd0aCA9PT0gci5sZW5ndGggJiYgIXQuc29tZSgobikgPT4gci5pbmRleE9mKG4pID09PSAtMSk7XG59XG5mdW5jdGlvbiBVcyhzLCBlKSB7XG4gIGNvbnN0IHtcbiAgICBhdWRpb0NvZGVjOiB0LFxuICAgIGNoYW5uZWxzOiByXG4gIH0gPSBzO1xuICByZXR1cm4gKHQgPT09IHZvaWQgMCB8fCAoZS5hdWRpb0NvZGVjIHx8IFwiXCIpLnN1YnN0cmluZygwLCA0KSA9PT0gdC5zdWJzdHJpbmcoMCwgNCkpICYmIChyID09PSB2b2lkIDAgfHwgciA9PT0gKGUuY2hhbm5lbHMgfHwgXCIyXCIpKTtcbn1cbmZ1bmN0aW9uIG1iKHMsIGUsIHQsIHIsIG4pIHtcbiAgY29uc3QgaSA9IGVbcl0sIGEgPSBlLnJlZHVjZSgoaCwgZiwgcCkgPT4ge1xuICAgIGNvbnN0IHkgPSBmLnVyaTtcbiAgICByZXR1cm4gKGhbeV0gfHwgKGhbeV0gPSBbXSkpLnB1c2gocCksIGg7XG4gIH0sIHt9KVtpLnVyaV07XG4gIGEubGVuZ3RoID4gMSAmJiAociA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGEpKTtcbiAgY29uc3QgbCA9IGkudmlkZW9SYW5nZSwgYyA9IGkuZnJhbWVSYXRlLCB1ID0gaS5jb2RlY1NldC5zdWJzdHJpbmcoMCwgNCksIGQgPSB1aChlLCByLCAoaCkgPT4ge1xuICAgIGlmIChoLnZpZGVvUmFuZ2UgIT09IGwgfHwgaC5mcmFtZVJhdGUgIT09IGMgfHwgaC5jb2RlY1NldC5zdWJzdHJpbmcoMCwgNCkgIT09IHUpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgZiA9IGguYXVkaW9Hcm91cHMsIHAgPSB0LmZpbHRlcigoeSkgPT4gIWYgfHwgZi5pbmRleE9mKHkuZ3JvdXBJZCkgIT09IC0xKTtcbiAgICByZXR1cm4gV3IocywgcCwgbikgPiAtMTtcbiAgfSk7XG4gIHJldHVybiBkID4gLTEgPyBkIDogdWgoZSwgciwgKGgpID0+IHtcbiAgICBjb25zdCBmID0gaC5hdWRpb0dyb3VwcywgcCA9IHQuZmlsdGVyKCh5KSA9PiAhZiB8fCBmLmluZGV4T2YoeS5ncm91cElkKSAhPT0gLTEpO1xuICAgIHJldHVybiBXcihzLCBwLCBuKSA+IC0xO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVoKHMsIGUsIHQpIHtcbiAgZm9yIChsZXQgciA9IGU7IHIgPiAtMTsgci0tKVxuICAgIGlmICh0KHNbcl0pKVxuICAgICAgcmV0dXJuIHI7XG4gIGZvciAobGV0IHIgPSBlICsgMTsgciA8IHMubGVuZ3RoOyByKyspXG4gICAgaWYgKHQoc1tyXSkpXG4gICAgICByZXR1cm4gcjtcbiAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gUW8ocywgZSkge1xuICB2YXIgdDtcbiAgcmV0dXJuICEhcyAmJiBzICE9PSAoKHQgPSBlLmxvYWRMZXZlbE9iaikgPT0gbnVsbCA/IHZvaWQgMCA6IHQudXJpKTtcbn1cbmNsYXNzIHliIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJhYnJcIiwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5sYXN0TGV2ZWxMb2FkU2VjID0gMCwgdGhpcy5sYXN0TG9hZGVkRnJhZ0xldmVsID0gLTEsIHRoaXMuZmlyc3RTZWxlY3Rpb24gPSAtMSwgdGhpcy5fbmV4dEF1dG9MZXZlbCA9IC0xLCB0aGlzLm5leHRBdXRvTGV2ZWxLZXkgPSBcIlwiLCB0aGlzLmF1ZGlvVHJhY2tzQnlHcm91cCA9IG51bGwsIHRoaXMuY29kZWNUaWVycyA9IG51bGwsIHRoaXMudGltZXIgPSAtMSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMucGFydEN1cnJlbnQgPSBudWxsLCB0aGlzLmJpdHJhdGVUZXN0RGVsYXkgPSAwLCB0aGlzLnJlYnVmZmVyTm90aWNlID0gLTEsIHRoaXMuc3VwcG9ydGVkQ2FjaGUgPSB7fSwgdGhpcy5id0VzdGltYXRvciA9IHZvaWQgMCwgdGhpcy5fYWJhbmRvblJ1bGVzQ2hlY2sgPSAodCkgPT4ge1xuICAgICAgdmFyIHI7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZyYWdDdXJyZW50OiBuLFxuICAgICAgICBwYXJ0Q3VycmVudDogaSxcbiAgICAgICAgaGxzOiBvXG4gICAgICB9ID0gdGhpcywge1xuICAgICAgICBhdXRvTGV2ZWxFbmFibGVkOiBhLFxuICAgICAgICBtZWRpYTogbFxuICAgICAgfSA9IG87XG4gICAgICBpZiAoIW4gfHwgIWwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBwZXJmb3JtYW5jZS5ub3coKSwgdSA9IGkgPyBpLnN0YXRzIDogbi5zdGF0cywgZCA9IGkgPyBpLmR1cmF0aW9uIDogbi5kdXJhdGlvbiwgaCA9IGMgLSB1LmxvYWRpbmcuc3RhcnQsIGYgPSBvLm1pbkF1dG9MZXZlbCwgcCA9IG4ubGV2ZWwsIHkgPSB0aGlzLl9uZXh0QXV0b0xldmVsO1xuICAgICAgaWYgKHUuYWJvcnRlZCB8fCB1LmxvYWRlZCAmJiB1LmxvYWRlZCA9PT0gdS50b3RhbCB8fCBwIDw9IGYpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMuX25leHRBdXRvTGV2ZWwgPSAtMTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFhKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBFID0geSA+IC0xICYmIHkgIT09IHAsIGIgPSAhIXQgfHwgRTtcbiAgICAgIGlmICghYiAmJiAobC5wYXVzZWQgfHwgIWwucGxheWJhY2tSYXRlIHx8ICFsLnJlYWR5U3RhdGUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBSID0gby5tYWluRm9yd2FyZEJ1ZmZlckluZm87XG4gICAgICBpZiAoIWIgJiYgUiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgQSA9IHRoaXMuYndFc3RpbWF0b3IuZ2V0RXN0aW1hdGVUVEZCKCksIEYgPSBNYXRoLmFicyhsLnBsYXliYWNrUmF0ZSk7XG4gICAgICBpZiAoaCA8PSBNYXRoLm1heChBLCAxZTMgKiAoZCAvIChGICogMikpKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgTSA9IFIgPyBSLmxlbiAvIEYgOiAwLCBIID0gdS5sb2FkaW5nLmZpcnN0ID8gdS5sb2FkaW5nLmZpcnN0IC0gdS5sb2FkaW5nLnN0YXJ0IDogLTEsIEsgPSB1LmxvYWRlZCAmJiBIID4gLTEsIGogPSB0aGlzLmdldEJ3RXN0aW1hdGUoKSwgQyA9IG8ubGV2ZWxzLCBrID0gQ1twXSwgJCA9IE1hdGgubWF4KHUubG9hZGVkLCBNYXRoLnJvdW5kKGQgKiAobi5iaXRyYXRlIHx8IGsuYXZlcmFnZUJpdHJhdGUpIC8gOCkpO1xuICAgICAgbGV0IFcgPSBLID8gaCAtIEggOiBoO1xuICAgICAgVyA8IDEgJiYgSyAmJiAoVyA9IE1hdGgubWluKGgsIHUubG9hZGVkICogOCAvIGopKTtcbiAgICAgIGNvbnN0IF8gPSBLID8gdS5sb2FkZWQgKiAxZTMgLyBXIDogMCwgZyA9IEEgLyAxZTMsIHggPSBfID8gKCQgLSB1LmxvYWRlZCkgLyBfIDogJCAqIDggLyBqICsgZztcbiAgICAgIGlmICh4IDw9IE0pXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHcgPSBfID8gXyAqIDggOiBqLCBEID0gKChyID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZGV0YWlscykgfHwgdGhpcy5obHMubGF0ZXN0TGV2ZWxEZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogci5saXZlKSA9PT0gITAsIE8gPSB0aGlzLmhscy5jb25maWcuYWJyQmFuZFdpZHRoVXBGYWN0b3I7XG4gICAgICBsZXQgVSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgVjtcbiAgICAgIGZvciAoViA9IHAgLSAxOyBWID4gZjsgVi0tKSB7XG4gICAgICAgIGNvbnN0IFAgPSBDW1ZdLm1heEJpdHJhdGUsIE4gPSAhQ1tWXS5kZXRhaWxzIHx8IEQ7XG4gICAgICAgIGlmIChVID0gdGhpcy5nZXRUaW1lVG9Mb2FkRnJhZyhnLCB3LCBkICogUCwgTiksIFUgPCBNYXRoLm1pbihNLCBkICsgZykpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoVSA+PSB4IHx8IFUgPiBkICogMTApXG4gICAgICAgIHJldHVybjtcbiAgICAgIEsgPyB0aGlzLmJ3RXN0aW1hdG9yLnNhbXBsZShoIC0gTWF0aC5taW4oQSwgSCksIHUubG9hZGVkKSA6IHRoaXMuYndFc3RpbWF0b3Iuc2FtcGxlVFRGQihoKTtcbiAgICAgIGNvbnN0IEwgPSBDW1ZdLm1heEJpdHJhdGU7XG4gICAgICB0aGlzLmdldEJ3RXN0aW1hdGUoKSAqIE8gPiBMICYmIHRoaXMucmVzZXRFc3RpbWF0b3IoTCk7XG4gICAgICBjb25zdCBtID0gdGhpcy5maW5kQmVzdExldmVsKEwsIGYsIFYsIDAsIE0sIDEsIDEpO1xuICAgICAgbSA+IC0xICYmIChWID0gbSksIHRoaXMud2FybihgRnJhZ21lbnQgJHtuLnNufSR7aSA/IFwiIHBhcnQgXCIgKyBpLmluZGV4IDogXCJcIn0gb2YgbGV2ZWwgJHtwfSBpcyBsb2FkaW5nIHRvbyBzbG93bHk7XG4gICAgICBGcmFnbWVudCBkdXJhdGlvbjogJHtuLmR1cmF0aW9uLnRvRml4ZWQoMyl9XG4gICAgICBUaW1lIHRvIHVuZGVyYnVmZmVyOiAke00udG9GaXhlZCgzKX0gc1xuICAgICAgRXN0aW1hdGVkIGxvYWQgdGltZSBmb3IgY3VycmVudCBmcmFnbWVudDogJHt4LnRvRml4ZWQoMyl9IHNcbiAgICAgIEVzdGltYXRlZCBsb2FkIHRpbWUgZm9yIGRvd24gc3dpdGNoIGZyYWdtZW50OiAke1UudG9GaXhlZCgzKX0gc1xuICAgICAgVFRGQiBlc3RpbWF0ZTogJHtIIHwgMH0gbXNcbiAgICAgIEN1cnJlbnQgQlcgZXN0aW1hdGU6ICR7dWUoaikgPyBqIHwgMCA6IFwiVW5rbm93blwifSBicHNcbiAgICAgIE5ldyBCVyBlc3RpbWF0ZTogJHt0aGlzLmdldEJ3RXN0aW1hdGUoKSB8IDB9IGJwc1xuICAgICAgU3dpdGNoaW5nIHRvIGxldmVsICR7Vn0gQCAke0wgfCAwfSBicHNgKSwgby5uZXh0TG9hZExldmVsID0gby5uZXh0QXV0b0xldmVsID0gViwgdGhpcy5jbGVhclRpbWVyKCk7XG4gICAgICBjb25zdCB2ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbGVhclRpbWVyKCksIHRoaXMuZnJhZ0N1cnJlbnQgPT09IG4gJiYgdGhpcy5obHMubG9hZExldmVsID09PSBWICYmIFYgPiAwKSB7XG4gICAgICAgICAgY29uc3QgUCA9IHRoaXMuZ2V0U3RhcnZhdGlvbkRlbGF5KCk7XG4gICAgICAgICAgaWYgKHRoaXMud2FybihgQWJvcnRpbmcgaW5mbGlnaHQgcmVxdWVzdCAke1YgPiAwID8gXCJhbmQgc3dpdGNoaW5nIGRvd25cIiA6IFwiXCJ9XG4gICAgICBGcmFnbWVudCBkdXJhdGlvbjogJHtuLmR1cmF0aW9uLnRvRml4ZWQoMyl9IHNcbiAgICAgIFRpbWUgdG8gdW5kZXJidWZmZXI6ICR7UC50b0ZpeGVkKDMpfSBzYCksIG4uYWJvcnRSZXF1ZXN0cygpLCB0aGlzLmZyYWdDdXJyZW50ID0gdGhpcy5wYXJ0Q3VycmVudCA9IG51bGwsIFYgPiBmKSB7XG4gICAgICAgICAgICBsZXQgTiA9IHRoaXMuZmluZEJlc3RMZXZlbCh0aGlzLmhscy5sZXZlbHNbZl0uYml0cmF0ZSwgZiwgViwgMCwgUCwgMSwgMSk7XG4gICAgICAgICAgICBOID09PSAtMSAmJiAoTiA9IGYpLCB0aGlzLmhscy5uZXh0TG9hZExldmVsID0gdGhpcy5obHMubmV4dEF1dG9MZXZlbCA9IE4sIHRoaXMucmVzZXRFc3RpbWF0b3IodGhpcy5obHMubGV2ZWxzW05dLmJpdHJhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIEUgfHwgeCA+IFUgKiAyID8gdigpIDogdGhpcy50aW1lciA9IHNlbGYuc2V0SW50ZXJ2YWwodiwgVSAqIDFlMyksIG8udHJpZ2dlcihJLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCwge1xuICAgICAgICBmcmFnOiBuLFxuICAgICAgICBwYXJ0OiBpLFxuICAgICAgICBzdGF0czogdVxuICAgICAgfSk7XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLmJ3RXN0aW1hdG9yID0gdGhpcy5pbml0RXN0aW1hdG9yKCksIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICByZXNldEVzdGltYXRvcihlKSB7XG4gICAgZSAmJiAodGhpcy5sb2coYHNldHRpbmcgaW5pdGlhbCBid2UgdG8gJHtlfWApLCB0aGlzLmhscy5jb25maWcuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSA9IGUpLCB0aGlzLmZpcnN0U2VsZWN0aW9uID0gLTEsIHRoaXMuYndFc3RpbWF0b3IgPSB0aGlzLmluaXRFc3RpbWF0b3IoKTtcbiAgfVxuICBpbml0RXN0aW1hdG9yKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscy5jb25maWc7XG4gICAgcmV0dXJuIG5ldyBUUyhlLmFickV3bWFTbG93Vm9ELCBlLmFickV3bWFGYXN0Vm9ELCBlLmFickV3bWFEZWZhdWx0RXN0aW1hdGUpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkZSQUdfTE9BRElORywgdGhpcy5vbkZyYWdMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKSwgZS5vbihJLkxFVkVMX1NXSVRDSElORywgdGhpcy5vbkxldmVsU3dpdGNoaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMU19VUERBVEVELCB0aGlzLm9uTGV2ZWxzVXBkYXRlZCwgdGhpcyksIGUub24oSS5NQVhfQVVUT19MRVZFTF9VUERBVEVELCB0aGlzLm9uTWF4QXV0b0xldmVsVXBkYXRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUgJiYgKGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuRlJBR19MT0FESU5HLCB0aGlzLm9uRnJhZ0xvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcyksIGUub2ZmKEkuRlJBR19CVUZGRVJFRCwgdGhpcy5vbkZyYWdCdWZmZXJlZCwgdGhpcyksIGUub2ZmKEkuTEVWRUxfU1dJVENISU5HLCB0aGlzLm9uTGV2ZWxTd2l0Y2hpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLk1BWF9BVVRPX0xFVkVMX1VQREFURUQsIHRoaXMub25NYXhBdXRvTGV2ZWxVcGRhdGVkLCB0aGlzKSwgZS5vZmYoSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMuaGxzID0gdGhpcy5fYWJhbmRvblJ1bGVzQ2hlY2sgPSB0aGlzLnN1cHBvcnRlZENhY2hlID0gbnVsbCwgdGhpcy5mcmFnQ3VycmVudCA9IHRoaXMucGFydEN1cnJlbnQgPSBudWxsO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKGUsIHQpIHtcbiAgICB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwgPSAtMSwgdGhpcy5maXJzdFNlbGVjdGlvbiA9IC0xLCB0aGlzLmxhc3RMZXZlbExvYWRTZWMgPSAwLCB0aGlzLnN1cHBvcnRlZENhY2hlID0ge30sIHRoaXMuZnJhZ0N1cnJlbnQgPSB0aGlzLnBhcnRDdXJyZW50ID0gbnVsbCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQoKSwgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgb25MZXZlbHNVcGRhdGVkKCkge1xuICAgIHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA+IC0xICYmIHRoaXMuZnJhZ0N1cnJlbnQgJiYgKHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA9IHRoaXMuZnJhZ0N1cnJlbnQubGV2ZWwpLCB0aGlzLl9uZXh0QXV0b0xldmVsID0gLTEsIHRoaXMub25NYXhBdXRvTGV2ZWxVcGRhdGVkKCksIHRoaXMuY29kZWNUaWVycyA9IG51bGwsIHRoaXMuYXVkaW9UcmFja3NCeUdyb3VwID0gbnVsbDtcbiAgfVxuICBvbk1heEF1dG9MZXZlbFVwZGF0ZWQoKSB7XG4gICAgdGhpcy5maXJzdFNlbGVjdGlvbiA9IC0xLCB0aGlzLm5leHRBdXRvTGV2ZWxLZXkgPSBcIlwiO1xuICB9XG4gIG9uRnJhZ0xvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0LmZyYWc7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUZyYWdtZW50KHIpKSB7XG4gICAgICBpZiAoIXIuYml0cmF0ZVRlc3QpIHtcbiAgICAgICAgdmFyIG47XG4gICAgICAgIHRoaXMuZnJhZ0N1cnJlbnQgPSByLCB0aGlzLnBhcnRDdXJyZW50ID0gKG4gPSB0LnBhcnQpICE9IG51bGwgPyBuIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xlYXJUaW1lcigpLCB0aGlzLnRpbWVyID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLl9hYmFuZG9uUnVsZXNDaGVjaywgMTAwKTtcbiAgICB9XG4gIH1cbiAgb25MZXZlbFN3aXRjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgaWYgKCF0LmZhdGFsKVxuICAgICAgc3dpdGNoICh0LmRldGFpbHMpIHtcbiAgICAgICAgY2FzZSBKLkJVRkZFUl9BRERfQ09ERUNfRVJST1I6XG4gICAgICAgIGNhc2UgSi5CVUZGRVJfQVBQRU5EX0VSUk9SOlxuICAgICAgICAgIHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA9IC0xLCB0aGlzLmZpcnN0U2VsZWN0aW9uID0gLTE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSi5GUkFHX0xPQURfVElNRU9VVDoge1xuICAgICAgICAgIGNvbnN0IHIgPSB0LmZyYWcsIHtcbiAgICAgICAgICAgIGZyYWdDdXJyZW50OiBuLFxuICAgICAgICAgICAgcGFydEN1cnJlbnQ6IGlcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAociAmJiBuICYmIHIuc24gPT09IG4uc24gJiYgci5sZXZlbCA9PT0gbi5sZXZlbCkge1xuICAgICAgICAgICAgY29uc3QgbyA9IHBlcmZvcm1hbmNlLm5vdygpLCBhID0gaSA/IGkuc3RhdHMgOiByLnN0YXRzLCBsID0gbyAtIGEubG9hZGluZy5zdGFydCwgYyA9IGEubG9hZGluZy5maXJzdCA/IGEubG9hZGluZy5maXJzdCAtIGEubG9hZGluZy5zdGFydCA6IC0xO1xuICAgICAgICAgICAgaWYgKGEubG9hZGVkICYmIGMgPiAtMSkge1xuICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5id0VzdGltYXRvci5nZXRFc3RpbWF0ZVRURkIoKTtcbiAgICAgICAgICAgICAgdGhpcy5id0VzdGltYXRvci5zYW1wbGUobCAtIE1hdGgubWluKGQsIGMpLCBhLmxvYWRlZCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5id0VzdGltYXRvci5zYW1wbGVUVEZCKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICB9XG4gIGdldFRpbWVUb0xvYWRGcmFnKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gZSArIHIgLyB0LCBvID0gbiA/IGUgKyB0aGlzLmxhc3RMZXZlbExvYWRTZWMgOiAwO1xuICAgIHJldHVybiBpICsgbztcbiAgfVxuICBvbkxldmVsTG9hZGVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5obHMuY29uZmlnLCB7XG4gICAgICBsb2FkaW5nOiBuXG4gICAgfSA9IHQuc3RhdHMsIGkgPSBuLmVuZCAtIG4uZmlyc3Q7XG4gICAgdWUoaSkgJiYgKHRoaXMubGFzdExldmVsTG9hZFNlYyA9IGkgLyAxZTMpLCB0LmRldGFpbHMubGl2ZSA/IHRoaXMuYndFc3RpbWF0b3IudXBkYXRlKHIuYWJyRXdtYVNsb3dMaXZlLCByLmFickV3bWFGYXN0TGl2ZSkgOiB0aGlzLmJ3RXN0aW1hdG9yLnVwZGF0ZShyLmFickV3bWFTbG93Vm9ELCByLmFickV3bWFGYXN0Vm9EKSwgdGhpcy50aW1lciA+IC0xICYmIHRoaXMuX2FiYW5kb25SdWxlc0NoZWNrKHQubGV2ZWxJbmZvKTtcbiAgfVxuICBvbkZyYWdMb2FkZWQoZSwge1xuICAgIGZyYWc6IHQsXG4gICAgcGFydDogclxuICB9KSB7XG4gICAgY29uc3QgbiA9IHIgPyByLnN0YXRzIDogdC5zdGF0cztcbiAgICBpZiAodC50eXBlID09PSBwZS5NQUlOICYmIHRoaXMuYndFc3RpbWF0b3Iuc2FtcGxlVFRGQihuLmxvYWRpbmcuZmlyc3QgLSBuLmxvYWRpbmcuc3RhcnQpLCAhdGhpcy5pZ25vcmVGcmFnbWVudCh0KSkge1xuICAgICAgaWYgKHRoaXMuY2xlYXJUaW1lcigpLCB0LmxldmVsID09PSB0aGlzLl9uZXh0QXV0b0xldmVsICYmICh0aGlzLl9uZXh0QXV0b0xldmVsID0gLTEpLCB0aGlzLmZpcnN0U2VsZWN0aW9uID0gLTEsIHRoaXMuaGxzLmNvbmZpZy5hYnJNYXhXaXRoUmVhbEJpdHJhdGUpIHtcbiAgICAgICAgY29uc3QgaSA9IHIgPyByLmR1cmF0aW9uIDogdC5kdXJhdGlvbiwgbyA9IHRoaXMuaGxzLmxldmVsc1t0LmxldmVsXSwgYSA9IChvLmxvYWRlZCA/IG8ubG9hZGVkLmJ5dGVzIDogMCkgKyBuLmxvYWRlZCwgbCA9IChvLmxvYWRlZCA/IG8ubG9hZGVkLmR1cmF0aW9uIDogMCkgKyBpO1xuICAgICAgICBvLmxvYWRlZCA9IHtcbiAgICAgICAgICBieXRlczogYSxcbiAgICAgICAgICBkdXJhdGlvbjogbFxuICAgICAgICB9LCBvLnJlYWxCaXRyYXRlID0gTWF0aC5yb3VuZCg4ICogYSAvIGwpO1xuICAgICAgfVxuICAgICAgaWYgKHQuYml0cmF0ZVRlc3QpIHtcbiAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICBzdGF0czogbixcbiAgICAgICAgICBmcmFnOiB0LFxuICAgICAgICAgIHBhcnQ6IHIsXG4gICAgICAgICAgaWQ6IHQudHlwZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uRnJhZ0J1ZmZlcmVkKEkuRlJBR19CVUZGRVJFRCwgaSksIHQuYml0cmF0ZVRlc3QgPSAhMTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwgPSB0LmxldmVsO1xuICAgIH1cbiAgfVxuICBvbkZyYWdCdWZmZXJlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHBhcnQ6IG5cbiAgICB9ID0gdCwgaSA9IG4gIT0gbnVsbCAmJiBuLnN0YXRzLmxvYWRlZCA/IG4uc3RhdHMgOiByLnN0YXRzO1xuICAgIGlmIChpLmFib3J0ZWQgfHwgdGhpcy5pZ25vcmVGcmFnbWVudChyKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvID0gaS5wYXJzaW5nLmVuZCAtIGkubG9hZGluZy5zdGFydCAtIE1hdGgubWluKGkubG9hZGluZy5maXJzdCAtIGkubG9hZGluZy5zdGFydCwgdGhpcy5id0VzdGltYXRvci5nZXRFc3RpbWF0ZVRURkIoKSk7XG4gICAgdGhpcy5id0VzdGltYXRvci5zYW1wbGUobywgaS5sb2FkZWQpLCBpLmJ3RXN0aW1hdGUgPSB0aGlzLmdldEJ3RXN0aW1hdGUoKSwgci5iaXRyYXRlVGVzdCA/IHRoaXMuYml0cmF0ZVRlc3REZWxheSA9IG8gLyAxZTMgOiB0aGlzLmJpdHJhdGVUZXN0RGVsYXkgPSAwO1xuICB9XG4gIGlnbm9yZUZyYWdtZW50KGUpIHtcbiAgICByZXR1cm4gZS50eXBlICE9PSBwZS5NQUlOIHx8IGUuc24gPT09IFwiaW5pdFNlZ21lbnRcIjtcbiAgfVxuICBjbGVhclRpbWVyKCkge1xuICAgIHRoaXMudGltZXIgPiAtMSAmJiAoc2VsZi5jbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gLTEpO1xuICB9XG4gIGdldCBmaXJzdEF1dG9MZXZlbCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhBdXRvTGV2ZWw6IGUsXG4gICAgICBtaW5BdXRvTGV2ZWw6IHRcbiAgICB9ID0gdGhpcy5obHMsIHIgPSB0aGlzLmdldEJ3RXN0aW1hdGUoKSwgbiA9IHRoaXMuaGxzLmNvbmZpZy5tYXhTdGFydmF0aW9uRGVsYXksIGkgPSB0aGlzLmZpbmRCZXN0TGV2ZWwociwgdCwgZSwgMCwgbiwgMSwgMSk7XG4gICAgaWYgKGkgPiAtMSlcbiAgICAgIHJldHVybiBpO1xuICAgIGNvbnN0IG8gPSB0aGlzLmhscy5maXJzdExldmVsLCBhID0gTWF0aC5taW4oTWF0aC5tYXgobywgdCksIGUpO1xuICAgIHJldHVybiB0aGlzLndhcm4oYENvdWxkIG5vdCBmaW5kIGJlc3Qgc3RhcnRpbmcgYXV0byBsZXZlbC4gRGVmYXVsdGluZyB0byBmaXJzdCBpbiBwbGF5bGlzdCAke299IGNsYW1wZWQgdG8gJHthfWApLCBhO1xuICB9XG4gIGdldCBmb3JjZWRBdXRvTGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubmV4dEF1dG9MZXZlbEtleSA/IC0xIDogdGhpcy5fbmV4dEF1dG9MZXZlbDtcbiAgfVxuICAvLyByZXR1cm4gbmV4dCBhdXRvIGxldmVsXG4gIGdldCBuZXh0QXV0b0xldmVsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmZvcmNlZEF1dG9MZXZlbCwgciA9IHRoaXMuYndFc3RpbWF0b3IuY2FuRXN0aW1hdGUoKSwgbiA9IHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA+IC0xO1xuICAgIGlmIChlICE9PSAtMSAmJiAoIXIgfHwgIW4gfHwgdGhpcy5uZXh0QXV0b0xldmVsS2V5ID09PSB0aGlzLmdldEF1dG9MZXZlbEtleSgpKSlcbiAgICAgIHJldHVybiBlO1xuICAgIGNvbnN0IGkgPSByICYmIG4gPyB0aGlzLmdldE5leHRBQlJBdXRvTGV2ZWwoKSA6IHRoaXMuZmlyc3RBdXRvTGV2ZWw7XG4gICAgaWYgKGUgIT09IC0xKSB7XG4gICAgICBjb25zdCBvID0gdGhpcy5obHMubGV2ZWxzO1xuICAgICAgaWYgKG8ubGVuZ3RoID4gTWF0aC5tYXgoZSwgaSkgJiYgb1tlXS5sb2FkRXJyb3IgPD0gb1tpXS5sb2FkRXJyb3IpXG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbmV4dEF1dG9MZXZlbCA9IGksIHRoaXMubmV4dEF1dG9MZXZlbEtleSA9IHRoaXMuZ2V0QXV0b0xldmVsS2V5KCksIGk7XG4gIH1cbiAgZ2V0QXV0b0xldmVsS2V5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLmdldEJ3RXN0aW1hdGUoKX1fJHt0aGlzLmdldFN0YXJ2YXRpb25EZWxheSgpLnRvRml4ZWQoMil9YDtcbiAgfVxuICBnZXROZXh0QUJSQXV0b0xldmVsKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWdDdXJyZW50OiBlLFxuICAgICAgcGFydEN1cnJlbnQ6IHQsXG4gICAgICBobHM6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoci5sZXZlbHMubGVuZ3RoIDw9IDEpXG4gICAgICByZXR1cm4gci5sb2FkTGV2ZWw7XG4gICAgY29uc3Qge1xuICAgICAgbWF4QXV0b0xldmVsOiBuLFxuICAgICAgY29uZmlnOiBpLFxuICAgICAgbWluQXV0b0xldmVsOiBvXG4gICAgfSA9IHIsIGEgPSB0ID8gdC5kdXJhdGlvbiA6IGUgPyBlLmR1cmF0aW9uIDogMCwgbCA9IHRoaXMuZ2V0QndFc3RpbWF0ZSgpLCBjID0gdGhpcy5nZXRTdGFydmF0aW9uRGVsYXkoKTtcbiAgICBsZXQgdSA9IGkuYWJyQmFuZFdpZHRoRmFjdG9yLCBkID0gaS5hYnJCYW5kV2lkdGhVcEZhY3RvcjtcbiAgICBpZiAoYykge1xuICAgICAgY29uc3QgRSA9IHRoaXMuZmluZEJlc3RMZXZlbChsLCBvLCBuLCBjLCAwLCB1LCBkKTtcbiAgICAgIGlmIChFID49IDApXG4gICAgICAgIHJldHVybiB0aGlzLnJlYnVmZmVyTm90aWNlID0gLTEsIEU7XG4gICAgfVxuICAgIGxldCBoID0gYSA/IE1hdGgubWluKGEsIGkubWF4U3RhcnZhdGlvbkRlbGF5KSA6IGkubWF4U3RhcnZhdGlvbkRlbGF5O1xuICAgIGlmICghYykge1xuICAgICAgY29uc3QgRSA9IHRoaXMuYml0cmF0ZVRlc3REZWxheTtcbiAgICAgIEUgJiYgKGggPSAoYSA/IE1hdGgubWluKGEsIGkubWF4TG9hZGluZ0RlbGF5KSA6IGkubWF4TG9hZGluZ0RlbGF5KSAtIEUsIHRoaXMuaW5mbyhgYml0cmF0ZSB0ZXN0IHRvb2sgJHtNYXRoLnJvdW5kKDFlMyAqIEUpfW1zLCBzZXQgZmlyc3QgZnJhZ21lbnQgbWF4IGZldGNoRHVyYXRpb24gdG8gJHtNYXRoLnJvdW5kKDFlMyAqIGgpfSBtc2ApLCB1ID0gZCA9IDEpO1xuICAgIH1cbiAgICBjb25zdCBmID0gdGhpcy5maW5kQmVzdExldmVsKGwsIG8sIG4sIGMsIGgsIHUsIGQpO1xuICAgIGlmICh0aGlzLnJlYnVmZmVyTm90aWNlICE9PSBmICYmICh0aGlzLnJlYnVmZmVyTm90aWNlID0gZiwgdGhpcy5pbmZvKGAke2MgPyBcInJlYnVmZmVyaW5nIGV4cGVjdGVkXCIgOiBcImJ1ZmZlciBpcyBlbXB0eVwifSwgb3B0aW1hbCBxdWFsaXR5IGxldmVsICR7Zn1gKSksIGYgPiAtMSlcbiAgICAgIHJldHVybiBmO1xuICAgIGNvbnN0IHAgPSByLmxldmVsc1tvXSwgeSA9IHIubG9hZExldmVsT2JqO1xuICAgIHJldHVybiB5ICYmIChwID09IG51bGwgPyB2b2lkIDAgOiBwLmJpdHJhdGUpIDwgeS5iaXRyYXRlID8gbyA6IHIubG9hZExldmVsO1xuICB9XG4gIGdldFN0YXJ2YXRpb25EZWxheSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHMsIHQgPSBlLm1lZGlhO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybiAxIC8gMDtcbiAgICBjb25zdCByID0gdCAmJiB0LnBsYXliYWNrUmF0ZSAhPT0gMCA/IE1hdGguYWJzKHQucGxheWJhY2tSYXRlKSA6IDEsIG4gPSBlLm1haW5Gb3J3YXJkQnVmZmVySW5mbztcbiAgICByZXR1cm4gKG4gPyBuLmxlbiA6IDApIC8gcjtcbiAgfVxuICBnZXRCd0VzdGltYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmJ3RXN0aW1hdG9yLmNhbkVzdGltYXRlKCkgPyB0aGlzLmJ3RXN0aW1hdG9yLmdldEVzdGltYXRlKCkgOiB0aGlzLmhscy5jb25maWcuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZTtcbiAgfVxuICBmaW5kQmVzdExldmVsKGUsIHQsIHIsIG4sIGksIG8sIGEpIHtcbiAgICB2YXIgbDtcbiAgICBjb25zdCBjID0gbiArIGksIHUgPSB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwsIGQgPSB1ID09PSAtMSA/IHRoaXMuaGxzLmZpcnN0TGV2ZWwgOiB1LCB7XG4gICAgICBmcmFnQ3VycmVudDogaCxcbiAgICAgIHBhcnRDdXJyZW50OiBmXG4gICAgfSA9IHRoaXMsIHtcbiAgICAgIGxldmVsczogcCxcbiAgICAgIGFsbEF1ZGlvVHJhY2tzOiB5LFxuICAgICAgbG9hZExldmVsOiBFLFxuICAgICAgY29uZmlnOiBiXG4gICAgfSA9IHRoaXMuaGxzO1xuICAgIGlmIChwLmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IFIgPSBwW2RdLCBBID0gISEoKGwgPSB0aGlzLmhscy5sYXRlc3RMZXZlbERldGFpbHMpICE9IG51bGwgJiYgbC5saXZlKSwgRiA9IEUgPT09IC0xIHx8IHUgPT09IC0xO1xuICAgIGxldCBNLCBIID0gXCJTRFJcIiwgSyA9IChSID09IG51bGwgPyB2b2lkIDAgOiBSLmZyYW1lUmF0ZSkgfHwgMDtcbiAgICBjb25zdCB7XG4gICAgICBhdWRpb1ByZWZlcmVuY2U6IGosXG4gICAgICB2aWRlb1ByZWZlcmVuY2U6IENcbiAgICB9ID0gYiwgayA9IHRoaXMuYXVkaW9UcmFja3NCeUdyb3VwIHx8ICh0aGlzLmF1ZGlvVHJhY2tzQnlHcm91cCA9ICRnKHkpKTtcbiAgICBsZXQgJCA9IC0xO1xuICAgIGlmIChGKSB7XG4gICAgICBpZiAodGhpcy5maXJzdFNlbGVjdGlvbiAhPT0gLTEpXG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0U2VsZWN0aW9uO1xuICAgICAgY29uc3QgdyA9IHRoaXMuY29kZWNUaWVycyB8fCAodGhpcy5jb2RlY1RpZXJzID0gZmIocCwgaywgdCwgcikpLCBEID0gaGIodywgSCwgZSwgaiwgQyksIHtcbiAgICAgICAgY29kZWNTZXQ6IE8sXG4gICAgICAgIHZpZGVvUmFuZ2VzOiBVLFxuICAgICAgICBtaW5GcmFtZXJhdGU6IFYsXG4gICAgICAgIG1pbkJpdHJhdGU6IEwsXG4gICAgICAgIG1pbkluZGV4OiBtLFxuICAgICAgICBwcmVmZXJIRFI6IHZcbiAgICAgIH0gPSBEO1xuICAgICAgJCA9IG0sIE0gPSBPLCBIID0gdiA/IFVbVS5sZW5ndGggLSAxXSA6IFVbMF0sIEsgPSBWLCBlID0gTWF0aC5tYXgoZSwgTCksIHRoaXMubG9nKGBwaWNrZWQgc3RhcnQgdGllciAke2F0KEQpfWApO1xuICAgIH0gZWxzZVxuICAgICAgTSA9IFIgPT0gbnVsbCA/IHZvaWQgMCA6IFIuY29kZWNTZXQsIEggPSBSID09IG51bGwgPyB2b2lkIDAgOiBSLnZpZGVvUmFuZ2U7XG4gICAgY29uc3QgVyA9IGYgPyBmLmR1cmF0aW9uIDogaCA/IGguZHVyYXRpb24gOiAwLCBfID0gdGhpcy5id0VzdGltYXRvci5nZXRFc3RpbWF0ZVRURkIoKSAvIDFlMywgZyA9IFtdO1xuICAgIGZvciAobGV0IHcgPSByOyB3ID49IHQ7IHctLSkge1xuICAgICAgdmFyIHg7XG4gICAgICBjb25zdCBEID0gcFt3XSwgTyA9IHcgPiBkO1xuICAgICAgaWYgKCFEKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGlmIChiLnVzZU1lZGlhQ2FwYWJpbGl0aWVzICYmICFELnN1cHBvcnRlZFJlc3VsdCAmJiAhRC5zdXBwb3J0ZWRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IE4gPSBuYXZpZ2F0b3IubWVkaWFDYXBhYmlsaXRpZXM7XG4gICAgICAgIHR5cGVvZiAoTiA9PSBudWxsID8gdm9pZCAwIDogTi5kZWNvZGluZ0luZm8pID09IFwiZnVuY3Rpb25cIiAmJiByYihELCBrLCBILCBLLCBlLCBqKSA/IChELnN1cHBvcnRlZFByb21pc2UgPSBOZyhELCBrLCBOLCB0aGlzLnN1cHBvcnRlZENhY2hlKSwgRC5zdXBwb3J0ZWRQcm9taXNlLnRoZW4oKFkpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGxzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIEQuc3VwcG9ydGVkUmVzdWx0ID0gWTtcbiAgICAgICAgICBjb25zdCBlZSA9IHRoaXMuaGxzLmxldmVscywgaWUgPSBlZS5pbmRleE9mKEQpO1xuICAgICAgICAgIFkuZXJyb3IgPyB0aGlzLndhcm4oYE1lZGlhQ2FwYWJpbGl0aWVzIGRlY29kaW5nSW5mbyBlcnJvcjogXCIke1kuZXJyb3J9XCIgZm9yIGxldmVsICR7aWV9ICR7YXQoWSl9YCkgOiBZLnN1cHBvcnRlZCA/IFkuZGVjb2RpbmdJbmZvUmVzdWx0cy5zb21lKChsZSkgPT4gbGUuc21vb3RoID09PSAhMSB8fCBsZS5wb3dlckVmZmljaWVudCA9PT0gITEpICYmIHRoaXMubG9nKGBNZWRpYUNhcGFiaWxpdGllcyBkZWNvZGluZ0luZm8gZm9yIGxldmVsICR7aWV9IG5vdCBzbW9vdGggb3IgcG93ZXJFZmZpY2llbnQ6ICR7YXQoWSl9YCkgOiAodGhpcy53YXJuKGBVbnN1cHBvcnRlZCBNZWRpYUNhcGFiaWxpdGllcyBkZWNvZGluZ0luZm8gcmVzdWx0IGZvciBsZXZlbCAke2llfSAke2F0KFkpfWApLCBpZSA+IC0xICYmIGVlLmxlbmd0aCA+IDEgJiYgKHRoaXMubG9nKGBSZW1vdmluZyB1bnN1cHBvcnRlZCBsZXZlbCAke2llfWApLCB0aGlzLmhscy5yZW1vdmVMZXZlbChpZSksIHRoaXMuaGxzLmxvYWRMZXZlbCA9PT0gLTEgJiYgKHRoaXMuaGxzLm5leHRMb2FkTGV2ZWwgPSAwKSkpO1xuICAgICAgICB9KS5jYXRjaCgoWSkgPT4ge1xuICAgICAgICAgIHRoaXMud2FybihgRXJyb3IgaGFuZGxpbmcgTWVkaWFDYXBhYmlsaXRpZXMgZGVjb2RpbmdJbmZvOiAke1l9YCk7XG4gICAgICAgIH0pKSA6IEQuc3VwcG9ydGVkUmVzdWx0ID0gQmc7XG4gICAgICB9XG4gICAgICBpZiAoKE0gJiYgRC5jb2RlY1NldCAhPT0gTSB8fCBIICYmIEQudmlkZW9SYW5nZSAhPT0gSCB8fCBPICYmIEsgPiBELmZyYW1lUmF0ZSB8fCAhTyAmJiBLID4gMCAmJiBLIDwgRC5mcmFtZVJhdGUgfHwgKHggPSBELnN1cHBvcnRlZFJlc3VsdCkgIT0gbnVsbCAmJiAoeCA9IHguZGVjb2RpbmdJbmZvUmVzdWx0cykgIT0gbnVsbCAmJiB4LnNvbWUoKE4pID0+IE4uc21vb3RoID09PSAhMSkpICYmICghRiB8fCB3ICE9PSAkKSkge1xuICAgICAgICBnLnB1c2godyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgVSA9IEQuZGV0YWlscywgViA9IChmID8gVSA9PSBudWxsID8gdm9pZCAwIDogVS5wYXJ0VGFyZ2V0IDogVSA9PSBudWxsID8gdm9pZCAwIDogVS5hdmVyYWdldGFyZ2V0ZHVyYXRpb24pIHx8IFc7XG4gICAgICBsZXQgTDtcbiAgICAgIE8gPyBMID0gYSAqIGUgOiBMID0gbyAqIGU7XG4gICAgICBjb25zdCBtID0gVyAmJiBuID49IFcgKiAyICYmIGkgPT09IDAgPyBELmF2ZXJhZ2VCaXRyYXRlIDogRC5tYXhCaXRyYXRlLCB2ID0gdGhpcy5nZXRUaW1lVG9Mb2FkRnJhZyhfLCBMLCBtICogViwgVSA9PT0gdm9pZCAwKTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gaWYgYWRqdXN0ZWQgYncgaXMgZ3JlYXRlciB0aGFuIGxldmVsIGJpdHJhdGUgQU5EXG4gICAgICAgIEwgPj0gbSAmJiAvLyBubyBsZXZlbCBjaGFuZ2UsIG9yIG5ldyBsZXZlbCBoYXMgbm8gZXJyb3IgaGlzdG9yeVxuICAgICAgICAodyA9PT0gdSB8fCBELmxvYWRFcnJvciA9PT0gMCAmJiBELmZyYWdtZW50RXJyb3IgPT09IDApICYmIC8vIGZyYWdtZW50IGZldGNoRHVyYXRpb24gdW5rbm93biBPUiBsaXZlIHN0cmVhbSBPUiBmcmFnbWVudCBmZXRjaER1cmF0aW9uIGxlc3MgdGhhbiBtYXggYWxsb3dlZCBmZXRjaCBkdXJhdGlvbiwgdGhlbiB0aGlzIGxldmVsIG1hdGNoZXNcbiAgICAgICAgLy8gd2UgZG9uJ3QgYWNjb3VudCBmb3IgbWF4IEZldGNoIER1cmF0aW9uIGZvciBsaXZlIHN0cmVhbXMsIHRoaXMgaXMgdG8gYXZvaWQgc3dpdGNoaW5nIGRvd24gd2hlbiBuZWFyIHRoZSBlZGdlIG9mIGxpdmUgc2xpZGluZyB3aW5kb3cgLi4uXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSB0byBzdXBwb3J0IHN0YXJ0TGV2ZWwgPSAtMSAoYml0cmF0ZVRlc3QpIG9uIGxpdmUgc3RyZWFtcyA6IGluIHRoYXQgY2FzZSB3ZSBzaG91bGQgbm90IGV4aXQgbG9vcCBzbyB0aGF0IGZpbmRCZXN0TGV2ZWwgd2lsbCByZXR1cm4gLTFcbiAgICAgICAgKHYgPD0gXyB8fCAhdWUodikgfHwgQSAmJiAhdGhpcy5iaXRyYXRlVGVzdERlbGF5IHx8IHYgPCBjKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IE4gPSB0aGlzLmZvcmNlZEF1dG9MZXZlbDtcbiAgICAgICAgcmV0dXJuIHcgIT09IEUgJiYgKE4gPT09IC0xIHx8IE4gIT09IEUpICYmIChnLmxlbmd0aCAmJiB0aGlzLnRyYWNlKGBTa2lwcGVkIGxldmVsKHMpICR7Zy5qb2luKFwiLFwiKX0gb2YgJHtyfSBtYXggd2l0aCBDT0RFQ1MgYW5kIFZJREVPLVJBTkdFOlwiJHtwW2dbMF1dLmNvZGVjc31cIiAke3BbZ1swXV0udmlkZW9SYW5nZX07IG5vdCBjb21wYXRpYmxlIHdpdGggXCIke019XCIgJHtIfWApLCB0aGlzLmluZm8oYHN3aXRjaCBjYW5kaWRhdGU6JHtkfS0+JHt3fSBhZGp1c3RlZGJ3KCR7TWF0aC5yb3VuZChMKX0pLWJpdHJhdGU9JHtNYXRoLnJvdW5kKEwgLSBtKX0gdHRmYjoke18udG9GaXhlZCgxKX0gYXZnRHVyYXRpb246JHtWLnRvRml4ZWQoMSl9IG1heEZldGNoRHVyYXRpb246JHtjLnRvRml4ZWQoMSl9IGZldGNoRHVyYXRpb246JHt2LnRvRml4ZWQoMSl9IGZpcnN0U2VsZWN0aW9uOiR7Rn0gY29kZWNTZXQ6JHtELmNvZGVjU2V0fSB2aWRlb1JhbmdlOiR7RC52aWRlb1JhbmdlfSBobHMubG9hZExldmVsOiR7RX1gKSksIEYgJiYgKHRoaXMuZmlyc3RTZWxlY3Rpb24gPSB3KSwgdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHNldCBuZXh0QXV0b0xldmVsKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5kZXJpdmVOZXh0QXV0b0xldmVsKGUpO1xuICAgIHRoaXMuX25leHRBdXRvTGV2ZWwgIT09IHQgJiYgKHRoaXMubmV4dEF1dG9MZXZlbEtleSA9IFwiXCIsIHRoaXMuX25leHRBdXRvTGV2ZWwgPSB0KTtcbiAgfVxuICBkZXJpdmVOZXh0QXV0b0xldmVsKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhBdXRvTGV2ZWw6IHQsXG4gICAgICBtaW5BdXRvTGV2ZWw6IHJcbiAgICB9ID0gdGhpcy5obHM7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUsIHIpLCB0KTtcbiAgfVxufVxuY29uc3QgR2cgPSB7XG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgYW4gaXRlbSBpbiBhbiBhcnJheSB3aGljaCBtYXRjaGVzIGEgY2VydGFpbiBjb25kaXRpb24uXG4gICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbmRpdGlvbiB0byBvbmx5IG1hdGNoIG9uZSBpdGVtIGluIHRoZSBhcnJheSxcbiAgICogYW5kIGZvciB0aGUgYXJyYXkgdG8gYmUgb3JkZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxpc3QgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAgICogQHBhcmFtIGNvbXBhcmlzb25GblxuICAgKiAgICAgIENhbGxlZCBhbmQgcHJvdmlkZWQgYSBjYW5kaWRhdGUgaXRlbSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAqICAgICAgU2hvdWxkIHJldHVybjpcbiAgICogICAgICAgICAgPiAtMSBpZiB0aGUgaXRlbSBzaG91bGQgYmUgbG9jYXRlZCBhdCBhIGxvd2VyIGluZGV4IHRoYW4gdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAqICAgICAgICAgID4gMSBpZiB0aGUgaXRlbSBzaG91bGQgYmUgbG9jYXRlZCBhdCBhIGhpZ2hlciBpbmRleCB0aGFuIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgKiAgICAgICAgICA+IDAgaWYgdGhlIGl0ZW0gaXMgdGhlIGl0ZW0geW91J3JlIGxvb2tpbmcgZm9yLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgb2JqZWN0IGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBudWxsXG4gICAqL1xuICBzZWFyY2g6IGZ1bmN0aW9uKHMsIGUpIHtcbiAgICBsZXQgdCA9IDAsIHIgPSBzLmxlbmd0aCAtIDEsIG4gPSBudWxsLCBpID0gbnVsbDtcbiAgICBmb3IgKDsgdCA8PSByOyApIHtcbiAgICAgIG4gPSAodCArIHIpIC8gMiB8IDAsIGkgPSBzW25dO1xuICAgICAgY29uc3QgbyA9IGUoaSk7XG4gICAgICBpZiAobyA+IDApXG4gICAgICAgIHQgPSBuICsgMTtcbiAgICAgIGVsc2UgaWYgKG8gPCAwKVxuICAgICAgICByID0gbiAtIDE7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcbmZ1bmN0aW9uIHZiKHMsIGUsIHQpIHtcbiAgaWYgKGUgPT09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkocykgfHwgIXMubGVuZ3RoIHx8ICF1ZShlKSlcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgciA9IHNbMF0ucHJvZ3JhbURhdGVUaW1lO1xuICBpZiAoZSA8IChyIHx8IDApKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBuID0gc1tzLmxlbmd0aCAtIDFdLmVuZFByb2dyYW1EYXRlVGltZTtcbiAgaWYgKGUgPj0gKG4gfHwgMCkpXG4gICAgcmV0dXJuIG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG8gPSBzW2ldO1xuICAgIGlmICh4YihlLCB0LCBvKSlcbiAgICAgIHJldHVybiBvO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gSnMocywgZSwgdCA9IDAsIHIgPSAwLCBuID0gNWUtMykge1xuICBsZXQgaSA9IG51bGw7XG4gIGlmIChzKSB7XG4gICAgaSA9IGVbMSArIHMuc24gLSBlWzBdLnNuXSB8fCBudWxsO1xuICAgIGNvbnN0IGEgPSBzLmVuZERUUyAtIHQ7XG4gICAgYSA+IDAgJiYgYSA8IDE1ZS03ICYmICh0ICs9IDE1ZS03KSwgaSAmJiBzLmxldmVsICE9PSBpLmxldmVsICYmIGkuZW5kIDw9IHMuZW5kICYmIChpID0gZVsyICsgcy5zbiAtIGVbMF0uc25dIHx8IG51bGwpO1xuICB9IGVsc2UgdCA9PT0gMCAmJiBlWzBdLnN0YXJ0ID09PSAwICYmIChpID0gZVswXSk7XG4gIGlmIChpICYmICgoIXMgfHwgcy5sZXZlbCA9PT0gaS5sZXZlbCkgJiYgZGgodCwgciwgaSkgPT09IDAgfHwgRWIoaSwgcywgTWF0aC5taW4obiwgcikpKSlcbiAgICByZXR1cm4gaTtcbiAgY29uc3QgbyA9IEdnLnNlYXJjaChlLCBkaC5iaW5kKG51bGwsIHQsIHIpKTtcbiAgcmV0dXJuIG8gJiYgKG8gIT09IHMgfHwgIWkpID8gbyA6IGk7XG59XG5mdW5jdGlvbiBFYihzLCBlLCB0KSB7XG4gIGlmIChlICYmIGUuc3RhcnQgPT09IDAgJiYgZS5sZXZlbCA8IHMubGV2ZWwgJiYgKGUuZW5kUFRTIHx8IDApID4gMCkge1xuICAgIGNvbnN0IHIgPSBlLnRhZ0xpc3QucmVkdWNlKChuLCBpKSA9PiAoaVswXSA9PT0gXCJJTkZcIiAmJiAobiArPSBwYXJzZUZsb2F0KGlbMV0pKSwgbiksIHQpO1xuICAgIHJldHVybiBzLnN0YXJ0IDw9IHI7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gZGgocyA9IDAsIGUgPSAwLCB0KSB7XG4gIGlmICh0LnN0YXJ0IDw9IHMgJiYgdC5zdGFydCArIHQuZHVyYXRpb24gPiBzKVxuICAgIHJldHVybiAwO1xuICBjb25zdCByID0gTWF0aC5taW4oZSwgdC5kdXJhdGlvbiArICh0LmRlbHRhUFRTID8gdC5kZWx0YVBUUyA6IDApKTtcbiAgcmV0dXJuIHQuc3RhcnQgKyB0LmR1cmF0aW9uIC0gciA8PSBzID8gMSA6IHQuc3RhcnQgLSByID4gcyAmJiB0LnN0YXJ0ID8gLTEgOiAwO1xufVxuZnVuY3Rpb24geGIocywgZSwgdCkge1xuICBjb25zdCByID0gTWF0aC5taW4oZSwgdC5kdXJhdGlvbiArICh0LmRlbHRhUFRTID8gdC5kZWx0YVBUUyA6IDApKSAqIDFlMztcbiAgcmV0dXJuICh0LmVuZFByb2dyYW1EYXRlVGltZSB8fCAwKSAtIHIgPiBzO1xufVxuZnVuY3Rpb24gVmcocywgZSwgdCkge1xuICBpZiAocyAmJiBzLnN0YXJ0Q0MgPD0gZSAmJiBzLmVuZENDID49IGUpIHtcbiAgICBsZXQgciA9IHMuZnJhZ21lbnRzO1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWdtZW50SGludDogblxuICAgIH0gPSBzO1xuICAgIG4gJiYgKHIgPSByLmNvbmNhdChuKSk7XG4gICAgbGV0IGk7XG4gICAgcmV0dXJuIEdnLnNlYXJjaChyLCAobykgPT4gby5jYyA8IGUgPyAxIDogby5jYyA+IGUgPyAtMSA6IChpID0gbywgby5lbmQgPD0gdCA/IDEgOiBvLnN0YXJ0ID4gdCA/IC0xIDogMCkpLCBpIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBlYShzKSB7XG4gIHN3aXRjaCAocy5kZXRhaWxzKSB7XG4gICAgY2FzZSBKLkZSQUdfTE9BRF9USU1FT1VUOlxuICAgIGNhc2UgSi5LRVlfTE9BRF9USU1FT1VUOlxuICAgIGNhc2UgSi5MRVZFTF9MT0FEX1RJTUVPVVQ6XG4gICAgY2FzZSBKLk1BTklGRVNUX0xPQURfVElNRU9VVDpcbiAgICAgIHJldHVybiAhMDtcbiAgfVxuICByZXR1cm4gITE7XG59XG5mdW5jdGlvbiBqZyhzKSB7XG4gIHJldHVybiBzLmRldGFpbHMuc3RhcnRzV2l0aChcImtleVwiKTtcbn1cbmZ1bmN0aW9uIEtnKHMpIHtcbiAgcmV0dXJuIGpnKHMpICYmICEhcy5mcmFnICYmICFzLmZyYWcuZGVjcnlwdGRhdGE7XG59XG5mdW5jdGlvbiBoaChzLCBlKSB7XG4gIGNvbnN0IHQgPSBlYShlKTtcbiAgcmV0dXJuIHMuZGVmYXVsdFtgJHt0ID8gXCJ0aW1lb3V0XCIgOiBcImVycm9yXCJ9UmV0cnlgXTtcbn1cbmZ1bmN0aW9uIHl1KHMsIGUpIHtcbiAgY29uc3QgdCA9IHMuYmFja29mZiA9PT0gXCJsaW5lYXJcIiA/IDEgOiBNYXRoLnBvdygyLCBlKTtcbiAgcmV0dXJuIE1hdGgubWluKHQgKiBzLnJldHJ5RGVsYXlNcywgcy5tYXhSZXRyeURlbGF5TXMpO1xufVxuZnVuY3Rpb24gZmgocykge1xuICByZXR1cm4gdHQodHQoe30sIHMpLCB7XG4gICAgZXJyb3JSZXRyeTogbnVsbCxcbiAgICB0aW1lb3V0UmV0cnk6IG51bGxcbiAgfSk7XG59XG5mdW5jdGlvbiB0YShzLCBlLCB0LCByKSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gITE7XG4gIGNvbnN0IG4gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmNvZGUsIGkgPSBlIDwgcy5tYXhOdW1SZXRyeSAmJiAoU2IobikgfHwgISF0KTtcbiAgcmV0dXJuIHMuc2hvdWxkUmV0cnkgPyBzLnNob3VsZFJldHJ5KHMsIGUsIHQsIHIsIGkpIDogaTtcbn1cbmZ1bmN0aW9uIFNiKHMpIHtcbiAgcmV0dXJuIHVjKHMpIHx8ICEhcyAmJiAocyA8IDQwMCB8fCBzID4gNDk5KTtcbn1cbmZ1bmN0aW9uIHVjKHMpIHtcbiAgcmV0dXJuIHMgPT09IDAgJiYgbmF2aWdhdG9yLm9uTGluZSA9PT0gITE7XG59XG52YXIgWnQgPSB7XG4gIERvTm90aGluZzogMCxcbiAgU2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveDogMixcbiAgUmVtb3ZlQWx0ZXJuYXRlUGVybWFuZW50bHk6IDMsXG4gIFJldHJ5UmVxdWVzdDogNVxufSwgdnIgPSB7XG4gIE5vbmU6IDAsXG4gIE1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0OiAxLFxuICBNb3ZlQWxsQWx0ZXJuYXRlc01hdGNoaW5nSERDUDogMixcbiAgTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0tleTogNFxufTtcbmNsYXNzIGJiIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJlcnJvci1jb250cm9sbGVyXCIsIGUubG9nZ2VyKSwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMucGxheWxpc3RFcnJvciA9IDAsIHRoaXMuaGxzID0gZSwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscztcbiAgICBlLm9uKEkuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuaGxzO1xuICAgIGUgJiYgKGUub2ZmKEkuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyksIGUub2ZmKEkuRVJST1IsIHRoaXMub25FcnJvck91dCwgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTEVWRUxfVVBEQVRFRCwgdGhpcy5vbkxldmVsVXBkYXRlZCwgdGhpcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuaGxzID0gbnVsbDtcbiAgfVxuICBzdGFydExvYWQoZSkge1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIHRoaXMucGxheWxpc3RFcnJvciA9IDA7XG4gIH1cbiAgZ2V0VmFyaWFudExldmVsSW5kZXgoZSkge1xuICAgIHJldHVybiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS50eXBlKSA9PT0gcGUuTUFJTiA/IGUubGV2ZWwgOiB0aGlzLmdldFZhcmlhbnRJbmRleCgpO1xuICB9XG4gIGdldFZhcmlhbnRJbmRleCgpIHtcbiAgICB2YXIgZTtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMsIHIgPSB0LmN1cnJlbnRMZXZlbDtcbiAgICByZXR1cm4gKGUgPSB0LmxvYWRMZXZlbE9iaikgIT0gbnVsbCAmJiBlLmRldGFpbHMgfHwgciA9PT0gLTEgPyB0LmxvYWRMZXZlbCA6IHI7XG4gIH1cbiAgdmFyaWFudEhhc0tleShlLCB0KSB7XG4gICAgaWYgKGUpIHtcbiAgICAgIHZhciByO1xuICAgICAgaWYgKChyID0gZS5kZXRhaWxzKSAhPSBudWxsICYmIHIuaGFzS2V5KHQpKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICBjb25zdCBuID0gZS5hdWRpb0dyb3VwcztcbiAgICAgIGlmIChuKVxuICAgICAgICByZXR1cm4gdGhpcy5obHMuYWxsQXVkaW9UcmFja3MuZmlsdGVyKChvKSA9PiBuLmluZGV4T2Yoby5ncm91cElkKSA+PSAwKS5zb21lKChvKSA9PiB7XG4gICAgICAgICAgdmFyIGE7XG4gICAgICAgICAgcmV0dXJuIChhID0gby5kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogYS5oYXNLZXkodCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5wbGF5bGlzdEVycm9yID0gMDtcbiAgfVxuICBvbkxldmVsVXBkYXRlZCgpIHtcbiAgICB0aGlzLnBsYXlsaXN0RXJyb3IgPSAwO1xuICB9XG4gIG9uRXJyb3IoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGlmICh0LmZhdGFsKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0aGlzLmhscywgaSA9IHQuY29udGV4dDtcbiAgICBzd2l0Y2ggKHQuZGV0YWlscykge1xuICAgICAgY2FzZSBKLkZSQUdfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5GUkFHX0xPQURfVElNRU9VVDpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9USU1FT1VUOlxuICAgICAgICB0LmVycm9yQWN0aW9uID0gdGhpcy5nZXRGcmFnUmV0cnlPclN3aXRjaEFjdGlvbih0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBKLkZSQUdfUEFSU0lOR19FUlJPUjpcbiAgICAgICAgaWYgKChyID0gdC5mcmFnKSAhPSBudWxsICYmIHIuZ2FwKSB7XG4gICAgICAgICAgdC5lcnJvckFjdGlvbiA9IEFuKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIEouRlJBR19HQVA6XG4gICAgICBjYXNlIEouRlJBR19ERUNSWVBUX0VSUk9SOiB7XG4gICAgICAgIHQuZXJyb3JBY3Rpb24gPSB0aGlzLmdldEZyYWdSZXRyeU9yU3dpdGNoQWN0aW9uKHQpLCB0LmVycm9yQWN0aW9uLmFjdGlvbiA9IFp0LlNlbmRBbHRlcm5hdGVUb1BlbmFsdHlCb3g7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgSi5MRVZFTF9FTVBUWV9FUlJPUjpcbiAgICAgIGNhc2UgSi5MRVZFTF9QQVJTSU5HX0VSUk9SOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG87XG4gICAgICAgICAgY29uc3QgbCA9IHQucGFyZW50ID09PSBwZS5NQUlOID8gdC5sZXZlbCA6IG4ubG9hZExldmVsO1xuICAgICAgICAgIHQuZGV0YWlscyA9PT0gSi5MRVZFTF9FTVBUWV9FUlJPUiAmJiAoKG8gPSB0LmNvbnRleHQpICE9IG51bGwgJiYgKG8gPSBvLmxldmVsRGV0YWlscykgIT0gbnVsbCAmJiBvLmxpdmUpID8gdC5lcnJvckFjdGlvbiA9IHRoaXMuZ2V0UGxheWxpc3RSZXRyeU9yU3dpdGNoQWN0aW9uKHQsIGwpIDogKHQubGV2ZWxSZXRyeSA9ICExLCB0LmVycm9yQWN0aW9uID0gdGhpcy5nZXRMZXZlbFN3aXRjaEFjdGlvbih0LCBsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBKLkxFVkVMX0xPQURfRVJST1I6XG4gICAgICBjYXNlIEouTEVWRUxfTE9BRF9USU1FT1VUOlxuICAgICAgICB0eXBlb2YgKGkgPT0gbnVsbCA/IHZvaWQgMCA6IGkubGV2ZWwpID09IFwibnVtYmVyXCIgJiYgKHQuZXJyb3JBY3Rpb24gPSB0aGlzLmdldFBsYXlsaXN0UmV0cnlPclN3aXRjaEFjdGlvbih0LCBpLmxldmVsKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgSi5BVURJT19UUkFDS19MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLkFVRElPX1RSQUNLX0xPQURfVElNRU9VVDpcbiAgICAgIGNhc2UgSi5TVUJUSVRMRV9MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLlNVQlRJVExFX1RSQUNLX0xPQURfVElNRU9VVDpcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICBjb25zdCBsID0gbi5sb2FkTGV2ZWxPYmo7XG4gICAgICAgICAgaWYgKGwgJiYgKGkudHlwZSA9PT0gS2UuQVVESU9fVFJBQ0sgJiYgbC5oYXNBdWRpb0dyb3VwKGkuZ3JvdXBJZCkgfHwgaS50eXBlID09PSBLZS5TVUJUSVRMRV9UUkFDSyAmJiBsLmhhc1N1YnRpdGxlR3JvdXAoaS5ncm91cElkKSkpIHtcbiAgICAgICAgICAgIHQuZXJyb3JBY3Rpb24gPSB0aGlzLmdldFBsYXlsaXN0UmV0cnlPclN3aXRjaEFjdGlvbih0LCBuLmxvYWRMZXZlbCksIHQuZXJyb3JBY3Rpb24uYWN0aW9uID0gWnQuU2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveCwgdC5lcnJvckFjdGlvbi5mbGFncyA9IHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9TVEFUVVNfT1VUUFVUX1JFU1RSSUNURUQ6XG4gICAgICAgIHQuZXJyb3JBY3Rpb24gPSB7XG4gICAgICAgICAgYWN0aW9uOiBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94LFxuICAgICAgICAgIGZsYWdzOiB2ci5Nb3ZlQWxsQWx0ZXJuYXRlc01hdGNoaW5nSERDUFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9TRVNTSU9OX1VQREFURV9GQUlMRUQ6XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9TVEFUVVNfSU5URVJOQUxfRVJST1I6XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9OT19TRVNTSU9OOlxuICAgICAgICB0LmVycm9yQWN0aW9uID0ge1xuICAgICAgICAgIGFjdGlvbjogWnQuU2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveCxcbiAgICAgICAgICBmbGFnczogdnIuTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0tleVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEouQlVGRkVSX0FERF9DT0RFQ19FUlJPUjpcbiAgICAgIGNhc2UgSi5SRU1VWF9BTExPQ19FUlJPUjpcbiAgICAgIGNhc2UgSi5CVUZGRVJfQVBQRU5EX0VSUk9SOlxuICAgICAgICBpZiAoIXQuZXJyb3JBY3Rpb24pIHtcbiAgICAgICAgICB2YXIgYTtcbiAgICAgICAgICB0LmVycm9yQWN0aW9uID0gdGhpcy5nZXRMZXZlbFN3aXRjaEFjdGlvbih0LCAoYSA9IHQubGV2ZWwpICE9IG51bGwgPyBhIDogbi5sb2FkTGV2ZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgSi5JTlRFUk5BTF9FWENFUFRJT046XG4gICAgICBjYXNlIEouQlVGRkVSX0FQUEVORElOR19FUlJPUjpcbiAgICAgIGNhc2UgSi5CVUZGRVJfRlVMTF9FUlJPUjpcbiAgICAgIGNhc2UgSi5MRVZFTF9TV0lUQ0hfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX1NUQUxMRURfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX1NFRUtfT1ZFUl9IT0xFOlxuICAgICAgY2FzZSBKLkJVRkZFUl9OVURHRV9PTl9TVEFMTDpcbiAgICAgICAgdC5lcnJvckFjdGlvbiA9IEFuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdC50eXBlID09PSB2ZS5LRVlfU1lTVEVNX0VSUk9SICYmICh0LmxldmVsUmV0cnkgPSAhMSwgdC5lcnJvckFjdGlvbiA9IEFuKCkpO1xuICB9XG4gIGdldFBsYXlsaXN0UmV0cnlPclN3aXRjaEFjdGlvbihlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLCBuID0gaGgoci5jb25maWcucGxheWxpc3RMb2FkUG9saWN5LCBlKSwgaSA9IHRoaXMucGxheWxpc3RFcnJvcisrO1xuICAgIGlmICh0YShuLCBpLCBlYShlKSwgZS5yZXNwb25zZSkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IFp0LlJldHJ5UmVxdWVzdCxcbiAgICAgICAgZmxhZ3M6IHZyLk5vbmUsXG4gICAgICAgIHJldHJ5Q29uZmlnOiBuLFxuICAgICAgICByZXRyeUNvdW50OiBpXG4gICAgICB9O1xuICAgIGNvbnN0IGEgPSB0aGlzLmdldExldmVsU3dpdGNoQWN0aW9uKGUsIHQpO1xuICAgIHJldHVybiBuICYmIChhLnJldHJ5Q29uZmlnID0gbiwgYS5yZXRyeUNvdW50ID0gaSksIGE7XG4gIH1cbiAgZ2V0RnJhZ1JldHJ5T3JTd2l0Y2hBY3Rpb24oZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmhscywgciA9IHRoaXMuZ2V0VmFyaWFudExldmVsSW5kZXgoZS5mcmFnKSwgbiA9IHQubGV2ZWxzW3JdLCB7XG4gICAgICBmcmFnTG9hZFBvbGljeTogaSxcbiAgICAgIGtleUxvYWRQb2xpY3k6IG9cbiAgICB9ID0gdC5jb25maWcsIGEgPSBoaChqZyhlKSA/IG8gOiBpLCBlKSwgbCA9IHQubGV2ZWxzLnJlZHVjZSgodSwgZCkgPT4gdSArIGQuZnJhZ21lbnRFcnJvciwgMCk7XG4gICAgaWYgKG4gJiYgKGUuZGV0YWlscyAhPT0gSi5GUkFHX0dBUCAmJiBuLmZyYWdtZW50RXJyb3IrKywgIUtnKGUpICYmIHRhKGEsIGwsIGVhKGUpLCBlLnJlc3BvbnNlKSkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IFp0LlJldHJ5UmVxdWVzdCxcbiAgICAgICAgZmxhZ3M6IHZyLk5vbmUsXG4gICAgICAgIHJldHJ5Q29uZmlnOiBhLFxuICAgICAgICByZXRyeUNvdW50OiBsXG4gICAgICB9O1xuICAgIGNvbnN0IGMgPSB0aGlzLmdldExldmVsU3dpdGNoQWN0aW9uKGUsIHIpO1xuICAgIHJldHVybiBhICYmIChjLnJldHJ5Q29uZmlnID0gYSwgYy5yZXRyeUNvdW50ID0gbCksIGM7XG4gIH1cbiAgZ2V0TGV2ZWxTd2l0Y2hBY3Rpb24oZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscztcbiAgICB0ID09IG51bGwgJiYgKHQgPSByLmxvYWRMZXZlbCk7XG4gICAgY29uc3QgbiA9IHRoaXMuaGxzLmxldmVsc1t0XTtcbiAgICBpZiAobikge1xuICAgICAgdmFyIGksIG87XG4gICAgICBjb25zdCBjID0gZS5kZXRhaWxzO1xuICAgICAgbi5sb2FkRXJyb3IrKywgYyA9PT0gSi5CVUZGRVJfQVBQRU5EX0VSUk9SICYmIG4uZnJhZ21lbnRFcnJvcisrO1xuICAgICAgbGV0IHUgPSAtMTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGV2ZWxzOiBkLFxuICAgICAgICBsb2FkTGV2ZWw6IGgsXG4gICAgICAgIG1pbkF1dG9MZXZlbDogZixcbiAgICAgICAgbWF4QXV0b0xldmVsOiBwXG4gICAgICB9ID0gcjtcbiAgICAgICFyLmF1dG9MZXZlbEVuYWJsZWQgJiYgIXIuY29uZmlnLnByZXNlcnZlTWFudWFsTGV2ZWxPbkVycm9yICYmIChyLmxvYWRMZXZlbCA9IC0xKTtcbiAgICAgIGNvbnN0IHkgPSAoaSA9IGUuZnJhZykgPT0gbnVsbCA/IHZvaWQgMCA6IGkudHlwZSwgYiA9ICh5ID09PSBwZS5BVURJTyAmJiBjID09PSBKLkZSQUdfUEFSU0lOR19FUlJPUiB8fCBlLnNvdXJjZUJ1ZmZlck5hbWUgPT09IFwiYXVkaW9cIiAmJiAoYyA9PT0gSi5CVUZGRVJfQUREX0NPREVDX0VSUk9SIHx8IGMgPT09IEouQlVGRkVSX0FQUEVORF9FUlJPUikpICYmIGQuc29tZSgoe1xuICAgICAgICBhdWRpb0NvZGVjOiBIXG4gICAgICB9KSA9PiBuLmF1ZGlvQ29kZWMgIT09IEgpLCBBID0gZS5zb3VyY2VCdWZmZXJOYW1lID09PSBcInZpZGVvXCIgJiYgKGMgPT09IEouQlVGRkVSX0FERF9DT0RFQ19FUlJPUiB8fCBjID09PSBKLkJVRkZFUl9BUFBFTkRfRVJST1IpICYmIGQuc29tZSgoe1xuICAgICAgICBjb2RlY1NldDogSCxcbiAgICAgICAgYXVkaW9Db2RlYzogS1xuICAgICAgfSkgPT4gbi5jb2RlY1NldCAhPT0gSCAmJiBuLmF1ZGlvQ29kZWMgPT09IEspLCB7XG4gICAgICAgIHR5cGU6IEYsXG4gICAgICAgIGdyb3VwSWQ6IE1cbiAgICAgIH0gPSAobyA9IGUuY29udGV4dCkgIT0gbnVsbCA/IG8gOiB7fTtcbiAgICAgIGZvciAobGV0IEggPSBkLmxlbmd0aDsgSC0tOyApIHtcbiAgICAgICAgY29uc3QgSyA9IChIICsgaCkgJSBkLmxlbmd0aDtcbiAgICAgICAgaWYgKEsgIT09IGggJiYgSyA+PSBmICYmIEsgPD0gcCAmJiBkW0tdLmxvYWRFcnJvciA9PT0gMCkge1xuICAgICAgICAgIHZhciBhLCBsO1xuICAgICAgICAgIGNvbnN0IGogPSBkW0tdO1xuICAgICAgICAgIGlmIChjID09PSBKLkZSQUdfR0FQICYmIHkgPT09IHBlLk1BSU4gJiYgZS5mcmFnKSB7XG4gICAgICAgICAgICBjb25zdCBDID0gZFtLXS5kZXRhaWxzO1xuICAgICAgICAgICAgaWYgKEMpIHtcbiAgICAgICAgICAgICAgY29uc3QgayA9IEpzKGUuZnJhZywgQy5mcmFnbWVudHMsIGUuZnJhZy5zdGFydCk7XG4gICAgICAgICAgICAgIGlmIChrICE9IG51bGwgJiYgay5nYXApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChGID09PSBLZS5BVURJT19UUkFDSyAmJiBqLmhhc0F1ZGlvR3JvdXAoTSkgfHwgRiA9PT0gS2UuU1VCVElUTEVfVFJBQ0sgJiYgai5oYXNTdWJ0aXRsZUdyb3VwKE0pKVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh5ID09PSBwZS5BVURJTyAmJiAoYSA9IG4uYXVkaW9Hcm91cHMpICE9IG51bGwgJiYgYS5zb21lKChDKSA9PiBqLmhhc0F1ZGlvR3JvdXAoQykpIHx8IHkgPT09IHBlLlNVQlRJVExFICYmIChsID0gbi5zdWJ0aXRsZUdyb3VwcykgIT0gbnVsbCAmJiBsLnNvbWUoKEMpID0+IGouaGFzU3VidGl0bGVHcm91cChDKSkgfHwgYiAmJiBuLmF1ZGlvQ29kZWMgPT09IGouYXVkaW9Db2RlYyB8fCBBICYmIG4uY29kZWNTZXQgPT09IGouY29kZWNTZXQgfHwgIWIgJiYgbi5jb2RlY1NldCAhPT0gai5jb2RlY1NldClcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHUgPSBLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodSA+IC0xICYmIHIubG9hZExldmVsICE9PSB1KVxuICAgICAgICByZXR1cm4gZS5sZXZlbFJldHJ5ID0gITAsIHRoaXMucGxheWxpc3RFcnJvciA9IDAsIHtcbiAgICAgICAgICBhY3Rpb246IFp0LlNlbmRBbHRlcm5hdGVUb1BlbmFsdHlCb3gsXG4gICAgICAgICAgZmxhZ3M6IHZyLk5vbmUsXG4gICAgICAgICAgbmV4dEF1dG9MZXZlbDogdVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94LFxuICAgICAgZmxhZ3M6IHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0XG4gICAgfTtcbiAgfVxuICBvbkVycm9yT3V0KGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBzd2l0Y2ggKChyID0gdC5lcnJvckFjdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IHIuYWN0aW9uKSB7XG4gICAgICBjYXNlIFp0LkRvTm90aGluZzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFp0LlNlbmRBbHRlcm5hdGVUb1BlbmFsdHlCb3g6XG4gICAgICAgIHRoaXMuc2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveCh0KSwgIXQuZXJyb3JBY3Rpb24ucmVzb2x2ZWQgJiYgdC5kZXRhaWxzICE9PSBKLkZSQUdfR0FQID8gdC5mYXRhbCA9ICEwIDogL01lZGlhU291cmNlIHJlYWR5U3RhdGU6IGVuZGVkLy50ZXN0KHQuZXJyb3IubWVzc2FnZSkgJiYgKHRoaXMud2FybihgTWVkaWFTb3VyY2UgZW5kZWQgYWZ0ZXIgXCIke3Quc291cmNlQnVmZmVyTmFtZX1cIiBzb3VyY2VCdWZmZXIgYXBwZW5kIGVycm9yLiBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBtZWRpYSBlcnJvci5gKSwgdGhpcy5obHMucmVjb3Zlck1lZGlhRXJyb3IoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodC5mYXRhbCkge1xuICAgICAgdGhpcy5obHMuc3RvcExvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgc2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaGxzLCByID0gZS5lcnJvckFjdGlvbjtcbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgZmxhZ3M6IG5cbiAgICB9ID0gciwgaSA9IHIubmV4dEF1dG9MZXZlbDtcbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgdnIuTm9uZTpcbiAgICAgICAgdGhpcy5zd2l0Y2hMZXZlbChlLCBpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIRENQOiB7XG4gICAgICAgIGNvbnN0IGwgPSB0aGlzLmdldFZhcmlhbnRMZXZlbEluZGV4KGUuZnJhZyksIGMgPSB0LmxldmVsc1tsXSwgdSA9IGMgPT0gbnVsbCA/IHZvaWQgMCA6IGMuYXR0cnNbXCJIRENQLUxFVkVMXCJdO1xuICAgICAgICBpZiAoci5oZGNwTGV2ZWwgPSB1LCB1ID09PSBcIk5PTkVcIilcbiAgICAgICAgICB0aGlzLndhcm4oXCJIRENQIHBvbGljeSByZXN0aWN0ZWQgb3V0cHV0IHdpdGggSERDUC1MRVZFTD1OT05FXCIpO1xuICAgICAgICBlbHNlIGlmICh1KSB7XG4gICAgICAgICAgdC5tYXhIZGNwTGV2ZWwgPSBjY1tjYy5pbmRleE9mKHUpIC0gMV0sIHIucmVzb2x2ZWQgPSAhMCwgdGhpcy53YXJuKGBSZXN0cmljdGluZyBwbGF5YmFjayB0byBIRENQLUxFVkVMIG9mIFwiJHt0Lm1heEhkY3BMZXZlbH1cIiBvciBsb3dlcmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgdnIuTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0tleToge1xuICAgICAgICBjb25zdCBsID0gZS5kZWNyeXB0ZGF0YTtcbiAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICBjb25zdCBjID0gdGhpcy5obHMubGV2ZWxzLCB1ID0gYy5sZW5ndGg7XG4gICAgICAgICAgZm9yIChsZXQgaCA9IHU7IGgtLTsgKVxuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWFudEhhc0tleShjW2hdLCBsKSkge1xuICAgICAgICAgICAgICB2YXIgbywgYTtcbiAgICAgICAgICAgICAgdGhpcy5sb2coYEJhbm5lZCBrZXkgZm91bmQgaW4gbGV2ZWwgJHtofSAoJHtjW2hdLmJpdHJhdGV9YnBzKSBvciBhdWRpbyBncm91cCBcIiR7KG8gPSBjW2hdLmF1ZGlvR3JvdXBzKSA9PSBudWxsID8gdm9pZCAwIDogby5qb2luKFwiLFwiKX1cIiAoJHsoYSA9IGUuZnJhZykgPT0gbnVsbCA/IHZvaWQgMCA6IGEudHlwZX0gZnJhZ21lbnQpICR7ZnIobC5rZXlJZCB8fCBbXSl9YCksIGNbaF0uZnJhZ21lbnRFcnJvcisrLCBjW2hdLmxvYWRFcnJvcisrLCB0aGlzLmxvZyhgUmVtb3ZpbmcgbGV2ZWwgJHtofSB3aXRoIGtleSBlcnJvciAoJHtlLmVycm9yfSlgKSwgdGhpcy5obHMucmVtb3ZlTGV2ZWwoaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZCA9IGUuZnJhZztcbiAgICAgICAgICBpZiAodGhpcy5obHMubGV2ZWxzLmxlbmd0aCA8IHUpXG4gICAgICAgICAgICByLnJlc29sdmVkID0gITA7XG4gICAgICAgICAgZWxzZSBpZiAoZCAmJiBkLnR5cGUgIT09IHBlLk1BSU4pIHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBkLmRlY3J5cHRkYXRhO1xuICAgICAgICAgICAgaCAmJiAhbC5tYXRjaGVzKGgpICYmIChyLnJlc29sdmVkID0gITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgci5yZXNvbHZlZCB8fCB0aGlzLnN3aXRjaExldmVsKGUsIGkpO1xuICB9XG4gIHN3aXRjaExldmVsKGUsIHQpIHtcbiAgICBpZiAodCAhPT0gdm9pZCAwICYmIGUuZXJyb3JBY3Rpb24gJiYgKHRoaXMud2Fybihgc3dpdGNoaW5nIHRvIGxldmVsICR7dH0gYWZ0ZXIgJHtlLmRldGFpbHN9YCksIHRoaXMuaGxzLm5leHRBdXRvTGV2ZWwgPSB0LCBlLmVycm9yQWN0aW9uLnJlc29sdmVkID0gITAsIHRoaXMuaGxzLm5leHRMb2FkTGV2ZWwgPSB0aGlzLmhscy5uZXh0QXV0b0xldmVsLCBlLmRldGFpbHMgPT09IEouQlVGRkVSX0FERF9DT0RFQ19FUlJPUiAmJiBlLm1pbWVUeXBlICYmIGUuc291cmNlQnVmZmVyTmFtZSAhPT0gXCJhdWRpb3ZpZGVvXCIpKSB7XG4gICAgICBjb25zdCByID0gbGMoZS5taW1lVHlwZSksIG4gPSB0aGlzLmhscy5sZXZlbHM7XG4gICAgICBmb3IgKGxldCBpID0gbi5sZW5ndGg7IGktLTsgKVxuICAgICAgICBuW2ldW2Ake2Uuc291cmNlQnVmZmVyTmFtZX1Db2RlY2BdID09PSByICYmICh0aGlzLmxvZyhgUmVtb3ZpbmcgbGV2ZWwgJHtpfSBmb3IgJHtlLmRldGFpbHN9IChcIiR7cn1cIiBub3Qgc3VwcG9ydGVkKWApLCB0aGlzLmhscy5yZW1vdmVMZXZlbChpKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBBbihzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgYWN0aW9uOiBadC5Eb05vdGhpbmcsXG4gICAgZmxhZ3M6IHZyLk5vbmVcbiAgfTtcbiAgcmV0dXJuIHMgJiYgKGUucmVzb2x2ZWQgPSAhMCksIGU7XG59XG52YXIgSHQgPSB7XG4gIE5PVF9MT0FERUQ6IFwiTk9UX0xPQURFRFwiLFxuICBBUFBFTkRJTkc6IFwiQVBQRU5ESU5HXCIsXG4gIFBBUlRJQUw6IFwiUEFSVElBTFwiLFxuICBPSzogXCJPS1wiXG59O1xuY2xhc3MgVGIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5hY3RpdmVQYXJ0TGlzdHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5lbmRMaXN0RnJhZ21lbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZnJhZ21lbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMudGltZVJhbmdlcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmJ1ZmZlclBhZGRpbmcgPSAwLjIsIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmhhc0dhcHMgPSAhMSwgdGhpcy5obHMgPSBlLCB0aGlzLl9yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIF9yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9uKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub24oSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKSwgZS5vbihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcykpO1xuICB9XG4gIF91bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUgJiYgKGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0FQUEVOREVELCB0aGlzLm9uQnVmZmVyQXBwZW5kZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfQlVGRkVSRUQsIHRoaXMub25GcmFnQnVmZmVyZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLmhscyA9IC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmZyYWdtZW50cyA9IC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmFjdGl2ZVBhcnRMaXN0cyA9IC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmVuZExpc3RGcmFnbWVudHMgPSB0aGlzLnRpbWVSYW5nZXMgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBGcmFnbWVudCBvciBQYXJ0IHdpdGggYW4gYXBwZW5kZWQgcmFuZ2UgdGhhdCBtYXRjaGVzIHRoZSBwb3NpdGlvbiBhbmQgbGV2ZWxUeXBlXG4gICAqIE90aGVyd2lzZSwgcmV0dXJuIG51bGxcbiAgICovXG4gIGdldEFwcGVuZGVkRnJhZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuYWN0aXZlUGFydExpc3RzW3RdO1xuICAgIGlmIChyKVxuICAgICAgZm9yIChsZXQgbiA9IHIubGVuZ3RoOyBuLS07ICkge1xuICAgICAgICBjb25zdCBpID0gcltuXTtcbiAgICAgICAgaWYgKCFpKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoaS5zdGFydCA8PSBlICYmIGUgPD0gaS5lbmQgJiYgaS5sb2FkZWQpXG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyZWRGcmFnKGUsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBidWZmZXJlZCBGcmFnbWVudCB0aGF0IG1hdGNoZXMgdGhlIHBvc2l0aW9uIGFuZCBsZXZlbFR5cGUuXG4gICAqIEEgYnVmZmVyZWQgRnJhZ21lbnQgaXMgb25lIHdob3NlIGxvYWRpbmcsIHBhcnNpbmcgYW5kIGFwcGVuZGluZyBpcyBkb25lIChjb21wbGV0ZWQgb3IgXCJwYXJ0aWFsXCIgbWVhbmluZyBhYm9ydGVkKS5cbiAgICogSWYgbm90IGZvdW5kIGFueSBGcmFnbWVudCwgcmV0dXJuIG51bGxcbiAgICovXG4gIGdldEJ1ZmZlcmVkRnJhZyhlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RnJhZ0F0UG9zKGUsIHQsICEwKTtcbiAgfVxuICBnZXRGcmFnQXRQb3MoZSwgdCwgcikge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWdtZW50czogblxuICAgIH0gPSB0aGlzLCBpID0gT2JqZWN0LmtleXMobik7XG4gICAgZm9yIChsZXQgbyA9IGkubGVuZ3RoOyBvLS07ICkge1xuICAgICAgY29uc3QgYSA9IG5baVtvXV07XG4gICAgICBpZiAoKGEgPT0gbnVsbCA/IHZvaWQgMCA6IGEuYm9keS50eXBlKSA9PT0gdCAmJiAoIXIgfHwgYS5idWZmZXJlZCkpIHtcbiAgICAgICAgY29uc3QgbCA9IGEuYm9keTtcbiAgICAgICAgaWYgKGwuc3RhcnQgPD0gZSAmJiBlIDw9IGwuZW5kKVxuICAgICAgICAgIHJldHVybiBsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUGFydGlhbCBmcmFnbWVudHMgZWZmZWN0ZWQgYnkgY29kZWQgZnJhbWUgZXZpY3Rpb24gd2lsbCBiZSByZW1vdmVkXG4gICAqIFRoZSBicm93c2VyIHdpbGwgdW5sb2FkIHBhcnRzIG9mIHRoZSBidWZmZXIgdG8gZnJlZSB1cCBtZW1vcnkgZm9yIG5ldyBidWZmZXIgZGF0YVxuICAgKiBGcmFnbWVudHMgd2lsbCBuZWVkIHRvIGJlIHJlbG9hZGVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBmcmVlZCB1cCwgcmVtb3ZpbmcgcGFydGlhbCBmcmFnbWVudHMgd2lsbCBhbGxvdyB0aGVtIHRvIHJlbG9hZChzaW5jZSB0aGVyZSBtaWdodCBiZSBwYXJ0cyB0aGF0IGFyZSBzdGlsbCBwbGF5YWJsZSlcbiAgICovXG4gIGRldGVjdEV2aWN0ZWRGcmFnbWVudHMoZSwgdCwgciwgbiwgaSkge1xuICAgIHRoaXMudGltZVJhbmdlcyAmJiAodGhpcy50aW1lUmFuZ2VzW2VdID0gdCk7XG4gICAgY29uc3QgbyA9IChuID09IG51bGwgPyB2b2lkIDAgOiBuLmZyYWdtZW50LnNuKSB8fCAtMTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZyYWdtZW50cykuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgY29uc3QgbCA9IHRoaXMuZnJhZ21lbnRzW2FdO1xuICAgICAgaWYgKCFsIHx8IG8gPj0gbC5ib2R5LnNuKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIWwuYnVmZmVyZWQgJiYgKCFsLmxvYWRlZCB8fCBpKSkge1xuICAgICAgICBsLmJvZHkudHlwZSA9PT0gciAmJiB0aGlzLnJlbW92ZUZyYWdtZW50KGwuYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGMgPSBsLnJhbmdlW2VdO1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgaWYgKGMudGltZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyYWdtZW50KGwuYm9keSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGMudGltZS5zb21lKCh1KSA9PiB7XG4gICAgICAgICAgY29uc3QgZCA9ICF0aGlzLmlzVGltZUJ1ZmZlcmVkKHUuc3RhcnRQVFMsIHUuZW5kUFRTLCB0KTtcbiAgICAgICAgICByZXR1cm4gZCAmJiB0aGlzLnJlbW92ZUZyYWdtZW50KGwuYm9keSksIGQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGZyYWdtZW50IHBhc3NlZCBpbiBpcyBsb2FkZWQgaW4gdGhlIGJ1ZmZlciBwcm9wZXJseVxuICAgKiBQYXJ0aWFsbHkgbG9hZGVkIGZyYWdtZW50cyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgYSBwYXJ0aWFsIGZyYWdtZW50XG4gICAqL1xuICBkZXRlY3RQYXJ0aWFsRnJhZ21lbnRzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy50aW1lUmFuZ2VzO1xuICAgIGlmICghdCB8fCBlLmZyYWcuc24gPT09IFwiaW5pdFNlZ21lbnRcIilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gZS5mcmFnLCBuID0gZm4ociksIGkgPSB0aGlzLmZyYWdtZW50c1tuXTtcbiAgICBpZiAoIWkgfHwgaS5idWZmZXJlZCAmJiByLmdhcClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvID0gIXIucmVsdXJsO1xuICAgIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGEpID0+IHtcbiAgICAgIGNvbnN0IGwgPSByLmVsZW1lbnRhcnlTdHJlYW1zW2FdO1xuICAgICAgaWYgKCFsKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjID0gdFthXSwgdSA9IG8gfHwgbC5wYXJ0aWFsID09PSAhMDtcbiAgICAgIGkucmFuZ2VbYV0gPSB0aGlzLmdldEJ1ZmZlcmVkVGltZXMociwgZS5wYXJ0LCB1LCBjKTtcbiAgICB9KSwgaS5sb2FkZWQgPSBudWxsLCBPYmplY3Qua2V5cyhpLnJhbmdlKS5sZW5ndGggPyAoaS5idWZmZXJlZCA9ICEwLCAoaS5ib2R5LmVuZExpc3QgPSByLmVuZExpc3QgfHwgaS5ib2R5LmVuZExpc3QpICYmICh0aGlzLmVuZExpc3RGcmFnbWVudHNbaS5ib2R5LnR5cGVdID0gaSksIEhpKGkpIHx8IHRoaXMucmVtb3ZlUGFydHMoci5zbiAtIDEsIHIudHlwZSkpIDogdGhpcy5yZW1vdmVGcmFnbWVudChpLmJvZHkpO1xuICB9XG4gIHJlbW92ZVBhcnRzKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5hY3RpdmVQYXJ0TGlzdHNbdF07XG4gICAgciAmJiAodGhpcy5hY3RpdmVQYXJ0TGlzdHNbdF0gPSBnaChyLCAobikgPT4gbi5mcmFnbWVudC5zbiA+PSBlKSk7XG4gIH1cbiAgZnJhZ0J1ZmZlcmVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gZm4oZSk7XG4gICAgbGV0IG4gPSB0aGlzLmZyYWdtZW50c1tyXTtcbiAgICAhbiAmJiB0ICYmIChuID0gdGhpcy5mcmFnbWVudHNbcl0gPSB7XG4gICAgICBib2R5OiBlLFxuICAgICAgYXBwZW5kZWRQVFM6IG51bGwsXG4gICAgICBsb2FkZWQ6IG51bGwsXG4gICAgICBidWZmZXJlZDogITEsXG4gICAgICByYW5nZTogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9LCBlLmdhcCAmJiAodGhpcy5oYXNHYXBzID0gITApKSwgbiAmJiAobi5sb2FkZWQgPSBudWxsLCBuLmJ1ZmZlcmVkID0gITApO1xuICB9XG4gIGdldEJ1ZmZlcmVkVGltZXMoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSB7XG4gICAgICB0aW1lOiBbXSxcbiAgICAgIHBhcnRpYWw6IHJcbiAgICB9LCBvID0gZS5zdGFydCwgYSA9IGUuZW5kLCBsID0gZS5taW5FbmRQVFMgfHwgYSwgYyA9IGUubWF4U3RhcnRQVFMgfHwgbztcbiAgICBmb3IgKGxldCB1ID0gMDsgdSA8IG4ubGVuZ3RoOyB1KyspIHtcbiAgICAgIGNvbnN0IGQgPSBuLnN0YXJ0KHUpIC0gdGhpcy5idWZmZXJQYWRkaW5nLCBoID0gbi5lbmQodSkgKyB0aGlzLmJ1ZmZlclBhZGRpbmc7XG4gICAgICBpZiAoYyA+PSBkICYmIGwgPD0gaCkge1xuICAgICAgICBpLnRpbWUucHVzaCh7XG4gICAgICAgICAgc3RhcnRQVFM6IE1hdGgubWF4KG8sIG4uc3RhcnQodSkpLFxuICAgICAgICAgIGVuZFBUUzogTWF0aC5taW4oYSwgbi5lbmQodSkpXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAobyA8IGggJiYgYSA+IGQpIHtcbiAgICAgICAgY29uc3QgZiA9IE1hdGgubWF4KG8sIG4uc3RhcnQodSkpLCBwID0gTWF0aC5taW4oYSwgbi5lbmQodSkpO1xuICAgICAgICBwID4gZiAmJiAoaS5wYXJ0aWFsID0gITAsIGkudGltZS5wdXNoKHtcbiAgICAgICAgICBzdGFydFBUUzogZixcbiAgICAgICAgICBlbmRQVFM6IHBcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIGlmIChhIDw9IGQpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgcGFydGlhbCBmcmFnbWVudCBmb3IgYSBjZXJ0YWluIHRpbWVcbiAgICovXG4gIGdldFBhcnRpYWxGcmFnbWVudChlKSB7XG4gICAgbGV0IHQgPSBudWxsLCByLCBuLCBpLCBvID0gMDtcbiAgICBjb25zdCB7XG4gICAgICBidWZmZXJQYWRkaW5nOiBhLFxuICAgICAgZnJhZ21lbnRzOiBsXG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGwpLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBsW2NdO1xuICAgICAgdSAmJiBIaSh1KSAmJiAobiA9IHUuYm9keS5zdGFydCAtIGEsIGkgPSB1LmJvZHkuZW5kICsgYSwgZSA+PSBuICYmIGUgPD0gaSAmJiAociA9IE1hdGgubWluKGUgLSBuLCBpIC0gZSksIG8gPD0gciAmJiAodCA9IHUuYm9keSwgbyA9IHIpKSk7XG4gICAgfSksIHQ7XG4gIH1cbiAgaXNFbmRMaXN0QXBwZW5kZWQoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmVuZExpc3RGcmFnbWVudHNbZV07XG4gICAgcmV0dXJuIHQgIT09IHZvaWQgMCAmJiAodC5idWZmZXJlZCB8fCBIaSh0KSk7XG4gIH1cbiAgZ2V0U3RhdGUoZSkge1xuICAgIGNvbnN0IHQgPSBmbihlKSwgciA9IHRoaXMuZnJhZ21lbnRzW3RdO1xuICAgIHJldHVybiByID8gci5idWZmZXJlZCA/IEhpKHIpID8gSHQuUEFSVElBTCA6IEh0Lk9LIDogSHQuQVBQRU5ESU5HIDogSHQuTk9UX0xPQURFRDtcbiAgfVxuICBpc1RpbWVCdWZmZXJlZChlLCB0LCByKSB7XG4gICAgbGV0IG4sIGk7XG4gICAgZm9yIChsZXQgbyA9IDA7IG8gPCByLmxlbmd0aDsgbysrKSB7XG4gICAgICBpZiAobiA9IHIuc3RhcnQobykgLSB0aGlzLmJ1ZmZlclBhZGRpbmcsIGkgPSByLmVuZChvKSArIHRoaXMuYnVmZmVyUGFkZGluZywgZSA+PSBuICYmIHQgPD0gaSlcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgaWYgKHQgPD0gbilcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5yZW1vdmVBbGxGcmFnbWVudHMoKTtcbiAgfVxuICBvbkZyYWdMb2FkZWQoZSwgdCkge1xuICAgIGlmICh0LmZyYWcuc24gPT09IFwiaW5pdFNlZ21lbnRcIiB8fCB0LmZyYWcuYml0cmF0ZVRlc3QpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHQuZnJhZywgbiA9IHQucGFydCA/IG51bGwgOiB0LCBpID0gZm4ocik7XG4gICAgdGhpcy5mcmFnbWVudHNbaV0gPSB7XG4gICAgICBib2R5OiByLFxuICAgICAgYXBwZW5kZWRQVFM6IG51bGwsXG4gICAgICBsb2FkZWQ6IG4sXG4gICAgICBidWZmZXJlZDogITEsXG4gICAgICByYW5nZTogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9O1xuICB9XG4gIG9uQnVmZmVyQXBwZW5kZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHIsXG4gICAgICBwYXJ0OiBuLFxuICAgICAgdGltZVJhbmdlczogaSxcbiAgICAgIHR5cGU6IG9cbiAgICB9ID0gdDtcbiAgICBpZiAoci5zbiA9PT0gXCJpbml0U2VnbWVudFwiKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSByLnR5cGU7XG4gICAgaWYgKG4pIHtcbiAgICAgIGxldCBjID0gdGhpcy5hY3RpdmVQYXJ0TGlzdHNbYV07XG4gICAgICBjIHx8ICh0aGlzLmFjdGl2ZVBhcnRMaXN0c1thXSA9IGMgPSBbXSksIGMucHVzaChuKTtcbiAgICB9XG4gICAgdGhpcy50aW1lUmFuZ2VzID0gaTtcbiAgICBjb25zdCBsID0gaVtvXTtcbiAgICB0aGlzLmRldGVjdEV2aWN0ZWRGcmFnbWVudHMobywgbCwgYSwgbik7XG4gIH1cbiAgb25GcmFnQnVmZmVyZWQoZSwgdCkge1xuICAgIHRoaXMuZGV0ZWN0UGFydGlhbEZyYWdtZW50cyh0KTtcbiAgfVxuICBoYXNGcmFnbWVudChlKSB7XG4gICAgY29uc3QgdCA9IGZuKGUpO1xuICAgIHJldHVybiAhIXRoaXMuZnJhZ21lbnRzW3RdO1xuICB9XG4gIGhhc0ZyYWdtZW50cyhlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZ21lbnRzOiB0XG4gICAgfSA9IHRoaXMsIHIgPSBPYmplY3Qua2V5cyh0KTtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gci5sZW5ndGggPiAwO1xuICAgIGZvciAobGV0IG4gPSByLmxlbmd0aDsgbi0tOyApIHtcbiAgICAgIGNvbnN0IGkgPSB0W3Jbbl1dO1xuICAgICAgaWYgKChpID09IG51bGwgPyB2b2lkIDAgOiBpLmJvZHkudHlwZSkgPT09IGUpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGhhc1BhcnRzKGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gISEoKHQgPSB0aGlzLmFjdGl2ZVBhcnRMaXN0c1tlXSkgIT0gbnVsbCAmJiB0Lmxlbmd0aCk7XG4gIH1cbiAgcmVtb3ZlRnJhZ21lbnRzSW5SYW5nZShlLCB0LCByLCBuLCBpKSB7XG4gICAgbiAmJiAhdGhpcy5oYXNHYXBzIHx8IE9iamVjdC5rZXlzKHRoaXMuZnJhZ21lbnRzKS5mb3JFYWNoKChvKSA9PiB7XG4gICAgICBjb25zdCBhID0gdGhpcy5mcmFnbWVudHNbb107XG4gICAgICBpZiAoIWEpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGwgPSBhLmJvZHk7XG4gICAgICBsLnR5cGUgIT09IHIgfHwgbiAmJiAhbC5nYXAgfHwgbC5zdGFydCA8IHQgJiYgbC5lbmQgPiBlICYmIChhLmJ1ZmZlcmVkIHx8IGkpICYmIHRoaXMucmVtb3ZlRnJhZ21lbnQobCk7XG4gICAgfSk7XG4gIH1cbiAgcmVtb3ZlRnJhZ21lbnQoZSkge1xuICAgIGNvbnN0IHQgPSBmbihlKTtcbiAgICBlLmNsZWFyRWxlbWVudGFyeVN0cmVhbUluZm8oKTtcbiAgICBjb25zdCByID0gdGhpcy5hY3RpdmVQYXJ0TGlzdHNbZS50eXBlXTtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgbiA9IGUuc247XG4gICAgICB0aGlzLmFjdGl2ZVBhcnRMaXN0c1tlLnR5cGVdID0gZ2gociwgKGkpID0+IGkuZnJhZ21lbnQuc24gIT09IG4pO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5mcmFnbWVudHNbdF0sIGUuZW5kTGlzdCAmJiBkZWxldGUgdGhpcy5lbmRMaXN0RnJhZ21lbnRzW2UudHlwZV07XG4gIH1cbiAgcmVtb3ZlQWxsRnJhZ21lbnRzKCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMuZnJhZ21lbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZW5kTGlzdEZyYWdtZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmFjdGl2ZVBhcnRMaXN0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmhhc0dhcHMgPSAhMTtcbiAgICBjb25zdCB0ID0gKGUgPSB0aGlzLmhscykgPT0gbnVsbCB8fCAoZSA9IGUubGF0ZXN0TGV2ZWxEZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogZS5wYXJ0TGlzdDtcbiAgICB0ICYmIHQuZm9yRWFjaCgocikgPT4gci5jbGVhckVsZW1lbnRhcnlTdHJlYW1JbmZvKCkpO1xuICB9XG59XG5mdW5jdGlvbiBIaShzKSB7XG4gIHZhciBlLCB0LCByO1xuICByZXR1cm4gcy5idWZmZXJlZCAmJiAhIShzLmJvZHkuZ2FwIHx8IChlID0gcy5yYW5nZS52aWRlbykgIT0gbnVsbCAmJiBlLnBhcnRpYWwgfHwgKHQgPSBzLnJhbmdlLmF1ZGlvKSAhPSBudWxsICYmIHQucGFydGlhbCB8fCAociA9IHMucmFuZ2UuYXVkaW92aWRlbykgIT0gbnVsbCAmJiByLnBhcnRpYWwpO1xufVxuZnVuY3Rpb24gZm4ocykge1xuICByZXR1cm4gYCR7cy50eXBlfV8ke3MubGV2ZWx9XyR7cy5zbn1gO1xufVxuZnVuY3Rpb24gZ2gocywgZSkge1xuICByZXR1cm4gcy5maWx0ZXIoKHQpID0+IHtcbiAgICBjb25zdCByID0gZSh0KTtcbiAgICByZXR1cm4gciB8fCB0LmNsZWFyRWxlbWVudGFyeVN0cmVhbUluZm8oKSwgcjtcbiAgfSk7XG59XG52YXIgT3MgPSB7XG4gIGNiYzogMCxcbiAgY3RyOiAxXG59O1xuY2xhc3Mgd2Ige1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy5zdWJ0bGUgPSB2b2lkIDAsIHRoaXMuYWVzSVYgPSB2b2lkIDAsIHRoaXMuYWVzTW9kZSA9IHZvaWQgMCwgdGhpcy5zdWJ0bGUgPSBlLCB0aGlzLmFlc0lWID0gdCwgdGhpcy5hZXNNb2RlID0gcjtcbiAgfVxuICBkZWNyeXB0KGUsIHQpIHtcbiAgICBzd2l0Y2ggKHRoaXMuYWVzTW9kZSkge1xuICAgICAgY2FzZSBPcy5jYmM6XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnRsZS5kZWNyeXB0KHtcbiAgICAgICAgICBuYW1lOiBcIkFFUy1DQkNcIixcbiAgICAgICAgICBpdjogdGhpcy5hZXNJVlxuICAgICAgICB9LCB0LCBlKTtcbiAgICAgIGNhc2UgT3MuY3RyOlxuICAgICAgICByZXR1cm4gdGhpcy5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkFFUy1DVFJcIixcbiAgICAgICAgICAgIGNvdW50ZXI6IHRoaXMuYWVzSVYsXG4gICAgICAgICAgICBsZW5ndGg6IDY0XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLzY0IDogTklTVCBTUDgwMC0zOEEgc3RhbmRhcmQgc3VnZ2VzdHMgdGhhdCB0aGUgY291bnRlciBzaG91bGQgb2NjdXB5IGhhbGYgb2YgdGhlIGNvdW50ZXIgYmxvY2tcbiAgICAgICAgICB0LFxuICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW0FFU0NyeXB0b10gaW52YWxpZCBhZXMgbW9kZSAke3RoaXMuYWVzTW9kZX1gKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIEFiKHMpIHtcbiAgY29uc3QgZSA9IHMuYnl0ZUxlbmd0aCwgdCA9IGUgJiYgbmV3IERhdGFWaWV3KHMuYnVmZmVyKS5nZXRVaW50OChlIC0gMSk7XG4gIHJldHVybiB0ID8gcy5zbGljZSgwLCBlIC0gdCkgOiBzO1xufVxuY2xhc3MgSWIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJjb24gPSBbMCwgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNywgNTRdLCB0aGlzLnN1Yk1peCA9IFtuZXcgVWludDMyQXJyYXkoMjU2KSwgbmV3IFVpbnQzMkFycmF5KDI1NiksIG5ldyBVaW50MzJBcnJheSgyNTYpLCBuZXcgVWludDMyQXJyYXkoMjU2KV0sIHRoaXMuaW52U3ViTWl4ID0gW25ldyBVaW50MzJBcnJheSgyNTYpLCBuZXcgVWludDMyQXJyYXkoMjU2KSwgbmV3IFVpbnQzMkFycmF5KDI1NiksIG5ldyBVaW50MzJBcnJheSgyNTYpXSwgdGhpcy5zQm94ID0gbmV3IFVpbnQzMkFycmF5KDI1NiksIHRoaXMuaW52U0JveCA9IG5ldyBVaW50MzJBcnJheSgyNTYpLCB0aGlzLmtleSA9IG5ldyBVaW50MzJBcnJheSgwKSwgdGhpcy5rc1Jvd3MgPSAwLCB0aGlzLmtleVNpemUgPSAwLCB0aGlzLmtleVNjaGVkdWxlID0gdm9pZCAwLCB0aGlzLmludktleVNjaGVkdWxlID0gdm9pZCAwLCB0aGlzLmluaXRUYWJsZSgpO1xuICB9XG4gIC8vIFVzaW5nIHZpZXcuZ2V0VWludDMyKCkgYWxzbyBzd2FwcyB0aGUgYnl0ZSBvcmRlci5cbiAgdWludDhBcnJheVRvVWludDMyQXJyYXlfKGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IERhdGFWaWV3KGUpLCByID0gbmV3IFVpbnQzMkFycmF5KDQpO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgbisrKVxuICAgICAgcltuXSA9IHQuZ2V0VWludDMyKG4gKiA0KTtcbiAgICByZXR1cm4gcjtcbiAgfVxuICBpbml0VGFibGUoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuc0JveCwgdCA9IHRoaXMuaW52U0JveCwgciA9IHRoaXMuc3ViTWl4LCBuID0gclswXSwgaSA9IHJbMV0sIG8gPSByWzJdLCBhID0gclszXSwgbCA9IHRoaXMuaW52U3ViTWl4LCBjID0gbFswXSwgdSA9IGxbMV0sIGQgPSBsWzJdLCBoID0gbFszXSwgZiA9IG5ldyBVaW50MzJBcnJheSgyNTYpO1xuICAgIGxldCBwID0gMCwgeSA9IDAsIEUgPSAwO1xuICAgIGZvciAoRSA9IDA7IEUgPCAyNTY7IEUrKylcbiAgICAgIEUgPCAxMjggPyBmW0VdID0gRSA8PCAxIDogZltFXSA9IEUgPDwgMSBeIDI4MztcbiAgICBmb3IgKEUgPSAwOyBFIDwgMjU2OyBFKyspIHtcbiAgICAgIGxldCBiID0geSBeIHkgPDwgMSBeIHkgPDwgMiBeIHkgPDwgMyBeIHkgPDwgNDtcbiAgICAgIGIgPSBiID4+PiA4IF4gYiAmIDI1NSBeIDk5LCBlW3BdID0gYiwgdFtiXSA9IHA7XG4gICAgICBjb25zdCBSID0gZltwXSwgQSA9IGZbUl0sIEYgPSBmW0FdO1xuICAgICAgbGV0IE0gPSBmW2JdICogMjU3IF4gYiAqIDE2ODQzMDA4O1xuICAgICAgbltwXSA9IE0gPDwgMjQgfCBNID4+PiA4LCBpW3BdID0gTSA8PCAxNiB8IE0gPj4+IDE2LCBvW3BdID0gTSA8PCA4IHwgTSA+Pj4gMjQsIGFbcF0gPSBNLCBNID0gRiAqIDE2ODQzMDA5IF4gQSAqIDY1NTM3IF4gUiAqIDI1NyBeIHAgKiAxNjg0MzAwOCwgY1tiXSA9IE0gPDwgMjQgfCBNID4+PiA4LCB1W2JdID0gTSA8PCAxNiB8IE0gPj4+IDE2LCBkW2JdID0gTSA8PCA4IHwgTSA+Pj4gMjQsIGhbYl0gPSBNLCBwID8gKHAgPSBSIF4gZltmW2ZbRiBeIFJdXV0sIHkgXj0gZltmW3ldXSkgOiBwID0geSA9IDE7XG4gICAgfVxuICB9XG4gIGV4cGFuZEtleShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMudWludDhBcnJheVRvVWludDMyQXJyYXlfKGUpO1xuICAgIGxldCByID0gITAsIG4gPSAwO1xuICAgIGZvciAoOyBuIDwgdC5sZW5ndGggJiYgcjsgKVxuICAgICAgciA9IHRbbl0gPT09IHRoaXMua2V5W25dLCBuKys7XG4gICAgaWYgKHIpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5rZXkgPSB0O1xuICAgIGNvbnN0IGkgPSB0aGlzLmtleVNpemUgPSB0Lmxlbmd0aDtcbiAgICBpZiAoaSAhPT0gNCAmJiBpICE9PSA2ICYmIGkgIT09IDgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFlcyBrZXkgc2l6ZT1cIiArIGkpO1xuICAgIGNvbnN0IG8gPSB0aGlzLmtzUm93cyA9IChpICsgNiArIDEpICogNDtcbiAgICBsZXQgYSwgbDtcbiAgICBjb25zdCBjID0gdGhpcy5rZXlTY2hlZHVsZSA9IG5ldyBVaW50MzJBcnJheShvKSwgdSA9IHRoaXMuaW52S2V5U2NoZWR1bGUgPSBuZXcgVWludDMyQXJyYXkobyksIGQgPSB0aGlzLnNCb3gsIGggPSB0aGlzLnJjb24sIGYgPSB0aGlzLmludlN1Yk1peCwgcCA9IGZbMF0sIHkgPSBmWzFdLCBFID0gZlsyXSwgYiA9IGZbM107XG4gICAgbGV0IFIsIEE7XG4gICAgZm9yIChhID0gMDsgYSA8IG87IGErKykge1xuICAgICAgaWYgKGEgPCBpKSB7XG4gICAgICAgIFIgPSBjW2FdID0gdFthXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBBID0gUiwgYSAlIGkgPT09IDAgPyAoQSA9IEEgPDwgOCB8IEEgPj4+IDI0LCBBID0gZFtBID4+PiAyNF0gPDwgMjQgfCBkW0EgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IGRbQSA+Pj4gOCAmIDI1NV0gPDwgOCB8IGRbQSAmIDI1NV0sIEEgXj0gaFthIC8gaSB8IDBdIDw8IDI0KSA6IGkgPiA2ICYmIGEgJSBpID09PSA0ICYmIChBID0gZFtBID4+PiAyNF0gPDwgMjQgfCBkW0EgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IGRbQSA+Pj4gOCAmIDI1NV0gPDwgOCB8IGRbQSAmIDI1NV0pLCBjW2FdID0gUiA9IChjW2EgLSBpXSBeIEEpID4+PiAwO1xuICAgIH1cbiAgICBmb3IgKGwgPSAwOyBsIDwgbzsgbCsrKVxuICAgICAgYSA9IG8gLSBsLCBsICYgMyA/IEEgPSBjW2FdIDogQSA9IGNbYSAtIDRdLCBsIDwgNCB8fCBhIDw9IDQgPyB1W2xdID0gQSA6IHVbbF0gPSBwW2RbQSA+Pj4gMjRdXSBeIHlbZFtBID4+PiAxNiAmIDI1NV1dIF4gRVtkW0EgPj4+IDggJiAyNTVdXSBeIGJbZFtBICYgMjU1XV0sIHVbbF0gPSB1W2xdID4+PiAwO1xuICB9XG4gIC8vIEFkZGluZyB0aGlzIGFzIGEgbWV0aG9kIGdyZWF0bHkgaW1wcm92ZXMgcGVyZm9ybWFuY2UuXG4gIG5ldHdvcmtUb0hvc3RPcmRlclN3YXAoZSkge1xuICAgIHJldHVybiBlIDw8IDI0IHwgKGUgJiA2NTI4MCkgPDwgOCB8IChlICYgMTY3MTE2ODApID4+IDggfCBlID4+PiAyNDtcbiAgfVxuICBkZWNyeXB0KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5rZXlTaXplICsgNiwgaSA9IHRoaXMuaW52S2V5U2NoZWR1bGUsIG8gPSB0aGlzLmludlNCb3gsIGEgPSB0aGlzLmludlN1Yk1peCwgbCA9IGFbMF0sIGMgPSBhWzFdLCB1ID0gYVsyXSwgZCA9IGFbM10sIGggPSB0aGlzLnVpbnQ4QXJyYXlUb1VpbnQzMkFycmF5XyhyKTtcbiAgICBsZXQgZiA9IGhbMF0sIHAgPSBoWzFdLCB5ID0gaFsyXSwgRSA9IGhbM107XG4gICAgY29uc3QgYiA9IG5ldyBJbnQzMkFycmF5KGUpLCBSID0gbmV3IEludDMyQXJyYXkoYi5sZW5ndGgpO1xuICAgIGxldCBBLCBGLCBNLCBILCBLLCBqLCBDLCBrLCAkLCBXLCBfLCBnLCB4LCB3O1xuICAgIGNvbnN0IEQgPSB0aGlzLm5ldHdvcmtUb0hvc3RPcmRlclN3YXA7XG4gICAgZm9yICg7IHQgPCBiLmxlbmd0aDsgKSB7XG4gICAgICBmb3IgKCQgPSBEKGJbdF0pLCBXID0gRChiW3QgKyAxXSksIF8gPSBEKGJbdCArIDJdKSwgZyA9IEQoYlt0ICsgM10pLCBLID0gJCBeIGlbMF0sIGogPSBnIF4gaVsxXSwgQyA9IF8gXiBpWzJdLCBrID0gVyBeIGlbM10sIHggPSA0LCB3ID0gMTsgdyA8IG47IHcrKylcbiAgICAgICAgQSA9IGxbSyA+Pj4gMjRdIF4gY1tqID4+IDE2ICYgMjU1XSBeIHVbQyA+PiA4ICYgMjU1XSBeIGRbayAmIDI1NV0gXiBpW3hdLCBGID0gbFtqID4+PiAyNF0gXiBjW0MgPj4gMTYgJiAyNTVdIF4gdVtrID4+IDggJiAyNTVdIF4gZFtLICYgMjU1XSBeIGlbeCArIDFdLCBNID0gbFtDID4+PiAyNF0gXiBjW2sgPj4gMTYgJiAyNTVdIF4gdVtLID4+IDggJiAyNTVdIF4gZFtqICYgMjU1XSBeIGlbeCArIDJdLCBIID0gbFtrID4+PiAyNF0gXiBjW0sgPj4gMTYgJiAyNTVdIF4gdVtqID4+IDggJiAyNTVdIF4gZFtDICYgMjU1XSBeIGlbeCArIDNdLCBLID0gQSwgaiA9IEYsIEMgPSBNLCBrID0gSCwgeCA9IHggKyA0O1xuICAgICAgQSA9IG9bSyA+Pj4gMjRdIDw8IDI0IF4gb1tqID4+IDE2ICYgMjU1XSA8PCAxNiBeIG9bQyA+PiA4ICYgMjU1XSA8PCA4IF4gb1trICYgMjU1XSBeIGlbeF0sIEYgPSBvW2ogPj4+IDI0XSA8PCAyNCBeIG9bQyA+PiAxNiAmIDI1NV0gPDwgMTYgXiBvW2sgPj4gOCAmIDI1NV0gPDwgOCBeIG9bSyAmIDI1NV0gXiBpW3ggKyAxXSwgTSA9IG9bQyA+Pj4gMjRdIDw8IDI0IF4gb1trID4+IDE2ICYgMjU1XSA8PCAxNiBeIG9bSyA+PiA4ICYgMjU1XSA8PCA4IF4gb1tqICYgMjU1XSBeIGlbeCArIDJdLCBIID0gb1trID4+PiAyNF0gPDwgMjQgXiBvW0sgPj4gMTYgJiAyNTVdIDw8IDE2IF4gb1tqID4+IDggJiAyNTVdIDw8IDggXiBvW0MgJiAyNTVdIF4gaVt4ICsgM10sIFJbdF0gPSBEKEEgXiBmKSwgUlt0ICsgMV0gPSBEKEggXiBwKSwgUlt0ICsgMl0gPSBEKE0gXiB5KSwgUlt0ICsgM10gPSBEKEYgXiBFKSwgZiA9ICQsIHAgPSBXLCB5ID0gXywgRSA9IGcsIHQgPSB0ICsgNDtcbiAgICB9XG4gICAgcmV0dXJuIFIuYnVmZmVyO1xuICB9XG59XG5jbGFzcyBfYiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICB0aGlzLnN1YnRsZSA9IHZvaWQgMCwgdGhpcy5rZXkgPSB2b2lkIDAsIHRoaXMuYWVzTW9kZSA9IHZvaWQgMCwgdGhpcy5zdWJ0bGUgPSBlLCB0aGlzLmtleSA9IHQsIHRoaXMuYWVzTW9kZSA9IHI7XG4gIH1cbiAgZXhwYW5kS2V5KCkge1xuICAgIGNvbnN0IGUgPSBSYih0aGlzLmFlc01vZGUpO1xuICAgIHJldHVybiB0aGlzLnN1YnRsZS5pbXBvcnRLZXkoXCJyYXdcIiwgdGhpcy5rZXksIHtcbiAgICAgIG5hbWU6IGVcbiAgICB9LCAhMSwgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0pO1xuICB9XG59XG5mdW5jdGlvbiBSYihzKSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgT3MuY2JjOlxuICAgICAgcmV0dXJuIFwiQUVTLUNCQ1wiO1xuICAgIGNhc2UgT3MuY3RyOlxuICAgICAgcmV0dXJuIFwiQUVTLUNUUlwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGYXN0QUVTS2V5XSBpbnZhbGlkIGFlcyBtb2RlICR7c31gKTtcbiAgfVxufVxuY29uc3QgTGIgPSAxNjtcbmNsYXNzIHZ1IHtcbiAgY29uc3RydWN0b3IoZSwge1xuICAgIHJlbW92ZVBLQ1M3UGFkZGluZzogdCA9ICEwXG4gIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLmxvZ0VuYWJsZWQgPSAhMCwgdGhpcy5yZW1vdmVQS0NTN1BhZGRpbmcgPSB2b2lkIDAsIHRoaXMuc3VidGxlID0gbnVsbCwgdGhpcy5zb2Z0d2FyZURlY3J5cHRlciA9IG51bGwsIHRoaXMua2V5ID0gbnVsbCwgdGhpcy5mYXN0QWVzS2V5ID0gbnVsbCwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy5jdXJyZW50SVYgPSBudWxsLCB0aGlzLmN1cnJlbnRSZXN1bHQgPSBudWxsLCB0aGlzLnVzZVNvZnR3YXJlID0gdm9pZCAwLCB0aGlzLmVuYWJsZVNvZnR3YXJlQUVTID0gdm9pZCAwLCB0aGlzLmVuYWJsZVNvZnR3YXJlQUVTID0gZS5lbmFibGVTb2Z0d2FyZUFFUywgdGhpcy5yZW1vdmVQS0NTN1BhZGRpbmcgPSB0LCB0KVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IHNlbGYuY3J5cHRvO1xuICAgICAgICByICYmICh0aGlzLnN1YnRsZSA9IHIuc3VidGxlIHx8IHIud2Via2l0U3VidGxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgIHRoaXMudXNlU29mdHdhcmUgPSAhdGhpcy5zdWJ0bGU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnRsZSA9IG51bGwsIHRoaXMuc29mdHdhcmVEZWNyeXB0ZXIgPSBudWxsLCB0aGlzLmtleSA9IG51bGwsIHRoaXMuZmFzdEFlc0tleSA9IG51bGwsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGwsIHRoaXMuY3VycmVudElWID0gbnVsbCwgdGhpcy5jdXJyZW50UmVzdWx0ID0gbnVsbDtcbiAgfVxuICBpc1N5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMudXNlU29mdHdhcmU7XG4gIH1cbiAgZmx1c2goKSB7XG4gICAgY29uc3Qge1xuICAgICAgY3VycmVudFJlc3VsdDogZSxcbiAgICAgIHJlbWFpbmRlckRhdGE6IHRcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWUgfHwgdClcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0KCksIG51bGw7XG4gICAgY29uc3QgciA9IG5ldyBVaW50OEFycmF5KGUpO1xuICAgIHJldHVybiB0aGlzLnJlc2V0KCksIHRoaXMucmVtb3ZlUEtDUzdQYWRkaW5nID8gQWIocikgOiByO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIHRoaXMuY3VycmVudFJlc3VsdCA9IG51bGwsIHRoaXMuY3VycmVudElWID0gbnVsbCwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy5zb2Z0d2FyZURlY3J5cHRlciAmJiAodGhpcy5zb2Z0d2FyZURlY3J5cHRlciA9IG51bGwpO1xuICB9XG4gIGRlY3J5cHQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiB0aGlzLnVzZVNvZnR3YXJlID8gbmV3IFByb21pc2UoKGksIG8pID0+IHtcbiAgICAgIGNvbnN0IGEgPSBBcnJheUJ1ZmZlci5pc1ZpZXcoZSkgPyBlIDogbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgICB0aGlzLnNvZnR3YXJlRGVjcnlwdChhLCB0LCByLCBuKTtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmZsdXNoKCk7XG4gICAgICBsID8gaShsLmJ1ZmZlcikgOiBvKG5ldyBFcnJvcihcIltzb2Z0d2FyZURlY3J5cHRdIEZhaWxlZCB0byBkZWNyeXB0IGRhdGFcIikpO1xuICAgIH0pIDogdGhpcy53ZWJDcnlwdG9EZWNyeXB0KG5ldyBVaW50OEFycmF5KGUpLCB0LCByLCBuKTtcbiAgfVxuICAvLyBTb2Z0d2FyZSBkZWNyeXB0aW9uIGlzIHByb2dyZXNzaXZlLiBQcm9ncmVzc2l2ZSBkZWNyeXB0aW9uIG1heSBub3QgcmV0dXJuIGEgcmVzdWx0IG9uIGVhY2ggY2FsbC4gQW55IGNhY2hlZFxuICAvLyBkYXRhIGlzIGhhbmRsZWQgaW4gdGhlIGZsdXNoKCkgY2FsbFxuICBzb2Z0d2FyZURlY3J5cHQoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRJVjogaSxcbiAgICAgIGN1cnJlbnRSZXN1bHQ6IG8sXG4gICAgICByZW1haW5kZXJEYXRhOiBhXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKG4gIT09IE9zLmNiYyB8fCB0LmJ5dGVMZW5ndGggIT09IDE2KVxuICAgICAgcmV0dXJuIHJ0Lndhcm4oXCJTb2Z0d2FyZURlY3J5cHQ6IGNhbiBvbmx5IGhhbmRsZSBBRVMtMTI4LUNCQ1wiKSwgbnVsbDtcbiAgICB0aGlzLmxvZ09uY2UoXCJKUyBBRVMgZGVjcnlwdFwiKSwgYSAmJiAoZSA9IF9yKGEsIGUpLCB0aGlzLnJlbWFpbmRlckRhdGEgPSBudWxsKTtcbiAgICBjb25zdCBsID0gdGhpcy5nZXRWYWxpZENodW5rKGUpO1xuICAgIGlmICghbC5sZW5ndGgpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpICYmIChyID0gaSk7XG4gICAgbGV0IGMgPSB0aGlzLnNvZnR3YXJlRGVjcnlwdGVyO1xuICAgIGMgfHwgKGMgPSB0aGlzLnNvZnR3YXJlRGVjcnlwdGVyID0gbmV3IEliKCkpLCBjLmV4cGFuZEtleSh0KTtcbiAgICBjb25zdCB1ID0gbztcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmVzdWx0ID0gYy5kZWNyeXB0KGwuYnVmZmVyLCAwLCByKSwgdGhpcy5jdXJyZW50SVYgPSBsLnNsaWNlKC0xNikuYnVmZmVyLCB1IHx8IG51bGw7XG4gIH1cbiAgd2ViQ3J5cHRvRGVjcnlwdChlLCB0LCByLCBuKSB7XG4gICAgaWYgKHRoaXMua2V5ICE9PSB0IHx8ICF0aGlzLmZhc3RBZXNLZXkpIHtcbiAgICAgIGlmICghdGhpcy5zdWJ0bGUpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vbldlYkNyeXB0b0Vycm9yKGUsIHQsIHIsIG4pKTtcbiAgICAgIHRoaXMua2V5ID0gdCwgdGhpcy5mYXN0QWVzS2V5ID0gbmV3IF9iKHRoaXMuc3VidGxlLCB0LCBuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmFzdEFlc0tleS5leHBhbmRLZXkoKS50aGVuKChpKSA9PiB0aGlzLnN1YnRsZSA/ICh0aGlzLmxvZ09uY2UoXCJXZWJDcnlwdG8gQUVTIGRlY3J5cHRcIiksIG5ldyB3Yih0aGlzLnN1YnRsZSwgbmV3IFVpbnQ4QXJyYXkociksIG4pLmRlY3J5cHQoZS5idWZmZXIsIGkpKSA6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIndlYiBjcnlwdG8gbm90IGluaXRpYWxpemVkXCIpKSkuY2F0Y2goKGkpID0+IChydC53YXJuKGBbZGVjcnlwdGVyXTogV2ViQ3J5cHRvIEVycm9yLCBkaXNhYmxlIFdlYkNyeXB0byBBUEksICR7aS5uYW1lfTogJHtpLm1lc3NhZ2V9YCksIHRoaXMub25XZWJDcnlwdG9FcnJvcihlLCB0LCByLCBuKSkpO1xuICB9XG4gIG9uV2ViQ3J5cHRvRXJyb3IoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSB0aGlzLmVuYWJsZVNvZnR3YXJlQUVTO1xuICAgIGlmIChpKSB7XG4gICAgICB0aGlzLnVzZVNvZnR3YXJlID0gITAsIHRoaXMubG9nRW5hYmxlZCA9ICEwLCB0aGlzLnNvZnR3YXJlRGVjcnlwdChlLCB0LCByLCBuKTtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmZsdXNoKCk7XG4gICAgICBpZiAobylcbiAgICAgICAgcmV0dXJuIG8uYnVmZmVyO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJDcnlwdG9cIiArIChpID8gXCIgYW5kIHNvZnR3YXJlRGVjcnlwdFwiIDogXCJcIikgKyBcIjogZmFpbGVkIHRvIGRlY3J5cHQgZGF0YVwiKTtcbiAgfVxuICBnZXRWYWxpZENodW5rKGUpIHtcbiAgICBsZXQgdCA9IGU7XG4gICAgY29uc3QgciA9IGUubGVuZ3RoIC0gZS5sZW5ndGggJSBMYjtcbiAgICByZXR1cm4gciAhPT0gZS5sZW5ndGggJiYgKHQgPSBlLnNsaWNlKDAsIHIpLCB0aGlzLnJlbWFpbmRlckRhdGEgPSBlLnNsaWNlKHIpKSwgdDtcbiAgfVxuICBsb2dPbmNlKGUpIHtcbiAgICB0aGlzLmxvZ0VuYWJsZWQgJiYgKHJ0LmxvZyhgW2RlY3J5cHRlcl06ICR7ZX1gKSwgdGhpcy5sb2dFbmFibGVkID0gITEpO1xuICB9XG59XG5jb25zdCBwaCA9IE1hdGgucG93KDIsIDE3KTtcbmNsYXNzIENiIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IG51bGwsIHRoaXMucGFydExvYWRUaW1lb3V0ID0gLTEsIHRoaXMuY29uZmlnID0gZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMubG9hZGVyICYmICh0aGlzLmxvYWRlci5kZXN0cm95KCksIHRoaXMubG9hZGVyID0gbnVsbCk7XG4gIH1cbiAgYWJvcnQoKSB7XG4gICAgdGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuYWJvcnQoKTtcbiAgfVxuICBsb2FkKGUsIHQpIHtcbiAgICBjb25zdCByID0gZS51cmw7XG4gICAgaWYgKCFyKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBhcyh7XG4gICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouRlJBR19MT0FEX0VSUk9SLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGZyYWc6IGUsXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYEZyYWdtZW50IGRvZXMgbm90IGhhdmUgYSAke3IgPyBcInBhcnQgbGlzdFwiIDogXCJ1cmxcIn1gKSxcbiAgICAgICAgbmV0d29ya0RldGFpbHM6IG51bGxcbiAgICAgIH0pKTtcbiAgICB0aGlzLmFib3J0KCk7XG4gICAgY29uc3QgbiA9IHRoaXMuY29uZmlnLCBpID0gbi5mTG9hZGVyLCBvID0gbi5sb2FkZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChhLCBsKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuZGVzdHJveSgpLCBlLmdhcClcbiAgICAgICAgaWYgKGUudGFnTGlzdC5zb21lKChwKSA9PiBwWzBdID09PSBcIkdBUFwiKSkge1xuICAgICAgICAgIGwoeWgoZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZS5nYXAgPSAhMTtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmxvYWRlciA9IGkgPyBuZXcgaShuKSA6IG5ldyBvKG4pLCB1ID0gbWgoZSk7XG4gICAgICBlLmxvYWRlciA9IGM7XG4gICAgICBjb25zdCBkID0gZmgobi5mcmFnTG9hZFBvbGljeS5kZWZhdWx0KSwgaCA9IHtcbiAgICAgICAgbG9hZFBvbGljeTogZCxcbiAgICAgICAgdGltZW91dDogZC5tYXhMb2FkVGltZU1zLFxuICAgICAgICBtYXhSZXRyeTogMCxcbiAgICAgICAgcmV0cnlEZWxheTogMCxcbiAgICAgICAgbWF4UmV0cnlEZWxheTogMCxcbiAgICAgICAgaGlnaFdhdGVyTWFyazogZS5zbiA9PT0gXCJpbml0U2VnbWVudFwiID8gMSAvIDAgOiBwaFxuICAgICAgfTtcbiAgICAgIGUuc3RhdHMgPSBjLnN0YXRzO1xuICAgICAgY29uc3QgZiA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAocCwgeSwgRSwgYikgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyk7XG4gICAgICAgICAgbGV0IFIgPSBwLmRhdGE7XG4gICAgICAgICAgRS5yZXNldElWICYmIGUuZGVjcnlwdGRhdGEgJiYgKGUuZGVjcnlwdGRhdGEuaXYgPSBuZXcgVWludDhBcnJheShSLnNsaWNlKDAsIDE2KSksIFIgPSBSLnNsaWNlKDE2KSksIGEoe1xuICAgICAgICAgICAgZnJhZzogZSxcbiAgICAgICAgICAgIHBhcnQ6IG51bGwsXG4gICAgICAgICAgICBwYXlsb2FkOiBSLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IGJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKHAsIHksIEUsIGIpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2V0TG9hZGVyKGUsIGMpLCBsKG5ldyBhcyh7XG4gICAgICAgICAgICB0eXBlOiB2ZS5ORVRXT1JLX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5GUkFHX0xPQURfRVJST1IsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR0KHtcbiAgICAgICAgICAgICAgdXJsOiByLFxuICAgICAgICAgICAgICBkYXRhOiB2b2lkIDBcbiAgICAgICAgICAgIH0sIHApLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihgSFRUUCBFcnJvciAke3AuY29kZX0gJHtwLnRleHR9YCksXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogRSxcbiAgICAgICAgICAgIHN0YXRzOiBiXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBvbkFib3J0OiAocCwgeSwgRSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLklOVEVSTkFMX0FCT1JURUQsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkFib3J0ZWRcIiksXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogRSxcbiAgICAgICAgICAgIHN0YXRzOiBwXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBvblRpbWVvdXQ6IChwLCB5LCBFKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNldExvYWRlcihlLCBjKSwgbChuZXcgYXMoe1xuICAgICAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgICAgIGRldGFpbHM6IEouRlJBR19MT0FEX1RJTUVPVVQsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihgVGltZW91dCBhZnRlciAke2gudGltZW91dH1tc2ApLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IEUsXG4gICAgICAgICAgICBzdGF0czogcFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHQgJiYgKGYub25Qcm9ncmVzcyA9IChwLCB5LCBFLCBiKSA9PiB0KHtcbiAgICAgICAgZnJhZzogZSxcbiAgICAgICAgcGFydDogbnVsbCxcbiAgICAgICAgcGF5bG9hZDogRSxcbiAgICAgICAgbmV0d29ya0RldGFpbHM6IGJcbiAgICAgIH0pKSwgYy5sb2FkKHUsIGgsIGYpO1xuICAgIH0pO1xuICB9XG4gIGxvYWRQYXJ0KGUsIHQsIHIpIHtcbiAgICB0aGlzLmFib3J0KCk7XG4gICAgY29uc3QgbiA9IHRoaXMuY29uZmlnLCBpID0gbi5mTG9hZGVyLCBvID0gbi5sb2FkZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChhLCBsKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuZGVzdHJveSgpLCBlLmdhcCB8fCB0LmdhcCkge1xuICAgICAgICBsKHloKGUsIHQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYyA9IHRoaXMubG9hZGVyID0gaSA/IG5ldyBpKG4pIDogbmV3IG8obiksIHUgPSBtaChlLCB0KTtcbiAgICAgIGUubG9hZGVyID0gYztcbiAgICAgIGNvbnN0IGQgPSBmaChuLmZyYWdMb2FkUG9saWN5LmRlZmF1bHQpLCBoID0ge1xuICAgICAgICBsb2FkUG9saWN5OiBkLFxuICAgICAgICB0aW1lb3V0OiBkLm1heExvYWRUaW1lTXMsXG4gICAgICAgIG1heFJldHJ5OiAwLFxuICAgICAgICByZXRyeURlbGF5OiAwLFxuICAgICAgICBtYXhSZXRyeURlbGF5OiAwLFxuICAgICAgICBoaWdoV2F0ZXJNYXJrOiBwaFxuICAgICAgfTtcbiAgICAgIHQuc3RhdHMgPSBjLnN0YXRzLCBjLmxvYWQodSwgaCwge1xuICAgICAgICBvblN1Y2Nlc3M6IChmLCBwLCB5LCBFKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNldExvYWRlcihlLCBjKSwgdGhpcy51cGRhdGVTdGF0c0Zyb21QYXJ0KGUsIHQpO1xuICAgICAgICAgIGNvbnN0IGIgPSB7XG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcGFydDogdCxcbiAgICAgICAgICAgIHBheWxvYWQ6IGYuZGF0YSxcbiAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBFXG4gICAgICAgICAgfTtcbiAgICAgICAgICByKGIpLCBhKGIpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoZiwgcCwgeSwgRSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfTE9BRF9FUlJPUixcbiAgICAgICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgICAgIGZyYWc6IGUsXG4gICAgICAgICAgICBwYXJ0OiB0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR0KHtcbiAgICAgICAgICAgICAgdXJsOiB1LnVybCxcbiAgICAgICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgICAgICB9LCBmKSxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYEhUVFAgRXJyb3IgJHtmLmNvZGV9ICR7Zi50ZXh0fWApLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IHksXG4gICAgICAgICAgICBzdGF0czogRVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25BYm9ydDogKGYsIHAsIHkpID0+IHtcbiAgICAgICAgICBlLnN0YXRzLmFib3J0ZWQgPSB0LnN0YXRzLmFib3J0ZWQsIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLklOVEVSTkFMX0FCT1JURUQsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcGFydDogdCxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJBYm9ydGVkXCIpLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IHksXG4gICAgICAgICAgICBzdGF0czogZlxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25UaW1lb3V0OiAoZiwgcCwgeSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfTE9BRF9USU1FT1VULFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZnJhZzogZSxcbiAgICAgICAgICAgIHBhcnQ6IHQsXG4gICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBUaW1lb3V0IGFmdGVyICR7aC50aW1lb3V0fW1zYCksXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogeSxcbiAgICAgICAgICAgIHN0YXRzOiBmXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVTdGF0c0Zyb21QYXJ0KGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5zdGF0cywgbiA9IHQuc3RhdHMsIGkgPSBuLnRvdGFsO1xuICAgIGlmIChyLmxvYWRlZCArPSBuLmxvYWRlZCwgaSkge1xuICAgICAgY29uc3QgbCA9IE1hdGgucm91bmQoZS5kdXJhdGlvbiAvIHQuZHVyYXRpb24pLCBjID0gTWF0aC5taW4oTWF0aC5yb3VuZChyLmxvYWRlZCAvIGkpLCBsKSwgZCA9IChsIC0gYykgKiBNYXRoLnJvdW5kKHIubG9hZGVkIC8gYyk7XG4gICAgICByLnRvdGFsID0gci5sb2FkZWQgKyBkO1xuICAgIH0gZWxzZVxuICAgICAgci50b3RhbCA9IE1hdGgubWF4KHIubG9hZGVkLCByLnRvdGFsKTtcbiAgICBjb25zdCBvID0gci5sb2FkaW5nLCBhID0gbi5sb2FkaW5nO1xuICAgIG8uc3RhcnQgPyBvLmZpcnN0ICs9IGEuZmlyc3QgLSBhLnN0YXJ0IDogKG8uc3RhcnQgPSBhLnN0YXJ0LCBvLmZpcnN0ID0gYS5maXJzdCksIG8uZW5kID0gYS5lbmQ7XG4gIH1cbiAgcmVzZXRMb2FkZXIoZSwgdCkge1xuICAgIGUubG9hZGVyID0gbnVsbCwgdGhpcy5sb2FkZXIgPT09IHQgJiYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucGFydExvYWRUaW1lb3V0KSwgdGhpcy5sb2FkZXIgPSBudWxsKSwgdC5kZXN0cm95KCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1oKHMsIGUgPSBudWxsKSB7XG4gIGNvbnN0IHQgPSBlIHx8IHMsIHIgPSB7XG4gICAgZnJhZzogcyxcbiAgICBwYXJ0OiBlLFxuICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgIHVybDogdC51cmwsXG4gICAgaGVhZGVyczoge30sXG4gICAgcmFuZ2VTdGFydDogMCxcbiAgICByYW5nZUVuZDogMFxuICB9LCBuID0gdC5ieXRlUmFuZ2VTdGFydE9mZnNldCwgaSA9IHQuYnl0ZVJhbmdlRW5kT2Zmc2V0O1xuICBpZiAodWUobikgJiYgdWUoaSkpIHtcbiAgICB2YXIgbztcbiAgICBsZXQgYSA9IG4sIGwgPSBpO1xuICAgIGlmIChzLnNuID09PSBcImluaXRTZWdtZW50XCIgJiYga2IoKG8gPSBzLmRlY3J5cHRkYXRhKSA9PSBudWxsID8gdm9pZCAwIDogby5tZXRob2QpKSB7XG4gICAgICBjb25zdCBjID0gaSAtIG47XG4gICAgICBjICUgMTYgJiYgKGwgPSBpICsgKDE2IC0gYyAlIDE2KSksIG4gIT09IDAgJiYgKHIucmVzZXRJViA9ICEwLCBhID0gbiAtIDE2KTtcbiAgICB9XG4gICAgci5yYW5nZVN0YXJ0ID0gYSwgci5yYW5nZUVuZCA9IGw7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiB5aChzLCBlKSB7XG4gIGNvbnN0IHQgPSBuZXcgRXJyb3IoYEdBUCAke3MuZ2FwID8gXCJ0YWdcIiA6IFwiYXR0cmlidXRlXCJ9IGZvdW5kYCksIHIgPSB7XG4gICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgZGV0YWlsczogSi5GUkFHX0dBUCxcbiAgICBmYXRhbDogITEsXG4gICAgZnJhZzogcyxcbiAgICBlcnJvcjogdCxcbiAgICBuZXR3b3JrRGV0YWlsczogbnVsbFxuICB9O1xuICByZXR1cm4gZSAmJiAoci5wYXJ0ID0gZSksIChlIHx8IHMpLnN0YXRzLmFib3J0ZWQgPSAhMCwgbmV3IGFzKHIpO1xufVxuZnVuY3Rpb24ga2Iocykge1xuICByZXR1cm4gcyA9PT0gXCJBRVMtMTI4XCIgfHwgcyA9PT0gXCJBRVMtMjU2XCI7XG59XG5jbGFzcyBhcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUuZXJyb3IubWVzc2FnZSksIHRoaXMuZGF0YSA9IHZvaWQgMCwgdGhpcy5kYXRhID0gZTtcbiAgfVxufVxuY2xhc3MgSGcgZXh0ZW5kcyBMciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcihlLCB0KSwgdGhpcy5fYm91bmRUaWNrID0gdm9pZCAwLCB0aGlzLl90aWNrVGltZXIgPSBudWxsLCB0aGlzLl90aWNrSW50ZXJ2YWwgPSBudWxsLCB0aGlzLl90aWNrQ2FsbENvdW50ID0gMCwgdGhpcy5fYm91bmRUaWNrID0gdGhpcy50aWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm9uSGFuZGxlckRlc3Ryb3lpbmcoKSwgdGhpcy5vbkhhbmRsZXJEZXN0cm95ZWQoKTtcbiAgfVxuICBvbkhhbmRsZXJEZXN0cm95aW5nKCkge1xuICAgIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgfVxuICBvbkhhbmRsZXJEZXN0cm95ZWQoKSB7XG4gIH1cbiAgaGFzSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fdGlja0ludGVydmFsO1xuICB9XG4gIGhhc05leHRUaWNrKCkge1xuICAgIHJldHVybiAhIXRoaXMuX3RpY2tUaW1lcjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIG1pbGxpcyAtIEludGVydmFsIHRpbWUgKG1zKVxuICAgKiBAZXR1cm5zIFRydWUgd2hlbiBpbnRlcnZhbCBoYXMgYmVlbiBzY2hlZHVsZWQsIGZhbHNlIHdoZW4gYWxyZWFkeSBzY2hlZHVsZWQgKG5vIGVmZmVjdClcbiAgICovXG4gIHNldEludGVydmFsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fdGlja0ludGVydmFsID8gITEgOiAodGhpcy5fdGlja0NhbGxDb3VudCA9IDAsIHRoaXMuX3RpY2tJbnRlcnZhbCA9IHNlbGYuc2V0SW50ZXJ2YWwodGhpcy5fYm91bmRUaWNrLCBlKSwgITApO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gaW50ZXJ2YWwgd2FzIGNsZWFyZWQsIGZhbHNlIHdoZW4gbm9uZSB3YXMgc2V0IChubyBlZmZlY3QpXG4gICAqL1xuICBjbGVhckludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLl90aWNrSW50ZXJ2YWwgPyAoc2VsZi5jbGVhckludGVydmFsKHRoaXMuX3RpY2tJbnRlcnZhbCksIHRoaXMuX3RpY2tJbnRlcnZhbCA9IG51bGwsICEwKSA6ICExO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGltZW91dCB3YXMgY2xlYXJlZCwgZmFsc2Ugd2hlbiBub25lIHdhcyBzZXQgKG5vIGVmZmVjdClcbiAgICovXG4gIGNsZWFyTmV4dFRpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpY2tUaW1lciA/IChzZWxmLmNsZWFyVGltZW91dCh0aGlzLl90aWNrVGltZXIpLCB0aGlzLl90aWNrVGltZXIgPSBudWxsLCAhMCkgOiAhMTtcbiAgfVxuICAvKipcbiAgICogV2lsbCBjYWxsIHRoZSBzdWJjbGFzcyBkb1RpY2sgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBtYWluIGxvb3AgdGlja1xuICAgKiBvciBpbiB0aGUgbmV4dCBvbmUgKHZpYSBzZXRUaW1lb3V0KCwwKSkgaW4gY2FzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZFxuICAgKiBpbiB0aGlzIHRpY2sgKGluIGNhc2UgdGhpcyBpcyBhIHJlLWVudHJhbnQgY2FsbCkuXG4gICAqL1xuICB0aWNrKCkge1xuICAgIHRoaXMuX3RpY2tDYWxsQ291bnQrKywgdGhpcy5fdGlja0NhbGxDb3VudCA9PT0gMSAmJiAodGhpcy5kb1RpY2soKSwgdGhpcy5fdGlja0NhbGxDb3VudCA+IDEgJiYgdGhpcy50aWNrSW1tZWRpYXRlKCksIHRoaXMuX3RpY2tDYWxsQ291bnQgPSAwKTtcbiAgfVxuICB0aWNrSW1tZWRpYXRlKCkge1xuICAgIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLl90aWNrVGltZXIgPSBzZWxmLnNldFRpbWVvdXQodGhpcy5fYm91bmRUaWNrLCAwKTtcbiAgfVxuICAvKipcbiAgICogRm9yIHN1YmNsYXNzIHRvIGltcGxlbWVudCB0YXNrIGxvZ2ljXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZG9UaWNrKCkge1xuICB9XG59XG5jbGFzcyBFdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4gPSAwLCBpID0gLTEsIG8gPSAhMSkge1xuICAgIHRoaXMubGV2ZWwgPSB2b2lkIDAsIHRoaXMuc24gPSB2b2lkIDAsIHRoaXMucGFydCA9IHZvaWQgMCwgdGhpcy5pZCA9IHZvaWQgMCwgdGhpcy5zaXplID0gdm9pZCAwLCB0aGlzLnBhcnRpYWwgPSB2b2lkIDAsIHRoaXMudHJhbnNtdXhpbmcgPSBxaSgpLCB0aGlzLmJ1ZmZlcmluZyA9IHtcbiAgICAgIGF1ZGlvOiBxaSgpLFxuICAgICAgdmlkZW86IHFpKCksXG4gICAgICBhdWRpb3ZpZGVvOiBxaSgpXG4gICAgfSwgdGhpcy5sZXZlbCA9IGUsIHRoaXMuc24gPSB0LCB0aGlzLmlkID0gciwgdGhpcy5zaXplID0gbiwgdGhpcy5wYXJ0ID0gaSwgdGhpcy5wYXJ0aWFsID0gbztcbiAgfVxufVxuZnVuY3Rpb24gcWkoKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZXhlY3V0ZVN0YXJ0OiAwLFxuICAgIGV4ZWN1dGVFbmQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG5jb25zdCB2aCA9IHtcbiAgbGVuZ3RoOiAwLFxuICBzdGFydDogKCkgPT4gMCxcbiAgZW5kOiAoKSA9PiAwXG59O1xuY2xhc3MgQ2Uge1xuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgYG1lZGlhYCdzIGJ1ZmZlcmVkIGluY2x1ZGUgYHBvc2l0aW9uYFxuICAgKi9cbiAgc3RhdGljIGlzQnVmZmVyZWQoZSwgdCkge1xuICAgIGlmIChlKSB7XG4gICAgICBjb25zdCByID0gQ2UuZ2V0QnVmZmVyZWQoZSk7XG4gICAgICBmb3IgKGxldCBuID0gci5sZW5ndGg7IG4tLTsgKVxuICAgICAgICBpZiAodCA+PSByLnN0YXJ0KG4pICYmIHQgPD0gci5lbmQobikpXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgc3RhdGljIGJ1ZmZlcmVkUmFuZ2VzKGUpIHtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgdCA9IENlLmdldEJ1ZmZlcmVkKGUpO1xuICAgICAgcmV0dXJuIENlLnRpbWVSYW5nZXNUb0FycmF5KHQpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgc3RhdGljIHRpbWVSYW5nZXNUb0FycmF5KGUpIHtcbiAgICBjb25zdCB0ID0gW107XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKVxuICAgICAgdC5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGUuc3RhcnQociksXG4gICAgICAgIGVuZDogZS5lbmQocilcbiAgICAgIH0pO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHN0YXRpYyBidWZmZXJJbmZvKGUsIHQsIHIpIHtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgbiA9IENlLmJ1ZmZlcmVkUmFuZ2VzKGUpO1xuICAgICAgaWYgKG4ubGVuZ3RoKVxuICAgICAgICByZXR1cm4gQ2UuYnVmZmVyZWRJbmZvKG4sIHQsIHIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVuOiAwLFxuICAgICAgc3RhcnQ6IHQsXG4gICAgICBlbmQ6IHQsXG4gICAgICBidWZmZXJlZEluZGV4OiAtMVxuICAgIH07XG4gIH1cbiAgc3RhdGljIGJ1ZmZlcmVkSW5mbyhlLCB0LCByKSB7XG4gICAgdCA9IE1hdGgubWF4KDAsIHQpLCBlLmxlbmd0aCA+IDEgJiYgZS5zb3J0KCh1LCBkKSA9PiB1LnN0YXJ0IC0gZC5zdGFydCB8fCBkLmVuZCAtIHUuZW5kKTtcbiAgICBsZXQgbiA9IC0xLCBpID0gW107XG4gICAgaWYgKHIpXG4gICAgICBmb3IgKGxldCB1ID0gMDsgdSA8IGUubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgdCA+PSBlW3VdLnN0YXJ0ICYmIHQgPD0gZVt1XS5lbmQgJiYgKG4gPSB1KTtcbiAgICAgICAgY29uc3QgZCA9IGkubGVuZ3RoO1xuICAgICAgICBpZiAoZCkge1xuICAgICAgICAgIGNvbnN0IGggPSBpW2QgLSAxXS5lbmQ7XG4gICAgICAgICAgZVt1XS5zdGFydCAtIGggPCByID8gZVt1XS5lbmQgPiBoICYmIChpW2QgLSAxXS5lbmQgPSBlW3VdLmVuZCkgOiBpLnB1c2goZVt1XSk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGkucHVzaChlW3VdKTtcbiAgICAgIH1cbiAgICBlbHNlXG4gICAgICBpID0gZTtcbiAgICBsZXQgbyA9IDAsIGEsIGwgPSB0LCBjID0gdDtcbiAgICBmb3IgKGxldCB1ID0gMDsgdSA8IGkubGVuZ3RoOyB1KyspIHtcbiAgICAgIGNvbnN0IGQgPSBpW3VdLnN0YXJ0LCBoID0gaVt1XS5lbmQ7XG4gICAgICBpZiAobiA9PT0gLTEgJiYgdCA+PSBkICYmIHQgPD0gaCAmJiAobiA9IHUpLCB0ICsgciA+PSBkICYmIHQgPCBoKVxuICAgICAgICBsID0gZCwgYyA9IGgsIG8gPSBjIC0gdDtcbiAgICAgIGVsc2UgaWYgKHQgKyByIDwgZCkge1xuICAgICAgICBhID0gZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsZW46IG8sXG4gICAgICBzdGFydDogbCB8fCAwLFxuICAgICAgZW5kOiBjIHx8IDAsXG4gICAgICBuZXh0U3RhcnQ6IGEsXG4gICAgICBidWZmZXJlZDogZSxcbiAgICAgIGJ1ZmZlcmVkSW5kZXg6IG5cbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBTYWZlIG1ldGhvZCB0byBnZXQgYnVmZmVyZWQgcHJvcGVydHkuXG4gICAqIFNvdXJjZUJ1ZmZlci5idWZmZXJlZCBtYXkgdGhyb3cgaWYgU291cmNlQnVmZmVyIGlzIHJlbW92ZWQgZnJvbSBpdCdzIE1lZGlhU291cmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0QnVmZmVyZWQoZSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZS5idWZmZXJlZCB8fCB2aDtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICByZXR1cm4gcnQubG9nKFwiZmFpbGVkIHRvIGdldCBtZWRpYS5idWZmZXJlZFwiLCB0KSwgdmg7XG4gICAgfVxuICB9XG59XG5jb25zdCBxZyA9IC9cXHtcXCQoW2EtekEtWjAtOS1fXSspXFx9L2c7XG5mdW5jdGlvbiBFaChzKSB7XG4gIHJldHVybiBxZy50ZXN0KHMpO1xufVxuZnVuY3Rpb24gZGMocywgZSkge1xuICBpZiAocy52YXJpYWJsZUxpc3QgIT09IG51bGwgfHwgcy5oYXNWYXJpYWJsZVJlZnMpIHtcbiAgICBjb25zdCB0ID0gcy52YXJpYWJsZUxpc3Q7XG4gICAgcmV0dXJuIGUucmVwbGFjZShxZywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByLnN1YnN0cmluZygyLCByLmxlbmd0aCAtIDEpLCBpID0gdCA9PSBudWxsID8gdm9pZCAwIDogdFtuXTtcbiAgICAgIHJldHVybiBpID09PSB2b2lkIDAgPyAocy5wbGF5bGlzdFBhcnNpbmdFcnJvciB8fCAocy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihgTWlzc2luZyBwcmVjZWRpbmcgRVhULVgtREVGSU5FIHRhZyBmb3IgVmFyaWFibGUgUmVmZXJlbmNlOiBcIiR7bn1cImApKSwgcikgOiBpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24geGgocywgZSwgdCkge1xuICBsZXQgciA9IHMudmFyaWFibGVMaXN0O1xuICByIHx8IChzLnZhcmlhYmxlTGlzdCA9IHIgPSB7fSk7XG4gIGxldCBuLCBpO1xuICBpZiAoXCJRVUVSWVBBUkFNXCIgaW4gZSkge1xuICAgIG4gPSBlLlFVRVJZUEFSQU07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG8gPSBuZXcgc2VsZi5VUkwodCkuc2VhcmNoUGFyYW1zO1xuICAgICAgaWYgKG8uaGFzKG4pKVxuICAgICAgICBpID0gby5nZXQobik7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCIke259XCIgZG9lcyBub3QgbWF0Y2ggYW55IHF1ZXJ5IHBhcmFtZXRlciBpbiBVUkk6IFwiJHt0fVwiYCk7XG4gICAgfSBjYXRjaCAobykge1xuICAgICAgcy5wbGF5bGlzdFBhcnNpbmdFcnJvciB8fCAocy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihgRVhULVgtREVGSU5FIFFVRVJZUEFSQU06ICR7by5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0gZWxzZVxuICAgIG4gPSBlLk5BTUUsIGkgPSBlLlZBTFVFO1xuICBuIGluIHIgPyBzLnBsYXlsaXN0UGFyc2luZ0Vycm9yIHx8IChzLnBsYXlsaXN0UGFyc2luZ0Vycm9yID0gbmV3IEVycm9yKGBFWFQtWC1ERUZJTkUgZHVwbGljYXRlIFZhcmlhYmxlIE5hbWUgZGVjbGFyYXRpb25zOiBcIiR7bn1cImApKSA6IHJbbl0gPSBpIHx8IFwiXCI7XG59XG5mdW5jdGlvbiBEYihzLCBlLCB0KSB7XG4gIGNvbnN0IHIgPSBlLklNUE9SVDtcbiAgaWYgKHQgJiYgciBpbiB0KSB7XG4gICAgbGV0IG4gPSBzLnZhcmlhYmxlTGlzdDtcbiAgICBuIHx8IChzLnZhcmlhYmxlTGlzdCA9IG4gPSB7fSksIG5bcl0gPSB0W3JdO1xuICB9IGVsc2VcbiAgICBzLnBsYXlsaXN0UGFyc2luZ0Vycm9yIHx8IChzLnBsYXlsaXN0UGFyc2luZ0Vycm9yID0gbmV3IEVycm9yKGBFWFQtWC1ERUZJTkUgSU1QT1JUIGF0dHJpYnV0ZSBub3QgZm91bmQgaW4gTXVsdGl2YXJpYW50IFBsYXlsaXN0OiBcIiR7cn1cImApKTtcbn1cbmNvbnN0IFBiID0gL14oXFxkKyl4KFxcZCspJC8sIFNoID0gLyguKz8pPShcIi4qP1wifC4qPykoPzosfCQpL2c7XG5jbGFzcyBndCB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICB0eXBlb2YgZSA9PSBcInN0cmluZ1wiICYmIChlID0gZ3QucGFyc2VBdHRyTGlzdChlLCB0KSksIG50KHRoaXMsIGUpO1xuICB9XG4gIGdldCBjbGllbnRBdHRycygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykuZmlsdGVyKChlKSA9PiBlLnN1YnN0cmluZygwLCAyKSA9PT0gXCJYLVwiKTtcbiAgfVxuICBkZWNpbWFsSW50ZWdlcihlKSB7XG4gICAgY29uc3QgdCA9IHBhcnNlSW50KHRoaXNbZV0sIDEwKTtcbiAgICByZXR1cm4gdCA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSID8gMSAvIDAgOiB0O1xuICB9XG4gIGhleGFkZWNpbWFsSW50ZWdlcihlKSB7XG4gICAgaWYgKHRoaXNbZV0pIHtcbiAgICAgIGxldCB0ID0gKHRoaXNbZV0gfHwgXCIweFwiKS5zbGljZSgyKTtcbiAgICAgIHQgPSAodC5sZW5ndGggJiAxID8gXCIwXCIgOiBcIlwiKSArIHQ7XG4gICAgICBjb25zdCByID0gbmV3IFVpbnQ4QXJyYXkodC5sZW5ndGggLyAyKTtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGggLyAyOyBuKyspXG4gICAgICAgIHJbbl0gPSBwYXJzZUludCh0LnNsaWNlKG4gKiAyLCBuICogMiArIDIpLCAxNik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaGV4YWRlY2ltYWxJbnRlZ2VyQXNOdW1iZXIoZSkge1xuICAgIGNvbnN0IHQgPSBwYXJzZUludCh0aGlzW2VdLCAxNik7XG4gICAgcmV0dXJuIHQgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA/IDEgLyAwIDogdDtcbiAgfVxuICBkZWNpbWFsRmxvYXRpbmdQb2ludChlKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpc1tlXSk7XG4gIH1cbiAgb3B0aW9uYWxGbG9hdChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXNbZV07XG4gICAgcmV0dXJuIHIgPyBwYXJzZUZsb2F0KHIpIDogdDtcbiAgfVxuICBlbnVtZXJhdGVkU3RyaW5nKGUpIHtcbiAgICByZXR1cm4gdGhpc1tlXTtcbiAgfVxuICBlbnVtZXJhdGVkU3RyaW5nTGlzdChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXNbZV07XG4gICAgcmV0dXJuIChyID8gci5zcGxpdCgvWyAsXSsvKSA6IFtdKS5yZWR1Y2UoKG4sIGkpID0+IChuW2kudG9Mb3dlckNhc2UoKV0gPSAhMCwgbiksIHQpO1xuICB9XG4gIGJvb2woZSkge1xuICAgIHJldHVybiB0aGlzW2VdID09PSBcIllFU1wiO1xuICB9XG4gIGRlY2ltYWxSZXNvbHV0aW9uKGUpIHtcbiAgICBjb25zdCB0ID0gUGIuZXhlYyh0aGlzW2VdKTtcbiAgICBpZiAodCAhPT0gbnVsbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBwYXJzZUludCh0WzFdLCAxMCksXG4gICAgICAgIGhlaWdodDogcGFyc2VJbnQodFsyXSwgMTApXG4gICAgICB9O1xuICB9XG4gIHN0YXRpYyBwYXJzZUF0dHJMaXN0KGUsIHQpIHtcbiAgICBsZXQgcjtcbiAgICBjb25zdCBuID0ge307XG4gICAgZm9yIChTaC5sYXN0SW5kZXggPSAwOyAociA9IFNoLmV4ZWMoZSkpICE9PSBudWxsOyApIHtcbiAgICAgIGNvbnN0IG8gPSByWzFdLnRyaW0oKTtcbiAgICAgIGxldCBhID0gclsyXTtcbiAgICAgIGNvbnN0IGwgPSBhLmluZGV4T2YoJ1wiJykgPT09IDAgJiYgYS5sYXN0SW5kZXhPZignXCInKSA9PT0gYS5sZW5ndGggLSAxO1xuICAgICAgbGV0IGMgPSAhMTtcbiAgICAgIGlmIChsKVxuICAgICAgICBhID0gYS5zbGljZSgxLCAtMSk7XG4gICAgICBlbHNlXG4gICAgICAgIHN3aXRjaCAobykge1xuICAgICAgICAgIGNhc2UgXCJJVlwiOlxuICAgICAgICAgIGNhc2UgXCJTQ1RFMzUtQ01EXCI6XG4gICAgICAgICAgY2FzZSBcIlNDVEUzNS1JTlwiOlxuICAgICAgICAgIGNhc2UgXCJTQ1RFMzUtT1VUXCI6XG4gICAgICAgICAgICBjID0gITA7XG4gICAgICAgIH1cbiAgICAgIGlmICh0ICYmIChsIHx8IGMpKVxuICAgICAgICBhID0gZGModCwgYSk7XG4gICAgICBlbHNlIGlmICghYyAmJiAhbClcbiAgICAgICAgc3dpdGNoIChvKSB7XG4gICAgICAgICAgY2FzZSBcIkNMT1NFRC1DQVBUSU9OU1wiOlxuICAgICAgICAgICAgaWYgKGEgPT09IFwiTk9ORVwiKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgY2FzZSBcIkFMTE9XRUQtQ1BDXCI6XG4gICAgICAgICAgY2FzZSBcIkNMQVNTXCI6XG4gICAgICAgICAgY2FzZSBcIkFTU09DLUxBTkdVQUdFXCI6XG4gICAgICAgICAgY2FzZSBcIkFVRElPXCI6XG4gICAgICAgICAgY2FzZSBcIkJZVEVSQU5HRVwiOlxuICAgICAgICAgIGNhc2UgXCJDSEFOTkVMU1wiOlxuICAgICAgICAgIGNhc2UgXCJDSEFSQUNURVJJU1RJQ1NcIjpcbiAgICAgICAgICBjYXNlIFwiQ09ERUNTXCI6XG4gICAgICAgICAgY2FzZSBcIkRBVEEtSURcIjpcbiAgICAgICAgICBjYXNlIFwiRU5ELURBVEVcIjpcbiAgICAgICAgICBjYXNlIFwiR1JPVVAtSURcIjpcbiAgICAgICAgICBjYXNlIFwiSURcIjpcbiAgICAgICAgICBjYXNlIFwiSU1QT1JUXCI6XG4gICAgICAgICAgY2FzZSBcIklOU1RSRUFNLUlEXCI6XG4gICAgICAgICAgY2FzZSBcIktFWUZPUk1BVFwiOlxuICAgICAgICAgIGNhc2UgXCJLRVlGT1JNQVRWRVJTSU9OU1wiOlxuICAgICAgICAgIGNhc2UgXCJMQU5HVUFHRVwiOlxuICAgICAgICAgIGNhc2UgXCJOQU1FXCI6XG4gICAgICAgICAgY2FzZSBcIlBBVEhXQVktSURcIjpcbiAgICAgICAgICBjYXNlIFwiUVVFUllQQVJBTVwiOlxuICAgICAgICAgIGNhc2UgXCJSRUNFTlRMWS1SRU1PVkVELURBVEVSQU5HRVNcIjpcbiAgICAgICAgICBjYXNlIFwiU0VSVkVSLVVSSVwiOlxuICAgICAgICAgIGNhc2UgXCJTVEFCTEUtUkVORElUSU9OLUlEXCI6XG4gICAgICAgICAgY2FzZSBcIlNUQUJMRS1WQVJJQU5ULUlEXCI6XG4gICAgICAgICAgY2FzZSBcIlNUQVJULURBVEVcIjpcbiAgICAgICAgICBjYXNlIFwiU1VCVElUTEVTXCI6XG4gICAgICAgICAgY2FzZSBcIlNVUFBMRU1FTlRBTC1DT0RFQ1NcIjpcbiAgICAgICAgICBjYXNlIFwiVVJJXCI6XG4gICAgICAgICAgY2FzZSBcIlZBTFVFXCI6XG4gICAgICAgICAgY2FzZSBcIlZJREVPXCI6XG4gICAgICAgICAgY2FzZSBcIlgtQVNTRVQtTElTVFwiOlxuICAgICAgICAgIGNhc2UgXCJYLUFTU0VULVVSSVwiOlxuICAgICAgICAgICAgcnQud2FybihgJHtlfTogYXR0cmlidXRlICR7b30gaXMgbWlzc2luZyBxdW90ZXNgKTtcbiAgICAgICAgfVxuICAgICAgbltvXSA9IGE7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG59XG5jb25zdCBNYiA9IFwiY29tLmFwcGxlLmhscy5pbnRlcnN0aXRpYWxcIjtcbmZ1bmN0aW9uIE9iKHMpIHtcbiAgcmV0dXJuIHMgIT09IFwiSURcIiAmJiBzICE9PSBcIkNMQVNTXCIgJiYgcyAhPT0gXCJDVUVcIiAmJiBzICE9PSBcIlNUQVJULURBVEVcIiAmJiBzICE9PSBcIkRVUkFUSU9OXCIgJiYgcyAhPT0gXCJFTkQtREFURVwiICYmIHMgIT09IFwiRU5ELU9OLU5FWFRcIjtcbn1cbmZ1bmN0aW9uIEJiKHMpIHtcbiAgcmV0dXJuIHMgPT09IFwiU0NURTM1LU9VVFwiIHx8IHMgPT09IFwiU0NURTM1LUlOXCIgfHwgcyA9PT0gXCJTQ1RFMzUtQ01EXCI7XG59XG5jbGFzcyBXZyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIgPSAwKSB7XG4gICAgdmFyIG47XG4gICAgaWYgKHRoaXMuYXR0ciA9IHZvaWQgMCwgdGhpcy50YWdBbmNob3IgPSB2b2lkIDAsIHRoaXMudGFnT3JkZXIgPSB2b2lkIDAsIHRoaXMuX3N0YXJ0RGF0ZSA9IHZvaWQgMCwgdGhpcy5fZW5kRGF0ZSA9IHZvaWQgMCwgdGhpcy5fZGF0ZUF0RW5kID0gdm9pZCAwLCB0aGlzLl9jdWUgPSB2b2lkIDAsIHRoaXMuX2JhZFZhbHVlRm9yU2FtZUlkID0gdm9pZCAwLCB0aGlzLnRhZ0FuY2hvciA9ICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LnRhZ0FuY2hvcikgfHwgbnVsbCwgdGhpcy50YWdPcmRlciA9IChuID0gdCA9PSBudWxsID8gdm9pZCAwIDogdC50YWdPcmRlcikgIT0gbnVsbCA/IG4gOiByLCB0KSB7XG4gICAgICBjb25zdCBpID0gdC5hdHRyO1xuICAgICAgZm9yIChjb25zdCBvIGluIGkpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykgJiYgZVtvXSAhPT0gaVtvXSkge1xuICAgICAgICAgIHJ0Lndhcm4oYERBVEVSQU5HRSB0YWcgYXR0cmlidXRlOiBcIiR7b31cIiBkb2VzIG5vdCBtYXRjaCBmb3IgdGFncyB3aXRoIElEOiBcIiR7ZS5JRH1cImApLCB0aGlzLl9iYWRWYWx1ZUZvclNhbWVJZCA9IG87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGUgPSBudChuZXcgZ3Qoe30pLCBpLCBlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXR0ciA9IGUsIHQgPyAodGhpcy5fc3RhcnREYXRlID0gdC5fc3RhcnREYXRlLCB0aGlzLl9jdWUgPSB0Ll9jdWUsIHRoaXMuX2VuZERhdGUgPSB0Ll9lbmREYXRlLCB0aGlzLl9kYXRlQXRFbmQgPSB0Ll9kYXRlQXRFbmQpIDogdGhpcy5fc3RhcnREYXRlID0gbmV3IERhdGUoZVtcIlNUQVJULURBVEVcIl0pLCBcIkVORC1EQVRFXCIgaW4gdGhpcy5hdHRyKSB7XG4gICAgICBjb25zdCBpID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZW5kRGF0ZSkgfHwgbmV3IERhdGUodGhpcy5hdHRyW1wiRU5ELURBVEVcIl0pO1xuICAgICAgdWUoaS5nZXRUaW1lKCkpICYmICh0aGlzLl9lbmREYXRlID0gaSk7XG4gICAgfVxuICB9XG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyLklEO1xuICB9XG4gIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyLkNMQVNTO1xuICB9XG4gIGdldCBjdWUoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuX2N1ZTtcbiAgICByZXR1cm4gZSA9PT0gdm9pZCAwID8gdGhpcy5fY3VlID0gdGhpcy5hdHRyLmVudW1lcmF0ZWRTdHJpbmdMaXN0KHRoaXMuYXR0ci5DVUUgPyBcIkNVRVwiIDogXCJYLUNVRVwiLCB7XG4gICAgICBwcmU6ICExLFxuICAgICAgcG9zdDogITEsXG4gICAgICBvbmNlOiAhMVxuICAgIH0pIDogZTtcbiAgfVxuICBnZXQgc3RhcnRUaW1lKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRhZ0FuY2hvcjogZVxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBlID09PSBudWxsIHx8IGUucHJvZ3JhbURhdGVUaW1lID09PSBudWxsID8gKHJ0Lndhcm4oYEV4cGVjdGVkIHRhZ0FuY2hvciBGcmFnbWVudCB3aXRoIFBEVCBzZXQgZm9yIERhdGVSYW5nZSBcIiR7dGhpcy5pZH1cIjogJHtlfWApLCBOYU4pIDogZS5zdGFydCArICh0aGlzLnN0YXJ0RGF0ZS5nZXRUaW1lKCkgLSBlLnByb2dyYW1EYXRlVGltZSkgLyAxZTM7XG4gIH1cbiAgZ2V0IHN0YXJ0RGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnREYXRlO1xuICB9XG4gIGdldCBlbmREYXRlKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLl9lbmREYXRlIHx8IHRoaXMuX2RhdGVBdEVuZDtcbiAgICBpZiAoZSlcbiAgICAgIHJldHVybiBlO1xuICAgIGNvbnN0IHQgPSB0aGlzLmR1cmF0aW9uO1xuICAgIHJldHVybiB0ICE9PSBudWxsID8gdGhpcy5fZGF0ZUF0RW5kID0gbmV3IERhdGUodGhpcy5fc3RhcnREYXRlLmdldFRpbWUoKSArIHQgKiAxZTMpIDogbnVsbDtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgaWYgKFwiRFVSQVRJT05cIiBpbiB0aGlzLmF0dHIpIHtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmF0dHIuZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJEVVJBVElPTlwiKTtcbiAgICAgIGlmICh1ZShlKSlcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9lbmREYXRlKVxuICAgICAgcmV0dXJuICh0aGlzLl9lbmREYXRlLmdldFRpbWUoKSAtIHRoaXMuX3N0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gMWUzO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBwbGFubmVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIFwiUExBTk5FRC1EVVJBVElPTlwiIGluIHRoaXMuYXR0ciA/IHRoaXMuYXR0ci5kZWNpbWFsRmxvYXRpbmdQb2ludChcIlBMQU5ORUQtRFVSQVRJT05cIikgOiBudWxsO1xuICB9XG4gIGdldCBlbmRPbk5leHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0ci5ib29sKFwiRU5ELU9OLU5FWFRcIik7XG4gIH1cbiAgZ2V0IGlzSW50ZXJzdGl0aWFsKCkge1xuICAgIHJldHVybiB0aGlzLmNsYXNzID09PSBNYjtcbiAgfVxuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmlkICYmICF0aGlzLl9iYWRWYWx1ZUZvclNhbWVJZCAmJiB1ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRUaW1lKCkpICYmICh0aGlzLmR1cmF0aW9uID09PSBudWxsIHx8IHRoaXMuZHVyYXRpb24gPj0gMCkgJiYgKCF0aGlzLmVuZE9uTmV4dCB8fCAhIXRoaXMuY2xhc3MpICYmICghdGhpcy5hdHRyLkNVRSB8fCAhdGhpcy5jdWUucHJlICYmICF0aGlzLmN1ZS5wb3N0IHx8IHRoaXMuY3VlLnByZSAhPT0gdGhpcy5jdWUucG9zdCkgJiYgKCF0aGlzLmlzSW50ZXJzdGl0aWFsIHx8IFwiWC1BU1NFVC1VUklcIiBpbiB0aGlzLmF0dHIgfHwgXCJYLUFTU0VULUxJU1RcIiBpbiB0aGlzLmF0dHIpO1xuICB9XG59XG5jb25zdCBGYiA9IDEwO1xuY2xhc3MgTmIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5QVFNLbm93biA9ICExLCB0aGlzLmFsaWduZWRTbGlkaW5nID0gITEsIHRoaXMuYXZlcmFnZXRhcmdldGR1cmF0aW9uID0gdm9pZCAwLCB0aGlzLmVuZENDID0gMCwgdGhpcy5lbmRTTiA9IDAsIHRoaXMuZnJhZ21lbnRzID0gdm9pZCAwLCB0aGlzLmZyYWdtZW50SGludCA9IHZvaWQgMCwgdGhpcy5wYXJ0TGlzdCA9IG51bGwsIHRoaXMuZGF0ZVJhbmdlcyA9IHZvaWQgMCwgdGhpcy5kYXRlUmFuZ2VUYWdDb3VudCA9IDAsIHRoaXMubGl2ZSA9ICEwLCB0aGlzLnJlcXVlc3RTY2hlZHVsZWQgPSAtMSwgdGhpcy5hZ2VIZWFkZXIgPSAwLCB0aGlzLmFkdmFuY2VkRGF0ZVRpbWUgPSB2b2lkIDAsIHRoaXMudXBkYXRlZCA9ICEwLCB0aGlzLmFkdmFuY2VkID0gITAsIHRoaXMubWlzc2VzID0gMCwgdGhpcy5zdGFydENDID0gMCwgdGhpcy5zdGFydFNOID0gMCwgdGhpcy5zdGFydFRpbWVPZmZzZXQgPSBudWxsLCB0aGlzLnRhcmdldGR1cmF0aW9uID0gMCwgdGhpcy50b3RhbGR1cmF0aW9uID0gMCwgdGhpcy50eXBlID0gbnVsbCwgdGhpcy51cmwgPSB2b2lkIDAsIHRoaXMubTN1OCA9IFwiXCIsIHRoaXMudmVyc2lvbiA9IG51bGwsIHRoaXMuY2FuQmxvY2tSZWxvYWQgPSAhMSwgdGhpcy5jYW5Ta2lwVW50aWwgPSAwLCB0aGlzLmNhblNraXBEYXRlUmFuZ2VzID0gITEsIHRoaXMuc2tpcHBlZFNlZ21lbnRzID0gMCwgdGhpcy5yZWNlbnRseVJlbW92ZWREYXRlcmFuZ2VzID0gdm9pZCAwLCB0aGlzLnBhcnRIb2xkQmFjayA9IDAsIHRoaXMuaG9sZEJhY2sgPSAwLCB0aGlzLnBhcnRUYXJnZXQgPSAwLCB0aGlzLnByZWxvYWRIaW50ID0gdm9pZCAwLCB0aGlzLnJlbmRpdGlvblJlcG9ydHMgPSB2b2lkIDAsIHRoaXMudHVuZUluR29hbCA9IDAsIHRoaXMuZGVsdGFVcGRhdGVGYWlsZWQgPSB2b2lkIDAsIHRoaXMuZHJpZnRTdGFydFRpbWUgPSAwLCB0aGlzLmRyaWZ0RW5kVGltZSA9IDAsIHRoaXMuZHJpZnRTdGFydCA9IDAsIHRoaXMuZHJpZnRFbmQgPSAwLCB0aGlzLmVuY3J5cHRlZEZyYWdtZW50cyA9IHZvaWQgMCwgdGhpcy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG51bGwsIHRoaXMudmFyaWFibGVMaXN0ID0gbnVsbCwgdGhpcy5oYXNWYXJpYWJsZVJlZnMgPSAhMSwgdGhpcy5hcHBsaWVkVGltZWxpbmVPZmZzZXQgPSB2b2lkIDAsIHRoaXMuZnJhZ21lbnRzID0gW10sIHRoaXMuZW5jcnlwdGVkRnJhZ21lbnRzID0gW10sIHRoaXMuZGF0ZVJhbmdlcyA9IHt9LCB0aGlzLnVybCA9IGU7XG4gIH1cbiAgcmVsb2FkZWQoZSkge1xuICAgIGlmICghZSkge1xuICAgICAgdGhpcy5hZHZhbmNlZCA9ICEwLCB0aGlzLnVwZGF0ZWQgPSAhMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdCA9IHRoaXMubGFzdFBhcnRTbiAtIGUubGFzdFBhcnRTbiwgciA9IHRoaXMubGFzdFBhcnRJbmRleCAtIGUubGFzdFBhcnRJbmRleDtcbiAgICB0aGlzLnVwZGF0ZWQgPSB0aGlzLmVuZFNOICE9PSBlLmVuZFNOIHx8ICEhciB8fCAhIXQgfHwgIXRoaXMubGl2ZSwgdGhpcy5hZHZhbmNlZCA9IHRoaXMuZW5kU04gPiBlLmVuZFNOIHx8IHQgPiAwIHx8IHQgPT09IDAgJiYgciA+IDAsIHRoaXMudXBkYXRlZCB8fCB0aGlzLmFkdmFuY2VkID8gdGhpcy5taXNzZXMgPSBNYXRoLmZsb29yKGUubWlzc2VzICogMC42KSA6IHRoaXMubWlzc2VzID0gZS5taXNzZXMgKyAxO1xuICB9XG4gIGhhc0tleShlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jcnlwdGVkRnJhZ21lbnRzLnNvbWUoKHQpID0+IHtcbiAgICAgIGxldCByID0gdC5kZWNyeXB0ZGF0YTtcbiAgICAgIHJldHVybiByIHx8ICh0LnNldEtleUZvcm1hdChlLmtleUZvcm1hdCksIHIgPSB0LmRlY3J5cHRkYXRhKSwgISFyICYmIGUubWF0Y2hlcyhyKTtcbiAgICB9KTtcbiAgfVxuICBnZXQgaGFzUHJvZ3JhbURhdGVUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmZyYWdtZW50cy5sZW5ndGggPyB1ZSh0aGlzLmZyYWdtZW50c1t0aGlzLmZyYWdtZW50cy5sZW5ndGggLSAxXS5wcm9ncmFtRGF0ZVRpbWUpIDogITE7XG4gIH1cbiAgZ2V0IGxldmVsVGFyZ2V0RHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXZlcmFnZXRhcmdldGR1cmF0aW9uIHx8IHRoaXMudGFyZ2V0ZHVyYXRpb24gfHwgRmI7XG4gIH1cbiAgZ2V0IGRyaWZ0KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmRyaWZ0RW5kVGltZSAtIHRoaXMuZHJpZnRTdGFydFRpbWU7XG4gICAgcmV0dXJuIGUgPiAwID8gKHRoaXMuZHJpZnRFbmQgLSB0aGlzLmRyaWZ0U3RhcnQpICogMWUzIC8gZSA6IDE7XG4gIH1cbiAgZ2V0IGVkZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydEVuZCB8fCB0aGlzLmZyYWdtZW50RW5kO1xuICB9XG4gIGdldCBwYXJ0RW5kKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoZSA9IHRoaXMucGFydExpc3QpICE9IG51bGwgJiYgZS5sZW5ndGggPyB0aGlzLnBhcnRMaXN0W3RoaXMucGFydExpc3QubGVuZ3RoIC0gMV0uZW5kIDogdGhpcy5mcmFnbWVudEVuZDtcbiAgfVxuICBnZXQgZnJhZ21lbnRFbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJhZ21lbnRzLmxlbmd0aCA/IHRoaXMuZnJhZ21lbnRzW3RoaXMuZnJhZ21lbnRzLmxlbmd0aCAtIDFdLmVuZCA6IDA7XG4gIH1cbiAgZ2V0IGZyYWdtZW50U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJhZ21lbnRzLmxlbmd0aCA/IHRoaXMuZnJhZ21lbnRzWzBdLnN0YXJ0IDogMDtcbiAgfVxuICBnZXQgYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmFkdmFuY2VkRGF0ZVRpbWUgPyBNYXRoLm1heChEYXRlLm5vdygpIC0gdGhpcy5hZHZhbmNlZERhdGVUaW1lLCAwKSAvIDFlMyA6IDA7XG4gIH1cbiAgZ2V0IGxhc3RQYXJ0SW5kZXgoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIChlID0gdGhpcy5wYXJ0TGlzdCkgIT0gbnVsbCAmJiBlLmxlbmd0aCA/IHRoaXMucGFydExpc3RbdGhpcy5wYXJ0TGlzdC5sZW5ndGggLSAxXS5pbmRleCA6IC0xO1xuICB9XG4gIGdldCBtYXhQYXJ0SW5kZXgoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucGFydExpc3Q7XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLmxhc3RQYXJ0SW5kZXg7XG4gICAgICBpZiAodCAhPT0gLTEpIHtcbiAgICAgICAgZm9yIChsZXQgciA9IGUubGVuZ3RoOyByLS07IClcbiAgICAgICAgICBpZiAoZVtyXS5pbmRleCA+IHQpXG4gICAgICAgICAgICByZXR1cm4gZVtyXS5pbmRleDtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBsYXN0UGFydFNuKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoZSA9IHRoaXMucGFydExpc3QpICE9IG51bGwgJiYgZS5sZW5ndGggPyB0aGlzLnBhcnRMaXN0W3RoaXMucGFydExpc3QubGVuZ3RoIC0gMV0uZnJhZ21lbnQuc24gOiB0aGlzLmVuZFNOO1xuICB9XG4gIGdldCBleHBpcmVkKCkge1xuICAgIGlmICh0aGlzLmxpdmUgJiYgdGhpcy5hZ2UgJiYgdGhpcy5taXNzZXMgPCAzKSB7XG4gICAgICBjb25zdCBlID0gdGhpcy5wYXJ0RW5kIC0gdGhpcy5mcmFnbWVudFN0YXJ0O1xuICAgICAgcmV0dXJuIHRoaXMuYWdlID4gTWF0aC5tYXgoZSwgdGhpcy50b3RhbGR1cmF0aW9uKSArIHRoaXMubGV2ZWxUYXJnZXREdXJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG59XG5mdW5jdGlvbiB4dShzLCBlKSB7XG4gIHJldHVybiBzLmxlbmd0aCA9PT0gZS5sZW5ndGggPyAhcy5zb21lKCh0LCByKSA9PiB0ICE9PSBlW3JdKSA6ICExO1xufVxuZnVuY3Rpb24gYmgocywgZSkge1xuICByZXR1cm4gIXMgJiYgIWUgPyAhMCA6ICFzIHx8ICFlID8gITEgOiB4dShzLCBlKTtcbn1cbmZ1bmN0aW9uIEluKHMpIHtcbiAgcmV0dXJuIHMgPT09IFwiQUVTLTEyOFwiIHx8IHMgPT09IFwiQUVTLTI1NlwiIHx8IHMgPT09IFwiQUVTLTI1Ni1DVFJcIjtcbn1cbmZ1bmN0aW9uIFN1KHMpIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSBcIkFFUy0xMjhcIjpcbiAgICBjYXNlIFwiQUVTLTI1NlwiOlxuICAgICAgcmV0dXJuIE9zLmNiYztcbiAgICBjYXNlIFwiQUVTLTI1Ni1DVFJcIjpcbiAgICAgIHJldHVybiBPcy5jdHI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBmdWxsIHNlZ21lbnQgbWV0aG9kICR7c31gKTtcbiAgfVxufVxuZnVuY3Rpb24gYnUocykge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IocyksIChlKSA9PiBlLmNoYXJDb2RlQXQoMCkpO1xufVxuZnVuY3Rpb24gaGMocykge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSksIChlKSA9PiBlLmNoYXJDb2RlQXQoMCkpO1xufVxuZnVuY3Rpb24gVWIocykge1xuICBjb25zdCBlID0gaGMocykuc3ViYXJyYXkoMCwgMTYpLCB0ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICByZXR1cm4gdC5zZXQoZSwgMTYgLSBlLmxlbmd0aCksIHQ7XG59XG5mdW5jdGlvbiB6ZyhzKSB7XG4gIGNvbnN0IGUgPSBmdW5jdGlvbihyLCBuLCBpKSB7XG4gICAgY29uc3QgbyA9IHJbbl07XG4gICAgcltuXSA9IHJbaV0sIHJbaV0gPSBvO1xuICB9O1xuICBlKHMsIDAsIDMpLCBlKHMsIDEsIDIpLCBlKHMsIDQsIDUpLCBlKHMsIDYsIDcpO1xufVxuZnVuY3Rpb24gJGIocykge1xuICBjb25zdCBlID0gcy5zcGxpdChcIjpcIik7XG4gIGxldCB0ID0gbnVsbDtcbiAgaWYgKGVbMF0gPT09IFwiZGF0YVwiICYmIGUubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgciA9IGVbMV0uc3BsaXQoXCI7XCIpLCBuID0gcltyLmxlbmd0aCAtIDFdLnNwbGl0KFwiLFwiKTtcbiAgICBpZiAobi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IGkgPSBuWzBdID09PSBcImJhc2U2NFwiLCBvID0gblsxXTtcbiAgICAgIGkgPyAoci5zcGxpY2UoLTEsIDEpLCB0ID0gYnUobykpIDogdCA9IFViKG8pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdDtcbn1cbmNvbnN0IHJhID0gdHlwZW9mIHNlbGYgPCBcInVcIiA/IHNlbGYgOiB2b2lkIDA7XG52YXIgbXQgPSB7XG4gIENMRUFSS0VZOiBcIm9yZy53My5jbGVhcmtleVwiLFxuICBGQUlSUExBWTogXCJjb20uYXBwbGUuZnBzXCIsXG4gIFBMQVlSRUFEWTogXCJjb20ubWljcm9zb2Z0LnBsYXlyZWFkeVwiLFxuICBXSURFVklORTogXCJjb20ud2lkZXZpbmUuYWxwaGFcIlxufSwgbHIgPSB7XG4gIENMRUFSS0VZOiBcIm9yZy53My5jbGVhcmtleVwiLFxuICBGQUlSUExBWTogXCJjb20uYXBwbGUuc3RyZWFtaW5na2V5ZGVsaXZlcnlcIixcbiAgUExBWVJFQURZOiBcImNvbS5taWNyb3NvZnQucGxheXJlYWR5XCIsXG4gIFdJREVWSU5FOiBcInVybjp1dWlkOmVkZWY4YmE5LTc5ZDYtNGFjZS1hM2M4LTI3ZGNkNTFkMjFlZFwiXG59O1xuZnVuY3Rpb24gcG8ocykge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIGxyLkZBSVJQTEFZOlxuICAgICAgcmV0dXJuIG10LkZBSVJQTEFZO1xuICAgIGNhc2UgbHIuUExBWVJFQURZOlxuICAgICAgcmV0dXJuIG10LlBMQVlSRUFEWTtcbiAgICBjYXNlIGxyLldJREVWSU5FOlxuICAgICAgcmV0dXJuIG10LldJREVWSU5FO1xuICAgIGNhc2UgbHIuQ0xFQVJLRVk6XG4gICAgICByZXR1cm4gbXQuQ0xFQVJLRVk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZsKHMpIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSBtdC5GQUlSUExBWTpcbiAgICAgIHJldHVybiBsci5GQUlSUExBWTtcbiAgICBjYXNlIG10LlBMQVlSRUFEWTpcbiAgICAgIHJldHVybiBsci5QTEFZUkVBRFk7XG4gICAgY2FzZSBtdC5XSURFVklORTpcbiAgICAgIHJldHVybiBsci5XSURFVklORTtcbiAgICBjYXNlIG10LkNMRUFSS0VZOlxuICAgICAgcmV0dXJuIGxyLkNMRUFSS0VZO1xuICB9XG59XG5mdW5jdGlvbiB6bihzKSB7XG4gIGNvbnN0IHtcbiAgICBkcm1TeXN0ZW1zOiBlLFxuICAgIHdpZGV2aW5lTGljZW5zZVVybDogdFxuICB9ID0gcywgciA9IGUgPyBbbXQuRkFJUlBMQVksIG10LldJREVWSU5FLCBtdC5QTEFZUkVBRFksIG10LkNMRUFSS0VZXS5maWx0ZXIoKG4pID0+ICEhZVtuXSkgOiBbXTtcbiAgcmV0dXJuICFyW210LldJREVWSU5FXSAmJiB0ICYmIHIucHVzaChtdC5XSURFVklORSksIHI7XG59XG5jb25zdCBZZyA9IChmdW5jdGlvbihzKSB7XG4gIHJldHVybiByYSAhPSBudWxsICYmIChzID0gcmEubmF2aWdhdG9yKSAhPSBudWxsICYmIHMucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzID8gc2VsZi5uYXZpZ2F0b3IucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzLmJpbmQoc2VsZi5uYXZpZ2F0b3IpIDogbnVsbDtcbn0pKCk7XG5mdW5jdGlvbiBHYihzLCBlLCB0LCByKSB7XG4gIGxldCBuO1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIG10LkZBSVJQTEFZOlxuICAgICAgbiA9IFtcImNlbmNcIiwgXCJzaW5mXCJdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBtdC5XSURFVklORTpcbiAgICBjYXNlIG10LlBMQVlSRUFEWTpcbiAgICAgIG4gPSBbXCJjZW5jXCJdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBtdC5DTEVBUktFWTpcbiAgICAgIG4gPSBbXCJjZW5jXCIsIFwia2V5aWRzXCJdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBrZXktc3lzdGVtOiAke3N9YCk7XG4gIH1cbiAgcmV0dXJuIFZiKG4sIGUsIHQsIHIpO1xufVxuZnVuY3Rpb24gVmIocywgZSwgdCwgcikge1xuICByZXR1cm4gW3tcbiAgICBpbml0RGF0YVR5cGVzOiBzLFxuICAgIHBlcnNpc3RlbnRTdGF0ZTogci5wZXJzaXN0ZW50U3RhdGUgfHwgXCJvcHRpb25hbFwiLFxuICAgIGRpc3RpbmN0aXZlSWRlbnRpZmllcjogci5kaXN0aW5jdGl2ZUlkZW50aWZpZXIgfHwgXCJvcHRpb25hbFwiLFxuICAgIHNlc3Npb25UeXBlczogci5zZXNzaW9uVHlwZXMgfHwgW3Iuc2Vzc2lvblR5cGUgfHwgXCJ0ZW1wb3JhcnlcIl0sXG4gICAgYXVkaW9DYXBhYmlsaXRpZXM6IGUubWFwKChpKSA9PiAoe1xuICAgICAgY29udGVudFR5cGU6IGBhdWRpby9tcDQ7IGNvZGVjcz0ke2l9YCxcbiAgICAgIHJvYnVzdG5lc3M6IHIuYXVkaW9Sb2J1c3RuZXNzIHx8IFwiXCIsXG4gICAgICBlbmNyeXB0aW9uU2NoZW1lOiByLmF1ZGlvRW5jcnlwdGlvblNjaGVtZSB8fCBudWxsXG4gICAgfSkpLFxuICAgIHZpZGVvQ2FwYWJpbGl0aWVzOiB0Lm1hcCgoaSkgPT4gKHtcbiAgICAgIGNvbnRlbnRUeXBlOiBgdmlkZW8vbXA0OyBjb2RlY3M9JHtpfWAsXG4gICAgICByb2J1c3RuZXNzOiByLnZpZGVvUm9idXN0bmVzcyB8fCBcIlwiLFxuICAgICAgZW5jcnlwdGlvblNjaGVtZTogci52aWRlb0VuY3J5cHRpb25TY2hlbWUgfHwgbnVsbFxuICAgIH0pKVxuICB9XTtcbn1cbmZ1bmN0aW9uIGpiKHMpIHtcbiAgdmFyIGU7XG4gIHJldHVybiAhIXMgJiYgKHMuc2Vzc2lvblR5cGUgPT09IFwicGVyc2lzdGVudC1saWNlbnNlXCIgfHwgISEoKGUgPSBzLnNlc3Npb25UeXBlcykgIT0gbnVsbCAmJiBlLnNvbWUoKHQpID0+IHQgPT09IFwicGVyc2lzdGVudC1saWNlbnNlXCIpKSk7XG59XG5mdW5jdGlvbiBLYihzKSB7XG4gIGNvbnN0IGUgPSBuZXcgVWludDE2QXJyYXkocy5idWZmZXIsIHMuYnl0ZU9mZnNldCwgcy5ieXRlTGVuZ3RoIC8gMiksIHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20oZSkpLCByID0gdC5zdWJzdHJpbmcodC5pbmRleE9mKFwiPFwiKSwgdC5sZW5ndGgpLCBvID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhyLCBcInRleHQveG1sXCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiS0lEXCIpWzBdO1xuICBpZiAobykge1xuICAgIGNvbnN0IGEgPSBvLmNoaWxkTm9kZXNbMF0gPyBvLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlIDogby5nZXRBdHRyaWJ1dGUoXCJWQUxVRVwiKTtcbiAgICBpZiAoYSkge1xuICAgICAgY29uc3QgbCA9IGJ1KGEpLnN1YmFycmF5KDAsIDE2KTtcbiAgICAgIHJldHVybiB6ZyhsKSwgbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5sZXQgV2kgPSB7fTtcbmNsYXNzIHlpIHtcbiAgc3RhdGljIGNsZWFyS2V5VXJpVG9LZXlJZE1hcCgpIHtcbiAgICBXaSA9IHt9O1xuICB9XG4gIHN0YXRpYyBzZXRLZXlJZEZvclVyaShlLCB0KSB7XG4gICAgV2lbZV0gPSB0O1xuICB9XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4gPSBbMV0sIGkgPSBudWxsLCBvKSB7XG4gICAgdGhpcy51cmkgPSB2b2lkIDAsIHRoaXMubWV0aG9kID0gdm9pZCAwLCB0aGlzLmtleUZvcm1hdCA9IHZvaWQgMCwgdGhpcy5rZXlGb3JtYXRWZXJzaW9ucyA9IHZvaWQgMCwgdGhpcy5lbmNyeXB0ZWQgPSB2b2lkIDAsIHRoaXMuaXNDb21tb25FbmNyeXB0aW9uID0gdm9pZCAwLCB0aGlzLml2ID0gbnVsbCwgdGhpcy5rZXkgPSBudWxsLCB0aGlzLmtleUlkID0gbnVsbCwgdGhpcy5wc3NoID0gbnVsbCwgdGhpcy5tZXRob2QgPSBlLCB0aGlzLnVyaSA9IHQsIHRoaXMua2V5Rm9ybWF0ID0gciwgdGhpcy5rZXlGb3JtYXRWZXJzaW9ucyA9IG4sIHRoaXMuaXYgPSBpLCB0aGlzLmVuY3J5cHRlZCA9IGUgPyBlICE9PSBcIk5PTkVcIiA6ICExLCB0aGlzLmlzQ29tbW9uRW5jcnlwdGlvbiA9IHRoaXMuZW5jcnlwdGVkICYmICFJbihlKSwgbyAhPSBudWxsICYmIG8uc3RhcnRzV2l0aChcIjB4XCIpICYmICh0aGlzLmtleUlkID0gbmV3IFVpbnQ4QXJyYXkoSWcobykpKTtcbiAgfVxuICBtYXRjaGVzKGUpIHtcbiAgICByZXR1cm4gZS51cmkgPT09IHRoaXMudXJpICYmIGUubWV0aG9kID09PSB0aGlzLm1ldGhvZCAmJiBlLmVuY3J5cHRlZCA9PT0gdGhpcy5lbmNyeXB0ZWQgJiYgZS5rZXlGb3JtYXQgPT09IHRoaXMua2V5Rm9ybWF0ICYmIHh1KGUua2V5Rm9ybWF0VmVyc2lvbnMsIHRoaXMua2V5Rm9ybWF0VmVyc2lvbnMpICYmIGJoKGUuaXYsIHRoaXMuaXYpICYmIGJoKGUua2V5SWQsIHRoaXMua2V5SWQpO1xuICB9XG4gIGlzU3VwcG9ydGVkKCkge1xuICAgIGlmICh0aGlzLm1ldGhvZCkge1xuICAgICAgaWYgKEluKHRoaXMubWV0aG9kKSB8fCB0aGlzLm1ldGhvZCA9PT0gXCJOT05FXCIpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIGlmICh0aGlzLmtleUZvcm1hdCA9PT0gXCJpZGVudGl0eVwiKVxuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QgPT09IFwiU0FNUExFLUFFU1wiO1xuICAgICAgc3dpdGNoICh0aGlzLmtleUZvcm1hdCkge1xuICAgICAgICBjYXNlIGxyLkZBSVJQTEFZOlxuICAgICAgICBjYXNlIGxyLldJREVWSU5FOlxuICAgICAgICBjYXNlIGxyLlBMQVlSRUFEWTpcbiAgICAgICAgY2FzZSBsci5DTEVBUktFWTpcbiAgICAgICAgICByZXR1cm4gW1wiU0FNUExFLUFFU1wiLCBcIlNBTVBMRS1BRVMtQ0VOQ1wiLCBcIlNBTVBMRS1BRVMtQ1RSXCJdLmluZGV4T2YodGhpcy5tZXRob2QpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGdldERlY3J5cHREYXRhKGUpIHtcbiAgICBpZiAoIXRoaXMuZW5jcnlwdGVkIHx8ICF0aGlzLnVyaSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChJbih0aGlzLm1ldGhvZCkpIHtcbiAgICAgIGxldCBuID0gdGhpcy5pdjtcbiAgICAgIHJldHVybiBuIHx8ICh0eXBlb2YgZSAhPSBcIm51bWJlclwiICYmIChydC53YXJuKGBtaXNzaW5nIElWIGZvciBpbml0aWFsaXphdGlvbiBzZWdtZW50IHdpdGggbWV0aG9kPVwiJHt0aGlzLm1ldGhvZH1cIiAtIGNvbXBsaWFuY2UgaXNzdWVgKSwgZSA9IDApLCBuID0gSGIoZSkpLCBuZXcgeWkodGhpcy5tZXRob2QsIHRoaXMudXJpLCBcImlkZW50aXR5XCIsIHRoaXMua2V5Rm9ybWF0VmVyc2lvbnMsIG4pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wc3NoICYmIHRoaXMua2V5SWQpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICBjb25zdCB0ID0gJGIodGhpcy51cmkpO1xuICAgIGlmICh0KVxuICAgICAgc3dpdGNoICh0aGlzLmtleUZvcm1hdCkge1xuICAgICAgICBjYXNlIGxyLldJREVWSU5FOlxuICAgICAgICAgIGlmICh0aGlzLnBzc2ggPSB0LCAhdGhpcy5rZXlJZCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IFdTKHQuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChuLmxlbmd0aCkge1xuICAgICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IG5bMF07XG4gICAgICAgICAgICAgIHRoaXMua2V5SWQgPSAociA9IGkua2lkcykgIT0gbnVsbCAmJiByLmxlbmd0aCA/IGkua2lkc1swXSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5rZXlJZCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQubGVuZ3RoIC0gMjI7XG4gICAgICAgICAgICB0aGlzLmtleUlkID0gdC5zdWJhcnJheShuLCBuICsgMTYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBsci5QTEFZUkVBRFk6IHtcbiAgICAgICAgICBjb25zdCBuID0gbmV3IFVpbnQ4QXJyYXkoWzE1NCwgNCwgMjQwLCAxMjEsIDE1MiwgNjQsIDY2LCAxMzQsIDE3MSwgMTQ2LCAyMzAsIDkxLCAyMjQsIDEzNiwgOTUsIDE0OV0pO1xuICAgICAgICAgIHRoaXMucHNzaCA9IHFTKG4sIG51bGwsIHQpLCB0aGlzLmtleUlkID0gS2IodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxldCBuID0gdC5zdWJhcnJheSgwLCAxNik7XG4gICAgICAgICAgaWYgKG4ubGVuZ3RoICE9PSAxNikge1xuICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgIGkuc2V0KG4sIDE2IC0gbi5sZW5ndGgpLCBuID0gaTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5rZXlJZCA9IG47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBpZiAoIXRoaXMua2V5SWQgfHwgdGhpcy5rZXlJZC5ieXRlTGVuZ3RoICE9PSAxNikge1xuICAgICAgbGV0IG4gPSBXaVt0aGlzLnVyaV07XG4gICAgICBpZiAoIW4pIHtcbiAgICAgICAgY29uc3QgaSA9IE9iamVjdC5rZXlzKFdpKS5sZW5ndGggJSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgbiA9IG5ldyBVaW50OEFycmF5KDE2KSwgbmV3IERhdGFWaWV3KG4uYnVmZmVyLCAxMiwgNCkuc2V0VWludDMyKDAsIGkpLCB5aS5zZXRLZXlJZEZvclVyaSh0aGlzLnVyaSwgbik7XG4gICAgICB9XG4gICAgICB0aGlzLmtleUlkID0gbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmZ1bmN0aW9uIEhiKHMpIHtcbiAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgZm9yIChsZXQgdCA9IDEyOyB0IDwgMTY7IHQrKylcbiAgICBlW3RdID0gcyA+PiA4ICogKDE1IC0gdCkgJiAyNTU7XG4gIHJldHVybiBlO1xufVxuY29uc3QgVGggPSAvI0VYVC1YLVNUUkVBTS1JTkY6KFteXFxyXFxuXSopKD86W1xcclxcbl0oPzojW15cXHJcXG5dKik/KSooW15cXHJcXG5dKyl8I0VYVC1YLShTRVNTSU9OLURBVEF8U0VTU0lPTi1LRVl8REVGSU5FfENPTlRFTlQtU1RFRVJJTkd8U1RBUlQpOihbXlxcclxcbl0qKVtcXHJcXG5dKy9nLCB3aCA9IC8jRVhULVgtTUVESUE6KC4qKS9nLCBxYiA9IC9eI0VYVCg/OklORnwtWC1UQVJHRVREVVJBVElPTik6L20sIGdsID0gbmV3IFJlZ0V4cChbXG4gIC8jRVhUSU5GOlxccyooXFxkKig/OlxcLlxcZCspPykoPzosKC4qKVxccyspPy8uc291cmNlLFxuICAvLyBkdXJhdGlvbiAoI0VYVElORjo8ZHVyYXRpb24+LDx0aXRsZT4pLCBncm91cCAxID0+IGR1cmF0aW9uLCBncm91cCAyID0+IHRpdGxlXG4gIC8oPyEjKSAqKFxcU1teXFxyXFxuXSopLy5zb3VyY2UsXG4gIC8vIHNlZ21lbnQgVVJJLCBncm91cCAzID0+IHRoZSBVUkkgKG5vdGUgbmV3bGluZSBpcyBub3QgZWF0ZW4pXG4gIC8jLiovLnNvdXJjZVxuICAvLyBBbGwgb3RoZXIgbm9uLXNlZ21lbnQgb3JpZW50ZWQgdGFncyB3aWxsIG1hdGNoIHdpdGggYWxsIGdyb3VwcyBlbXB0eVxuXS5qb2luKFwifFwiKSwgXCJnXCIpLCBXYiA9IG5ldyBSZWdFeHAoWy8jRVhULVgtKFBST0dSQU0tREFURS1USU1FfEJZVEVSQU5HRXxEQVRFUkFOR0V8REVGSU5FfEtFWXxNQVB8UEFSVHxQQVJULUlORnxQTEFZTElTVC1UWVBFfFBSRUxPQUQtSElOVHxSRU5ESVRJT04tUkVQT1JUfFNFUlZFUi1DT05UUk9MfFNLSVB8U1RBUlQpOiguKykvLnNvdXJjZSwgLyNFWFQtWC0oQklUUkFURXxESVNDT05USU5VSVRZLVNFUVVFTkNFfE1FRElBLVNFUVVFTkNFfFRBUkdFVERVUkFUSU9OfFZFUlNJT04pOiAqKFxcZCspLy5zb3VyY2UsIC8jRVhULVgtKERJU0NPTlRJTlVJVFl8RU5ETElTVHxHQVB8SU5ERVBFTkRFTlQtU0VHTUVOVFMpLy5zb3VyY2UsIC8oIykoW146XSopOiguKikvLnNvdXJjZSwgLygjKSguKikoPzouKilcXHI/XFxuPy8uc291cmNlXS5qb2luKFwifFwiKSk7XG5jbGFzcyB6ciB7XG4gIHN0YXRpYyBmaW5kR3JvdXAoZSwgdCkge1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgY29uc3QgbiA9IGVbcl07XG4gICAgICBpZiAobi5pZCA9PT0gdClcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZXNvbHZlKGUsIHQpIHtcbiAgICByZXR1cm4gaHUuYnVpbGRBYnNvbHV0ZVVSTCh0LCBlLCB7XG4gICAgICBhbHdheXNOb3JtYWxpemU6ICEwXG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGlzTWVkaWFQbGF5bGlzdChlKSB7XG4gICAgcmV0dXJuIHFiLnRlc3QoZSk7XG4gIH1cbiAgc3RhdGljIHBhcnNlTWFzdGVyUGxheWxpc3QoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBFaChlKSwgbiA9IHtcbiAgICAgIGNvbnRlbnRTdGVlcmluZzogbnVsbCxcbiAgICAgIGxldmVsczogW10sXG4gICAgICBwbGF5bGlzdFBhcnNpbmdFcnJvcjogbnVsbCxcbiAgICAgIHNlc3Npb25EYXRhOiBudWxsLFxuICAgICAgc2Vzc2lvbktleXM6IG51bGwsXG4gICAgICBzdGFydFRpbWVPZmZzZXQ6IG51bGwsXG4gICAgICB2YXJpYWJsZUxpc3Q6IG51bGwsXG4gICAgICBoYXNWYXJpYWJsZVJlZnM6IHJcbiAgICB9LCBpID0gW107XG4gICAgaWYgKFRoLmxhc3RJbmRleCA9IDAsICFlLnN0YXJ0c1dpdGgoXCIjRVhUTTNVXCIpKVxuICAgICAgcmV0dXJuIG4ucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoXCJubyBFWFRNM1UgZGVsaW1pdGVyXCIpLCBuO1xuICAgIGxldCBvO1xuICAgIGZvciAoOyAobyA9IFRoLmV4ZWMoZSkpICE9IG51bGw7IClcbiAgICAgIGlmIChvWzFdKSB7XG4gICAgICAgIHZhciBhO1xuICAgICAgICBjb25zdCBjID0gbmV3IGd0KG9bMV0sIG4pLCB1ID0gZGMobiwgb1syXSksIGQgPSB7XG4gICAgICAgICAgYXR0cnM6IGMsXG4gICAgICAgICAgYml0cmF0ZTogYy5kZWNpbWFsSW50ZWdlcihcIkJBTkRXSURUSFwiKSB8fCBjLmRlY2ltYWxJbnRlZ2VyKFwiQVZFUkFHRS1CQU5EV0lEVEhcIiksXG4gICAgICAgICAgbmFtZTogYy5OQU1FLFxuICAgICAgICAgIHVybDogenIucmVzb2x2ZSh1LCB0KVxuICAgICAgICB9LCBoID0gYy5kZWNpbWFsUmVzb2x1dGlvbihcIlJFU09MVVRJT05cIik7XG4gICAgICAgIGggJiYgKGQud2lkdGggPSBoLndpZHRoLCBkLmhlaWdodCA9IGguaGVpZ2h0KSwgX2goYy5DT0RFQ1MsIGQpO1xuICAgICAgICBjb25zdCBmID0gY1tcIlNVUFBMRU1FTlRBTC1DT0RFQ1NcIl07XG4gICAgICAgIGYgJiYgKGQuc3VwcGxlbWVudGFsID0ge30sIF9oKGYsIGQuc3VwcGxlbWVudGFsKSksIChhID0gZC51bmtub3duQ29kZWNzKSAhPSBudWxsICYmIGEubGVuZ3RoIHx8IGkucHVzaChkKSwgbi5sZXZlbHMucHVzaChkKTtcbiAgICAgIH0gZWxzZSBpZiAob1szXSkge1xuICAgICAgICBjb25zdCBjID0gb1szXSwgdSA9IG9bNF07XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgXCJTRVNTSU9OLURBVEFcIjoge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBndCh1LCBuKSwgaCA9IGRbXCJEQVRBLUlEXCJdO1xuICAgICAgICAgICAgaCAmJiAobi5zZXNzaW9uRGF0YSA9PT0gbnVsbCAmJiAobi5zZXNzaW9uRGF0YSA9IHt9KSwgbi5zZXNzaW9uRGF0YVtoXSA9IGQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJTRVNTSU9OLUtFWVwiOiB7XG4gICAgICAgICAgICBjb25zdCBkID0gQWgodSwgdCwgbik7XG4gICAgICAgICAgICBkLmVuY3J5cHRlZCAmJiBkLmlzU3VwcG9ydGVkKCkgPyAobi5zZXNzaW9uS2V5cyA9PT0gbnVsbCAmJiAobi5zZXNzaW9uS2V5cyA9IFtdKSwgbi5zZXNzaW9uS2V5cy5wdXNoKGQpKSA6IHJ0Lndhcm4oYFtLZXlzXSBJZ25vcmluZyBpbnZhbGlkIEVYVC1YLVNFU1NJT04tS0VZIHRhZzogXCIke3V9XCJgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiREVGSU5FXCI6IHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBndCh1LCBuKTtcbiAgICAgICAgICAgICAgeGgobiwgZCwgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIkNPTlRFTlQtU1RFRVJJTkdcIjoge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBndCh1LCBuKTtcbiAgICAgICAgICAgIG4uY29udGVudFN0ZWVyaW5nID0ge1xuICAgICAgICAgICAgICB1cmk6IHpyLnJlc29sdmUoZFtcIlNFUlZFUi1VUklcIl0sIHQpLFxuICAgICAgICAgICAgICBwYXRod2F5SWQ6IGRbXCJQQVRIV0FZLUlEXCJdIHx8IFwiLlwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJTVEFSVFwiOiB7XG4gICAgICAgICAgICBuLnN0YXJ0VGltZU9mZnNldCA9IEloKHUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgY29uc3QgbCA9IGkubGVuZ3RoID4gMCAmJiBpLmxlbmd0aCA8IG4ubGV2ZWxzLmxlbmd0aDtcbiAgICByZXR1cm4gbi5sZXZlbHMgPSBsID8gaSA6IG4ubGV2ZWxzLCBuLmxldmVscy5sZW5ndGggPT09IDAgJiYgKG4ucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoXCJubyBsZXZlbHMgZm91bmQgaW4gbWFuaWZlc3RcIikpLCBuO1xuICB9XG4gIHN0YXRpYyBwYXJzZU1hc3RlclBsYXlsaXN0TWVkaWEoZSwgdCwgcikge1xuICAgIGxldCBuO1xuICAgIGNvbnN0IGkgPSB7fSwgbyA9IHIubGV2ZWxzLCBhID0ge1xuICAgICAgQVVESU86IG8ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5hdHRycy5BVURJTyxcbiAgICAgICAgYXVkaW9Db2RlYzogYy5hdWRpb0NvZGVjXG4gICAgICB9KSksXG4gICAgICBTVUJUSVRMRVM6IG8ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5hdHRycy5TVUJUSVRMRVMsXG4gICAgICAgIHRleHRDb2RlYzogYy50ZXh0Q29kZWNcbiAgICAgIH0pKSxcbiAgICAgIFwiQ0xPU0VELUNBUFRJT05TXCI6IFtdXG4gICAgfTtcbiAgICBsZXQgbCA9IDA7XG4gICAgZm9yICh3aC5sYXN0SW5kZXggPSAwOyAobiA9IHdoLmV4ZWMoZSkpICE9PSBudWxsOyApIHtcbiAgICAgIGNvbnN0IGMgPSBuZXcgZ3QoblsxXSwgciksIHUgPSBjLlRZUEU7XG4gICAgICBpZiAodSkge1xuICAgICAgICBjb25zdCBkID0gYVt1XSwgaCA9IGlbdV0gfHwgW107XG4gICAgICAgIGlbdV0gPSBoO1xuICAgICAgICBjb25zdCBmID0gYy5MQU5HVUFHRSwgcCA9IGNbXCJBU1NPQy1MQU5HVUFHRVwiXSwgeSA9IGMuQ0hBTk5FTFMsIEUgPSBjLkNIQVJBQ1RFUklTVElDUywgYiA9IGNbXCJJTlNUUkVBTS1JRFwiXSwgUiA9IHtcbiAgICAgICAgICBhdHRyczogYyxcbiAgICAgICAgICBiaXRyYXRlOiAwLFxuICAgICAgICAgIGlkOiBsKyssXG4gICAgICAgICAgZ3JvdXBJZDogY1tcIkdST1VQLUlEXCJdIHx8IFwiXCIsXG4gICAgICAgICAgbmFtZTogYy5OQU1FIHx8IGYgfHwgXCJcIixcbiAgICAgICAgICB0eXBlOiB1LFxuICAgICAgICAgIGRlZmF1bHQ6IGMuYm9vbChcIkRFRkFVTFRcIiksXG4gICAgICAgICAgYXV0b3NlbGVjdDogYy5ib29sKFwiQVVUT1NFTEVDVFwiKSxcbiAgICAgICAgICBmb3JjZWQ6IGMuYm9vbChcIkZPUkNFRFwiKSxcbiAgICAgICAgICBsYW5nOiBmLFxuICAgICAgICAgIHVybDogYy5VUkkgPyB6ci5yZXNvbHZlKGMuVVJJLCB0KSA6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHAgJiYgKFIuYXNzb2NMYW5nID0gcCksIHkgJiYgKFIuY2hhbm5lbHMgPSB5KSwgRSAmJiAoUi5jaGFyYWN0ZXJpc3RpY3MgPSBFKSwgYiAmJiAoUi5pbnN0cmVhbUlkID0gYiksIGQgIT0gbnVsbCAmJiBkLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IEEgPSB6ci5maW5kR3JvdXAoZCwgUi5ncm91cElkKSB8fCBkWzBdO1xuICAgICAgICAgIFJoKFIsIEEsIFwiYXVkaW9Db2RlY1wiKSwgUmgoUiwgQSwgXCJ0ZXh0Q29kZWNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaC5wdXNoKFIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuICBzdGF0aWMgcGFyc2VMZXZlbFBsYXlsaXN0KGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgICB2YXIgYTtcbiAgICBjb25zdCBsID0ge1xuICAgICAgdXJsOiB0XG4gICAgfSwgYyA9IG5ldyBOYih0KSwgdSA9IGMuZnJhZ21lbnRzLCBkID0gW107XG4gICAgbGV0IGggPSBudWxsLCBmID0gMCwgcCA9IDAsIHkgPSAwLCBFID0gMCwgYiA9IDAsIFIgPSBudWxsLCBBID0gbmV3IHVsKG4sIGwpLCBGLCBNLCBILCBLID0gLTEsIGogPSAhMSwgQyA9IG51bGwsIGs7XG4gICAgaWYgKGdsLmxhc3RJbmRleCA9IDAsIGMubTN1OCA9IGUsIGMuaGFzVmFyaWFibGVSZWZzID0gRWgoZSksICgoYSA9IGdsLmV4ZWMoZSkpID09IG51bGwgPyB2b2lkIDAgOiBhWzBdKSAhPT0gXCIjRVhUTTNVXCIpXG4gICAgICByZXR1cm4gYy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihcIk1pc3NpbmcgZm9ybWF0IGlkZW50aWZpZXIgI0VYVE0zVVwiKSwgYztcbiAgICBmb3IgKDsgKEYgPSBnbC5leGVjKGUpKSAhPT0gbnVsbDsgKSB7XG4gICAgICBqICYmIChqID0gITEsIEEgPSBuZXcgdWwobiwgbCksIEEucGxheWxpc3RPZmZzZXQgPSB5LCBBLnNldFN0YXJ0KHkpLCBBLnNuID0gZiwgQS5jYyA9IEUsIGIgJiYgKEEuYml0cmF0ZSA9IGIpLCBBLmxldmVsID0gciwgaCAmJiAoQS5pbml0U2VnbWVudCA9IGgsIGgucmF3UHJvZ3JhbURhdGVUaW1lICYmIChBLnJhd1Byb2dyYW1EYXRlVGltZSA9IGgucmF3UHJvZ3JhbURhdGVUaW1lLCBoLnJhd1Byb2dyYW1EYXRlVGltZSA9IG51bGwpLCBDICYmIChBLnNldEJ5dGVSYW5nZShDKSwgQyA9IG51bGwpKSk7XG4gICAgICBjb25zdCBnID0gRlsxXTtcbiAgICAgIGlmIChnKSB7XG4gICAgICAgIEEuZHVyYXRpb24gPSBwYXJzZUZsb2F0KGcpO1xuICAgICAgICBjb25zdCB4ID0gKFwiIFwiICsgRlsyXSkuc2xpY2UoMSk7XG4gICAgICAgIEEudGl0bGUgPSB4IHx8IG51bGwsIEEudGFnTGlzdC5wdXNoKHggPyBbXCJJTkZcIiwgZywgeF0gOiBbXCJJTkZcIiwgZ10pO1xuICAgICAgfSBlbHNlIGlmIChGWzNdKSB7XG4gICAgICAgIGlmICh1ZShBLmR1cmF0aW9uKSkge1xuICAgICAgICAgIEEucGxheWxpc3RPZmZzZXQgPSB5LCBBLnNldFN0YXJ0KHkpLCBIICYmIENoKEEsIEgsIGMpLCBBLnNuID0gZiwgQS5sZXZlbCA9IHIsIEEuY2MgPSBFLCB1LnB1c2goQSk7XG4gICAgICAgICAgY29uc3QgeCA9IChcIiBcIiArIEZbM10pLnNsaWNlKDEpO1xuICAgICAgICAgIEEucmVsdXJsID0gZGMoYywgeCksIGZjKEEsIFIsIGQpLCBSID0gQSwgeSArPSBBLmR1cmF0aW9uLCBmKyssIHAgPSAwLCBqID0gITA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChGID0gRlswXS5tYXRjaChXYiksICFGKSB7XG4gICAgICAgICAgcnQud2FybihcIk5vIG1hdGNoZXMgb24gc2xvdyByZWdleCBtYXRjaCBmb3IgbGV2ZWwgcGxheWxpc3QhXCIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoTSA9IDE7IE0gPCBGLmxlbmd0aCAmJiBGW01dID09PSB2b2lkIDA7IE0rKylcbiAgICAgICAgICA7XG4gICAgICAgIGNvbnN0IHggPSAoXCIgXCIgKyBGW01dKS5zbGljZSgxKSwgdyA9IChcIiBcIiArIEZbTSArIDFdKS5zbGljZSgxKSwgRCA9IEZbTSArIDJdID8gKFwiIFwiICsgRltNICsgMl0pLnNsaWNlKDEpIDogbnVsbDtcbiAgICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgICAgY2FzZSBcIkJZVEVSQU5HRVwiOlxuICAgICAgICAgICAgUiA/IEEuc2V0Qnl0ZVJhbmdlKHcsIFIpIDogQS5zZXRCeXRlUmFuZ2Uodyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiUFJPR1JBTS1EQVRFLVRJTUVcIjpcbiAgICAgICAgICAgIEEucmF3UHJvZ3JhbURhdGVUaW1lID0gdywgQS50YWdMaXN0LnB1c2goW1wiUFJPR1JBTS1EQVRFLVRJTUVcIiwgd10pLCBLID09PSAtMSAmJiAoSyA9IHUubGVuZ3RoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJQTEFZTElTVC1UWVBFXCI6XG4gICAgICAgICAgICBjLnR5cGUgJiYgbnMoYywgeCwgRiksIGMudHlwZSA9IHcudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJNRURJQS1TRVFVRU5DRVwiOlxuICAgICAgICAgICAgYy5zdGFydFNOICE9PSAwID8gbnMoYywgeCwgRikgOiB1Lmxlbmd0aCA+IDAgJiYga2goYywgeCwgRiksIGYgPSBjLnN0YXJ0U04gPSBwYXJzZUludCh3KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJTS0lQXCI6IHtcbiAgICAgICAgICAgIGMuc2tpcHBlZFNlZ21lbnRzICYmIG5zKGMsIHgsIEYpO1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3LCBjKSwgVSA9IE8uZGVjaW1hbEludGVnZXIoXCJTS0lQUEVELVNFR01FTlRTXCIpO1xuICAgICAgICAgICAgaWYgKHVlKFUpKSB7XG4gICAgICAgICAgICAgIGMuc2tpcHBlZFNlZ21lbnRzICs9IFU7XG4gICAgICAgICAgICAgIGZvciAobGV0IEwgPSBVOyBMLS07IClcbiAgICAgICAgICAgICAgICB1LnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgIGYgKz0gVTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFYgPSBPLmVudW1lcmF0ZWRTdHJpbmcoXCJSRUNFTlRMWS1SRU1PVkVELURBVEVSQU5HRVNcIik7XG4gICAgICAgICAgICBWICYmIChjLnJlY2VudGx5UmVtb3ZlZERhdGVyYW5nZXMgPSAoYy5yZWNlbnRseVJlbW92ZWREYXRlcmFuZ2VzIHx8IFtdKS5jb25jYXQoVi5zcGxpdChcIlx0XCIpKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIlRBUkdFVERVUkFUSU9OXCI6XG4gICAgICAgICAgICBjLnRhcmdldGR1cmF0aW9uICE9PSAwICYmIG5zKGMsIHgsIEYpLCBjLnRhcmdldGR1cmF0aW9uID0gTWF0aC5tYXgocGFyc2VJbnQodyksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIlZFUlNJT05cIjpcbiAgICAgICAgICAgIGMudmVyc2lvbiAhPT0gbnVsbCAmJiBucyhjLCB4LCBGKSwgYy52ZXJzaW9uID0gcGFyc2VJbnQodyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiSU5ERVBFTkRFTlQtU0VHTUVOVFNcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJFTkRMSVNUXCI6XG4gICAgICAgICAgICBjLmxpdmUgfHwgbnMoYywgeCwgRiksIGMubGl2ZSA9ICExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIiNcIjpcbiAgICAgICAgICAgICh3IHx8IEQpICYmIEEudGFnTGlzdC5wdXNoKEQgPyBbdywgRF0gOiBbd10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkRJU0NPTlRJTlVJVFlcIjpcbiAgICAgICAgICAgIEUrKywgQS50YWdMaXN0LnB1c2goW1wiRElTXCJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJHQVBcIjpcbiAgICAgICAgICAgIEEuZ2FwID0gITAsIEEudGFnTGlzdC5wdXNoKFt4XSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQklUUkFURVwiOlxuICAgICAgICAgICAgQS50YWdMaXN0LnB1c2goW3gsIHddKSwgYiA9IHBhcnNlSW50KHcpICogMWUzLCB1ZShiKSA/IEEuYml0cmF0ZSA9IGIgOiBiID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJEQVRFUkFOR0VcIjoge1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3LCBjKSwgVSA9IG5ldyBXZyhPLCBjLmRhdGVSYW5nZXNbTy5JRF0sIGMuZGF0ZVJhbmdlVGFnQ291bnQpO1xuICAgICAgICAgICAgYy5kYXRlUmFuZ2VUYWdDb3VudCsrLCBVLmlzVmFsaWQgfHwgYy5za2lwcGVkU2VnbWVudHMgPyBjLmRhdGVSYW5nZXNbVS5pZF0gPSBVIDogcnQud2FybihgSWdub3JpbmcgaW52YWxpZCBEQVRFUkFOR0UgdGFnOiBcIiR7d31cImApLCBBLnRhZ0xpc3QucHVzaChbXCJFWFQtWC1EQVRFUkFOR0VcIiwgd10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJERUZJTkVcIjoge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBPID0gbmV3IGd0KHcsIGMpO1xuICAgICAgICAgICAgICBcIklNUE9SVFwiIGluIE8gPyBEYihjLCBPLCBvKSA6IHhoKGMsIE8sIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJESVNDT05USU5VSVRZLVNFUVVFTkNFXCI6XG4gICAgICAgICAgICBjLnN0YXJ0Q0MgIT09IDAgPyBucyhjLCB4LCBGKSA6IHUubGVuZ3RoID4gMCAmJiBraChjLCB4LCBGKSwgYy5zdGFydENDID0gRSA9IHBhcnNlSW50KHcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIktFWVwiOiB7XG4gICAgICAgICAgICBjb25zdCBPID0gQWgodywgdCwgYyk7XG4gICAgICAgICAgICBpZiAoTy5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgICAgIGlmIChPLm1ldGhvZCA9PT0gXCJOT05FXCIpIHtcbiAgICAgICAgICAgICAgICBIID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEggfHwgKEggPSB7fSk7XG4gICAgICAgICAgICAgIGNvbnN0IFUgPSBIW08ua2V5Rm9ybWF0XTtcbiAgICAgICAgICAgICAgVSAhPSBudWxsICYmIFUubWF0Y2hlcyhPKSB8fCAoVSAmJiAoSCA9IG50KHt9LCBIKSksIEhbTy5rZXlGb3JtYXRdID0gTyk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgcnQud2FybihgW0tleXNdIElnbm9yaW5nIHVuc3VwcG9ydGVkIEVYVC1YLUtFWSB0YWc6IFwiJHt3fVwiYCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIlNUQVJUXCI6XG4gICAgICAgICAgICBjLnN0YXJ0VGltZU9mZnNldCA9IEloKHcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIk1BUFwiOiB7XG4gICAgICAgICAgICBjb25zdCBPID0gbmV3IGd0KHcsIGMpO1xuICAgICAgICAgICAgaWYgKEEuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgY29uc3QgVSA9IG5ldyB1bChuLCBsKTtcbiAgICAgICAgICAgICAgTGgoVSwgTywgciwgSCksIGggPSBVLCBBLmluaXRTZWdtZW50ID0gaCwgaC5yYXdQcm9ncmFtRGF0ZVRpbWUgJiYgIUEucmF3UHJvZ3JhbURhdGVUaW1lICYmIChBLnJhd1Byb2dyYW1EYXRlVGltZSA9IGgucmF3UHJvZ3JhbURhdGVUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IFUgPSBBLmJ5dGVSYW5nZUVuZE9mZnNldDtcbiAgICAgICAgICAgICAgaWYgKFUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBWID0gQS5ieXRlUmFuZ2VTdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICBDID0gYCR7VSAtIFZ9QCR7Vn1gO1xuICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBDID0gbnVsbDtcbiAgICAgICAgICAgICAgTGgoQSwgTywgciwgSCksIGggPSBBLCBqID0gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoLmNjID0gRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiU0VSVkVSLUNPTlRST0xcIjoge1xuICAgICAgICAgICAgayAmJiBucyhjLCB4LCBGKSwgayA9IG5ldyBndCh3KSwgYy5jYW5CbG9ja1JlbG9hZCA9IGsuYm9vbChcIkNBTi1CTE9DSy1SRUxPQURcIiksIGMuY2FuU2tpcFVudGlsID0gay5vcHRpb25hbEZsb2F0KFwiQ0FOLVNLSVAtVU5USUxcIiwgMCksIGMuY2FuU2tpcERhdGVSYW5nZXMgPSBjLmNhblNraXBVbnRpbCA+IDAgJiYgay5ib29sKFwiQ0FOLVNLSVAtREFURVJBTkdFU1wiKSwgYy5wYXJ0SG9sZEJhY2sgPSBrLm9wdGlvbmFsRmxvYXQoXCJQQVJULUhPTEQtQkFDS1wiLCAwKSwgYy5ob2xkQmFjayA9IGsub3B0aW9uYWxGbG9hdChcIkhPTEQtQkFDS1wiLCAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiUEFSVC1JTkZcIjoge1xuICAgICAgICAgICAgYy5wYXJ0VGFyZ2V0ICYmIG5zKGMsIHgsIEYpO1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3KTtcbiAgICAgICAgICAgIGMucGFydFRhcmdldCA9IE8uZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJQQVJULVRBUkdFVFwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiUEFSVFwiOiB7XG4gICAgICAgICAgICBsZXQgTyA9IGMucGFydExpc3Q7XG4gICAgICAgICAgICBPIHx8IChPID0gYy5wYXJ0TGlzdCA9IFtdKTtcbiAgICAgICAgICAgIGNvbnN0IFUgPSBwID4gMCA/IE9bTy5sZW5ndGggLSAxXSA6IHZvaWQgMCwgViA9IHArKywgTCA9IG5ldyBndCh3LCBjKSwgbSA9IG5ldyBQUyhMLCBBLCBsLCBWLCBVKTtcbiAgICAgICAgICAgIE8ucHVzaChtKSwgQS5kdXJhdGlvbiArPSBtLmR1cmF0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJQUkVMT0FELUhJTlRcIjoge1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3LCBjKTtcbiAgICAgICAgICAgIGMucHJlbG9hZEhpbnQgPSBPO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJSRU5ESVRJT04tUkVQT1JUXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IE8gPSBuZXcgZ3QodywgYyk7XG4gICAgICAgICAgICBjLnJlbmRpdGlvblJlcG9ydHMgPSBjLnJlbmRpdGlvblJlcG9ydHMgfHwgW10sIGMucmVuZGl0aW9uUmVwb3J0cy5wdXNoKE8pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBydC53YXJuKGBsaW5lIHBhcnNlZCBidXQgbm90IGhhbmRsZWQ6ICR7Rn1gKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFIgJiYgIVIucmVsdXJsID8gKHUucG9wKCksIHkgLT0gUi5kdXJhdGlvbiwgYy5wYXJ0TGlzdCAmJiAoYy5mcmFnbWVudEhpbnQgPSBSKSkgOiBjLnBhcnRMaXN0ICYmIChmYyhBLCBSLCBkKSwgQS5jYyA9IEUsIGMuZnJhZ21lbnRIaW50ID0gQSwgSCAmJiBDaChBLCBILCBjKSksIGMudGFyZ2V0ZHVyYXRpb24gfHwgKGMucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoXCJNaXNzaW5nIFRhcmdldCBEdXJhdGlvblwiKSk7XG4gICAgY29uc3QgJCA9IHUubGVuZ3RoLCBXID0gdVswXSwgXyA9IHVbJCAtIDFdO1xuICAgIGlmICh5ICs9IGMuc2tpcHBlZFNlZ21lbnRzICogYy50YXJnZXRkdXJhdGlvbiwgeSA+IDAgJiYgJCAmJiBfKSB7XG4gICAgICBjLmF2ZXJhZ2V0YXJnZXRkdXJhdGlvbiA9IHkgLyAkO1xuICAgICAgY29uc3QgZyA9IF8uc247XG4gICAgICBjLmVuZFNOID0gZyAhPT0gXCJpbml0U2VnbWVudFwiID8gZyA6IDAsIGMubGl2ZSB8fCAoXy5lbmRMaXN0ID0gITApLCBLID4gMCAmJiAoWWIodSwgSyksIFcgJiYgZC51bnNoaWZ0KFcpKTtcbiAgICB9XG4gICAgcmV0dXJuIGMuZnJhZ21lbnRIaW50ICYmICh5ICs9IGMuZnJhZ21lbnRIaW50LmR1cmF0aW9uKSwgYy50b3RhbGR1cmF0aW9uID0geSwgZC5sZW5ndGggJiYgYy5kYXRlUmFuZ2VUYWdDb3VudCAmJiBXICYmIFpnKGQsIGMpLCBjLmVuZENDID0gRSwgYztcbiAgfVxufVxuZnVuY3Rpb24gWmcocywgZSkge1xuICBsZXQgdCA9IHMubGVuZ3RoO1xuICBpZiAoIXQpXG4gICAgaWYgKGUuaGFzUHJvZ3JhbURhdGVUaW1lKSB7XG4gICAgICBjb25zdCBhID0gZS5mcmFnbWVudHNbZS5mcmFnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICBzLnB1c2goYSksIHQrKztcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybjtcbiAgY29uc3QgciA9IHNbdCAtIDFdLCBuID0gZS5saXZlID8gMSAvIDAgOiBlLnRvdGFsZHVyYXRpb24sIGkgPSBPYmplY3Qua2V5cyhlLmRhdGVSYW5nZXMpO1xuICBmb3IgKGxldCBhID0gaS5sZW5ndGg7IGEtLTsgKSB7XG4gICAgY29uc3QgbCA9IGUuZGF0ZVJhbmdlc1tpW2FdXSwgYyA9IGwuc3RhcnREYXRlLmdldFRpbWUoKTtcbiAgICBsLnRhZ0FuY2hvciA9IHIucmVmO1xuICAgIGZvciAobGV0IHUgPSB0OyB1LS07ICkge1xuICAgICAgdmFyIG87XG4gICAgICBpZiAoKChvID0gc1t1XSkgPT0gbnVsbCA/IHZvaWQgMCA6IG8uc24pIDwgZS5zdGFydFNOKVxuICAgICAgICBicmVhaztcbiAgICAgIGNvbnN0IGQgPSB6YihlLCBjLCBzLCB1LCBuKTtcbiAgICAgIGlmIChkICE9PSAtMSkge1xuICAgICAgICBsLnRhZ0FuY2hvciA9IGUuZnJhZ21lbnRzW2RdLnJlZjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB6YihzLCBlLCB0LCByLCBuKSB7XG4gIGNvbnN0IGkgPSB0W3JdO1xuICBpZiAoaSkge1xuICAgIGNvbnN0IGEgPSBpLnByb2dyYW1EYXRlVGltZTtcbiAgICBpZiAoZSA+PSBhIHx8IHIgPT09IDApIHtcbiAgICAgIHZhciBvO1xuICAgICAgY29uc3QgbCA9ICgoKG8gPSB0W3IgKyAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IG8uc3RhcnQpIHx8IG4pIC0gaS5zdGFydDtcbiAgICAgIGlmIChlIDw9IGEgKyBsICogMWUzKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0W3JdLnNuIC0gcy5zdGFydFNOO1xuICAgICAgICBpZiAoYyA8IDApXG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBjb25zdCB1ID0gcy5mcmFnbWVudHM7XG4gICAgICAgIGlmICh1Lmxlbmd0aCA+IHQubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgaCA9ICh0W3IgKyAxXSB8fCB1W3UubGVuZ3RoIC0gMV0pLnNuIC0gcy5zdGFydFNOO1xuICAgICAgICAgIGZvciAobGV0IGYgPSBoOyBmID4gYzsgZi0tKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdVtmXS5wcm9ncmFtRGF0ZVRpbWU7XG4gICAgICAgICAgICBpZiAoZSA+PSBwICYmIGUgPCBwICsgdVtmXS5kdXJhdGlvbiAqIDFlMylcbiAgICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBBaChzLCBlLCB0KSB7XG4gIHZhciByLCBuO1xuICBjb25zdCBpID0gbmV3IGd0KHMsIHQpLCBvID0gKHIgPSBpLk1FVEhPRCkgIT0gbnVsbCA/IHIgOiBcIlwiLCBhID0gaS5VUkksIGwgPSBpLmhleGFkZWNpbWFsSW50ZWdlcihcIklWXCIpLCBjID0gaS5LRVlGT1JNQVRWRVJTSU9OUywgdSA9IChuID0gaS5LRVlGT1JNQVQpICE9IG51bGwgPyBuIDogXCJpZGVudGl0eVwiO1xuICBhICYmIGkuSVYgJiYgIWwgJiYgcnQuZXJyb3IoYEludmFsaWQgSVY6ICR7aS5JVn1gKTtcbiAgY29uc3QgZCA9IGEgPyB6ci5yZXNvbHZlKGEsIGUpIDogXCJcIiwgaCA9IChjIHx8IFwiMVwiKS5zcGxpdChcIi9cIikubWFwKE51bWJlcikuZmlsdGVyKE51bWJlci5pc0Zpbml0ZSk7XG4gIHJldHVybiBuZXcgeWkobywgZCwgdSwgaCwgbCwgaS5LRVlJRCk7XG59XG5mdW5jdGlvbiBJaChzKSB7XG4gIGNvbnN0IHQgPSBuZXcgZ3QocykuZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJUSU1FLU9GRlNFVFwiKTtcbiAgcmV0dXJuIHVlKHQpID8gdCA6IG51bGw7XG59XG5mdW5jdGlvbiBfaChzLCBlKSB7XG4gIGxldCB0ID0gKHMgfHwgXCJcIikuc3BsaXQoL1sgLF0rLykuZmlsdGVyKChyKSA9PiByKTtcbiAgW1widmlkZW9cIiwgXCJhdWRpb1wiLCBcInRleHRcIl0uZm9yRWFjaCgocikgPT4ge1xuICAgIGNvbnN0IG4gPSB0LmZpbHRlcigoaSkgPT4gcHUoaSwgcikpO1xuICAgIG4ubGVuZ3RoICYmIChlW2Ake3J9Q29kZWNgXSA9IG4ubWFwKChpKSA9PiBpLnNwbGl0KFwiL1wiKVswXSkuam9pbihcIixcIiksIHQgPSB0LmZpbHRlcigoaSkgPT4gbi5pbmRleE9mKGkpID09PSAtMSkpO1xuICB9KSwgZS51bmtub3duQ29kZWNzID0gdDtcbn1cbmZ1bmN0aW9uIFJoKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IGVbdF07XG4gIHIgJiYgKHNbdF0gPSByKTtcbn1cbmZ1bmN0aW9uIFliKHMsIGUpIHtcbiAgbGV0IHQgPSBzW2VdO1xuICBmb3IgKGxldCByID0gZTsgci0tOyApIHtcbiAgICBjb25zdCBuID0gc1tyXTtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm47XG4gICAgbi5wcm9ncmFtRGF0ZVRpbWUgPSB0LnByb2dyYW1EYXRlVGltZSAtIG4uZHVyYXRpb24gKiAxZTMsIHQgPSBuO1xuICB9XG59XG5mdW5jdGlvbiBmYyhzLCBlLCB0KSB7XG4gIHMucmF3UHJvZ3JhbURhdGVUaW1lID8gdC5wdXNoKHMpIDogZSAhPSBudWxsICYmIGUucHJvZ3JhbURhdGVUaW1lICYmIChzLnByb2dyYW1EYXRlVGltZSA9IGUuZW5kUHJvZ3JhbURhdGVUaW1lKTtcbn1cbmZ1bmN0aW9uIExoKHMsIGUsIHQsIHIpIHtcbiAgcy5yZWx1cmwgPSBlLlVSSSwgZS5CWVRFUkFOR0UgJiYgcy5zZXRCeXRlUmFuZ2UoZS5CWVRFUkFOR0UpLCBzLmxldmVsID0gdCwgcy5zbiA9IFwiaW5pdFNlZ21lbnRcIiwgciAmJiAocy5sZXZlbGtleXMgPSByKSwgcy5pbml0U2VnbWVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBDaChzLCBlLCB0KSB7XG4gIHMubGV2ZWxrZXlzID0gZTtcbiAgY29uc3Qge1xuICAgIGVuY3J5cHRlZEZyYWdtZW50czogclxuICB9ID0gdDtcbiAgKCFyLmxlbmd0aCB8fCByW3IubGVuZ3RoIC0gMV0ubGV2ZWxrZXlzICE9PSBlKSAmJiBPYmplY3Qua2V5cyhlKS5zb21lKChuKSA9PiBlW25dLmlzQ29tbW9uRW5jcnlwdGlvbikgJiYgci5wdXNoKHMpO1xufVxuZnVuY3Rpb24gbnMocywgZSwgdCkge1xuICBzLnBsYXlsaXN0UGFyc2luZ0Vycm9yID0gbmV3IEVycm9yKGAjRVhULVgtJHtlfSBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKCR7dFswXX0pYCk7XG59XG5mdW5jdGlvbiBraChzLCBlLCB0KSB7XG4gIHMucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoYCNFWFQtWC0ke2V9IG11c3QgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgTWVkaWEgU2VnbWVudCAoJHt0WzBdfSlgKTtcbn1cbmZ1bmN0aW9uIHBsKHMsIGUpIHtcbiAgY29uc3QgdCA9IGUuc3RhcnRQVFM7XG4gIGlmICh1ZSh0KSkge1xuICAgIGxldCByID0gMCwgbjtcbiAgICBlLnNuID4gcy5zbiA/IChyID0gdCAtIHMuc3RhcnQsIG4gPSBzKSA6IChyID0gcy5zdGFydCAtIHQsIG4gPSBlKSwgbi5kdXJhdGlvbiAhPT0gciAmJiBuLnNldER1cmF0aW9uKHIpO1xuICB9IGVsc2UgZS5zbiA+IHMuc24gPyBzLmNjID09PSBlLmNjICYmIHMubWluRW5kUFRTID8gZS5zZXRTdGFydChzLnN0YXJ0ICsgKHMubWluRW5kUFRTIC0gcy5zdGFydCkpIDogZS5zZXRTdGFydChzLnN0YXJ0ICsgcy5kdXJhdGlvbikgOiBlLnNldFN0YXJ0KE1hdGgubWF4KHMuc3RhcnQgLSBlLmR1cmF0aW9uLCAwKSk7XG59XG5mdW5jdGlvbiBYZyhzLCBlLCB0LCByLCBuLCBpLCBvKSB7XG4gIHIgLSB0IDw9IDAgJiYgKG8ud2FybihcIkZyYWdtZW50IHNob3VsZCBoYXZlIGEgcG9zaXRpdmUgZHVyYXRpb25cIiwgZSksIHIgPSB0ICsgZS5kdXJhdGlvbiwgaSA9IG4gKyBlLmR1cmF0aW9uKTtcbiAgbGV0IGwgPSB0LCBjID0gcjtcbiAgY29uc3QgdSA9IGUuc3RhcnRQVFMsIGQgPSBlLmVuZFBUUztcbiAgaWYgKHVlKHUpKSB7XG4gICAgY29uc3QgYiA9IE1hdGguYWJzKHUgLSB0KTtcbiAgICBzICYmIGIgPiBzLnRvdGFsZHVyYXRpb24gPyBvLndhcm4oYG1lZGlhIHRpbWVzdGFtcHMgYW5kIHBsYXlsaXN0IHRpbWVzIGRpZmZlciBieSAke2J9cyBmb3IgbGV2ZWwgJHtlLmxldmVsfSAke3MudXJsfWApIDogdWUoZS5kZWx0YVBUUykgPyBlLmRlbHRhUFRTID0gTWF0aC5tYXgoYiwgZS5kZWx0YVBUUykgOiBlLmRlbHRhUFRTID0gYiwgbCA9IE1hdGgubWF4KHQsIHUpLCB0ID0gTWF0aC5taW4odCwgdSksIG4gPSBlLnN0YXJ0RFRTICE9PSB2b2lkIDAgPyBNYXRoLm1pbihuLCBlLnN0YXJ0RFRTKSA6IG4sIGMgPSBNYXRoLm1pbihyLCBkKSwgciA9IE1hdGgubWF4KHIsIGQpLCBpID0gZS5lbmREVFMgIT09IHZvaWQgMCA/IE1hdGgubWF4KGksIGUuZW5kRFRTKSA6IGk7XG4gIH1cbiAgY29uc3QgaCA9IHQgLSBlLnN0YXJ0O1xuICBlLnN0YXJ0ICE9PSAwICYmIGUuc2V0U3RhcnQodCksIGUuc2V0RHVyYXRpb24ociAtIGUuc3RhcnQpLCBlLnN0YXJ0UFRTID0gdCwgZS5tYXhTdGFydFBUUyA9IGwsIGUuc3RhcnREVFMgPSBuLCBlLmVuZFBUUyA9IHIsIGUubWluRW5kUFRTID0gYywgZS5lbmREVFMgPSBpO1xuICBjb25zdCBmID0gZS5zbjtcbiAgaWYgKCFzIHx8IGYgPCBzLnN0YXJ0U04gfHwgZiA+IHMuZW5kU04pXG4gICAgcmV0dXJuIDA7XG4gIGxldCBwO1xuICBjb25zdCB5ID0gZiAtIHMuc3RhcnRTTiwgRSA9IHMuZnJhZ21lbnRzO1xuICBmb3IgKEVbeV0gPSBlLCBwID0geTsgcCA+IDA7IHAtLSlcbiAgICBwbChFW3BdLCBFW3AgLSAxXSk7XG4gIGZvciAocCA9IHk7IHAgPCBFLmxlbmd0aCAtIDE7IHArKylcbiAgICBwbChFW3BdLCBFW3AgKyAxXSk7XG4gIHJldHVybiBzLmZyYWdtZW50SGludCAmJiBwbChFW0UubGVuZ3RoIC0gMV0sIHMuZnJhZ21lbnRIaW50KSwgcy5QVFNLbm93biA9IHMuYWxpZ25lZFNsaWRpbmcgPSAhMCwgaDtcbn1cbmZ1bmN0aW9uIFpiKHMsIGUsIHQpIHtcbiAgaWYgKHMgPT09IGUpXG4gICAgcmV0dXJuO1xuICBsZXQgciA9IG51bGw7XG4gIGNvbnN0IG4gPSBzLmZyYWdtZW50cztcbiAgZm9yIChsZXQgdSA9IG4ubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHtcbiAgICBjb25zdCBkID0gblt1XS5pbml0U2VnbWVudDtcbiAgICBpZiAoZCkge1xuICAgICAgciA9IGQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcy5mcmFnbWVudEhpbnQgJiYgZGVsZXRlIHMuZnJhZ21lbnRIaW50LmVuZFBUUztcbiAgbGV0IGk7XG4gIFFiKHMsIGUsICh1LCBkLCBoLCBmKSA9PiB7XG4gICAgaWYgKCghZS5zdGFydENDIHx8IGUuc2tpcHBlZFNlZ21lbnRzKSAmJiBkLmNjICE9PSB1LmNjKSB7XG4gICAgICBjb25zdCBwID0gdS5jYyAtIGQuY2M7XG4gICAgICBmb3IgKGxldCB5ID0gaDsgeSA8IGYubGVuZ3RoOyB5KyspXG4gICAgICAgIGZbeV0uY2MgKz0gcDtcbiAgICAgIGUuZW5kQ0MgPSBmW2YubGVuZ3RoIC0gMV0uY2M7XG4gICAgfVxuICAgIHVlKHUuc3RhcnRQVFMpICYmIHVlKHUuZW5kUFRTKSAmJiAoZC5zZXRTdGFydChkLnN0YXJ0UFRTID0gdS5zdGFydFBUUyksIGQuc3RhcnREVFMgPSB1LnN0YXJ0RFRTLCBkLm1heFN0YXJ0UFRTID0gdS5tYXhTdGFydFBUUywgZC5lbmRQVFMgPSB1LmVuZFBUUywgZC5lbmREVFMgPSB1LmVuZERUUywgZC5taW5FbmRQVFMgPSB1Lm1pbkVuZFBUUywgZC5zZXREdXJhdGlvbih1LmVuZFBUUyAtIHUuc3RhcnRQVFMpLCBkLmR1cmF0aW9uICYmIChpID0gZCksIGUuUFRTS25vd24gPSBlLmFsaWduZWRTbGlkaW5nID0gITApLCB1Lmhhc1N0cmVhbXMgJiYgKGQuZWxlbWVudGFyeVN0cmVhbXMgPSB1LmVsZW1lbnRhcnlTdHJlYW1zKSwgZC5sb2FkZXIgPSB1LmxvYWRlciwgdS5oYXNTdGF0cyAmJiAoZC5zdGF0cyA9IHUuc3RhdHMpLCB1LmluaXRTZWdtZW50ICYmIChkLmluaXRTZWdtZW50ID0gdS5pbml0U2VnbWVudCwgciA9IHUuaW5pdFNlZ21lbnQpO1xuICB9KTtcbiAgY29uc3QgbyA9IGUuZnJhZ21lbnRzLCBhID0gZS5mcmFnbWVudEhpbnQgPyBvLmNvbmNhdChlLmZyYWdtZW50SGludCkgOiBvO1xuICBpZiAociAmJiBhLmZvckVhY2goKHUpID0+IHtcbiAgICB2YXIgZDtcbiAgICB1ICYmICghdS5pbml0U2VnbWVudCB8fCB1LmluaXRTZWdtZW50LnJlbHVybCA9PT0gKChkID0gcikgPT0gbnVsbCA/IHZvaWQgMCA6IGQucmVsdXJsKSkgJiYgKHUuaW5pdFNlZ21lbnQgPSByKTtcbiAgfSksIGUuc2tpcHBlZFNlZ21lbnRzKSB7XG4gICAgaWYgKGUuZGVsdGFVcGRhdGVGYWlsZWQgPSBvLnNvbWUoKHUpID0+ICF1KSwgZS5kZWx0YVVwZGF0ZUZhaWxlZCkge1xuICAgICAgdC53YXJuKFwiW2xldmVsLWhlbHBlcl0gUHJldmlvdXMgcGxheWxpc3QgbWlzc2luZyBzZWdtZW50cyBza2lwcGVkIGluIGRlbHRhIHBsYXlsaXN0XCIpO1xuICAgICAgZm9yIChsZXQgdSA9IGUuc2tpcHBlZFNlZ21lbnRzOyB1LS07IClcbiAgICAgICAgby5zaGlmdCgpO1xuICAgICAgZS5zdGFydFNOID0gb1swXS5zbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZS5jYW5Ta2lwRGF0ZVJhbmdlcyAmJiAoZS5kYXRlUmFuZ2VzID0gWGIocy5kYXRlUmFuZ2VzLCBlLCB0KSk7XG4gICAgICBjb25zdCB1ID0gcy5mcmFnbWVudHMuZmlsdGVyKChkKSA9PiBkLnJhd1Byb2dyYW1EYXRlVGltZSk7XG4gICAgICBpZiAocy5oYXNQcm9ncmFtRGF0ZVRpbWUgJiYgIWUuaGFzUHJvZ3JhbURhdGVUaW1lKVxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8IGEubGVuZ3RoOyBkKyspXG4gICAgICAgICAgYVtkXS5wcm9ncmFtRGF0ZVRpbWUgPT09IG51bGwgJiYgZmMoYVtkXSwgYVtkIC0gMV0sIHUpO1xuICAgICAgWmcodSwgZSk7XG4gICAgfVxuICAgIGUuZW5kQ0MgPSBvW28ubGVuZ3RoIC0gMV0uY2M7XG4gIH1cbiAgaWYgKCFlLnN0YXJ0Q0MpIHtcbiAgICB2YXIgbDtcbiAgICBjb25zdCB1ID0gZXAocywgZS5zdGFydFNOIC0gMSk7XG4gICAgZS5zdGFydENDID0gKGwgPSB1ID09IG51bGwgPyB2b2lkIDAgOiB1LmNjKSAhPSBudWxsID8gbCA6IG9bMF0uY2M7XG4gIH1cbiAgSmIocy5wYXJ0TGlzdCwgZS5wYXJ0TGlzdCwgKHUsIGQpID0+IHtcbiAgICBkLmVsZW1lbnRhcnlTdHJlYW1zID0gdS5lbGVtZW50YXJ5U3RyZWFtcywgZC5zdGF0cyA9IHUuc3RhdHM7XG4gIH0pLCBpID8gWGcoZSwgaSwgaS5zdGFydFBUUywgaS5lbmRQVFMsIGkuc3RhcnREVFMsIGkuZW5kRFRTLCB0KSA6IEpnKHMsIGUpLCBvLmxlbmd0aCAmJiAoZS50b3RhbGR1cmF0aW9uID0gZS5lZGdlIC0gb1swXS5zdGFydCksIGUuZHJpZnRTdGFydFRpbWUgPSBzLmRyaWZ0U3RhcnRUaW1lLCBlLmRyaWZ0U3RhcnQgPSBzLmRyaWZ0U3RhcnQ7XG4gIGNvbnN0IGMgPSBlLmFkdmFuY2VkRGF0ZVRpbWU7XG4gIGlmIChlLmFkdmFuY2VkICYmIGMpIHtcbiAgICBjb25zdCB1ID0gZS5lZGdlO1xuICAgIGUuZHJpZnRTdGFydCB8fCAoZS5kcmlmdFN0YXJ0VGltZSA9IGMsIGUuZHJpZnRTdGFydCA9IHUpLCBlLmRyaWZ0RW5kVGltZSA9IGMsIGUuZHJpZnRFbmQgPSB1O1xuICB9IGVsc2VcbiAgICBlLmRyaWZ0RW5kVGltZSA9IHMuZHJpZnRFbmRUaW1lLCBlLmRyaWZ0RW5kID0gcy5kcmlmdEVuZCwgZS5hZHZhbmNlZERhdGVUaW1lID0gcy5hZHZhbmNlZERhdGVUaW1lO1xuICBlLnJlcXVlc3RTY2hlZHVsZWQgPT09IC0xICYmIChlLnJlcXVlc3RTY2hlZHVsZWQgPSBzLnJlcXVlc3RTY2hlZHVsZWQpO1xufVxuZnVuY3Rpb24gWGIocywgZSwgdCkge1xuICBjb25zdCB7XG4gICAgZGF0ZVJhbmdlczogcixcbiAgICByZWNlbnRseVJlbW92ZWREYXRlcmFuZ2VzOiBuXG4gIH0gPSBlLCBpID0gbnQoe30sIHMpO1xuICBuICYmIG4uZm9yRWFjaCgobCkgPT4ge1xuICAgIGRlbGV0ZSBpW2xdO1xuICB9KTtcbiAgY29uc3QgYSA9IE9iamVjdC5rZXlzKGkpLmxlbmd0aDtcbiAgcmV0dXJuIGEgPyAoT2JqZWN0LmtleXMocikuZm9yRWFjaCgobCkgPT4ge1xuICAgIGNvbnN0IGMgPSBpW2xdLCB1ID0gbmV3IFdnKHJbbF0uYXR0ciwgYyk7XG4gICAgdS5pc1ZhbGlkID8gKGlbbF0gPSB1LCBjIHx8ICh1LnRhZ09yZGVyICs9IGEpKSA6IHQud2FybihgSWdub3JpbmcgaW52YWxpZCBQbGF5bGlzdCBEZWx0YSBVcGRhdGUgREFURVJBTkdFIHRhZzogXCIke2F0KHJbbF0uYXR0cil9XCJgKTtcbiAgfSksIGkpIDogcjtcbn1cbmZ1bmN0aW9uIEpiKHMsIGUsIHQpIHtcbiAgaWYgKHMgJiYgZSkge1xuICAgIGxldCByID0gMDtcbiAgICBmb3IgKGxldCBuID0gMCwgaSA9IHMubGVuZ3RoOyBuIDw9IGk7IG4rKykge1xuICAgICAgY29uc3QgbyA9IHNbbl0sIGEgPSBlW24gKyByXTtcbiAgICAgIG8gJiYgYSAmJiBvLmluZGV4ID09PSBhLmluZGV4ICYmIG8uZnJhZ21lbnQuc24gPT09IGEuZnJhZ21lbnQuc24gPyB0KG8sIGEpIDogci0tO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gUWIocywgZSwgdCkge1xuICBjb25zdCByID0gZS5za2lwcGVkU2VnbWVudHMsIG4gPSBNYXRoLm1heChzLnN0YXJ0U04sIGUuc3RhcnRTTikgLSBlLnN0YXJ0U04sIGkgPSAocy5mcmFnbWVudEhpbnQgPyAxIDogMCkgKyAociA/IGUuZW5kU04gOiBNYXRoLm1pbihzLmVuZFNOLCBlLmVuZFNOKSkgLSBlLnN0YXJ0U04sIG8gPSBlLnN0YXJ0U04gLSBzLnN0YXJ0U04sIGEgPSBlLmZyYWdtZW50SGludCA/IGUuZnJhZ21lbnRzLmNvbmNhdChlLmZyYWdtZW50SGludCkgOiBlLmZyYWdtZW50cywgbCA9IHMuZnJhZ21lbnRIaW50ID8gcy5mcmFnbWVudHMuY29uY2F0KHMuZnJhZ21lbnRIaW50KSA6IHMuZnJhZ21lbnRzO1xuICBmb3IgKGxldCBjID0gbjsgYyA8PSBpOyBjKyspIHtcbiAgICBjb25zdCB1ID0gbFtvICsgY107XG4gICAgbGV0IGQgPSBhW2NdO1xuICAgIGlmIChyICYmICFkICYmIHUgJiYgKGQgPSBlLmZyYWdtZW50c1tjXSA9IHUpLCB1ICYmIGQpIHtcbiAgICAgIHQodSwgZCwgYywgYSk7XG4gICAgICBjb25zdCBoID0gdS5yZWx1cmwsIGYgPSBkLnJlbHVybDtcbiAgICAgIGlmIChoICYmIGVUKGgsIGYpKSB7XG4gICAgICAgIGUucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBEaChgbWVkaWEgc2VxdWVuY2UgbWlzbWF0Y2ggJHtkLnNufTpgLCBzLCBlLCB1LCBkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh1LmNjICE9PSBkLmNjKSB7XG4gICAgICAgIGUucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBEaChgZGlzY29udGludWl0eSBzZXF1ZW5jZSBtaXNtYXRjaCAoJHt1LmNjfSE9JHtkLmNjfSlgLCBzLCBlLCB1LCBkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gRGgocywgZSwgdCwgciwgbikge1xuICByZXR1cm4gbmV3IEVycm9yKGAke3N9ICR7bi51cmx9XG5QbGF5bGlzdCBzdGFydGluZyBAJHtlLnN0YXJ0U059XG4ke2UubTN1OH1cblxuUGxheWxpc3Qgc3RhcnRpbmcgQCR7dC5zdGFydFNOfVxuJHt0Lm0zdTh9YCk7XG59XG5mdW5jdGlvbiBKZyhzLCBlLCB0ID0gITApIHtcbiAgY29uc3QgciA9IGUuc3RhcnRTTiArIGUuc2tpcHBlZFNlZ21lbnRzIC0gcy5zdGFydFNOLCBuID0gcy5mcmFnbWVudHMsIGkgPSByID49IDA7XG4gIGxldCBvID0gMDtcbiAgaWYgKGkgJiYgciA8IG4ubGVuZ3RoKVxuICAgIG8gPSBuW3JdLnN0YXJ0O1xuICBlbHNlIGlmIChpICYmIGUuc3RhcnRTTiA9PT0gcy5lbmRTTiArIDEpXG4gICAgbyA9IHMuZnJhZ21lbnRFbmQ7XG4gIGVsc2UgaWYgKGkgJiYgdClcbiAgICBvID0gcy5mcmFnbWVudFN0YXJ0ICsgciAqIGUubGV2ZWxUYXJnZXREdXJhdGlvbjtcbiAgZWxzZSBpZiAoIWUuc2tpcHBlZFNlZ21lbnRzICYmIGUuZnJhZ21lbnRTdGFydCA9PT0gMClcbiAgICBvID0gcy5mcmFnbWVudFN0YXJ0O1xuICBlbHNlXG4gICAgcmV0dXJuO1xuICBnYyhlLCBvKTtcbn1cbmZ1bmN0aW9uIGdjKHMsIGUpIHtcbiAgaWYgKGUpIHtcbiAgICBjb25zdCB0ID0gcy5mcmFnbWVudHM7XG4gICAgZm9yIChsZXQgciA9IHMuc2tpcHBlZFNlZ21lbnRzOyByIDwgdC5sZW5ndGg7IHIrKylcbiAgICAgIHRbcl0uYWRkU3RhcnQoZSk7XG4gICAgcy5mcmFnbWVudEhpbnQgJiYgcy5mcmFnbWVudEhpbnQuYWRkU3RhcnQoZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIFFnKHMsIGUgPSAxIC8gMCkge1xuICBsZXQgdCA9IDFlMyAqIHMudGFyZ2V0ZHVyYXRpb247XG4gIGlmIChzLnVwZGF0ZWQpIHtcbiAgICBjb25zdCByID0gcy5mcmFnbWVudHM7XG4gICAgaWYgKHIubGVuZ3RoICYmIHQgKiA0ID4gZSkge1xuICAgICAgY29uc3QgaSA9IHJbci5sZW5ndGggLSAxXS5kdXJhdGlvbiAqIDFlMztcbiAgICAgIGkgPCB0ICYmICh0ID0gaSk7XG4gICAgfVxuICB9IGVsc2VcbiAgICB0IC89IDI7XG4gIHJldHVybiBNYXRoLnJvdW5kKHQpO1xufVxuZnVuY3Rpb24gZXAocywgZSwgdCkge1xuICBpZiAoIXMpXG4gICAgcmV0dXJuIG51bGw7XG4gIGxldCByID0gcy5mcmFnbWVudHNbZSAtIHMuc3RhcnRTTl07XG4gIHJldHVybiByIHx8IChyID0gcy5mcmFnbWVudEhpbnQsIHIgJiYgci5zbiA9PT0gZSkgPyByIDogZSA8IHMuc3RhcnRTTiAmJiB0ICYmIHQuc24gPT09IGUgPyB0IDogbnVsbDtcbn1cbmZ1bmN0aW9uIFBoKHMsIGUsIHQpIHtcbiAgcmV0dXJuIHMgPyB0cChzLnBhcnRMaXN0LCBlLCB0KSA6IG51bGw7XG59XG5mdW5jdGlvbiB0cChzLCBlLCB0KSB7XG4gIGlmIChzKVxuICAgIGZvciAobGV0IHIgPSBzLmxlbmd0aDsgci0tOyApIHtcbiAgICAgIGNvbnN0IG4gPSBzW3JdO1xuICAgICAgaWYgKG4uaW5kZXggPT09IHQgJiYgbi5mcmFnbWVudC5zbiA9PT0gZSlcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJwKHMpIHtcbiAgcy5mb3JFYWNoKChlLCB0KSA9PiB7XG4gICAgdmFyIHI7XG4gICAgKHIgPSBlLmRldGFpbHMpID09IG51bGwgfHwgci5mcmFnbWVudHMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgbi5sZXZlbCA9IHQsIG4uaW5pdFNlZ21lbnQgJiYgKG4uaW5pdFNlZ21lbnQubGV2ZWwgPSB0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBlVChzLCBlKSB7XG4gIHJldHVybiBzICE9PSBlICYmIGUgPyBNaChzKSAhPT0gTWgoZSkgOiAhMTtcbn1cbmZ1bmN0aW9uIE1oKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIik7XG59XG5mdW5jdGlvbiBZbihzLCBlKSB7XG4gIGZvciAobGV0IHIgPSAwLCBuID0gcy5sZW5ndGg7IHIgPCBuOyByKyspIHtcbiAgICB2YXIgdDtcbiAgICBpZiAoKCh0ID0gc1tyXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuY2MpID09PSBlKVxuICAgICAgcmV0dXJuIHNbcl07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB0VChzLCBlKSB7XG4gIHJldHVybiAhIShzICYmIGUuc3RhcnRDQyA8IHMuZW5kQ0MgJiYgZS5lbmRDQyA+IHMuc3RhcnRDQyk7XG59XG5mdW5jdGlvbiBPaChzLCBlKSB7XG4gIGNvbnN0IHQgPSBzLnN0YXJ0ICsgZTtcbiAgcy5zdGFydFBUUyA9IHQsIHMuc2V0U3RhcnQodCksIHMuZW5kUFRTID0gdCArIHMuZHVyYXRpb247XG59XG5mdW5jdGlvbiBzcChzLCBlKSB7XG4gIGNvbnN0IHQgPSBlLmZyYWdtZW50cztcbiAgZm9yIChsZXQgciA9IDAsIG4gPSB0Lmxlbmd0aDsgciA8IG47IHIrKylcbiAgICBPaCh0W3JdLCBzKTtcbiAgZS5mcmFnbWVudEhpbnQgJiYgT2goZS5mcmFnbWVudEhpbnQsIHMpLCBlLmFsaWduZWRTbGlkaW5nID0gITA7XG59XG5mdW5jdGlvbiByVChzLCBlKSB7XG4gIHMgJiYgKG5wKGUsIHMpLCBlLmFsaWduZWRTbGlkaW5nIHx8IHNhKGUsIHMpLCAhZS5hbGlnbmVkU2xpZGluZyAmJiAhZS5za2lwcGVkU2VnbWVudHMgJiYgSmcocywgZSwgITEpKTtcbn1cbmZ1bmN0aW9uIG5wKHMsIGUpIHtcbiAgaWYgKCF0VChlLCBzKSlcbiAgICByZXR1cm47XG4gIGNvbnN0IHQgPSBNYXRoLm1pbihlLmVuZENDLCBzLmVuZENDKSwgciA9IFluKGUuZnJhZ21lbnRzLCB0KSwgbiA9IFluKHMuZnJhZ21lbnRzLCB0KTtcbiAgaWYgKCFyIHx8ICFuKVxuICAgIHJldHVybjtcbiAgcnQubG9nKGBBbGlnbmluZyBwbGF5bGlzdCBhdCBzdGFydCBvZiBkaWNvbnRpbnVpdHkgc2VxdWVuY2UgJHt0fWApO1xuICBjb25zdCBpID0gci5zdGFydCAtIG4uc3RhcnQ7XG4gIHNwKGksIHMpO1xufVxuZnVuY3Rpb24gc2EocywgZSkge1xuICBpZiAoIXMuaGFzUHJvZ3JhbURhdGVUaW1lIHx8ICFlLmhhc1Byb2dyYW1EYXRlVGltZSlcbiAgICByZXR1cm47XG4gIGNvbnN0IHQgPSBzLmZyYWdtZW50cywgciA9IGUuZnJhZ21lbnRzO1xuICBpZiAoIXQubGVuZ3RoIHx8ICFyLmxlbmd0aClcbiAgICByZXR1cm47XG4gIGxldCBuLCBpO1xuICBjb25zdCBvID0gTWF0aC5taW4oZS5lbmRDQywgcy5lbmRDQyk7XG4gIGUuc3RhcnRDQyA8IG8gJiYgcy5zdGFydENDIDwgbyAmJiAobiA9IFluKHIsIG8pLCBpID0gWW4odCwgbykpLCAoIW4gfHwgIWkpICYmIChuID0gcltNYXRoLmZsb29yKHIubGVuZ3RoIC8gMildLCBpID0gWW4odCwgbi5jYykgfHwgdFtNYXRoLmZsb29yKHQubGVuZ3RoIC8gMildKTtcbiAgY29uc3QgYSA9IG4ucHJvZ3JhbURhdGVUaW1lLCBsID0gaS5wcm9ncmFtRGF0ZVRpbWU7XG4gIGlmICghYSB8fCAhbClcbiAgICByZXR1cm47XG4gIGNvbnN0IGMgPSAobCAtIGEpIC8gMWUzIC0gKGkuc3RhcnQgLSBuLnN0YXJ0KTtcbiAgc3AoYywgcyk7XG59XG5mdW5jdGlvbiBjcihzLCBlLCB0KSB7XG4gIHByKHMsIGUsIHQpLCBzLmFkZEV2ZW50TGlzdGVuZXIoZSwgdCk7XG59XG5mdW5jdGlvbiBwcihzLCBlLCB0KSB7XG4gIHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCB0KTtcbn1cbmNvbnN0IHNUID0ge1xuICB0b1N0cmluZzogZnVuY3Rpb24ocykge1xuICAgIGxldCBlID0gXCJcIjtcbiAgICBjb25zdCB0ID0gcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0OyByKyspXG4gICAgICBlICs9IGBbJHtzLnN0YXJ0KHIpLnRvRml4ZWQoMyl9LSR7cy5lbmQocikudG9GaXhlZCgzKX1dYDtcbiAgICByZXR1cm4gZTtcbiAgfVxufSwgbmUgPSB7XG4gIFNUT1BQRUQ6IFwiU1RPUFBFRFwiLFxuICBJRExFOiBcIklETEVcIixcbiAgS0VZX0xPQURJTkc6IFwiS0VZX0xPQURJTkdcIixcbiAgRlJBR19MT0FESU5HOiBcIkZSQUdfTE9BRElOR1wiLFxuICBGUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWTogXCJGUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWVwiLFxuICBXQUlUSU5HX1RSQUNLOiBcIldBSVRJTkdfVFJBQ0tcIixcbiAgUEFSU0lORzogXCJQQVJTSU5HXCIsXG4gIFBBUlNFRDogXCJQQVJTRURcIixcbiAgRU5ERUQ6IFwiRU5ERURcIixcbiAgRVJST1I6IFwiRVJST1JcIixcbiAgV0FJVElOR19JTklUX1BUUzogXCJXQUlUSU5HX0lOSVRfUFRTXCIsXG4gIFdBSVRJTkdfTEVWRUw6IFwiV0FJVElOR19MRVZFTFwiXG59O1xuY2xhc3MgVHUgZXh0ZW5kcyBIZyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4sIGkpIHtcbiAgICBzdXBlcihuLCBlLmxvZ2dlciksIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMuZnJhZ0N1cnJlbnQgPSBudWxsLCB0aGlzLmZyYWdtZW50VHJhY2tlciA9IHZvaWQgMCwgdGhpcy50cmFuc211eGVyID0gbnVsbCwgdGhpcy5fc3RhdGUgPSBuZS5TVE9QUEVELCB0aGlzLnBsYXlsaXN0VHlwZSA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubWVkaWFCdWZmZXIgPSBudWxsLCB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy5iaXRyYXRlVGVzdCA9ICExLCB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDAsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IDAsIHRoaXMuc3RhcnRQb3NpdGlvbiA9IDAsIHRoaXMuc3RhcnRUaW1lT2Zmc2V0ID0gbnVsbCwgdGhpcy5yZXRyeURhdGUgPSAwLCB0aGlzLmxldmVscyA9IG51bGwsIHRoaXMuZnJhZ21lbnRMb2FkZXIgPSB2b2lkIDAsIHRoaXMua2V5TG9hZGVyID0gdm9pZCAwLCB0aGlzLmxldmVsTGFzdExvYWRlZCA9IG51bGwsIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITEsIHRoaXMuZGVjcnlwdGVyID0gdm9pZCAwLCB0aGlzLmluaXRQVFMgPSBbXSwgdGhpcy5idWZmZXJpbmcgPSAhMCwgdGhpcy5sb2FkaW5nUGFydHMgPSAhMSwgdGhpcy5sb29wU24gPSB2b2lkIDAsIHRoaXMub25NZWRpYVNlZWtpbmcgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbmZpZzogbyxcbiAgICAgICAgZnJhZ0N1cnJlbnQ6IGEsXG4gICAgICAgIG1lZGlhOiBsLFxuICAgICAgICBtZWRpYUJ1ZmZlcjogYyxcbiAgICAgICAgc3RhdGU6IHVcbiAgICAgIH0gPSB0aGlzLCBkID0gbCA/IGwuY3VycmVudFRpbWUgOiAwLCBoID0gQ2UuYnVmZmVySW5mbyhjIHx8IGwsIGQsIG8ubWF4QnVmZmVySG9sZSksIGYgPSAhaC5sZW47XG4gICAgICBpZiAodGhpcy5sb2coYE1lZGlhIHNlZWtpbmcgdG8gJHt1ZShkKSA/IGQudG9GaXhlZCgzKSA6IGR9LCBzdGF0ZTogJHt1fSwgJHtmID8gXCJvdXQgb2ZcIiA6IFwiaW5cIn0gYnVmZmVyYCksIHRoaXMuc3RhdGUgPT09IG5lLkVOREVEKVxuICAgICAgICB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCk7XG4gICAgICBlbHNlIGlmIChhKSB7XG4gICAgICAgIGNvbnN0IHAgPSBvLm1heEZyYWdMb29rVXBUb2xlcmFuY2UsIHkgPSBhLnN0YXJ0IC0gcCwgRSA9IGEuc3RhcnQgKyBhLmR1cmF0aW9uICsgcDtcbiAgICAgICAgaWYgKGYgfHwgRSA8IGguc3RhcnQgfHwgeSA+IGguZW5kKSB7XG4gICAgICAgICAgY29uc3QgYiA9IGQgPiBFO1xuICAgICAgICAgIChkIDwgeSB8fCBiKSAmJiAoYiAmJiBhLmxvYWRlciAmJiAodGhpcy5sb2coYENhbmNlbGxpbmcgZnJhZ21lbnQgbG9hZCBmb3Igc2VlayAoc246ICR7YS5zbn0pYCksIGEuYWJvcnRSZXF1ZXN0cygpLCB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCkpLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobCkge1xuICAgICAgICB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudHNJblJhbmdlKGQsIDEgLyAwLCB0aGlzLnBsYXlsaXN0VHlwZSwgITApO1xuICAgICAgICBjb25zdCBwID0gdGhpcy5sYXN0Q3VycmVudFRpbWU7XG4gICAgICAgIGlmIChkID4gcCAmJiAodGhpcy5sYXN0Q3VycmVudFRpbWUgPSBkKSwgIXRoaXMubG9hZGluZ1BhcnRzKSB7XG4gICAgICAgICAgY29uc3QgeSA9IE1hdGgubWF4KGguZW5kLCBkKSwgRSA9IHRoaXMuc2hvdWxkTG9hZFBhcnRzKHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCksIHkpO1xuICAgICAgICAgIEUgJiYgKHRoaXMubG9nKGBMTC1QYXJ0IGxvYWRpbmcgT04gYWZ0ZXIgc2Vla2luZyB0byAke2QudG9GaXhlZCgyKX0gd2l0aCBidWZmZXIgQCR7eS50b0ZpeGVkKDIpfWApLCB0aGlzLmxvYWRpbmdQYXJ0cyA9IEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmhscy5oYXNFbm91Z2hUb1N0YXJ0IHx8ICh0aGlzLmxvZyhgU2V0dGluZyAke2YgPyBcInN0YXJ0UG9zaXRpb25cIiA6IFwibmV4dExvYWRQb3NpdGlvblwifSB0byAke2R9IGZvciBzZWVrIHdpdGhvdXQgZW5vdWdoIHRvIHN0YXJ0YCksIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGQsIGYgJiYgKHRoaXMuc3RhcnRQb3NpdGlvbiA9IGQpKSwgZiAmJiB0aGlzLnN0YXRlID09PSBuZS5JRExFICYmIHRoaXMudGlja0ltbWVkaWF0ZSgpO1xuICAgIH0sIHRoaXMub25NZWRpYUVuZGVkID0gKCkgPT4ge1xuICAgICAgdGhpcy5sb2coXCJzZXR0aW5nIHN0YXJ0UG9zaXRpb24gdG8gMCBiZWNhdXNlIG1lZGlhIGVuZGVkXCIpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDA7XG4gICAgfSwgdGhpcy5wbGF5bGlzdFR5cGUgPSBpLCB0aGlzLmhscyA9IGUsIHRoaXMuZnJhZ21lbnRMb2FkZXIgPSBuZXcgQ2IoZS5jb25maWcpLCB0aGlzLmtleUxvYWRlciA9IHIsIHRoaXMuZnJhZ21lbnRUcmFja2VyID0gdCwgdGhpcy5jb25maWcgPSBlLmNvbmZpZywgdGhpcy5kZWNyeXB0ZXIgPSBuZXcgdnUoZS5jb25maWcpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9uKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIGRvVGljaygpIHtcbiAgICB0aGlzLm9uVGlja0VuZCgpO1xuICB9XG4gIG9uVGlja0VuZCgpIHtcbiAgfVxuICBzdGFydExvYWQoZSkge1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBuZS5TVE9QUEVEKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZnJhZ21lbnRMb2FkZXIuYWJvcnQoKSwgdGhpcy5rZXlMb2FkZXIuYWJvcnQodGhpcy5wbGF5bGlzdFR5cGUpO1xuICAgIGNvbnN0IGUgPSB0aGlzLmZyYWdDdXJyZW50O1xuICAgIGUgIT0gbnVsbCAmJiBlLmxvYWRlciAmJiAoZS5hYm9ydFJlcXVlc3RzKCksIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUpKSwgdGhpcy5yZXNldFRyYW5zbXV4ZXIoKSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuZnJhZ1ByZXZpb3VzID0gbnVsbCwgdGhpcy5jbGVhckludGVydmFsKCksIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLnN0YXRlID0gbmUuU1RPUFBFRDtcbiAgfVxuICBnZXQgc3RhcnRQb3NpdGlvblZhbHVlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG5leHRMb2FkUG9zaXRpb246IGUsXG4gICAgICBzdGFydFBvc2l0aW9uOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuIHQgPT09IC0xICYmIGUgPyBlIDogdDtcbiAgfVxuICBnZXQgYnVmZmVyaW5nRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJpbmc7XG4gIH1cbiAgcGF1c2VCdWZmZXJpbmcoKSB7XG4gICAgdGhpcy5idWZmZXJpbmcgPSAhMTtcbiAgfVxuICByZXN1bWVCdWZmZXJpbmcoKSB7XG4gICAgdGhpcy5idWZmZXJpbmcgPSAhMDtcbiAgfVxuICBnZXQgaW5GbGlnaHRGcmFnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmcmFnOiB0aGlzLmZyYWdDdXJyZW50LFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGVcbiAgICB9O1xuICB9XG4gIF9zdHJlYW1FbmRlZChlLCB0KSB7XG4gICAgaWYgKHQubGl2ZSB8fCAhdGhpcy5tZWRpYSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCByID0gZS5lbmQgfHwgMCwgbiA9IHRoaXMuY29uZmlnLnRpbWVsaW5lT2Zmc2V0IHx8IDA7XG4gICAgaWYgKHIgPD0gbilcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCBpID0gZS5idWZmZXJlZDtcbiAgICB0aGlzLmNvbmZpZy5tYXhCdWZmZXJIb2xlICYmIGkgJiYgaS5sZW5ndGggPiAxICYmIChlID0gQ2UuYnVmZmVyZWRJbmZvKGksIGUuc3RhcnQsIDApKTtcbiAgICBjb25zdCBvID0gZS5uZXh0U3RhcnQ7XG4gICAgaWYgKG8gJiYgbyA+IG4gJiYgbyA8IHQuZWRnZSB8fCB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lIDwgZS5zdGFydClcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCBsID0gdC5wYXJ0TGlzdDtcbiAgICBpZiAobCAhPSBudWxsICYmIGwubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1ID0gbFtsLmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIENlLmlzQnVmZmVyZWQodGhpcy5tZWRpYSwgdS5zdGFydCArIHUuZHVyYXRpb24gLyAyKTtcbiAgICB9XG4gICAgY29uc3QgYyA9IHQuZnJhZ21lbnRzW3QuZnJhZ21lbnRzLmxlbmd0aCAtIDFdLnR5cGU7XG4gICAgcmV0dXJuIHRoaXMuZnJhZ21lbnRUcmFja2VyLmlzRW5kTGlzdEFwcGVuZGVkKGMpO1xuICB9XG4gIGdldExldmVsRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5sZXZlbHMgJiYgdGhpcy5sZXZlbExhc3RMb2FkZWQgIT09IG51bGwpXG4gICAgICByZXR1cm4gdGhpcy5sZXZlbExhc3RMb2FkZWQuZGV0YWlscztcbiAgfVxuICBnZXQgdGltZWxpbmVPZmZzZXQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuY29uZmlnLnRpbWVsaW5lT2Zmc2V0O1xuICAgIGlmIChlKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIHJldHVybiAoKHQgPSB0aGlzLmdldExldmVsRGV0YWlscygpKSA9PSBudWxsID8gdm9pZCAwIDogdC5hcHBsaWVkVGltZWxpbmVPZmZzZXQpIHx8IGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIG9uTWVkaWFBdHRhY2hlZChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMubWVkaWEgPSB0aGlzLm1lZGlhQnVmZmVyID0gdC5tZWRpYTtcbiAgICBjcihyLCBcInNlZWtpbmdcIiwgdGhpcy5vbk1lZGlhU2Vla2luZyksIGNyKHIsIFwiZW5kZWRcIiwgdGhpcy5vbk1lZGlhRW5kZWQpO1xuICAgIGNvbnN0IG4gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLmxldmVscyAmJiBuLmF1dG9TdGFydExvYWQgJiYgdGhpcy5zdGF0ZSA9PT0gbmUuU1RPUFBFRCAmJiB0aGlzLnN0YXJ0TG9hZChuLnN0YXJ0UG9zaXRpb24pO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAhIXQudHJhbnNmZXJNZWRpYSwgbiA9IHRoaXMubWVkaWE7XG4gICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgIGlmIChuLmVuZGVkICYmICh0aGlzLmxvZyhcIk1TRSBkZXRhY2hpbmcgYW5kIHZpZGVvIGVuZGVkLCByZXNldCBzdGFydFBvc2l0aW9uXCIpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDApLCBwcihuLCBcInNlZWtpbmdcIiwgdGhpcy5vbk1lZGlhU2Vla2luZyksIHByKG4sIFwiZW5kZWRcIiwgdGhpcy5vbk1lZGlhRW5kZWQpLCB0aGlzLmtleUxvYWRlciAmJiAhciAmJiB0aGlzLmtleUxvYWRlci5kZXRhY2goKSwgdGhpcy5tZWRpYSA9IHRoaXMubWVkaWFCdWZmZXIgPSBudWxsLCB0aGlzLmxvb3BTbiA9IHZvaWQgMCwgcikge1xuICAgICAgICB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCksIHRoaXMucmVzZXRUcmFuc211eGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZ1BhcnRzID0gITEsIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUFsbEZyYWdtZW50cygpLCB0aGlzLnN0b3BMb2FkKCk7XG4gICAgfVxuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKCkge1xuICAgIHRoaXMuaW5pdFBUUyA9IFtdLCB0aGlzLmxldmVscyA9IHRoaXMubGV2ZWxMYXN0TG9hZGVkID0gdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMubGFzdEN1cnJlbnRUaW1lID0gdGhpcy5zdGFydFBvc2l0aW9uID0gMCwgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMTtcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGVkKGUsIHQpIHtcbiAgICB0aGlzLnN0YXJ0VGltZU9mZnNldCA9IHQuc3RhcnRUaW1lT2Zmc2V0O1xuICB9XG4gIG9uSGFuZGxlckRlc3Ryb3lpbmcoKSB7XG4gICAgdGhpcy5zdG9wTG9hZCgpLCB0aGlzLnRyYW5zbXV4ZXIgJiYgKHRoaXMudHJhbnNtdXhlci5kZXN0cm95KCksIHRoaXMudHJhbnNtdXhlciA9IG51bGwpLCBzdXBlci5vbkhhbmRsZXJEZXN0cm95aW5nKCksIHRoaXMuaGxzID0gdGhpcy5vbk1lZGlhU2Vla2luZyA9IHRoaXMub25NZWRpYUVuZGVkID0gbnVsbDtcbiAgfVxuICBvbkhhbmRsZXJEZXN0cm95ZWQoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IG5lLlNUT1BQRUQsIHRoaXMuZnJhZ21lbnRMb2FkZXIgJiYgdGhpcy5mcmFnbWVudExvYWRlci5kZXN0cm95KCksIHRoaXMua2V5TG9hZGVyICYmIHRoaXMua2V5TG9hZGVyLmRlc3Ryb3koKSwgdGhpcy5kZWNyeXB0ZXIgJiYgdGhpcy5kZWNyeXB0ZXIuZGVzdHJveSgpLCB0aGlzLmhscyA9IHRoaXMubG9nID0gdGhpcy53YXJuID0gdGhpcy5kZWNyeXB0ZXIgPSB0aGlzLmtleUxvYWRlciA9IHRoaXMuZnJhZ21lbnRMb2FkZXIgPSB0aGlzLmZyYWdtZW50VHJhY2tlciA9IG51bGwsIHN1cGVyLm9uSGFuZGxlckRlc3Ryb3llZCgpO1xuICB9XG4gIGxvYWRGcmFnbWVudChlLCB0LCByKSB7XG4gICAgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMCwgdGhpcy5fbG9hZEZyYWdGb3JQbGF5YmFjayhlLCB0LCByKTtcbiAgfVxuICBfbG9hZEZyYWdGb3JQbGF5YmFjayhlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IChpKSA9PiB7XG4gICAgICBjb25zdCBvID0gaS5mcmFnO1xuICAgICAgaWYgKHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKG8pKSB7XG4gICAgICAgIHRoaXMud2FybihgJHtvLnR5cGV9IHNuOiAke28uc259JHtpLnBhcnQgPyBcIiBwYXJ0OiBcIiArIGkucGFydC5pbmRleCA6IFwiXCJ9IG9mICR7dGhpcy5mcmFnSW5mbyhvLCAhMSwgaS5wYXJ0KX0pIHdhcyBkcm9wcGVkIGR1cmluZyBkb3dubG9hZC5gKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQobyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG8uc3RhdHMuY2h1bmtDb3VudCsrLCB0aGlzLl9oYW5kbGVGcmFnbWVudExvYWRQcm9ncmVzcyhpKTtcbiAgICB9O1xuICAgIHRoaXMuX2RvRnJhZ0xvYWQoZSwgdCwgciwgbikudGhlbigoaSkgPT4ge1xuICAgICAgaWYgKCFpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvID0gdGhpcy5zdGF0ZSwgYSA9IGkuZnJhZztcbiAgICAgIGlmICh0aGlzLmZyYWdDb250ZXh0Q2hhbmdlZChhKSkge1xuICAgICAgICAobyA9PT0gbmUuRlJBR19MT0FESU5HIHx8ICF0aGlzLmZyYWdDdXJyZW50ICYmIG8gPT09IG5lLlBBUlNJTkcpICYmICh0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChhKSwgdGhpcy5zdGF0ZSA9IG5lLklETEUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcInBheWxvYWRcIiBpbiBpICYmICh0aGlzLmxvZyhgTG9hZGVkICR7YS50eXBlfSBzbjogJHthLnNufSBvZiAke3RoaXMucGxheWxpc3RMYWJlbCgpfSAke2EubGV2ZWx9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5GUkFHX0xPQURFRCwgaSkpLCB0aGlzLl9oYW5kbGVGcmFnbWVudExvYWRDb21wbGV0ZShpKTtcbiAgICB9KS5jYXRjaCgoaSkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9PT0gbmUuU1RPUFBFRCB8fCB0aGlzLnN0YXRlID09PSBuZS5FUlJPUiB8fCAodGhpcy53YXJuKGBGcmFnIGVycm9yOiAkeyhpID09IG51bGwgPyB2b2lkIDAgOiBpLm1lc3NhZ2UpIHx8IGl9YCksIHRoaXMucmVzZXRGcmFnbWVudExvYWRpbmcoZSkpO1xuICAgIH0pO1xuICB9XG4gIGNsZWFyVHJhY2tlcklmTmVlZGVkKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudFRyYWNrZXI6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoci5nZXRTdGF0ZShlKSA9PT0gSHQuQVBQRU5ESU5HKSB7XG4gICAgICBjb25zdCBpID0gZS50eXBlLCBvID0gdGhpcy5nZXRGd2RCdWZmZXJJbmZvKHRoaXMubWVkaWFCdWZmZXIsIGkpLCBhID0gTWF0aC5tYXgoZS5kdXJhdGlvbiwgbyA/IG8ubGVuIDogdGhpcy5jb25maWcubWF4QnVmZmVyTGVuZ3RoKSwgbCA9IHRoaXMuYmFja3RyYWNrRnJhZ21lbnQ7XG4gICAgICAoKGwgPyBlLnNuIC0gbC5zbiA6IDApID09PSAxIHx8IHRoaXMucmVkdWNlTWF4QnVmZmVyTGVuZ3RoKGEsIGUuZHVyYXRpb24pKSAmJiByLnJlbW92ZUZyYWdtZW50KGUpO1xuICAgIH0gZWxzZSAoKHQgPSB0aGlzLm1lZGlhQnVmZmVyKSA9PSBudWxsID8gdm9pZCAwIDogdC5idWZmZXJlZC5sZW5ndGgpID09PSAwID8gci5yZW1vdmVBbGxGcmFnbWVudHMoKSA6IHIuaGFzUGFydHMoZS50eXBlKSAmJiAoci5kZXRlY3RQYXJ0aWFsRnJhZ21lbnRzKHtcbiAgICAgIGZyYWc6IGUsXG4gICAgICBwYXJ0OiBudWxsLFxuICAgICAgc3RhdHM6IGUuc3RhdHMsXG4gICAgICBpZDogZS50eXBlXG4gICAgfSksIHIuZ2V0U3RhdGUoZSkgPT09IEh0LlBBUlRJQUwgJiYgci5yZW1vdmVGcmFnbWVudChlKSk7XG4gIH1cbiAgY2hlY2tMaXZlVXBkYXRlKGUpIHtcbiAgICBpZiAoZS51cGRhdGVkICYmICFlLmxpdmUpIHtcbiAgICAgIGNvbnN0IHQgPSBlLmZyYWdtZW50c1tlLmZyYWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHRoaXMuZnJhZ21lbnRUcmFja2VyLmRldGVjdFBhcnRpYWxGcmFnbWVudHMoe1xuICAgICAgICBmcmFnOiB0LFxuICAgICAgICBwYXJ0OiBudWxsLFxuICAgICAgICBzdGF0czogdC5zdGF0cyxcbiAgICAgICAgaWQ6IHQudHlwZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGUuZnJhZ21lbnRzWzBdIHx8IChlLmRlbHRhVXBkYXRlRmFpbGVkID0gITApO1xuICB9XG4gIHdhaXRGb3JMaXZlKGUpIHtcbiAgICBjb25zdCB0ID0gZS5kZXRhaWxzO1xuICAgIHJldHVybiAodCA9PSBudWxsID8gdm9pZCAwIDogdC5saXZlKSAmJiB0LnR5cGUgIT09IFwiRVZFTlRcIiAmJiAodGhpcy5sZXZlbExhc3RMb2FkZWQgIT09IGUgfHwgdC5leHBpcmVkKTtcbiAgfVxuICBmbHVzaE1haW5CdWZmZXIoZSwgdCwgciA9IG51bGwpIHtcbiAgICBpZiAoIShlIC0gdCkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IHtcbiAgICAgIHN0YXJ0T2Zmc2V0OiBlLFxuICAgICAgZW5kT2Zmc2V0OiB0LFxuICAgICAgdHlwZTogclxuICAgIH07XG4gICAgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywgbik7XG4gIH1cbiAgX2xvYWRJbml0U2VnbWVudChlLCB0KSB7XG4gICAgdGhpcy5fZG9GcmFnTG9hZChlLCB0KS50aGVuKChyKSA9PiB7XG4gICAgICBjb25zdCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5mcmFnO1xuICAgICAgaWYgKCFuIHx8IHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKG4pIHx8ICF0aGlzLmxldmVscylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5pdCBsb2FkIGFib3J0ZWRcIik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9KS50aGVuKChyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhsczogblxuICAgICAgfSA9IHRoaXMsIHtcbiAgICAgICAgZnJhZzogaSxcbiAgICAgICAgcGF5bG9hZDogb1xuICAgICAgfSA9IHIsIGEgPSBpLmRlY3J5cHRkYXRhO1xuICAgICAgaWYgKG8gJiYgby5ieXRlTGVuZ3RoID4gMCAmJiBhICE9IG51bGwgJiYgYS5rZXkgJiYgYS5pdiAmJiBJbihhLm1ldGhvZCkpIHtcbiAgICAgICAgY29uc3QgbCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRlci5kZWNyeXB0KG5ldyBVaW50OEFycmF5KG8pLCBhLmtleS5idWZmZXIsIGEuaXYuYnVmZmVyLCBTdShhLm1ldGhvZCkpLmNhdGNoKChjKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbi50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5GUkFHX0RFQ1JZUFRfRVJST1IsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBlcnJvcjogYyxcbiAgICAgICAgICAgIHJlYXNvbjogYy5tZXNzYWdlLFxuICAgICAgICAgICAgZnJhZzogaVxuICAgICAgICAgIH0pLCBjO1xuICAgICAgICB9KS50aGVuKChjKSA9PiB7XG4gICAgICAgICAgY29uc3QgdSA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgcmV0dXJuIG4udHJpZ2dlcihJLkZSQUdfREVDUllQVEVELCB7XG4gICAgICAgICAgICBmcmFnOiBpLFxuICAgICAgICAgICAgcGF5bG9hZDogYyxcbiAgICAgICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgICAgIHRzdGFydDogbCxcbiAgICAgICAgICAgICAgdGRlY3J5cHQ6IHVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgci5wYXlsb2FkID0gYywgdGhpcy5jb21wbGV0ZUluaXRTZWdtZW50TG9hZChyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZUluaXRTZWdtZW50TG9hZChyKTtcbiAgICB9KS5jYXRjaCgocikgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9PT0gbmUuU1RPUFBFRCB8fCB0aGlzLnN0YXRlID09PSBuZS5FUlJPUiB8fCAodGhpcy53YXJuKHIpLCB0aGlzLnJlc2V0RnJhZ21lbnRMb2FkaW5nKGUpKTtcbiAgICB9KTtcbiAgfVxuICBjb21wbGV0ZUluaXRTZWdtZW50TG9hZChlKSB7XG4gICAgY29uc3Qge1xuICAgICAgbGV2ZWxzOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCF0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5pdCBsb2FkIGFib3J0ZWQsIG1pc3NpbmcgbGV2ZWxzXCIpO1xuICAgIGNvbnN0IHIgPSBlLmZyYWcuc3RhdHM7XG4gICAgdGhpcy5zdGF0ZSAhPT0gbmUuU1RPUFBFRCAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpLCBlLmZyYWcuZGF0YSA9IG5ldyBVaW50OEFycmF5KGUucGF5bG9hZCksIHIucGFyc2luZy5zdGFydCA9IHIuYnVmZmVyaW5nLnN0YXJ0ID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgci5wYXJzaW5nLmVuZCA9IHIuYnVmZmVyaW5nLmVuZCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIHRoaXMudGljaygpO1xuICB9XG4gIHVuaGFuZGxlZEVuY3J5cHRpb25FcnJvcihlLCB0KSB7XG4gICAgdmFyIHIsIG47XG4gICAgY29uc3QgaSA9IGUudHJhY2tzO1xuICAgIGlmIChpICYmICF0LmVuY3J5cHRlZCAmJiAoKHIgPSBpLmF1ZGlvKSAhPSBudWxsICYmIHIuZW5jcnlwdGVkIHx8IChuID0gaS52aWRlbykgIT0gbnVsbCAmJiBuLmVuY3J5cHRlZCkgJiYgKCF0aGlzLmNvbmZpZy5lbWVFbmFibGVkIHx8ICF0aGlzLmtleUxvYWRlci5lbWVDb250cm9sbGVyKSkge1xuICAgICAgY29uc3QgbyA9IHRoaXMubWVkaWEsIGEgPSBuZXcgRXJyb3IoYEVuY3J5cHRlZCB0cmFjayB3aXRoIG5vIGtleSBpbiAke3RoaXMuZnJhZ0luZm8odCl9IChtZWRpYSAke28gPyBcImF0dGFjaGVkIG1lZGlhS2V5czogXCIgKyBvLm1lZGlhS2V5cyA6IFwiZGV0YWNoZWRcIn0pYCk7XG4gICAgICByZXR1cm4gdGhpcy53YXJuKGEubWVzc2FnZSksICFvIHx8IG8ubWVkaWFLZXlzID8gITEgOiAodGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9OT19LRVlTLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGVycm9yOiBhLFxuICAgICAgICBmcmFnOiB0XG4gICAgICB9KSwgdGhpcy5yZXNldFRyYW5zbXV4ZXIoKSwgITApO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgZnJhZ0NvbnRleHRDaGFuZ2VkKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnQ3VycmVudDogdFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiAhZSB8fCAhdCB8fCBlLnNuICE9PSB0LnNuIHx8IGUubGV2ZWwgIT09IHQubGV2ZWw7XG4gIH1cbiAgZnJhZ0J1ZmZlcmVkQ29tcGxldGUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7XG4gICAgaWYgKHRoaXMubG9nKGBCdWZmZXJlZCAke2UudHlwZX0gc246ICR7ZS5zbn0ke3QgPyBcIiBwYXJ0OiBcIiArIHQuaW5kZXggOiBcIlwifSBvZiAke3RoaXMuZnJhZ0luZm8oZSwgITEsIHQpfSA+IGJ1ZmZlcjoke3IgPyBzVC50b1N0cmluZyhDZS5nZXRCdWZmZXJlZChyKSkgOiBcIihkZXRhY2hlZClcIn0pYCksIFZ0KGUpKSB7XG4gICAgICB2YXIgbjtcbiAgICAgIGlmIChlLnR5cGUgIT09IHBlLlNVQlRJVExFKSB7XG4gICAgICAgIGNvbnN0IG8gPSBlLmVsZW1lbnRhcnlTdHJlYW1zO1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG8pLnNvbWUoKGEpID0+ICEhb1thXSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gbmUuSURMRTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSAobiA9IHRoaXMubGV2ZWxzKSA9PSBudWxsID8gdm9pZCAwIDogbltlLmxldmVsXTtcbiAgICAgIGkgIT0gbnVsbCAmJiBpLmZyYWdtZW50RXJyb3IgJiYgKHRoaXMubG9nKGBSZXNldHRpbmcgbGV2ZWwgZnJhZ21lbnQgZXJyb3IgY291bnQgb2YgJHtpLmZyYWdtZW50RXJyb3J9IG9uIGZyYWcgYnVmZmVyZWRgKSwgaS5mcmFnbWVudEVycm9yID0gMCk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICB9XG4gIF9oYW5kbGVGcmFnbWVudExvYWRDb21wbGV0ZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgdHJhbnNtdXhlcjogdFxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgcGFydDogbixcbiAgICAgIHBhcnRzTG9hZGVkOiBpXG4gICAgfSA9IGUsIG8gPSAhaSB8fCBpLmxlbmd0aCA9PT0gMCB8fCBpLnNvbWUoKGwpID0+ICFsKSwgYSA9IG5ldyBFdShyLmxldmVsLCByLnNuLCByLnN0YXRzLmNodW5rQ291bnQgKyAxLCAwLCBuID8gbi5pbmRleCA6IC0xLCAhbyk7XG4gICAgdC5mbHVzaChhKTtcbiAgfVxuICBfaGFuZGxlRnJhZ21lbnRMb2FkUHJvZ3Jlc3MoZSkge1xuICB9XG4gIF9kb0ZyYWdMb2FkKGUsIHQsIHIgPSBudWxsLCBuKSB7XG4gICAgdmFyIGk7XG4gICAgdGhpcy5mcmFnQ3VycmVudCA9IGU7XG4gICAgY29uc3QgbyA9IHQuZGV0YWlscztcbiAgICBpZiAoIXRoaXMubGV2ZWxzIHx8ICFvKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmcmFnIGxvYWQgYWJvcnRlZCwgbWlzc2luZyBsZXZlbCR7byA/IFwiXCIgOiBcIiBkZXRhaWxcIn1zYCk7XG4gICAgbGV0IGEgPSBudWxsO1xuICAgIGlmIChlLmVuY3J5cHRlZCAmJiAhKChpID0gZS5kZWNyeXB0ZGF0YSkgIT0gbnVsbCAmJiBpLmtleSkpIHtcbiAgICAgIGlmICh0aGlzLmxvZyhgTG9hZGluZyBrZXkgZm9yICR7ZS5zbn0gb2YgWyR7by5zdGFydFNOfS0ke28uZW5kU059XSwgJHt0aGlzLnBsYXlsaXN0TGFiZWwoKX0gJHtlLmxldmVsfWApLCB0aGlzLnN0YXRlID0gbmUuS0VZX0xPQURJTkcsIHRoaXMuZnJhZ0N1cnJlbnQgPSBlLCBhID0gdGhpcy5rZXlMb2FkZXIubG9hZChlKS50aGVuKChoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mcmFnQ29udGV4dENoYW5nZWQoaC5mcmFnKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5obHMudHJpZ2dlcihJLktFWV9MT0FERUQsIGgpLCB0aGlzLnN0YXRlID09PSBuZS5LRVlfTE9BRElORyAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpLCBoO1xuICAgICAgfSksIHRoaXMuaGxzLnRyaWdnZXIoSS5LRVlfTE9BRElORywge1xuICAgICAgICBmcmFnOiBlXG4gICAgICB9KSwgdGhpcy5mcmFnQ3VycmVudCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwiY29udGV4dCBjaGFuZ2VkIGluIEtFWV9MT0FESU5HXCIpLCBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfSBlbHNlIGUuZW5jcnlwdGVkIHx8IChhID0gdGhpcy5rZXlMb2FkZXIubG9hZENsZWFyKGUsIG8uZW5jcnlwdGVkRnJhZ21lbnRzLCB0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCksIGEgJiYgdGhpcy5sb2coXCJbZW1lXSBibG9ja2luZyBmcmFnIGxvYWQgdW50aWwgbWVkaWEta2V5cyBhY3F1aXJlZFwiKSk7XG4gICAgY29uc3QgbCA9IHRoaXMuZnJhZ1ByZXZpb3VzO1xuICAgIGlmIChWdChlKSAmJiAoIWwgfHwgZS5zbiAhPT0gbC5zbikpIHtcbiAgICAgIGNvbnN0IGggPSB0aGlzLnNob3VsZExvYWRQYXJ0cyh0LmRldGFpbHMsIGUuZW5kKTtcbiAgICAgIGggIT09IHRoaXMubG9hZGluZ1BhcnRzICYmICh0aGlzLmxvZyhgTEwtUGFydCBsb2FkaW5nICR7aCA/IFwiT05cIiA6IFwiT0ZGXCJ9IGxvYWRpbmcgc24gJHtsID09IG51bGwgPyB2b2lkIDAgOiBsLnNufS0+JHtlLnNufWApLCB0aGlzLmxvYWRpbmdQYXJ0cyA9IGgpO1xuICAgIH1cbiAgICBpZiAociA9IE1hdGgubWF4KGUuc3RhcnQsIHIgfHwgMCksIHRoaXMubG9hZGluZ1BhcnRzICYmIFZ0KGUpKSB7XG4gICAgICBjb25zdCBoID0gby5wYXJ0TGlzdDtcbiAgICAgIGlmIChoICYmIG4pIHtcbiAgICAgICAgciA+IG8uZnJhZ21lbnRFbmQgJiYgby5mcmFnbWVudEhpbnQgJiYgKGUgPSBvLmZyYWdtZW50SGludCk7XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLmdldE5leHRQYXJ0KGgsIGUsIHIpO1xuICAgICAgICBpZiAoZiA+IC0xKSB7XG4gICAgICAgICAgY29uc3QgcCA9IGhbZl07XG4gICAgICAgICAgZSA9IHRoaXMuZnJhZ0N1cnJlbnQgPSBwLmZyYWdtZW50LCB0aGlzLmxvZyhgTG9hZGluZyAke2UudHlwZX0gc246ICR7ZS5zbn0gcGFydDogJHtwLmluZGV4fSAoJHtmfS8ke2gubGVuZ3RoIC0gMX0pIG9mICR7dGhpcy5mcmFnSW5mbyhlLCAhMSwgcCl9KSBjYzogJHtlLmNjfSBbJHtvLnN0YXJ0U059LSR7by5lbmRTTn1dLCB0YXJnZXQ6ICR7cGFyc2VGbG9hdChyLnRvRml4ZWQoMykpfWApLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSBwLnN0YXJ0ICsgcC5kdXJhdGlvbiwgdGhpcy5zdGF0ZSA9IG5lLkZSQUdfTE9BRElORztcbiAgICAgICAgICBsZXQgeTtcbiAgICAgICAgICByZXR1cm4gYSA/IHkgPSBhLnRoZW4oKEUpID0+ICFFIHx8IHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKEUuZnJhZykgPyBudWxsIDogdGhpcy5kb0ZyYWdQYXJ0c0xvYWQoZSwgcCwgdCwgbikpLmNhdGNoKChFKSA9PiB0aGlzLmhhbmRsZUZyYWdMb2FkRXJyb3IoRSkpIDogeSA9IHRoaXMuZG9GcmFnUGFydHNMb2FkKGUsIHAsIHQsIG4pLmNhdGNoKChFKSA9PiB0aGlzLmhhbmRsZUZyYWdMb2FkRXJyb3IoRSkpLCB0aGlzLmhscy50cmlnZ2VyKEkuRlJBR19MT0FESU5HLCB7XG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcGFydDogcCxcbiAgICAgICAgICAgIHRhcmdldEJ1ZmZlclRpbWU6IHJcbiAgICAgICAgICB9KSwgdGhpcy5mcmFnQ3VycmVudCA9PT0gbnVsbCA/IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImZyYWcgbG9hZCBhYm9ydGVkLCBjb250ZXh0IGNoYW5nZWQgaW4gRlJBR19MT0FESU5HIHBhcnRzXCIpKSA6IHk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWUudXJsIHx8IHRoaXMubG9hZGVkRW5kT2ZQYXJ0cyhoLCByKSlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoVnQoZSkgJiYgdGhpcy5sb2FkaW5nUGFydHMpIHtcbiAgICAgIHZhciBjO1xuICAgICAgdGhpcy5sb2coYExMLVBhcnQgbG9hZGluZyBPRkYgYWZ0ZXIgbmV4dCBwYXJ0IG1pc3MgQCR7ci50b0ZpeGVkKDIpfSBDaGVjayBidWZmZXIgYXQgc246ICR7ZS5zbn0gbG9hZGVkIHBhcnRzOiAkeyhjID0gby5wYXJ0TGlzdCkgPT0gbnVsbCA/IHZvaWQgMCA6IGMuZmlsdGVyKChoKSA9PiBoLmxvYWRlZCkubWFwKChoKSA9PiBgWyR7aC5zdGFydH0tJHtoLmVuZH1dYCl9YCksIHRoaXMubG9hZGluZ1BhcnRzID0gITE7XG4gICAgfSBlbHNlIGlmICghZS51cmwpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIHRoaXMubG9nKGBMb2FkaW5nICR7ZS50eXBlfSBzbjogJHtlLnNufSBvZiAke3RoaXMuZnJhZ0luZm8oZSwgITEpfSkgY2M6ICR7ZS5jY30gJHtcIltcIiArIG8uc3RhcnRTTiArIFwiLVwiICsgby5lbmRTTiArIFwiXVwifSwgdGFyZ2V0OiAke3BhcnNlRmxvYXQoci50b0ZpeGVkKDMpKX1gKSwgdWUoZS5zbikgJiYgIXRoaXMuYml0cmF0ZVRlc3QgJiYgKHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGUuc3RhcnQgKyBlLmR1cmF0aW9uKSwgdGhpcy5zdGF0ZSA9IG5lLkZSQUdfTE9BRElORztcbiAgICBjb25zdCB1ID0gdGhpcy5jb25maWcucHJvZ3Jlc3NpdmU7XG4gICAgbGV0IGQ7XG4gICAgcmV0dXJuIHUgJiYgYSA/IGQgPSBhLnRoZW4oKGgpID0+ICFoIHx8IHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKGguZnJhZykgPyBudWxsIDogdGhpcy5mcmFnbWVudExvYWRlci5sb2FkKGUsIG4pKS5jYXRjaCgoaCkgPT4gdGhpcy5oYW5kbGVGcmFnTG9hZEVycm9yKGgpKSA6IGQgPSBQcm9taXNlLmFsbChbdGhpcy5mcmFnbWVudExvYWRlci5sb2FkKGUsIHUgPyBuIDogdm9pZCAwKSwgYV0pLnRoZW4oKFtoXSkgPT4gKCF1ICYmIG4gJiYgbihoKSwgaCkpLmNhdGNoKChoKSA9PiB0aGlzLmhhbmRsZUZyYWdMb2FkRXJyb3IoaCkpLCB0aGlzLmhscy50cmlnZ2VyKEkuRlJBR19MT0FESU5HLCB7XG4gICAgICBmcmFnOiBlLFxuICAgICAgdGFyZ2V0QnVmZmVyVGltZTogclxuICAgIH0pLCB0aGlzLmZyYWdDdXJyZW50ID09PSBudWxsID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZnJhZyBsb2FkIGFib3J0ZWQsIGNvbnRleHQgY2hhbmdlZCBpbiBGUkFHX0xPQURJTkdcIikpIDogZDtcbiAgfVxuICBkb0ZyYWdQYXJ0c0xvYWQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgbykgPT4ge1xuICAgICAgdmFyIGE7XG4gICAgICBjb25zdCBsID0gW10sIGMgPSAoYSA9IHIuZGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IGEucGFydExpc3QsIHUgPSAoZCkgPT4ge1xuICAgICAgICB0aGlzLmZyYWdtZW50TG9hZGVyLmxvYWRQYXJ0KGUsIGQsIG4pLnRoZW4oKGgpID0+IHtcbiAgICAgICAgICBsW2QuaW5kZXhdID0gaDtcbiAgICAgICAgICBjb25zdCBmID0gaC5wYXJ0O1xuICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5GUkFHX0xPQURFRCwgaCk7XG4gICAgICAgICAgY29uc3QgcCA9IFBoKHIuZGV0YWlscywgZS5zbiwgZC5pbmRleCArIDEpIHx8IHRwKGMsIGUuc24sIGQuaW5kZXggKyAxKTtcbiAgICAgICAgICBpZiAocClcbiAgICAgICAgICAgIHUocCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGkoe1xuICAgICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgICBwYXJ0OiBmLFxuICAgICAgICAgICAgICBwYXJ0c0xvYWRlZDogbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKG8pO1xuICAgICAgfTtcbiAgICAgIHUodCk7XG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlRnJhZ0xvYWRFcnJvcihlKSB7XG4gICAgaWYgKFwiZGF0YVwiIGluIGUpIHtcbiAgICAgIGNvbnN0IHQgPSBlLmRhdGE7XG4gICAgICB0LmZyYWcgJiYgdC5kZXRhaWxzID09PSBKLklOVEVSTkFMX0FCT1JURUQgPyB0aGlzLmhhbmRsZUZyYWdMb2FkQWJvcnRlZCh0LmZyYWcsIHQucGFydCkgOiB0LmZyYWcgJiYgdC50eXBlID09PSB2ZS5LRVlfU1lTVEVNX0VSUk9SID8gKHQuZnJhZy5hYm9ydFJlcXVlc3RzKCksIHRoaXMucmVzZXRTdGFydFdoZW5Ob3RMb2FkZWQoKSwgdGhpcy5yZXNldEZyYWdtZW50TG9hZGluZyh0LmZyYWcpKSA6IHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwgdCk7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgdHlwZTogdmUuT1RIRVJfRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouSU5URVJOQUxfRVhDRVBUSU9OLFxuICAgICAgICBlcnI6IGUsXG4gICAgICAgIGVycm9yOiBlLFxuICAgICAgICBmYXRhbDogITBcbiAgICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIF9oYW5kbGVUcmFuc211eGVyRmx1c2goZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmdldEN1cnJlbnRDb250ZXh0KGUpO1xuICAgIGlmICghdCB8fCB0aGlzLnN0YXRlICE9PSBuZS5QQVJTSU5HKSB7XG4gICAgICAhdGhpcy5mcmFnQ3VycmVudCAmJiB0aGlzLnN0YXRlICE9PSBuZS5TVE9QUEVEICYmIHRoaXMuc3RhdGUgIT09IG5lLkVSUk9SICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHIsXG4gICAgICBwYXJ0OiBuLFxuICAgICAgbGV2ZWw6IGlcbiAgICB9ID0gdCwgbyA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgci5zdGF0cy5wYXJzaW5nLmVuZCA9IG8sIG4gJiYgKG4uc3RhdHMucGFyc2luZy5lbmQgPSBvKTtcbiAgICBjb25zdCBhID0gdGhpcy5nZXRMZXZlbERldGFpbHMoKSwgYyA9IGEgJiYgci5zbiA+IGEuZW5kU04gfHwgdGhpcy5zaG91bGRMb2FkUGFydHMoYSwgci5lbmQpO1xuICAgIGMgIT09IHRoaXMubG9hZGluZ1BhcnRzICYmICh0aGlzLmxvZyhgTEwtUGFydCBsb2FkaW5nICR7YyA/IFwiT05cIiA6IFwiT0ZGXCJ9IGFmdGVyIHBhcnNpbmcgc2VnbWVudCBlbmRpbmcgQCR7ci5lbmQudG9GaXhlZCgyKX1gKSwgdGhpcy5sb2FkaW5nUGFydHMgPSBjKSwgdGhpcy51cGRhdGVMZXZlbFRpbWluZyhyLCBuLCBpLCBlLnBhcnRpYWwpO1xuICB9XG4gIHNob3VsZExvYWRQYXJ0cyhlLCB0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvd0xhdGVuY3lNb2RlKSB7XG4gICAgICBpZiAoIWUpXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdQYXJ0cztcbiAgICAgIGlmIChlLnBhcnRMaXN0KSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICBjb25zdCBpID0gZS5wYXJ0TGlzdFswXTtcbiAgICAgICAgaWYgKGkuZnJhZ21lbnQudHlwZSA9PT0gcGUuU1VCVElUTEUpXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBvID0gaS5lbmQgKyAoKChyID0gZS5mcmFnbWVudEhpbnQpID09IG51bGwgPyB2b2lkIDAgOiByLmR1cmF0aW9uKSB8fCAwKTtcbiAgICAgICAgaWYgKHQgPj0gbykge1xuICAgICAgICAgIHZhciBuO1xuICAgICAgICAgIGlmICgodGhpcy5obHMuaGFzRW5vdWdoVG9TdGFydCA/ICgobiA9IHRoaXMubWVkaWEpID09IG51bGwgPyB2b2lkIDAgOiBuLmN1cnJlbnRUaW1lKSB8fCB0aGlzLmxhc3RDdXJyZW50VGltZSA6IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCkpID4gaS5zdGFydCAtIGkuZnJhZ21lbnQuZHVyYXRpb24pXG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGdldEN1cnJlbnRDb250ZXh0KGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbHM6IHQsXG4gICAgICBmcmFnQ3VycmVudDogclxuICAgIH0gPSB0aGlzLCB7XG4gICAgICBsZXZlbDogbixcbiAgICAgIHNuOiBpLFxuICAgICAgcGFydDogb1xuICAgIH0gPSBlO1xuICAgIGlmICghKHQgIT0gbnVsbCAmJiB0W25dKSlcbiAgICAgIHJldHVybiB0aGlzLndhcm4oYExldmVscyBvYmplY3Qgd2FzIHVuc2V0IHdoaWxlIGJ1ZmZlcmluZyBmcmFnbWVudCAke2l9IG9mICR7dGhpcy5wbGF5bGlzdExhYmVsKCl9ICR7bn0uIFRoZSBjdXJyZW50IGNodW5rIHdpbGwgbm90IGJlIGJ1ZmZlcmVkLmApLCBudWxsO1xuICAgIGNvbnN0IGEgPSB0W25dLCBsID0gYS5kZXRhaWxzLCBjID0gbyA+IC0xID8gUGgobCwgaSwgbykgOiBudWxsLCB1ID0gYyA/IGMuZnJhZ21lbnQgOiBlcChsLCBpLCByKTtcbiAgICByZXR1cm4gdSA/IChyICYmIHIgIT09IHUgJiYgKHUuc3RhdHMgPSByLnN0YXRzKSwge1xuICAgICAgZnJhZzogdSxcbiAgICAgIHBhcnQ6IGMsXG4gICAgICBsZXZlbDogYVxuICAgIH0pIDogbnVsbDtcbiAgfVxuICBidWZmZXJGcmFnbWVudERhdGEoZSwgdCwgciwgbiwgaSkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBuZS5QQVJTSU5HKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGExOiBvLFxuICAgICAgZGF0YTI6IGFcbiAgICB9ID0gZTtcbiAgICBsZXQgbCA9IG87XG4gICAgaWYgKGEgJiYgKGwgPSBfcihvLCBhKSksICFsLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjID0gdGhpcy5pbml0UFRTW3QuY2NdLCB1ID0gYyA/IC1jLmJhc2VUaW1lIC8gYy50aW1lc2NhbGUgOiB2b2lkIDAsIGQgPSB7XG4gICAgICB0eXBlOiBlLnR5cGUsXG4gICAgICBmcmFnOiB0LFxuICAgICAgcGFydDogcixcbiAgICAgIGNodW5rTWV0YTogbixcbiAgICAgIG9mZnNldDogdSxcbiAgICAgIHBhcmVudDogdC50eXBlLFxuICAgICAgZGF0YTogbFxuICAgIH07XG4gICAgaWYgKHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQVBQRU5ESU5HLCBkKSwgZS5kcm9wcGVkICYmIGUuaW5kZXBlbmRlbnQgJiYgIXIpIHtcbiAgICAgIGlmIChpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLmZsdXNoQnVmZmVyR2FwKHQpO1xuICAgIH1cbiAgfVxuICBmbHVzaEJ1ZmZlckdhcChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMubWVkaWE7XG4gICAgaWYgKCF0KVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghQ2UuaXNCdWZmZXJlZCh0LCB0LmN1cnJlbnRUaW1lKSkge1xuICAgICAgdGhpcy5mbHVzaE1haW5CdWZmZXIoMCwgZS5zdGFydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHIgPSB0LmN1cnJlbnRUaW1lLCBuID0gQ2UuYnVmZmVySW5mbyh0LCByLCAwKSwgaSA9IGUuZHVyYXRpb24sIG8gPSBNYXRoLm1pbih0aGlzLmNvbmZpZy5tYXhGcmFnTG9va1VwVG9sZXJhbmNlICogMiwgaSAqIDAuMjUpLCBhID0gTWF0aC5tYXgoTWF0aC5taW4oZS5zdGFydCAtIG8sIG4uZW5kIC0gbyksIHIgKyBvKTtcbiAgICBlLnN0YXJ0IC0gYSA+IG8gJiYgdGhpcy5mbHVzaE1haW5CdWZmZXIoYSwgZS5zdGFydCk7XG4gIH1cbiAgZ2V0RndkQnVmZmVySW5mbyhlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgY29uc3QgbiA9IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCk7XG4gICAgaWYgKCF1ZShuKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG8gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA+IG4gfHwgKHIgPSB0aGlzLm1lZGlhKSAhPSBudWxsICYmIHIucGF1c2VkID8gMCA6IHRoaXMuY29uZmlnLm1heEJ1ZmZlckhvbGU7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RndkQnVmZmVySW5mb0F0UG9zKGUsIG4sIHQsIG8pO1xuICB9XG4gIGdldEZ3ZEJ1ZmZlckluZm9BdFBvcyhlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IENlLmJ1ZmZlckluZm8oZSwgdCwgbik7XG4gICAgaWYgKGkubGVuID09PSAwICYmIGkubmV4dFN0YXJ0ICE9PSB2b2lkIDApIHtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRCdWZmZXJlZEZyYWcodCwgcik7XG4gICAgICBpZiAobyAmJiAoaS5uZXh0U3RhcnQgPD0gby5lbmQgfHwgby5nYXApKSB7XG4gICAgICAgIGNvbnN0IGEgPSBNYXRoLm1heChNYXRoLm1pbihpLm5leHRTdGFydCwgby5lbmQpIC0gdCwgbik7XG4gICAgICAgIHJldHVybiBDZS5idWZmZXJJbmZvKGUsIHQsIGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuICBnZXRNYXhCdWZmZXJMZW5ndGgoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZzogdFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCByO1xuICAgIHJldHVybiBlID8gciA9IE1hdGgubWF4KDggKiB0Lm1heEJ1ZmZlclNpemUgLyBlLCB0Lm1heEJ1ZmZlckxlbmd0aCkgOiByID0gdC5tYXhCdWZmZXJMZW5ndGgsIE1hdGgubWluKHIsIHQubWF4TWF4QnVmZmVyTGVuZ3RoKTtcbiAgfVxuICByZWR1Y2VNYXhCdWZmZXJMZW5ndGgoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmNvbmZpZywgbiA9IE1hdGgubWF4KE1hdGgubWluKGUgLSB0LCByLm1heEJ1ZmZlckxlbmd0aCksIHQpLCBpID0gTWF0aC5tYXgoZSAtIHQgKiAzLCByLm1heE1heEJ1ZmZlckxlbmd0aCAvIDIsIG4pO1xuICAgIHJldHVybiBpID49IG4gPyAoci5tYXhNYXhCdWZmZXJMZW5ndGggPSBpLCB0aGlzLndhcm4oYFJlZHVjZSBtYXggYnVmZmVyIGxlbmd0aCB0byAke2l9c2ApLCAhMCkgOiAhMTtcbiAgfVxuICBnZXRBcHBlbmRlZEZyYWcoZSwgdCA9IHBlLk1BSU4pIHtcbiAgICBjb25zdCByID0gdGhpcy5mcmFnbWVudFRyYWNrZXIgPyB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRBcHBlbmRlZEZyYWcoZSwgdCkgOiBudWxsO1xuICAgIHJldHVybiByICYmIFwiZnJhZ21lbnRcIiBpbiByID8gci5mcmFnbWVudCA6IHI7XG4gIH1cbiAgZ2V0TmV4dEZyYWdtZW50KGUsIHQpIHtcbiAgICBjb25zdCByID0gdC5mcmFnbWVudHMsIG4gPSByLmxlbmd0aDtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWc6IGlcbiAgICB9ID0gdGhpcywgbyA9IHJbMF0uc3RhcnQsIGEgPSBpLmxvd0xhdGVuY3lNb2RlICYmICEhdC5wYXJ0TGlzdDtcbiAgICBsZXQgbCA9IG51bGw7XG4gICAgaWYgKHQubGl2ZSkge1xuICAgICAgY29uc3QgZCA9IGkuaW5pdGlhbExpdmVNYW5pZmVzdFNpemU7XG4gICAgICBpZiAobiA8IGQpXG4gICAgICAgIHJldHVybiB0aGlzLndhcm4oYE5vdCBlbm91Z2ggZnJhZ21lbnRzIHRvIHN0YXJ0IHBsYXliYWNrIChoYXZlOiAke259LCBuZWVkOiAke2R9KWApLCBudWxsO1xuICAgICAgaWYgKCF0LlBUU0tub3duICYmICF0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiB0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IGUgPCBvKSB7XG4gICAgICAgIHZhciBjO1xuICAgICAgICBhICYmICF0aGlzLmxvYWRpbmdQYXJ0cyAmJiAodGhpcy5sb2coXCJMTC1QYXJ0IGxvYWRpbmcgT04gZm9yIGluaXRpYWwgbGl2ZSBmcmFnbWVudFwiKSwgdGhpcy5sb2FkaW5nUGFydHMgPSAhMCksIGwgPSB0aGlzLmdldEluaXRpYWxMaXZlRnJhZ21lbnQodCk7XG4gICAgICAgIGNvbnN0IGggPSB0aGlzLmhscy5zdGFydFBvc2l0aW9uLCBmID0gdGhpcy5obHMubGl2ZVN5bmNQb3NpdGlvbiwgcCA9IGwgPyAoaCAhPT0gLTEgJiYgaCA+PSBvID8gaCA6IGYpIHx8IGwuc3RhcnQgOiBlO1xuICAgICAgICB0aGlzLmxvZyhgU2V0dGluZyBzdGFydFBvc2l0aW9uIHRvICR7cH0gdG8gbWF0Y2ggc3RhcnQgZnJhZyBhdCBsaXZlIGVkZ2UuIG1haW5TdGFydDogJHtofSBsaXZlU3luY1Bvc2l0aW9uOiAke2Z9IGZyYWcuc3RhcnQ6ICR7KGMgPSBsKSA9PSBudWxsID8gdm9pZCAwIDogYy5zdGFydH1gKSwgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgZSA8PSBvICYmIChsID0gclswXSk7XG4gICAgaWYgKCFsKSB7XG4gICAgICBjb25zdCBkID0gdGhpcy5sb2FkaW5nUGFydHMgPyB0LnBhcnRFbmQgOiB0LmZyYWdtZW50RW5kO1xuICAgICAgbCA9IHRoaXMuZ2V0RnJhZ21lbnRBdFBvc2l0aW9uKGUsIGQsIHQpO1xuICAgIH1cbiAgICBsZXQgdSA9IHRoaXMuZmlsdGVyUmVwbGFjZWRQcmltYXJ5KGwsIHQpO1xuICAgIGlmICghdSAmJiBsKSB7XG4gICAgICBjb25zdCBkID0gbC5zbiAtIHQuc3RhcnRTTjtcbiAgICAgIHUgPSB0aGlzLmZpbHRlclJlcGxhY2VkUHJpbWFyeShyW2QgKyAxXSB8fCBudWxsLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwVG9Jbml0RnJhZ1doZW5SZXF1aXJlZCh1KTtcbiAgfVxuICBpc0xvb3BMb2FkaW5nKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoZSk7XG4gICAgcmV0dXJuIChyID09PSBIdC5PSyB8fCByID09PSBIdC5QQVJUSUFMICYmICEhZS5nYXApICYmIHRoaXMubmV4dExvYWRQb3NpdGlvbiA+IHQ7XG4gIH1cbiAgZ2V0TmV4dEZyYWdtZW50TG9vcExvYWRpbmcoZSwgdCwgciwgbiwgaSkge1xuICAgIGxldCBvID0gbnVsbDtcbiAgICBpZiAoZS5nYXAgJiYgKG8gPSB0aGlzLmdldE5leHRGcmFnbWVudCh0aGlzLm5leHRMb2FkUG9zaXRpb24sIHQpLCBvICYmICFvLmdhcCAmJiByLm5leHRTdGFydCkpIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmdldEZ3ZEJ1ZmZlckluZm9BdFBvcyh0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWEsIHIubmV4dFN0YXJ0LCBuLCAwKTtcbiAgICAgIGlmIChhICE9PSBudWxsICYmIHIubGVuICsgYS5sZW4gPj0gaSkge1xuICAgICAgICBjb25zdCBsID0gby5zbjtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9vcFNuICE9PSBsICYmICh0aGlzLmxvZyhgYnVmZmVyIGZ1bGwgYWZ0ZXIgZ2FwcyBpbiBcIiR7bn1cIiBwbGF5bGlzdCBzdGFydGluZyBhdCBzbjogJHtsfWApLCB0aGlzLmxvb3BTbiA9IGwpLCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29wU24gPSB2b2lkIDAsIG87XG4gIH1cbiAgZ2V0IHByaW1hcnlQcmVmZXRjaCgpIHtcbiAgICBpZiAoQmgodGhpcy5jb25maWcpKSB7XG4gICAgICB2YXIgZTtcbiAgICAgIGlmICgoZSA9IHRoaXMuaGxzLmludGVyc3RpdGlhbHNNYW5hZ2VyKSA9PSBudWxsIHx8IChlID0gZS5wbGF5aW5nSXRlbSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuZXZlbnQpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGZpbHRlclJlcGxhY2VkUHJpbWFyeShlLCB0KSB7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuIGU7XG4gICAgaWYgKEJoKHRoaXMuY29uZmlnKSAmJiBlLnR5cGUgIT09IHBlLlNVQlRJVExFKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5obHMuaW50ZXJzdGl0aWFsc01hbmFnZXIsIG4gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmJ1ZmZlcmluZ0l0ZW07XG4gICAgICBpZiAobikge1xuICAgICAgICBjb25zdCBvID0gbi5ldmVudDtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICBpZiAoby5hcHBlbmRJblBsYWNlIHx8IE1hdGguYWJzKGUuc3RhcnQgLSBuLnN0YXJ0KSA+IDEgfHwgbi5zdGFydCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZW5kIDw9IG4uc3RhcnQgJiYgKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQubGl2ZSkgPT09ICExIHx8IGUuc3RhcnQgPiBuLmVuZCAmJiBuLm5leHRFdmVudCAmJiAobi5uZXh0RXZlbnQuYXBwZW5kSW5QbGFjZSB8fCBlLnN0YXJ0IC0gbi5lbmQgPiAxKSlcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSByID09IG51bGwgPyB2b2lkIDAgOiByLnBsYXllclF1ZXVlO1xuICAgICAgaWYgKGkpXG4gICAgICAgIGZvciAobGV0IG8gPSBpLmxlbmd0aDsgby0tOyApIHtcbiAgICAgICAgICBjb25zdCBhID0gaVtvXS5pbnRlcnN0aXRpYWw7XG4gICAgICAgICAgaWYgKGEuYXBwZW5kSW5QbGFjZSAmJiBlLnN0YXJ0ID49IGEuc3RhcnRUaW1lICYmIGUuZW5kIDw9IGEucmVzdW1lVGltZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlO1xuICB9XG4gIG1hcFRvSW5pdEZyYWdXaGVuUmVxdWlyZWQoZSkge1xuICAgIHJldHVybiBlICE9IG51bGwgJiYgZS5pbml0U2VnbWVudCAmJiAhZS5pbml0U2VnbWVudC5kYXRhICYmICF0aGlzLmJpdHJhdGVUZXN0ID8gZS5pbml0U2VnbWVudCA6IGU7XG4gIH1cbiAgZ2V0TmV4dFBhcnQoZSwgdCwgcikge1xuICAgIGxldCBuID0gLTEsIGkgPSAhMSwgbyA9ICEwO1xuICAgIGZvciAobGV0IGEgPSAwLCBsID0gZS5sZW5ndGg7IGEgPCBsOyBhKyspIHtcbiAgICAgIGNvbnN0IGMgPSBlW2FdO1xuICAgICAgaWYgKG8gPSBvICYmICFjLmluZGVwZW5kZW50LCBuID4gLTEgJiYgciA8IGMuc3RhcnQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY29uc3QgdSA9IGMubG9hZGVkO1xuICAgICAgdSA/IG4gPSAtMSA6IChpIHx8IChjLmluZGVwZW5kZW50IHx8IG8pICYmIGMuZnJhZ21lbnQgPT09IHQpICYmIChjLmZyYWdtZW50ICE9PSB0ICYmIHRoaXMud2FybihgTmVlZCBidWZmZXIgYXQgJHtyfSBidXQgbmV4dCB1bmxvYWRlZCBwYXJ0IHN0YXJ0cyBhdCAke2Muc3RhcnR9YCksIG4gPSBhKSwgaSA9IHU7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIGxvYWRlZEVuZE9mUGFydHMoZSwgdCkge1xuICAgIGxldCByO1xuICAgIGZvciAobGV0IG4gPSBlLmxlbmd0aDsgbi0tOyApIHtcbiAgICAgIGlmIChyID0gZVtuXSwgIXIubG9hZGVkKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBpZiAodCA+IHIuc3RhcnQpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIC8qXG4gICBUaGlzIG1ldGhvZCBpcyB1c2VkIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgZmlyc3QgZnJhZ21lbnQgZm9yIGEgbGl2ZSBwbGF5bGlzdC4gVGhpcyBmcmFnbWVudCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVcbiAgIFwic2xpZGluZ1wiIG9mIHRoZSBwbGF5bGlzdCwgd2hpY2ggaXMgaXRzIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBwbGF5YmFjay4gQWZ0ZXIgc2xpZGluZyB3ZSBjYW4gY29tcHV0ZSB0aGUgcmVhbFxuICAgc3RhcnQgYW5kIGVuZCB0aW1lcyBmb3IgZWFjaCBmcmFnbWVudCBpbiB0aGUgcGxheWxpc3QgKGFmdGVyIHdoaWNoIHRoaXMgbWV0aG9kIHdpbGwgbm90IG5lZWQgdG8gYmUgY2FsbGVkKS5cbiAgKi9cbiAgZ2V0SW5pdGlhbExpdmVGcmFnbWVudChlKSB7XG4gICAgY29uc3QgdCA9IGUuZnJhZ21lbnRzLCByID0gdGhpcy5mcmFnUHJldmlvdXM7XG4gICAgbGV0IG4gPSBudWxsO1xuICAgIGlmIChyKSB7XG4gICAgICBpZiAoZS5oYXNQcm9ncmFtRGF0ZVRpbWUgJiYgKHRoaXMubG9nKGBMaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIHNhbWUgUERUOiAke3IucHJvZ3JhbURhdGVUaW1lfWApLCBuID0gdmIodCwgci5lbmRQcm9ncmFtRGF0ZVRpbWUsIHRoaXMuY29uZmlnLm1heEZyYWdMb29rVXBUb2xlcmFuY2UpKSwgIW4pIHtcbiAgICAgICAgY29uc3QgaSA9IHIuc24gKyAxO1xuICAgICAgICBpZiAoaSA+PSBlLnN0YXJ0U04gJiYgaSA8PSBlLmVuZFNOKSB7XG4gICAgICAgICAgY29uc3QgbyA9IHRbaSAtIGUuc3RhcnRTTl07XG4gICAgICAgICAgci5jYyA9PT0gby5jYyAmJiAobiA9IG8sIHRoaXMubG9nKGBMaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIG5leHQgU046ICR7bi5zbn1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgbiB8fCAobiA9IFZnKGUsIHIuY2MsIHIuZW5kKSwgbiAmJiB0aGlzLmxvZyhgTGl2ZSBwbGF5bGlzdCwgc3dpdGNoaW5nIHBsYXlsaXN0LCBsb2FkIGZyYWcgd2l0aCBzYW1lIENDOiAke24uc259YCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5obHMubGl2ZVN5bmNQb3NpdGlvbjtcbiAgICAgIGkgIT09IG51bGwgJiYgKG4gPSB0aGlzLmdldEZyYWdtZW50QXRQb3NpdGlvbihpLCB0aGlzLmJpdHJhdGVUZXN0ID8gZS5mcmFnbWVudEVuZCA6IGUuZWRnZSwgZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfVxuICAvKlxuICBUaGlzIG1ldGhvZCBmaW5kcyB0aGUgYmVzdCBtYXRjaGluZyBmcmFnbWVudCBnaXZlbiB0aGUgcHJvdmlkZWQgcG9zaXRpb24uXG4gICAqL1xuICBnZXRGcmFnbWVudEF0UG9zaXRpb24oZSwgdCwgcikge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZzogblxuICAgIH0gPSB0aGlzO1xuICAgIGxldCB7XG4gICAgICBmcmFnUHJldmlvdXM6IGlcbiAgICB9ID0gdGhpcywge1xuICAgICAgZnJhZ21lbnRzOiBvLFxuICAgICAgZW5kU046IGFcbiAgICB9ID0gcjtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudEhpbnQ6IGxcbiAgICB9ID0gciwge1xuICAgICAgbWF4RnJhZ0xvb2tVcFRvbGVyYW5jZTogY1xuICAgIH0gPSBuLCB1ID0gci5wYXJ0TGlzdCwgZCA9ICEhKHRoaXMubG9hZGluZ1BhcnRzICYmIHUgIT0gbnVsbCAmJiB1Lmxlbmd0aCAmJiBsKTtcbiAgICBkICYmICF0aGlzLmJpdHJhdGVUZXN0ICYmIHVbdS5sZW5ndGggLSAxXS5mcmFnbWVudC5zbiA9PT0gbC5zbiAmJiAobyA9IG8uY29uY2F0KGwpLCBhID0gbC5zbik7XG4gICAgbGV0IGg7XG4gICAgaWYgKGUgPCB0KSB7XG4gICAgICB2YXIgZjtcbiAgICAgIGNvbnN0IHkgPSBlIDwgdGhpcy5sYXN0Q3VycmVudFRpbWUgfHwgZSA+IHQgLSBjIHx8IChmID0gdGhpcy5tZWRpYSkgIT0gbnVsbCAmJiBmLnBhdXNlZCB8fCAhdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPyAwIDogYztcbiAgICAgIGggPSBKcyhpLCBvLCBlLCB5KTtcbiAgICB9IGVsc2VcbiAgICAgIGggPSBvW28ubGVuZ3RoIC0gMV07XG4gICAgaWYgKGgpIHtcbiAgICAgIGNvbnN0IHAgPSBoLnNuIC0gci5zdGFydFNOLCB5ID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoaCk7XG4gICAgICBpZiAoKHkgPT09IEh0Lk9LIHx8IHkgPT09IEh0LlBBUlRJQUwgJiYgaC5nYXApICYmIChpID0gaCksIGkgJiYgaC5zbiA9PT0gaS5zbiAmJiAoIWQgfHwgdVswXS5mcmFnbWVudC5zbiA+IGguc24gfHwgIXIubGl2ZSkgJiYgaC5sZXZlbCA9PT0gaS5sZXZlbCkge1xuICAgICAgICBjb25zdCBiID0gb1twICsgMV07XG4gICAgICAgIGguc24gPCBhICYmIHRoaXMuZnJhZ21lbnRUcmFja2VyLmdldFN0YXRlKGIpICE9PSBIdC5PSyA/IGggPSBiIDogaCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoO1xuICB9XG4gIGFsaWduUGxheWxpc3RzKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gZS5mcmFnbWVudHMubGVuZ3RoO1xuICAgIGlmICghbilcbiAgICAgIHJldHVybiB0aGlzLndhcm4oXCJObyBmcmFnbWVudHMgaW4gbGl2ZSBwbGF5bGlzdFwiKSwgMDtcbiAgICBjb25zdCBpID0gZS5mcmFnbWVudFN0YXJ0LCBvID0gIXQsIGEgPSBlLmFsaWduZWRTbGlkaW5nICYmIHVlKGkpO1xuICAgIGlmIChvIHx8ICFhICYmICFpKSB7XG4gICAgICByVChyLCBlKTtcbiAgICAgIGNvbnN0IGwgPSBlLmZyYWdtZW50U3RhcnQ7XG4gICAgICByZXR1cm4gdGhpcy5sb2coYExpdmUgcGxheWxpc3Qgc2xpZGluZzogJHtsLnRvRml4ZWQoMil9IHN0YXJ0LXNuOiAke3QgPyB0LnN0YXJ0U04gOiBcIm5hXCJ9LT4ke2Uuc3RhcnRTTn0gZnJhZ21lbnRzOiAke259YCksIGw7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9XG4gIHdhaXRGb3JDZG5UdW5lSW4oZSkge1xuICAgIHJldHVybiBlLmxpdmUgJiYgZS5jYW5CbG9ja1JlbG9hZCAmJiBlLnBhcnRUYXJnZXQgJiYgZS50dW5lSW5Hb2FsID4gTWF0aC5tYXgoZS5wYXJ0SG9sZEJhY2ssIGUucGFydFRhcmdldCAqIDMpO1xuICB9XG4gIHNldFN0YXJ0UG9zaXRpb24oZSwgdCkge1xuICAgIGxldCByID0gdGhpcy5zdGFydFBvc2l0aW9uO1xuICAgIHIgPCB0ICYmIChyID0gLTEpO1xuICAgIGNvbnN0IG4gPSB0aGlzLnRpbWVsaW5lT2Zmc2V0O1xuICAgIGlmIChyID09PSAtMSkge1xuICAgICAgY29uc3QgaSA9IHRoaXMuc3RhcnRUaW1lT2Zmc2V0ICE9PSBudWxsLCBvID0gaSA/IHRoaXMuc3RhcnRUaW1lT2Zmc2V0IDogZS5zdGFydFRpbWVPZmZzZXQ7XG4gICAgICBvICE9PSBudWxsICYmIHVlKG8pID8gKHIgPSB0ICsgbywgbyA8IDAgJiYgKHIgKz0gZS5lZGdlKSwgciA9IE1hdGgubWluKE1hdGgubWF4KHQsIHIpLCB0ICsgZS50b3RhbGR1cmF0aW9uKSwgdGhpcy5sb2coYFNldHRpbmcgc3RhcnRQb3NpdGlvbiB0byAke3J9IGZvciBzdGFydCB0aW1lIG9mZnNldCAke299IGZvdW5kIGluICR7aSA/IFwibXVsdGl2YXJpYW50XCIgOiBcIm1lZGlhXCJ9IHBsYXlsaXN0YCksIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHIpIDogZS5saXZlID8gKHIgPSB0aGlzLmhscy5saXZlU3luY1Bvc2l0aW9uIHx8IHQsIHRoaXMubG9nKGBTZXR0aW5nIHN0YXJ0UG9zaXRpb24gdG8gLTEgdG8gc3RhcnQgYXQgbGl2ZSBlZGdlICR7cn1gKSwgdGhpcy5zdGFydFBvc2l0aW9uID0gLTEpIDogKHRoaXMubG9nKFwic2V0dGluZyBzdGFydFBvc2l0aW9uIHRvIDAgYnkgZGVmYXVsdFwiKSwgdGhpcy5zdGFydFBvc2l0aW9uID0gciA9IDApLCB0aGlzLmxhc3RDdXJyZW50VGltZSA9IHIgKyBuO1xuICAgIH1cbiAgICB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSByICsgbjtcbiAgfVxuICBnZXRMb2FkUG9zaXRpb24oKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IHRcbiAgICB9ID0gdGhpcztcbiAgICBsZXQgciA9IDA7XG4gICAgcmV0dXJuIChlID0gdGhpcy5obHMpICE9IG51bGwgJiYgZS5oYXNFbm91Z2hUb1N0YXJ0ICYmIHQgPyByID0gdC5jdXJyZW50VGltZSA6IHRoaXMubmV4dExvYWRQb3NpdGlvbiA+PSAwICYmIChyID0gdGhpcy5uZXh0TG9hZFBvc2l0aW9uKSwgcjtcbiAgfVxuICBoYW5kbGVGcmFnTG9hZEFib3J0ZWQoZSwgdCkge1xuICAgIHRoaXMudHJhbnNtdXhlciAmJiBlLnR5cGUgPT09IHRoaXMucGxheWxpc3RUeXBlICYmIFZ0KGUpICYmIGUuc3RhdHMuYWJvcnRlZCAmJiAodGhpcy5sb2coYEZyYWdtZW50ICR7ZS5zbn0ke3QgPyBcIiBwYXJ0IFwiICsgdC5pbmRleCA6IFwiXCJ9IG9mICR7dGhpcy5wbGF5bGlzdExhYmVsKCl9ICR7ZS5sZXZlbH0gd2FzIGFib3J0ZWRgKSwgdGhpcy5yZXNldEZyYWdtZW50TG9hZGluZyhlKSk7XG4gIH1cbiAgcmVzZXRGcmFnbWVudExvYWRpbmcoZSkge1xuICAgICghdGhpcy5mcmFnQ3VycmVudCB8fCAhdGhpcy5mcmFnQ29udGV4dENoYW5nZWQoZSkgJiYgdGhpcy5zdGF0ZSAhPT0gbmUuRlJBR19MT0FESU5HX1dBSVRJTkdfUkVUUlkpICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gIH1cbiAgb25GcmFnbWVudE9yS2V5TG9hZEVycm9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBpZiAodC5jaHVua01ldGEgJiYgIXQuZnJhZykge1xuICAgICAgY29uc3QgYiA9IHRoaXMuZ2V0Q3VycmVudENvbnRleHQodC5jaHVua01ldGEpO1xuICAgICAgYiAmJiAodC5mcmFnID0gYi5mcmFnKTtcbiAgICB9XG4gICAgY29uc3QgbiA9IHQuZnJhZztcbiAgICBpZiAoIW4gfHwgbi50eXBlICE9PSBlIHx8ICF0aGlzLmxldmVscylcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5mcmFnQ29udGV4dENoYW5nZWQobikpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdGhpcy53YXJuKGBGcmFnIGxvYWQgZXJyb3IgbXVzdCBtYXRjaCBjdXJyZW50IGZyYWcgdG8gcmV0cnkgJHtuLnVybH0gPiAkeyhpID0gdGhpcy5mcmFnQ3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IGkudXJsfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvID0gdC5kZXRhaWxzID09PSBKLkZSQUdfR0FQO1xuICAgIG8gJiYgdGhpcy5mcmFnbWVudFRyYWNrZXIuZnJhZ0J1ZmZlcmVkKG4sICEwKTtcbiAgICBjb25zdCBhID0gdC5lcnJvckFjdGlvbjtcbiAgICBpZiAoIWEpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBuZS5FUlJPUjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWN0aW9uOiBsLFxuICAgICAgZmxhZ3M6IGMsXG4gICAgICByZXRyeUNvdW50OiB1ID0gMCxcbiAgICAgIHJldHJ5Q29uZmlnOiBkXG4gICAgfSA9IGEsIGggPSAhIWQsIGYgPSBoICYmIGwgPT09IFp0LlJldHJ5UmVxdWVzdCwgcCA9IGggJiYgIWEucmVzb2x2ZWQgJiYgYyA9PT0gdnIuTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0hvc3QsIHkgPSAociA9IHRoaXMuaGxzLmxhdGVzdExldmVsRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IHIubGl2ZTtcbiAgICBpZiAoIWYgJiYgcCAmJiBWdChuKSAmJiAhbi5lbmRMaXN0ICYmIHkgJiYgIUtnKHQpKVxuICAgICAgdGhpcy5yZXNldEZyYWdtZW50RXJyb3JzKGUpLCB0aGlzLnRyZWF0QXNHYXAobiksIGEucmVzb2x2ZWQgPSAhMDtcbiAgICBlbHNlIGlmICgoZiB8fCBwKSAmJiB1IDwgZC5tYXhOdW1SZXRyeSkge1xuICAgICAgdmFyIEU7XG4gICAgICBjb25zdCBiID0gdWMoKEUgPSB0LnJlc3BvbnNlKSA9PSBudWxsID8gdm9pZCAwIDogRS5jb2RlKSwgUiA9IHl1KGQsIHUpO1xuICAgICAgaWYgKHRoaXMucmVzZXRTdGFydFdoZW5Ob3RMb2FkZWQoKSwgdGhpcy5yZXRyeURhdGUgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpICsgUiwgdGhpcy5zdGF0ZSA9IG5lLkZSQUdfTE9BRElOR19XQUlUSU5HX1JFVFJZLCBhLnJlc29sdmVkID0gITAsIGIpIHtcbiAgICAgICAgdGhpcy5sb2coXCJXYWl0aW5nIGZvciBjb25uZWN0aW9uIChvZmZsaW5lKVwiKSwgdGhpcy5yZXRyeURhdGUgPSAxIC8gMCwgdC5yZWFzb24gPSBcIm9mZmxpbmVcIjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCAke24uc259IG9mICR7ZX0gJHtuLmxldmVsfSBlcnJvcmVkIHdpdGggJHt0LmRldGFpbHN9LCByZXRyeWluZyBsb2FkaW5nICR7dSArIDF9LyR7ZC5tYXhOdW1SZXRyeX0gaW4gJHtSfW1zYCk7XG4gICAgfSBlbHNlIGlmIChkKVxuICAgICAgaWYgKHRoaXMucmVzZXRGcmFnbWVudEVycm9ycyhlKSwgdSA8IGQubWF4TnVtUmV0cnkpXG4gICAgICAgICFvICYmIGwgIT09IFp0LlJlbW92ZUFsdGVybmF0ZVBlcm1hbmVudGx5ICYmIChhLnJlc29sdmVkID0gITApO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMud2FybihgJHt0LmRldGFpbHN9IHJlYWNoZWQgb3IgZXhjZWVkZWQgbWF4IHJldHJ5ICgke3V9KWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgZWxzZSBsID09PSBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94ID8gdGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfTEVWRUwgOiB0aGlzLnN0YXRlID0gbmUuRVJST1I7XG4gICAgdGhpcy50aWNrSW1tZWRpYXRlKCk7XG4gIH1cbiAgY2hlY2tSZXRyeURhdGUoKSB7XG4gICAgY29uc3QgZSA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIHQgPSB0aGlzLnJldHJ5RGF0ZSwgciA9IHQgPT09IDEgLyAwO1xuICAgICghdCB8fCBlID49IHQgfHwgciAmJiAhdWMoMCkpICYmIChyICYmIHRoaXMubG9nKFwiQ29ubmVjdGlvbiByZXN0b3JlZCAob25saW5lKVwiKSwgdGhpcy5yZXNldFN0YXJ0V2hlbk5vdExvYWRlZCgpLCB0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gIH1cbiAgcmVkdWNlTGVuZ3RoQW5kRmx1c2hCdWZmZXIoZSkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBuZS5QQVJTSU5HIHx8IHRoaXMuc3RhdGUgPT09IG5lLlBBUlNFRCkge1xuICAgICAgY29uc3QgdCA9IGUuZnJhZywgciA9IGUucGFyZW50LCBuID0gdGhpcy5nZXRGd2RCdWZmZXJJbmZvKHRoaXMubWVkaWFCdWZmZXIsIHIpLCBpID0gbiAmJiBuLmxlbiA+IDAuNTtcbiAgICAgIGkgJiYgdGhpcy5yZWR1Y2VNYXhCdWZmZXJMZW5ndGgobi5sZW4sICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LmR1cmF0aW9uKSB8fCAxMCk7XG4gICAgICBjb25zdCBvID0gIWk7XG4gICAgICByZXR1cm4gbyAmJiB0aGlzLndhcm4oYEJ1ZmZlciBmdWxsIGVycm9yIHdoaWxlIG1lZGlhLmN1cnJlbnRUaW1lICgke3RoaXMuZ2V0TG9hZFBvc2l0aW9uKCl9KSBpcyBub3QgYnVmZmVyZWQsIGZsdXNoICR7cn0gYnVmZmVyYCksIHQgJiYgKHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KHQpLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0LnN0YXJ0KSwgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpLCBvO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgcmVzZXRGcmFnbWVudEVycm9ycyhlKSB7XG4gICAgZSA9PT0gcGUuQVVESU8gJiYgKHRoaXMuZnJhZ0N1cnJlbnQgPSBudWxsKSwgdGhpcy5obHMuaGFzRW5vdWdoVG9TdGFydCB8fCAodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMSksIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5JRExFKTtcbiAgfVxuICBhZnRlckJ1ZmZlckZsdXNoZWQoZSwgdCwgcikge1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gQ2UuZ2V0QnVmZmVyZWQoZSk7XG4gICAgdGhpcy5mcmFnbWVudFRyYWNrZXIuZGV0ZWN0RXZpY3RlZEZyYWdtZW50cyh0LCBuLCByKSwgdGhpcy5zdGF0ZSA9PT0gbmUuRU5ERUQgJiYgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpO1xuICB9XG4gIHJlc2V0TG9hZGluZ1N0YXRlKCkge1xuICAgIHRoaXMubG9nKFwiUmVzZXQgbG9hZGluZyBzdGF0ZVwiKSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuZnJhZ1ByZXZpb3VzID0gbnVsbCwgdGhpcy5zdGF0ZSAhPT0gbmUuU1RPUFBFRCAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpO1xuICB9XG4gIHJlc2V0U3RhcnRXaGVuTm90TG9hZGVkKCkge1xuICAgIGlmICghdGhpcy5obHMuaGFzRW5vdWdoVG9TdGFydCkge1xuICAgICAgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMTtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmxldmVsTGFzdExvYWRlZCwgdCA9IGUgPyBlLmRldGFpbHMgOiBudWxsO1xuICAgICAgdCAhPSBudWxsICYmIHQubGl2ZSA/ICh0aGlzLmxvZyhcInJlc2V0dGluZyBzdGFydFBvc2l0aW9uIGZvciBsaXZlIHN0YXJ0XCIpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSAtMSwgdGhpcy5zZXRTdGFydFBvc2l0aW9uKHQsIHQuZnJhZ21lbnRTdGFydCksIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKSkgOiB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb247XG4gICAgfVxuICB9XG4gIHJlc2V0V2hlbk1pc3NpbmdDb250ZXh0KGUpIHtcbiAgICB0aGlzLmxvZyhgTG9hZGluZyBjb250ZXh0IGNoYW5nZWQgd2hpbGUgYnVmZmVyaW5nIHNuICR7ZS5zbn0gb2YgJHt0aGlzLnBsYXlsaXN0TGFiZWwoKX0gJHtlLmxldmVsID09PSAtMSA/IFwiPHJlbW92ZWQ+XCIgOiBlLmxldmVsfS4gVGhpcyBjaHVuayB3aWxsIG5vdCBiZSBidWZmZXJlZC5gKSwgdGhpcy5yZW1vdmVVbmJ1ZmZlcmVkRnJhZ3MoKSwgdGhpcy5yZXNldFN0YXJ0V2hlbk5vdExvYWRlZCgpLCB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCk7XG4gIH1cbiAgcmVtb3ZlVW5idWZmZXJlZEZyYWdzKGUgPSAwKSB7XG4gICAgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnRzSW5SYW5nZShlLCAxIC8gMCwgdGhpcy5wbGF5bGlzdFR5cGUsICExLCAhMCk7XG4gIH1cbiAgdXBkYXRlTGV2ZWxUaW1pbmcoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSByLmRldGFpbHM7XG4gICAgaWYgKCFpKSB7XG4gICAgICB0aGlzLndhcm4oXCJsZXZlbC5kZXRhaWxzIHVuZGVmaW5lZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFPYmplY3Qua2V5cyhlLmVsZW1lbnRhcnlTdHJlYW1zKS5yZWR1Y2UoKGwsIGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBlLmVsZW1lbnRhcnlTdHJlYW1zW2NdO1xuICAgICAgaWYgKHUpIHtcbiAgICAgICAgY29uc3QgZCA9IHUuZW5kUFRTIC0gdS5zdGFydFBUUztcbiAgICAgICAgaWYgKGQgPD0gMClcbiAgICAgICAgICByZXR1cm4gdGhpcy53YXJuKGBDb3VsZCBub3QgcGFyc2UgZnJhZ21lbnQgJHtlLnNufSAke2N9IGR1cmF0aW9uIHJlbGlhYmx5ICgke2R9KWApLCBsIHx8ICExO1xuICAgICAgICBjb25zdCBoID0gbiA/IDAgOiBYZyhpLCBlLCB1LnN0YXJ0UFRTLCB1LmVuZFBUUywgdS5zdGFydERUUywgdS5lbmREVFMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5obHMudHJpZ2dlcihJLkxFVkVMX1BUU19VUERBVEVELCB7XG4gICAgICAgICAgZGV0YWlsczogaSxcbiAgICAgICAgICBsZXZlbDogcixcbiAgICAgICAgICBkcmlmdDogaCxcbiAgICAgICAgICB0eXBlOiBjLFxuICAgICAgICAgIGZyYWc6IGUsXG4gICAgICAgICAgc3RhcnQ6IHUuc3RhcnRQVFMsXG4gICAgICAgICAgZW5kOiB1LmVuZFBUU1xuICAgICAgICB9KSwgITA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbDtcbiAgICB9LCAhMSkpIHtcbiAgICAgIHZhciBhO1xuICAgICAgaWYgKHIuZnJhZ21lbnRFcnJvciA9PT0gMCAmJiB0aGlzLnRyZWF0QXNHYXAoZSwgciksICgoYSA9IHRoaXMudHJhbnNtdXhlcikgPT0gbnVsbCA/IHZvaWQgMCA6IGEuZXJyb3IpID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGwgPSBuZXcgRXJyb3IoYEZvdW5kIG5vIG1lZGlhIGluIGZyYWdtZW50ICR7ZS5zbn0gb2YgJHt0aGlzLnBsYXlsaXN0TGFiZWwoKX0gJHtlLmxldmVsfSByZXNldHRpbmcgdHJhbnNtdXhlciB0byBmYWxsYmFjayB0byBwbGF5bGlzdCB0aW1pbmdgKTtcbiAgICAgICAgaWYgKHRoaXMud2FybihsLm1lc3NhZ2UpLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgZXJyb3I6IGwsXG4gICAgICAgICAgZnJhZzogZSxcbiAgICAgICAgICByZWFzb246IGBGb3VuZCBubyBtZWRpYSBpbiBtc24gJHtlLnNufSBvZiAke3RoaXMucGxheWxpc3RMYWJlbCgpfSBcIiR7ci51cmx9XCJgXG4gICAgICAgIH0pLCAhdGhpcy5obHMpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlc2V0VHJhbnNtdXhlcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gbmUuUEFSU0VELCB0aGlzLmxvZyhgUGFyc2VkICR7ZS50eXBlfSBzbjogJHtlLnNufSR7dCA/IFwiIHBhcnQ6IFwiICsgdC5pbmRleCA6IFwiXCJ9IG9mICR7dGhpcy5mcmFnSW5mbyhlLCAhMSwgdCl9KWApLCB0aGlzLmhscy50cmlnZ2VyKEkuRlJBR19QQVJTRUQsIHtcbiAgICAgIGZyYWc6IGUsXG4gICAgICBwYXJ0OiB0XG4gICAgfSk7XG4gIH1cbiAgcGxheWxpc3RMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdFR5cGUgPT09IHBlLk1BSU4gPyBcImxldmVsXCIgOiBcInRyYWNrXCI7XG4gIH1cbiAgZnJhZ0luZm8oZSwgdCA9ICEwLCByKSB7XG4gICAgdmFyIG4sIGk7XG4gICAgcmV0dXJuIGAke3RoaXMucGxheWxpc3RMYWJlbCgpfSAke2UubGV2ZWx9ICgke3IgPyBcInBhcnRcIiA6IFwiZnJhZ1wifTpbJHsoKG4gPSB0ICYmICFyID8gZS5zdGFydFBUUyA6IChyIHx8IGUpLnN0YXJ0KSAhPSBudWxsID8gbiA6IE5hTikudG9GaXhlZCgzKX0tJHsoKGkgPSB0ICYmICFyID8gZS5lbmRQVFMgOiAociB8fCBlKS5lbmQpICE9IG51bGwgPyBpIDogTmFOKS50b0ZpeGVkKDMpfV0ke3IgJiYgZS50eXBlID09PSBcIm1haW5cIiA/IFwiSU5ERVBFTkRFTlQ9XCIgKyAoci5pbmRlcGVuZGVudCA/IFwiWUVTXCIgOiBcIk5PXCIpIDogXCJcIn1gO1xuICB9XG4gIHRyZWF0QXNHYXAoZSwgdCkge1xuICAgIHQgJiYgdC5mcmFnbWVudEVycm9yKyssIGUuZ2FwID0gITAsIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUpLCB0aGlzLmZyYWdtZW50VHJhY2tlci5mcmFnQnVmZmVyZWQoZSwgITApO1xuICB9XG4gIHJlc2V0VHJhbnNtdXhlcigpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMudHJhbnNtdXhlcikgPT0gbnVsbCB8fCBlLnJlc2V0KCk7XG4gIH1cbiAgcmVjb3ZlcldvcmtlckVycm9yKGUpIHtcbiAgICBlLmV2ZW50ID09PSBcImRlbXV4ZXJXb3JrZXJcIiAmJiAodGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlQWxsRnJhZ21lbnRzKCksIHRoaXMudHJhbnNtdXhlciAmJiAodGhpcy50cmFuc211eGVyLmRlc3Ryb3koKSwgdGhpcy50cmFuc211eGVyID0gbnVsbCksIHRoaXMucmVzZXRTdGFydFdoZW5Ob3RMb2FkZWQoKSwgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpKTtcbiAgfVxuICBzZXQgc3RhdGUoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLl9zdGF0ZTtcbiAgICB0ICE9PSBlICYmICh0aGlzLl9zdGF0ZSA9IGUsIHRoaXMubG9nKGAke3R9LT4ke2V9YCkpO1xuICB9XG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gIH1cbn1cbmZ1bmN0aW9uIEJoKHMpIHtcbiAgcmV0dXJuICEhcy5pbnRlcnN0aXRpYWxzQ29udHJvbGxlciAmJiBzLmVuYWJsZUludGVyc3RpdGlhbFBsYXliYWNrICE9PSAhMTtcbn1cbmNsYXNzIGlwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jaHVua3MgPSBbXSwgdGhpcy5kYXRhTGVuZ3RoID0gMDtcbiAgfVxuICBwdXNoKGUpIHtcbiAgICB0aGlzLmNodW5rcy5wdXNoKGUpLCB0aGlzLmRhdGFMZW5ndGggKz0gZS5sZW5ndGg7XG4gIH1cbiAgZmx1c2goKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2h1bmtzOiBlLFxuICAgICAgZGF0YUxlbmd0aDogdFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCByO1xuICAgIGlmIChlLmxlbmd0aClcbiAgICAgIGUubGVuZ3RoID09PSAxID8gciA9IGVbMF0gOiByID0gblQoZSwgdCk7XG4gICAgZWxzZSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgcmV0dXJuIHRoaXMucmVzZXQoKSwgcjtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLmNodW5rcy5sZW5ndGggPSAwLCB0aGlzLmRhdGFMZW5ndGggPSAwO1xuICB9XG59XG5mdW5jdGlvbiBuVChzLCBlKSB7XG4gIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShlKTtcbiAgbGV0IHIgPSAwO1xuICBmb3IgKGxldCBuID0gMDsgbiA8IHMubGVuZ3RoOyBuKyspIHtcbiAgICBjb25zdCBpID0gc1tuXTtcbiAgICB0LnNldChpLCByKSwgciArPSBpLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gdDtcbn1cbnZhciBtbCA9IHsgZXhwb3J0czoge30gfSwgRmg7XG5mdW5jdGlvbiBpVCgpIHtcbiAgcmV0dXJuIEZoIHx8IChGaCA9IDEsIChmdW5jdGlvbihzKSB7XG4gICAgdmFyIGUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCB0ID0gXCJ+XCI7XG4gICAgZnVuY3Rpb24gcigpIHtcbiAgICB9XG4gICAgT2JqZWN0LmNyZWF0ZSAmJiAoci5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgbmV3IHIoKS5fX3Byb3RvX18gfHwgKHQgPSAhMSkpO1xuICAgIGZ1bmN0aW9uIG4obCwgYywgdSkge1xuICAgICAgdGhpcy5mbiA9IGwsIHRoaXMuY29udGV4dCA9IGMsIHRoaXMub25jZSA9IHUgfHwgITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGkobCwgYywgdSwgZCwgaCkge1xuICAgICAgaWYgKHR5cGVvZiB1ICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICB2YXIgZiA9IG5ldyBuKHUsIGQgfHwgbCwgaCksIHAgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgcmV0dXJuIGwuX2V2ZW50c1twXSA/IGwuX2V2ZW50c1twXS5mbiA/IGwuX2V2ZW50c1twXSA9IFtsLl9ldmVudHNbcF0sIGZdIDogbC5fZXZlbnRzW3BdLnB1c2goZikgOiAobC5fZXZlbnRzW3BdID0gZiwgbC5fZXZlbnRzQ291bnQrKyksIGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG8obCwgYykge1xuICAgICAgLS1sLl9ldmVudHNDb3VudCA9PT0gMCA/IGwuX2V2ZW50cyA9IG5ldyByKCkgOiBkZWxldGUgbC5fZXZlbnRzW2NdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IHIoKSwgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYyA9IFtdLCB1LCBkO1xuICAgICAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gYztcbiAgICAgIGZvciAoZCBpbiB1ID0gdGhpcy5fZXZlbnRzKVxuICAgICAgICBlLmNhbGwodSwgZCkgJiYgYy5wdXNoKHQgPyBkLnNsaWNlKDEpIDogZCk7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IGMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModSkpIDogYztcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihjKSB7XG4gICAgICB2YXIgdSA9IHQgPyB0ICsgYyA6IGMsIGQgPSB0aGlzLl9ldmVudHNbdV07XG4gICAgICBpZiAoIWQpIHJldHVybiBbXTtcbiAgICAgIGlmIChkLmZuKSByZXR1cm4gW2QuZm5dO1xuICAgICAgZm9yICh2YXIgaCA9IDAsIGYgPSBkLmxlbmd0aCwgcCA9IG5ldyBBcnJheShmKTsgaCA8IGY7IGgrKylcbiAgICAgICAgcFtoXSA9IGRbaF0uZm47XG4gICAgICByZXR1cm4gcDtcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHUgPSB0ID8gdCArIGMgOiBjLCBkID0gdGhpcy5fZXZlbnRzW3VdO1xuICAgICAgcmV0dXJuIGQgPyBkLmZuID8gMSA6IGQubGVuZ3RoIDogMDtcbiAgICB9LCBhLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oYywgdSwgZCwgaCwgZiwgcCkge1xuICAgICAgdmFyIHkgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgaWYgKCF0aGlzLl9ldmVudHNbeV0pIHJldHVybiAhMTtcbiAgICAgIHZhciBFID0gdGhpcy5fZXZlbnRzW3ldLCBiID0gYXJndW1lbnRzLmxlbmd0aCwgUiwgQTtcbiAgICAgIGlmIChFLmZuKSB7XG4gICAgICAgIHN3aXRjaCAoRS5vbmNlICYmIHRoaXMucmVtb3ZlTGlzdGVuZXIoYywgRS5mbiwgdm9pZCAwLCAhMCksIGIpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCksICEwO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1KSwgITA7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQpLCAhMDtcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCwgdSwgZCwgaCksICEwO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1LCBkLCBoLCBmKSwgITA7XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQsIGgsIGYsIHApLCAhMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKEEgPSAxLCBSID0gbmV3IEFycmF5KGIgLSAxKTsgQSA8IGI7IEErKylcbiAgICAgICAgICBSW0EgLSAxXSA9IGFyZ3VtZW50c1tBXTtcbiAgICAgICAgRS5mbi5hcHBseShFLmNvbnRleHQsIFIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIEYgPSBFLmxlbmd0aCwgTTtcbiAgICAgICAgZm9yIChBID0gMDsgQSA8IEY7IEErKylcbiAgICAgICAgICBzd2l0Y2ggKEVbQV0ub25jZSAmJiB0aGlzLnJlbW92ZUxpc3RlbmVyKGMsIEVbQV0uZm4sIHZvaWQgMCwgITApLCBiKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgRVtBXS5mbi5jYWxsKEVbQV0uY29udGV4dCwgdSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBFW0FdLmZuLmNhbGwoRVtBXS5jb250ZXh0LCB1LCBkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQsIHUsIGQsIGgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmICghUikgZm9yIChNID0gMSwgUiA9IG5ldyBBcnJheShiIC0gMSk7IE0gPCBiOyBNKyspXG4gICAgICAgICAgICAgICAgUltNIC0gMV0gPSBhcmd1bWVudHNbTV07XG4gICAgICAgICAgICAgIEVbQV0uZm4uYXBwbHkoRVtBXS5jb250ZXh0LCBSKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgYS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihjLCB1LCBkKSB7XG4gICAgICByZXR1cm4gaSh0aGlzLCBjLCB1LCBkLCAhMSk7XG4gICAgfSwgYS5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGMsIHUsIGQpIHtcbiAgICAgIHJldHVybiBpKHRoaXMsIGMsIHUsIGQsICEwKTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGMsIHUsIGQsIGgpIHtcbiAgICAgIHZhciBmID0gdCA/IHQgKyBjIDogYztcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzW2ZdKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghdSlcbiAgICAgICAgcmV0dXJuIG8odGhpcywgZiksIHRoaXM7XG4gICAgICB2YXIgcCA9IHRoaXMuX2V2ZW50c1tmXTtcbiAgICAgIGlmIChwLmZuKVxuICAgICAgICBwLmZuID09PSB1ICYmICghaCB8fCBwLm9uY2UpICYmICghZCB8fCBwLmNvbnRleHQgPT09IGQpICYmIG8odGhpcywgZik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgeSA9IDAsIEUgPSBbXSwgYiA9IHAubGVuZ3RoOyB5IDwgYjsgeSsrKVxuICAgICAgICAgIChwW3ldLmZuICE9PSB1IHx8IGggJiYgIXBbeV0ub25jZSB8fCBkICYmIHBbeV0uY29udGV4dCAhPT0gZCkgJiYgRS5wdXNoKHBbeV0pO1xuICAgICAgICBFLmxlbmd0aCA/IHRoaXMuX2V2ZW50c1tmXSA9IEUubGVuZ3RoID09PSAxID8gRVswXSA6IEUgOiBvKHRoaXMsIGYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHU7XG4gICAgICByZXR1cm4gYyA/ICh1ID0gdCA/IHQgKyBjIDogYywgdGhpcy5fZXZlbnRzW3VdICYmIG8odGhpcywgdSkpIDogKHRoaXMuX2V2ZW50cyA9IG5ldyByKCksIHRoaXMuX2V2ZW50c0NvdW50ID0gMCksIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUub2ZmID0gYS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsIGEucHJvdG90eXBlLmFkZExpc3RlbmVyID0gYS5wcm90b3R5cGUub24sIGEucHJlZml4ZWQgPSB0LCBhLkV2ZW50RW1pdHRlciA9IGEsIHMuZXhwb3J0cyA9IGE7XG4gIH0pKG1sKSksIG1sLmV4cG9ydHM7XG59XG52YXIgb1QgPSBpVCgpLCB3dSA9IC8qIEBfX1BVUkVfXyAqLyBrUyhvVCk7XG5jb25zdCB2aSA9IFwiMS42LjEyXCIsIE5uID0ge307XG5mdW5jdGlvbiBhVCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBfX0hMU19XT1JLRVJfQlVORExFX18gPT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gbFQoKSB7XG4gIGNvbnN0IHMgPSBOblt2aV07XG4gIGlmIChzKVxuICAgIHJldHVybiBzLmNsaWVudENvdW50KyssIHM7XG4gIGNvbnN0IGUgPSBuZXcgc2VsZi5CbG9iKFtgdmFyIGV4cG9ydHM9e307dmFyIG1vZHVsZT17ZXhwb3J0czpleHBvcnRzfTtmdW5jdGlvbiBkZWZpbmUoZil7ZigpfTtkZWZpbmUuYW1kPXRydWU7KCR7X19ITFNfV09SS0VSX0JVTkRMRV9fLnRvU3RyaW5nKCl9KSh0cnVlKTtgXSwge1xuICAgIHR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCJcbiAgfSksIHQgPSBzZWxmLlVSTC5jcmVhdGVPYmplY3RVUkwoZSksIG4gPSB7XG4gICAgd29ya2VyOiBuZXcgc2VsZi5Xb3JrZXIodCksXG4gICAgb2JqZWN0VVJMOiB0LFxuICAgIGNsaWVudENvdW50OiAxXG4gIH07XG4gIHJldHVybiBOblt2aV0gPSBuLCBuO1xufVxuZnVuY3Rpb24gY1Qocykge1xuICBjb25zdCBlID0gTm5bc107XG4gIGlmIChlKVxuICAgIHJldHVybiBlLmNsaWVudENvdW50KyssIGU7XG4gIGNvbnN0IHQgPSBuZXcgc2VsZi5VUkwocywgc2VsZi5sb2NhdGlvbi5ocmVmKS5ocmVmLCBuID0ge1xuICAgIHdvcmtlcjogbmV3IHNlbGYuV29ya2VyKHQpLFxuICAgIHNjcmlwdFVSTDogdCxcbiAgICBjbGllbnRDb3VudDogMVxuICB9O1xuICByZXR1cm4gTm5bc10gPSBuLCBuO1xufVxuZnVuY3Rpb24gdVQocykge1xuICBjb25zdCBlID0gTm5bcyB8fCB2aV07XG4gIGlmIChlICYmIGUuY2xpZW50Q291bnQtLSA9PT0gMSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdvcmtlcjogcixcbiAgICAgIG9iamVjdFVSTDogblxuICAgIH0gPSBlO1xuICAgIGRlbGV0ZSBObltzIHx8IHZpXSwgbiAmJiBzZWxmLlVSTC5yZXZva2VPYmplY3RVUkwobiksIHIudGVybWluYXRlKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9wKHMsIGUpIHtcbiAgcmV0dXJuIGUgKyAxMCA8PSBzLmxlbmd0aCAmJiBzW2VdID09PSA1MSAmJiBzW2UgKyAxXSA9PT0gNjggJiYgc1tlICsgMl0gPT09IDczICYmIHNbZSArIDNdIDwgMjU1ICYmIHNbZSArIDRdIDwgMjU1ICYmIHNbZSArIDZdIDwgMTI4ICYmIHNbZSArIDddIDwgMTI4ICYmIHNbZSArIDhdIDwgMTI4ICYmIHNbZSArIDldIDwgMTI4O1xufVxuZnVuY3Rpb24gQXUocywgZSkge1xuICByZXR1cm4gZSArIDEwIDw9IHMubGVuZ3RoICYmIHNbZV0gPT09IDczICYmIHNbZSArIDFdID09PSA2OCAmJiBzW2UgKyAyXSA9PT0gNTEgJiYgc1tlICsgM10gPCAyNTUgJiYgc1tlICsgNF0gPCAyNTUgJiYgc1tlICsgNl0gPCAxMjggJiYgc1tlICsgN10gPCAxMjggJiYgc1tlICsgOF0gPCAxMjggJiYgc1tlICsgOV0gPCAxMjg7XG59XG5mdW5jdGlvbiB2YShzLCBlKSB7XG4gIGxldCB0ID0gMDtcbiAgcmV0dXJuIHQgPSAoc1tlXSAmIDEyNykgPDwgMjEsIHQgfD0gKHNbZSArIDFdICYgMTI3KSA8PCAxNCwgdCB8PSAoc1tlICsgMl0gJiAxMjcpIDw8IDcsIHQgfD0gc1tlICsgM10gJiAxMjcsIHQ7XG59XG5mdW5jdGlvbiBFaShzLCBlKSB7XG4gIGNvbnN0IHQgPSBlO1xuICBsZXQgciA9IDA7XG4gIGZvciAoOyBBdShzLCBlKTsgKSB7XG4gICAgciArPSAxMDtcbiAgICBjb25zdCBuID0gdmEocywgZSArIDYpO1xuICAgIHIgKz0gbiwgb3AocywgZSArIDEwKSAmJiAociArPSAxMCksIGUgKz0gcjtcbiAgfVxuICBpZiAociA+IDApXG4gICAgcmV0dXJuIHMuc3ViYXJyYXkodCwgdCArIHIpO1xufVxuZnVuY3Rpb24gZFQocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gWzk2ZTMsIDg4MjAwLCA2NGUzLCA0OGUzLCA0NDEwMCwgMzJlMywgMjRlMywgMjIwNTAsIDE2ZTMsIDEyZTMsIDExMDI1LCA4ZTMsIDczNTBdLCBpID0gZVt0ICsgMl0sIG8gPSBpID4+IDIgJiAxNTtcbiAgaWYgKG8gPiAxMikge1xuICAgIGNvbnN0IGYgPSBuZXcgRXJyb3IoYGludmFsaWQgQURUUyBzYW1wbGluZyBpbmRleDoke299YCk7XG4gICAgcy5lbWl0KEkuRVJST1IsIEkuRVJST1IsIHtcbiAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgZGV0YWlsczogSi5GUkFHX1BBUlNJTkdfRVJST1IsXG4gICAgICBmYXRhbDogITAsXG4gICAgICBlcnJvcjogZixcbiAgICAgIHJlYXNvbjogZi5tZXNzYWdlXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGEgPSAoaSA+PiA2ICYgMykgKyAxLCBsID0gZVt0ICsgM10gPj4gNiAmIDMgfCAoaSAmIDEpIDw8IDIsIGMgPSBcIm1wNGEuNDAuXCIgKyBhLCB1ID0gbltvXTtcbiAgbGV0IGQgPSBvO1xuICAoYSA9PT0gNSB8fCBhID09PSAyOSkgJiYgKGQgLT0gMyk7XG4gIGNvbnN0IGggPSBbYSA8PCAzIHwgKGQgJiAxNCkgPj4gMSwgKGQgJiAxKSA8PCA3IHwgbCA8PCAzXTtcbiAgcmV0dXJuIHJ0LmxvZyhgbWFuaWZlc3QgY29kZWM6JHtyfSwgcGFyc2VkIGNvZGVjOiR7Y30sIGNoYW5uZWxzOiR7bH0sIHJhdGU6JHt1fSAoQURUUyBvYmplY3QgdHlwZToke2F9IHNhbXBsaW5nIGluZGV4OiR7b30pYCksIHtcbiAgICBjb25maWc6IGgsXG4gICAgc2FtcGxlcmF0ZTogdSxcbiAgICBjaGFubmVsQ291bnQ6IGwsXG4gICAgY29kZWM6IGMsXG4gICAgcGFyc2VkQ29kZWM6IGMsXG4gICAgbWFuaWZlc3RDb2RlYzogclxuICB9O1xufVxuZnVuY3Rpb24gYXAocywgZSkge1xuICByZXR1cm4gc1tlXSA9PT0gMjU1ICYmIChzW2UgKyAxXSAmIDI0NikgPT09IDI0MDtcbn1cbmZ1bmN0aW9uIGxwKHMsIGUpIHtcbiAgcmV0dXJuIHNbZSArIDFdICYgMSA/IDcgOiA5O1xufVxuZnVuY3Rpb24gSXUocywgZSkge1xuICByZXR1cm4gKHNbZSArIDNdICYgMykgPDwgMTEgfCBzW2UgKyA0XSA8PCAzIHwgKHNbZSArIDVdICYgMjI0KSA+Pj4gNTtcbn1cbmZ1bmN0aW9uIGhUKHMsIGUpIHtcbiAgcmV0dXJuIGUgKyA1IDwgcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBuYShzLCBlKSB7XG4gIHJldHVybiBlICsgMSA8IHMubGVuZ3RoICYmIGFwKHMsIGUpO1xufVxuZnVuY3Rpb24gZlQocywgZSkge1xuICByZXR1cm4gaFQocywgZSkgJiYgYXAocywgZSkgJiYgSXUocywgZSkgPD0gcy5sZW5ndGggLSBlO1xufVxuZnVuY3Rpb24gZ1QocywgZSkge1xuICBpZiAobmEocywgZSkpIHtcbiAgICBjb25zdCB0ID0gbHAocywgZSk7XG4gICAgaWYgKGUgKyB0ID49IHMubGVuZ3RoKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IHIgPSBJdShzLCBlKTtcbiAgICBpZiAociA8PSB0KVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IG4gPSBlICsgcjtcbiAgICByZXR1cm4gbiA9PT0gcy5sZW5ndGggfHwgbmEocywgbik7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gY3AocywgZSwgdCwgciwgbikge1xuICBpZiAoIXMuc2FtcGxlcmF0ZSkge1xuICAgIGNvbnN0IGkgPSBkVChlLCB0LCByLCBuKTtcbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm47XG4gICAgbnQocywgaSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwKHMpIHtcbiAgcmV0dXJuIDEwMjQgKiA5ZTQgLyBzO1xufVxuZnVuY3Rpb24gcFQocywgZSkge1xuICBjb25zdCB0ID0gbHAocywgZSk7XG4gIGlmIChlICsgdCA8PSBzLmxlbmd0aCkge1xuICAgIGNvbnN0IHIgPSBJdShzLCBlKSAtIHQ7XG4gICAgaWYgKHIgPiAwKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyTGVuZ3RoOiB0LFxuICAgICAgICBmcmFtZUxlbmd0aDogclxuICAgICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZHAocywgZSwgdCwgciwgbikge1xuICBjb25zdCBpID0gdXAocy5zYW1wbGVyYXRlKSwgbyA9IHIgKyBuICogaSwgYSA9IHBUKGUsIHQpO1xuICBsZXQgbDtcbiAgaWYgKGEpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFtZUxlbmd0aDogZCxcbiAgICAgIGhlYWRlckxlbmd0aDogaFxuICAgIH0gPSBhLCBmID0gaCArIGQsIHAgPSBNYXRoLm1heCgwLCB0ICsgZiAtIGUubGVuZ3RoKTtcbiAgICBwID8gKGwgPSBuZXcgVWludDhBcnJheShmIC0gaCksIGwuc2V0KGUuc3ViYXJyYXkodCArIGgsIGUubGVuZ3RoKSwgMCkpIDogbCA9IGUuc3ViYXJyYXkodCArIGgsIHQgKyBmKTtcbiAgICBjb25zdCB5ID0ge1xuICAgICAgdW5pdDogbCxcbiAgICAgIHB0czogb1xuICAgIH07XG4gICAgcmV0dXJuIHAgfHwgcy5zYW1wbGVzLnB1c2goeSksIHtcbiAgICAgIHNhbXBsZTogeSxcbiAgICAgIGxlbmd0aDogZixcbiAgICAgIG1pc3Npbmc6IHBcbiAgICB9O1xuICB9XG4gIGNvbnN0IGMgPSBlLmxlbmd0aCAtIHQ7XG4gIHJldHVybiBsID0gbmV3IFVpbnQ4QXJyYXkoYyksIGwuc2V0KGUuc3ViYXJyYXkodCwgZS5sZW5ndGgpLCAwKSwge1xuICAgIHNhbXBsZToge1xuICAgICAgdW5pdDogbCxcbiAgICAgIHB0czogb1xuICAgIH0sXG4gICAgbGVuZ3RoOiBjLFxuICAgIG1pc3Npbmc6IC0xXG4gIH07XG59XG5mdW5jdGlvbiBtVChzLCBlKSB7XG4gIHJldHVybiBBdShzLCBlKSAmJiB2YShzLCBlICsgNikgKyAxMCA8PSBzLmxlbmd0aCAtIGU7XG59XG5mdW5jdGlvbiB5VChzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBzIDogcy5ieXRlT2Zmc2V0ID09IDAgJiYgcy5ieXRlTGVuZ3RoID09IHMuYnVmZmVyLmJ5dGVMZW5ndGggPyBzLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KHMpLmJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIHlsKHMsIGUgPSAwLCB0ID0gMSAvIDApIHtcbiAgcmV0dXJuIHZUKHMsIGUsIHQsIFVpbnQ4QXJyYXkpO1xufVxuZnVuY3Rpb24gdlQocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gRVQocyk7XG4gIGxldCBpID0gMTtcbiAgXCJCWVRFU19QRVJfRUxFTUVOVFwiIGluIHIgJiYgKGkgPSByLkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgY29uc3QgbyA9IHhUKHMpID8gcy5ieXRlT2Zmc2V0IDogMCwgYSA9IChvICsgcy5ieXRlTGVuZ3RoKSAvIGksIGwgPSAobyArIGUpIC8gaSwgYyA9IE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgTWF0aC5taW4obCwgYSkpKSwgdSA9IE1hdGguZmxvb3IoTWF0aC5taW4oYyArIE1hdGgubWF4KHQsIDApLCBhKSk7XG4gIHJldHVybiBuZXcgcihuLCBjLCB1IC0gYyk7XG59XG5mdW5jdGlvbiBFVChzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBzIDogcy5idWZmZXI7XG59XG5mdW5jdGlvbiB4VChzKSB7XG4gIHJldHVybiBzICYmIHMuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgJiYgcy5ieXRlTGVuZ3RoICE9PSB2b2lkIDAgJiYgcy5ieXRlT2Zmc2V0ICE9PSB2b2lkIDA7XG59XG5mdW5jdGlvbiBTVChzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgZGF0YTogXCJcIixcbiAgICBtaW1lVHlwZTogbnVsbCxcbiAgICBwaWN0dXJlVHlwZTogbnVsbFxuICB9LCB0ID0gMztcbiAgaWYgKHMuc2l6ZSA8IDIpXG4gICAgcmV0dXJuO1xuICBpZiAocy5kYXRhWzBdICE9PSB0KSB7XG4gICAgY29uc29sZS5sb2coXCJJZ25vcmUgZnJhbWUgd2l0aCB1bnJlY29nbml6ZWQgY2hhcmFjdGVyIGVuY29kaW5nXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByID0gcy5kYXRhLnN1YmFycmF5KDEpLmluZGV4T2YoMCk7XG4gIGlmIChyID09PSAtMSlcbiAgICByZXR1cm47XG4gIGNvbnN0IG4gPSBUcih5bChzLmRhdGEsIDEsIHIpKSwgaSA9IHMuZGF0YVsyICsgcl0sIG8gPSBzLmRhdGEuc3ViYXJyYXkoMyArIHIpLmluZGV4T2YoMCk7XG4gIGlmIChvID09PSAtMSlcbiAgICByZXR1cm47XG4gIGNvbnN0IGEgPSBUcih5bChzLmRhdGEsIDMgKyByLCBvKSk7XG4gIGxldCBsO1xuICByZXR1cm4gbiA9PT0gXCItLT5cIiA/IGwgPSBUcih5bChzLmRhdGEsIDQgKyByICsgbykpIDogbCA9IHlUKHMuZGF0YS5zdWJhcnJheSg0ICsgciArIG8pKSwgZS5taW1lVHlwZSA9IG4sIGUucGljdHVyZVR5cGUgPSBpLCBlLmRlc2NyaXB0aW9uID0gYSwgZS5kYXRhID0gbCwgZTtcbn1cbmZ1bmN0aW9uIGJUKHMpIHtcbiAgaWYgKHMuc2l6ZSA8IDIpXG4gICAgcmV0dXJuO1xuICBjb25zdCBlID0gVHIocy5kYXRhLCAhMCksIHQgPSBuZXcgVWludDhBcnJheShzLmRhdGEuc3ViYXJyYXkoZS5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgaW5mbzogZSxcbiAgICBkYXRhOiB0LmJ1ZmZlclxuICB9O1xufVxuZnVuY3Rpb24gVFQocykge1xuICBpZiAocy5zaXplIDwgMilcbiAgICByZXR1cm47XG4gIGlmIChzLnR5cGUgPT09IFwiVFhYWFwiKSB7XG4gICAgbGV0IHQgPSAxO1xuICAgIGNvbnN0IHIgPSBUcihzLmRhdGEuc3ViYXJyYXkodCksICEwKTtcbiAgICB0ICs9IHIubGVuZ3RoICsgMTtcbiAgICBjb25zdCBuID0gVHIocy5kYXRhLnN1YmFycmF5KHQpKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBzLnR5cGUsXG4gICAgICBpbmZvOiByLFxuICAgICAgZGF0YTogblxuICAgIH07XG4gIH1cbiAgY29uc3QgZSA9IFRyKHMuZGF0YS5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgaW5mbzogXCJcIixcbiAgICBkYXRhOiBlXG4gIH07XG59XG5mdW5jdGlvbiB3VChzKSB7XG4gIGlmIChzLnR5cGUgPT09IFwiV1hYWFwiKSB7XG4gICAgaWYgKHMuc2l6ZSA8IDIpXG4gICAgICByZXR1cm47XG4gICAgbGV0IHQgPSAxO1xuICAgIGNvbnN0IHIgPSBUcihzLmRhdGEuc3ViYXJyYXkodCksICEwKTtcbiAgICB0ICs9IHIubGVuZ3RoICsgMTtcbiAgICBjb25zdCBuID0gVHIocy5kYXRhLnN1YmFycmF5KHQpKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBzLnR5cGUsXG4gICAgICBpbmZvOiByLFxuICAgICAgZGF0YTogblxuICAgIH07XG4gIH1cbiAgY29uc3QgZSA9IFRyKHMuZGF0YSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgaW5mbzogXCJcIixcbiAgICBkYXRhOiBlXG4gIH07XG59XG5mdW5jdGlvbiBBVChzKSB7XG4gIHJldHVybiBzLnR5cGUgPT09IFwiUFJJVlwiID8gYlQocykgOiBzLnR5cGVbMF0gPT09IFwiV1wiID8gd1QocykgOiBzLnR5cGUgPT09IFwiQVBJQ1wiID8gU1QocykgOiBUVChzKTtcbn1cbmZ1bmN0aW9uIElUKHMpIHtcbiAgY29uc3QgZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoc1swXSwgc1sxXSwgc1syXSwgc1szXSksIHQgPSB2YShzLCA0KSwgciA9IDEwO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGUsXG4gICAgc2l6ZTogdCxcbiAgICBkYXRhOiBzLnN1YmFycmF5KHIsIHIgKyB0KVxuICB9O1xufVxuY29uc3QgemkgPSAxMCwgX1QgPSAxMDtcbmZ1bmN0aW9uIGhwKHMpIHtcbiAgbGV0IGUgPSAwO1xuICBjb25zdCB0ID0gW107XG4gIGZvciAoOyBBdShzLCBlKTsgKSB7XG4gICAgY29uc3QgciA9IHZhKHMsIGUgKyA2KTtcbiAgICBzW2UgKyA1XSA+PiA2ICYgMSAmJiAoZSArPSB6aSksIGUgKz0gemk7XG4gICAgY29uc3QgbiA9IGUgKyByO1xuICAgIGZvciAoOyBlICsgX1QgPCBuOyApIHtcbiAgICAgIGNvbnN0IGkgPSBJVChzLnN1YmFycmF5KGUpKSwgbyA9IEFUKGkpO1xuICAgICAgbyAmJiB0LnB1c2gobyksIGUgKz0gaS5zaXplICsgemk7XG4gICAgfVxuICAgIG9wKHMsIGUpICYmIChlICs9IHppKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIGZwKHMpIHtcbiAgcmV0dXJuIHMgJiYgcy5rZXkgPT09IFwiUFJJVlwiICYmIHMuaW5mbyA9PT0gXCJjb20uYXBwbGUuc3RyZWFtaW5nLnRyYW5zcG9ydFN0cmVhbVRpbWVzdGFtcFwiO1xufVxuZnVuY3Rpb24gUlQocykge1xuICBpZiAocy5kYXRhLmJ5dGVMZW5ndGggPT09IDgpIHtcbiAgICBjb25zdCBlID0gbmV3IFVpbnQ4QXJyYXkocy5kYXRhKSwgdCA9IGVbM10gJiAxO1xuICAgIGxldCByID0gKGVbNF0gPDwgMjMpICsgKGVbNV0gPDwgMTUpICsgKGVbNl0gPDwgNykgKyBlWzddO1xuICAgIHJldHVybiByIC89IDQ1LCB0ICYmIChyICs9IDQ3NzIxODU4ODRlLTIpLCBNYXRoLnJvdW5kKHIpO1xuICB9XG59XG5mdW5jdGlvbiBfdShzKSB7XG4gIGNvbnN0IGUgPSBocChzKTtcbiAgZm9yIChsZXQgdCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKSB7XG4gICAgY29uc3QgciA9IGVbdF07XG4gICAgaWYgKGZwKHIpKVxuICAgICAgcmV0dXJuIFJUKHIpO1xuICB9XG59XG5sZXQgYnIgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMuYXVkaW9JZDMgPSBcIm9yZy5pZDNcIiwgcy5kYXRlUmFuZ2UgPSBcImNvbS5hcHBsZS5xdWlja3RpbWUuSExTXCIsIHMuZW1zZyA9IFwiaHR0cHM6Ly9hb21lZGlhLm9yZy9lbXNnL0lEM1wiLCBzLm1pc2JrbHYgPSBcInVybjptaXNiOktMVjpiaW46MTkxMC4xXCIsIHM7XG59KSh7fSk7XG5mdW5jdGlvbiBqcihzID0gXCJcIiwgZSA9IDllNCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IHMsXG4gICAgaWQ6IC0xLFxuICAgIHBpZDogLTEsXG4gICAgaW5wdXRUaW1lU2NhbGU6IGUsXG4gICAgc2VxdWVuY2VOdW1iZXI6IC0xLFxuICAgIHNhbXBsZXM6IFtdLFxuICAgIGRyb3BwZWQ6IDBcbiAgfTtcbn1cbmNsYXNzIFJ1IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fYXVkaW9UcmFjayA9IHZvaWQgMCwgdGhpcy5faWQzVHJhY2sgPSB2b2lkIDAsIHRoaXMuZnJhbWVJbmRleCA9IDAsIHRoaXMuY2FjaGVkRGF0YSA9IG51bGwsIHRoaXMuYmFzZVBUUyA9IG51bGwsIHRoaXMuaW5pdFBUUyA9IG51bGwsIHRoaXMubGFzdFBUUyA9IG51bGw7XG4gIH1cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5faWQzVHJhY2sgPSB7XG4gICAgICB0eXBlOiBcImlkM1wiLFxuICAgICAgaWQ6IDMsXG4gICAgICBwaWQ6IC0xLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLFxuICAgICAgc2FtcGxlczogW10sXG4gICAgICBkcm9wcGVkOiAwXG4gICAgfTtcbiAgfVxuICByZXNldFRpbWVTdGFtcChlKSB7XG4gICAgdGhpcy5pbml0UFRTID0gZSwgdGhpcy5yZXNldENvbnRpZ3VpdHkoKTtcbiAgfVxuICByZXNldENvbnRpZ3VpdHkoKSB7XG4gICAgdGhpcy5iYXNlUFRTID0gbnVsbCwgdGhpcy5sYXN0UFRTID0gbnVsbCwgdGhpcy5mcmFtZUluZGV4ID0gMDtcbiAgfVxuICBjYW5QYXJzZShlLCB0KSB7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGFwcGVuZEZyYW1lKGUsIHQsIHIpIHtcbiAgfVxuICAvLyBmZWVkIGluY29taW5nIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSBwYXJzaW5nIHBpcGVsaW5lXG4gIGRlbXV4KGUsIHQpIHtcbiAgICB0aGlzLmNhY2hlZERhdGEgJiYgKGUgPSBfcih0aGlzLmNhY2hlZERhdGEsIGUpLCB0aGlzLmNhY2hlZERhdGEgPSBudWxsKTtcbiAgICBsZXQgciA9IEVpKGUsIDApLCBuID0gciA/IHIubGVuZ3RoIDogMCwgaTtcbiAgICBjb25zdCBvID0gdGhpcy5fYXVkaW9UcmFjaywgYSA9IHRoaXMuX2lkM1RyYWNrLCBsID0gciA/IF91KHIpIDogdm9pZCAwLCBjID0gZS5sZW5ndGg7XG4gICAgZm9yICgodGhpcy5iYXNlUFRTID09PSBudWxsIHx8IHRoaXMuZnJhbWVJbmRleCA9PT0gMCAmJiB1ZShsKSkgJiYgKHRoaXMuYmFzZVBUUyA9IExUKGwsIHQsIHRoaXMuaW5pdFBUUyksIHRoaXMubGFzdFBUUyA9IHRoaXMuYmFzZVBUUyksIHRoaXMubGFzdFBUUyA9PT0gbnVsbCAmJiAodGhpcy5sYXN0UFRTID0gdGhpcy5iYXNlUFRTKSwgciAmJiByLmxlbmd0aCA+IDAgJiYgYS5zYW1wbGVzLnB1c2goe1xuICAgICAgcHRzOiB0aGlzLmxhc3RQVFMsXG4gICAgICBkdHM6IHRoaXMubGFzdFBUUyxcbiAgICAgIGRhdGE6IHIsXG4gICAgICB0eXBlOiBici5hdWRpb0lkMyxcbiAgICAgIGR1cmF0aW9uOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICB9KTsgbiA8IGM7ICkge1xuICAgICAgaWYgKHRoaXMuY2FuUGFyc2UoZSwgbikpIHtcbiAgICAgICAgY29uc3QgdSA9IHRoaXMuYXBwZW5kRnJhbWUobywgZSwgbik7XG4gICAgICAgIHUgPyAodGhpcy5mcmFtZUluZGV4KyssIHRoaXMubGFzdFBUUyA9IHUuc2FtcGxlLnB0cywgbiArPSB1Lmxlbmd0aCwgaSA9IG4pIDogbiA9IGM7XG4gICAgICB9IGVsc2UgbVQoZSwgbikgPyAociA9IEVpKGUsIG4pLCBhLnNhbXBsZXMucHVzaCh7XG4gICAgICAgIHB0czogdGhpcy5sYXN0UFRTLFxuICAgICAgICBkdHM6IHRoaXMubGFzdFBUUyxcbiAgICAgICAgZGF0YTogcixcbiAgICAgICAgdHlwZTogYnIuYXVkaW9JZDMsXG4gICAgICAgIGR1cmF0aW9uOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgIH0pLCBuICs9IHIubGVuZ3RoLCBpID0gbikgOiBuKys7XG4gICAgICBpZiAobiA9PT0gYyAmJiBpICE9PSBjKSB7XG4gICAgICAgIGNvbnN0IHUgPSBlLnNsaWNlKGkpO1xuICAgICAgICB0aGlzLmNhY2hlZERhdGEgPyB0aGlzLmNhY2hlZERhdGEgPSBfcih0aGlzLmNhY2hlZERhdGEsIHUpIDogdGhpcy5jYWNoZWREYXRhID0gdTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGlvVHJhY2s6IG8sXG4gICAgICB2aWRlb1RyYWNrOiBqcigpLFxuICAgICAgaWQzVHJhY2s6IGEsXG4gICAgICB0ZXh0VHJhY2s6IGpyKClcbiAgICB9O1xuICB9XG4gIGRlbXV4U2FtcGxlQWVzKGUsIHQsIHIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbJHt0aGlzfV0gVGhpcyBkZW11eGVyIGRvZXMgbm90IHN1cHBvcnQgU2FtcGxlLUFFUyBkZWNyeXB0aW9uYCkpO1xuICB9XG4gIGZsdXNoKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jYWNoZWREYXRhO1xuICAgIHJldHVybiB0ICYmICh0aGlzLmNhY2hlZERhdGEgPSBudWxsLCB0aGlzLmRlbXV4KHQsIDApKSwge1xuICAgICAgYXVkaW9UcmFjazogdGhpcy5fYXVkaW9UcmFjayxcbiAgICAgIHZpZGVvVHJhY2s6IGpyKCksXG4gICAgICBpZDNUcmFjazogdGhpcy5faWQzVHJhY2ssXG4gICAgICB0ZXh0VHJhY2s6IGpyKClcbiAgICB9O1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jYWNoZWREYXRhID0gbnVsbCwgdGhpcy5fYXVkaW9UcmFjayA9IHRoaXMuX2lkM1RyYWNrID0gdm9pZCAwO1xuICB9XG59XG5jb25zdCBMVCA9IChzLCBlLCB0KSA9PiB7XG4gIGlmICh1ZShzKSlcbiAgICByZXR1cm4gcyAqIDkwO1xuICBjb25zdCByID0gdCA/IHQuYmFzZVRpbWUgKiA5ZTQgLyB0LnRpbWVzY2FsZSA6IDA7XG4gIHJldHVybiBlICogOWU0ICsgcjtcbn07XG5sZXQgWWkgPSBudWxsO1xuY29uc3QgQ1QgPSBbMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NiwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwXSwga1QgPSBbNDQxMDAsIDQ4ZTMsIDMyZTMsIDIyMDUwLCAyNGUzLCAxNmUzLCAxMTAyNSwgMTJlMywgOGUzXSwgRFQgPSBbXG4gIC8vIE1QRUcgMi41XG4gIFtcbiAgICAwLFxuICAgIC8vIFJlc2VydmVkXG4gICAgNzIsXG4gICAgLy8gTGF5ZXIzXG4gICAgMTQ0LFxuICAgIC8vIExheWVyMlxuICAgIDEyXG4gICAgLy8gTGF5ZXIxXG4gIF0sXG4gIC8vIFJlc2VydmVkXG4gIFtcbiAgICAwLFxuICAgIC8vIFJlc2VydmVkXG4gICAgMCxcbiAgICAvLyBMYXllcjNcbiAgICAwLFxuICAgIC8vIExheWVyMlxuICAgIDBcbiAgICAvLyBMYXllcjFcbiAgXSxcbiAgLy8gTVBFRyAyXG4gIFtcbiAgICAwLFxuICAgIC8vIFJlc2VydmVkXG4gICAgNzIsXG4gICAgLy8gTGF5ZXIzXG4gICAgMTQ0LFxuICAgIC8vIExheWVyMlxuICAgIDEyXG4gICAgLy8gTGF5ZXIxXG4gIF0sXG4gIC8vIE1QRUcgMVxuICBbXG4gICAgMCxcbiAgICAvLyBSZXNlcnZlZFxuICAgIDE0NCxcbiAgICAvLyBMYXllcjNcbiAgICAxNDQsXG4gICAgLy8gTGF5ZXIyXG4gICAgMTJcbiAgICAvLyBMYXllcjFcbiAgXVxuXSwgUFQgPSBbXG4gIDAsXG4gIC8vIFJlc2VydmVkXG4gIDEsXG4gIC8vIExheWVyM1xuICAxLFxuICAvLyBMYXllcjJcbiAgNFxuICAvLyBMYXllcjFcbl07XG5mdW5jdGlvbiBncChzLCBlLCB0LCByLCBuKSB7XG4gIGlmICh0ICsgMjQgPiBlLmxlbmd0aClcbiAgICByZXR1cm47XG4gIGNvbnN0IGkgPSBwcChlLCB0KTtcbiAgaWYgKGkgJiYgdCArIGkuZnJhbWVMZW5ndGggPD0gZS5sZW5ndGgpIHtcbiAgICBjb25zdCBvID0gaS5zYW1wbGVzUGVyRnJhbWUgKiA5ZTQgLyBpLnNhbXBsZVJhdGUsIGEgPSByICsgbiAqIG8sIGwgPSB7XG4gICAgICB1bml0OiBlLnN1YmFycmF5KHQsIHQgKyBpLmZyYW1lTGVuZ3RoKSxcbiAgICAgIHB0czogYSxcbiAgICAgIGR0czogYVxuICAgIH07XG4gICAgcmV0dXJuIHMuY29uZmlnID0gW10sIHMuY2hhbm5lbENvdW50ID0gaS5jaGFubmVsQ291bnQsIHMuc2FtcGxlcmF0ZSA9IGkuc2FtcGxlUmF0ZSwgcy5zYW1wbGVzLnB1c2gobCksIHtcbiAgICAgIHNhbXBsZTogbCxcbiAgICAgIGxlbmd0aDogaS5mcmFtZUxlbmd0aCxcbiAgICAgIG1pc3Npbmc6IDBcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBwcChzLCBlKSB7XG4gIGNvbnN0IHQgPSBzW2UgKyAxXSA+PiAzICYgMywgciA9IHNbZSArIDFdID4+IDEgJiAzLCBuID0gc1tlICsgMl0gPj4gNCAmIDE1LCBpID0gc1tlICsgMl0gPj4gMiAmIDM7XG4gIGlmICh0ICE9PSAxICYmIG4gIT09IDAgJiYgbiAhPT0gMTUgJiYgaSAhPT0gMykge1xuICAgIGNvbnN0IG8gPSBzW2UgKyAyXSA+PiAxICYgMSwgYSA9IHNbZSArIDNdID4+IDYsIGwgPSB0ID09PSAzID8gMyAtIHIgOiByID09PSAzID8gMyA6IDQsIGMgPSBDVFtsICogMTQgKyBuIC0gMV0gKiAxZTMsIGQgPSBrVFsodCA9PT0gMyA/IDAgOiB0ID09PSAyID8gMSA6IDIpICogMyArIGldLCBoID0gYSA9PT0gMyA/IDEgOiAyLCBmID0gRFRbdF1bcl0sIHAgPSBQVFtyXSwgeSA9IGYgKiA4ICogcCwgRSA9IE1hdGguZmxvb3IoZiAqIGMgLyBkICsgbykgKiBwO1xuICAgIGlmIChZaSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgQSA9IChuYXZpZ2F0b3IudXNlckFnZW50IHx8IFwiXCIpLm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvaSk7XG4gICAgICBZaSA9IEEgPyBwYXJzZUludChBWzFdKSA6IDA7XG4gICAgfVxuICAgIHJldHVybiAhIVlpICYmIFlpIDw9IDg3ICYmIHIgPT09IDIgJiYgYyA+PSAyMjRlMyAmJiBhID09PSAwICYmIChzW2UgKyAzXSA9IHNbZSArIDNdIHwgMTI4KSwge1xuICAgICAgc2FtcGxlUmF0ZTogZCxcbiAgICAgIGNoYW5uZWxDb3VudDogaCxcbiAgICAgIGZyYW1lTGVuZ3RoOiBFLFxuICAgICAgc2FtcGxlc1BlckZyYW1lOiB5XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gTHUocywgZSkge1xuICByZXR1cm4gc1tlXSA9PT0gMjU1ICYmIChzW2UgKyAxXSAmIDIyNCkgPT09IDIyNCAmJiAoc1tlICsgMV0gJiA2KSAhPT0gMDtcbn1cbmZ1bmN0aW9uIG1wKHMsIGUpIHtcbiAgcmV0dXJuIGUgKyAxIDwgcy5sZW5ndGggJiYgTHUocywgZSk7XG59XG5mdW5jdGlvbiBNVChzLCBlKSB7XG4gIHJldHVybiBMdShzLCBlKSAmJiA0IDw9IHMubGVuZ3RoIC0gZTtcbn1cbmZ1bmN0aW9uIHlwKHMsIGUpIHtcbiAgaWYgKGUgKyAxIDwgcy5sZW5ndGggJiYgTHUocywgZSkpIHtcbiAgICBjb25zdCByID0gcHAocywgZSk7XG4gICAgbGV0IG4gPSA0O1xuICAgIHIgIT0gbnVsbCAmJiByLmZyYW1lTGVuZ3RoICYmIChuID0gci5mcmFtZUxlbmd0aCk7XG4gICAgY29uc3QgaSA9IGUgKyBuO1xuICAgIHJldHVybiBpID09PSBzLmxlbmd0aCB8fCBtcChzLCBpKTtcbiAgfVxuICByZXR1cm4gITE7XG59XG5jbGFzcyBPVCBleHRlbmRzIFJ1IHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHN1cGVyKCksIHRoaXMub2JzZXJ2ZXIgPSB2b2lkIDAsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gZSwgdGhpcy5jb25maWcgPSB0O1xuICB9XG4gIHJlc2V0SW5pdFNlZ21lbnQoZSwgdCwgciwgbikge1xuICAgIHN1cGVyLnJlc2V0SW5pdFNlZ21lbnQoZSwgdCwgciwgbiksIHRoaXMuX2F1ZGlvVHJhY2sgPSB7XG4gICAgICBjb250YWluZXI6IFwiYXVkaW8vYWR0c1wiLFxuICAgICAgdHlwZTogXCJhdWRpb1wiLFxuICAgICAgaWQ6IDIsXG4gICAgICBwaWQ6IC0xLFxuICAgICAgc2VxdWVuY2VOdW1iZXI6IDAsXG4gICAgICBzZWdtZW50Q29kZWM6IFwiYWFjXCIsXG4gICAgICBzYW1wbGVzOiBbXSxcbiAgICAgIG1hbmlmZXN0Q29kZWM6IHQsXG4gICAgICBkdXJhdGlvbjogbixcbiAgICAgIGlucHV0VGltZVNjYWxlOiA5ZTQsXG4gICAgICBkcm9wcGVkOiAwXG4gICAgfTtcbiAgfVxuICAvLyBTb3VyY2UgZm9yIHByb2JlIGluZm8gLSBodHRwczovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QURUU1xuICBzdGF0aWMgcHJvYmUoZSwgdCkge1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCByID0gRWkoZSwgMCk7XG4gICAgbGV0IG4gPSAociA9PSBudWxsID8gdm9pZCAwIDogci5sZW5ndGgpIHx8IDA7XG4gICAgaWYgKHlwKGUsIG4pKVxuICAgICAgcmV0dXJuICExO1xuICAgIGZvciAobGV0IGkgPSBlLmxlbmd0aDsgbiA8IGk7IG4rKylcbiAgICAgIGlmIChnVChlLCBuKSlcbiAgICAgICAgcmV0dXJuIHQubG9nKFwiQURUUyBzeW5jIHdvcmQgZm91bmQgIVwiKSwgITA7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGNhblBhcnNlKGUsIHQpIHtcbiAgICByZXR1cm4gZlQoZSwgdCk7XG4gIH1cbiAgYXBwZW5kRnJhbWUoZSwgdCwgcikge1xuICAgIGNwKGUsIHRoaXMub2JzZXJ2ZXIsIHQsIHIsIGUubWFuaWZlc3RDb2RlYyk7XG4gICAgY29uc3QgbiA9IGRwKGUsIHQsIHIsIHRoaXMuYmFzZVBUUywgdGhpcy5mcmFtZUluZGV4KTtcbiAgICBpZiAobiAmJiBuLm1pc3NpbmcgPT09IDApXG4gICAgICByZXR1cm4gbjtcbiAgfVxufVxuY29uc3QgdnAgPSAocywgZSkgPT4ge1xuICBsZXQgdCA9IDAsIHIgPSA1O1xuICBlICs9IHI7XG4gIGNvbnN0IG4gPSBuZXcgVWludDMyQXJyYXkoMSksIGkgPSBuZXcgVWludDMyQXJyYXkoMSksIG8gPSBuZXcgVWludDhBcnJheSgxKTtcbiAgZm9yICg7IHIgPiAwOyApIHtcbiAgICBvWzBdID0gc1tlXTtcbiAgICBjb25zdCBhID0gTWF0aC5taW4ociwgOCksIGwgPSA4IC0gYTtcbiAgICBpWzBdID0gNDI3ODE5MDA4MCA+Pj4gMjQgKyBsIDw8IGwsIG5bMF0gPSAob1swXSAmIGlbMF0pID4+IGwsIHQgPSB0ID8gdCA8PCBhIHwgblswXSA6IG5bMF0sIGUgKz0gMSwgciAtPSBhO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmNsYXNzIEJUIGV4dGVuZHMgUnUge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoKSwgdGhpcy5vYnNlcnZlciA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IGU7XG4gIH1cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgc3VwZXIucmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSwgdGhpcy5fYXVkaW9UcmFjayA9IHtcbiAgICAgIGNvbnRhaW5lcjogXCJhdWRpby9hYy0zXCIsXG4gICAgICB0eXBlOiBcImF1ZGlvXCIsXG4gICAgICBpZDogMixcbiAgICAgIHBpZDogLTEsXG4gICAgICBzZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgIHNlZ21lbnRDb2RlYzogXCJhYzNcIixcbiAgICAgIHNhbXBsZXM6IFtdLFxuICAgICAgbWFuaWZlc3RDb2RlYzogdCxcbiAgICAgIGR1cmF0aW9uOiBuLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIGRyb3BwZWQ6IDBcbiAgICB9O1xuICB9XG4gIGNhblBhcnNlKGUsIHQpIHtcbiAgICByZXR1cm4gdCArIDY0IDwgZS5sZW5ndGg7XG4gIH1cbiAgYXBwZW5kRnJhbWUoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBFcChlLCB0LCByLCB0aGlzLmJhc2VQVFMsIHRoaXMuZnJhbWVJbmRleCk7XG4gICAgaWYgKG4gIT09IC0xKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2FtcGxlOiBlLnNhbXBsZXNbZS5zYW1wbGVzLmxlbmd0aCAtIDFdLFxuICAgICAgICBsZW5ndGg6IG4sXG4gICAgICAgIG1pc3Npbmc6IDBcbiAgICAgIH07XG4gIH1cbiAgc3RhdGljIHByb2JlKGUpIHtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgdCA9IEVpKGUsIDApO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCByID0gdC5sZW5ndGg7XG4gICAgcmV0dXJuIGVbcl0gPT09IDExICYmIGVbciArIDFdID09PSAxMTkgJiYgX3UodCkgIT09IHZvaWQgMCAmJiAvLyBjaGVjayB0aGUgYnNpZCB0byBjb25maXJtIGFjLTNcbiAgICB2cChlLCByKSA8IDE2O1xuICB9XG59XG5mdW5jdGlvbiBFcChzLCBlLCB0LCByLCBuKSB7XG4gIGlmICh0ICsgOCA+IGUubGVuZ3RoIHx8IGVbdF0gIT09IDExIHx8IGVbdCArIDFdICE9PSAxMTkpXG4gICAgcmV0dXJuIC0xO1xuICBjb25zdCBpID0gZVt0ICsgNF0gPj4gNjtcbiAgaWYgKGkgPj0gMylcbiAgICByZXR1cm4gLTE7XG4gIGNvbnN0IGEgPSBbNDhlMywgNDQxMDAsIDMyZTNdW2ldLCBsID0gZVt0ICsgNF0gJiA2MywgdSA9IFs2NCwgNjksIDk2LCA2NCwgNzAsIDk2LCA4MCwgODcsIDEyMCwgODAsIDg4LCAxMjAsIDk2LCAxMDQsIDE0NCwgOTYsIDEwNSwgMTQ0LCAxMTIsIDEyMSwgMTY4LCAxMTIsIDEyMiwgMTY4LCAxMjgsIDEzOSwgMTkyLCAxMjgsIDE0MCwgMTkyLCAxNjAsIDE3NCwgMjQwLCAxNjAsIDE3NSwgMjQwLCAxOTIsIDIwOCwgMjg4LCAxOTIsIDIwOSwgMjg4LCAyMjQsIDI0MywgMzM2LCAyMjQsIDI0NCwgMzM2LCAyNTYsIDI3OCwgMzg0LCAyNTYsIDI3OSwgMzg0LCAzMjAsIDM0OCwgNDgwLCAzMjAsIDM0OSwgNDgwLCAzODQsIDQxNywgNTc2LCAzODQsIDQxOCwgNTc2LCA0NDgsIDQ4NywgNjcyLCA0NDgsIDQ4OCwgNjcyLCA1MTIsIDU1NywgNzY4LCA1MTIsIDU1OCwgNzY4LCA2NDAsIDY5NiwgOTYwLCA2NDAsIDY5NywgOTYwLCA3NjgsIDgzNSwgMTE1MiwgNzY4LCA4MzYsIDExNTIsIDg5NiwgOTc1LCAxMzQ0LCA4OTYsIDk3NiwgMTM0NCwgMTAyNCwgMTExNCwgMTUzNiwgMTAyNCwgMTExNSwgMTUzNiwgMTE1MiwgMTI1MywgMTcyOCwgMTE1MiwgMTI1NCwgMTcyOCwgMTI4MCwgMTM5MywgMTkyMCwgMTI4MCwgMTM5NCwgMTkyMF1bbCAqIDMgKyBpXSAqIDI7XG4gIGlmICh0ICsgdSA+IGUubGVuZ3RoKVxuICAgIHJldHVybiAtMTtcbiAgY29uc3QgZCA9IGVbdCArIDZdID4+IDU7XG4gIGxldCBoID0gMDtcbiAgZCA9PT0gMiA/IGggKz0gMiA6IChkICYgMSAmJiBkICE9PSAxICYmIChoICs9IDIpLCBkICYgNCAmJiAoaCArPSAyKSk7XG4gIGNvbnN0IGYgPSAoZVt0ICsgNl0gPDwgOCB8IGVbdCArIDddKSA+PiAxMiAtIGggJiAxLCB5ID0gWzIsIDEsIDIsIDMsIDMsIDQsIDQsIDVdW2RdICsgZiwgRSA9IGVbdCArIDVdID4+IDMsIGIgPSBlW3QgKyA1XSAmIDcsIFIgPSBuZXcgVWludDhBcnJheShbaSA8PCA2IHwgRSA8PCAxIHwgYiA+PiAyLCAoYiAmIDMpIDw8IDYgfCBkIDw8IDMgfCBmIDw8IDIgfCBsID4+IDQsIGwgPDwgNCAmIDIyNF0pLCBBID0gMTUzNiAvIGEgKiA5ZTQsIEYgPSByICsgbiAqIEEsIE0gPSBlLnN1YmFycmF5KHQsIHQgKyB1KTtcbiAgcmV0dXJuIHMuY29uZmlnID0gUiwgcy5jaGFubmVsQ291bnQgPSB5LCBzLnNhbXBsZXJhdGUgPSBhLCBzLnNhbXBsZXMucHVzaCh7XG4gICAgdW5pdDogTSxcbiAgICBwdHM6IEZcbiAgfSksIHU7XG59XG5jbGFzcyBGVCBleHRlbmRzIFJ1IHtcbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgc3VwZXIucmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSwgdGhpcy5fYXVkaW9UcmFjayA9IHtcbiAgICAgIGNvbnRhaW5lcjogXCJhdWRpby9tcGVnXCIsXG4gICAgICB0eXBlOiBcImF1ZGlvXCIsXG4gICAgICBpZDogMixcbiAgICAgIHBpZDogLTEsXG4gICAgICBzZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgIHNlZ21lbnRDb2RlYzogXCJtcDNcIixcbiAgICAgIHNhbXBsZXM6IFtdLFxuICAgICAgbWFuaWZlc3RDb2RlYzogdCxcbiAgICAgIGR1cmF0aW9uOiBuLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIGRyb3BwZWQ6IDBcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBwcm9iZShlKSB7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IHQgPSBFaShlLCAwKTtcbiAgICBsZXQgciA9ICh0ID09IG51bGwgPyB2b2lkIDAgOiB0Lmxlbmd0aCkgfHwgMDtcbiAgICBpZiAodCAmJiBlW3JdID09PSAxMSAmJiBlW3IgKyAxXSA9PT0gMTE5ICYmIF91KHQpICE9PSB2b2lkIDAgJiYgLy8gY2hlY2sgdGhlIGJzaWQgdG8gY29uZmlybSBhYy0zIG9yIGVjLTMgKG5vdCBtcDMpXG4gICAgdnAoZSwgcikgPD0gMTYpXG4gICAgICByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgbiA9IGUubGVuZ3RoOyByIDwgbjsgcisrKVxuICAgICAgaWYgKHlwKGUsIHIpKVxuICAgICAgICByZXR1cm4gcnQubG9nKFwiTVBFRyBBdWRpbyBzeW5jIHdvcmQgZm91bmQgIVwiKSwgITA7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGNhblBhcnNlKGUsIHQpIHtcbiAgICByZXR1cm4gTVQoZSwgdCk7XG4gIH1cbiAgYXBwZW5kRnJhbWUoZSwgdCwgcikge1xuICAgIGlmICh0aGlzLmJhc2VQVFMgIT09IG51bGwpXG4gICAgICByZXR1cm4gZ3AoZSwgdCwgciwgdGhpcy5iYXNlUFRTLCB0aGlzLmZyYW1lSW5kZXgpO1xuICB9XG59XG5jb25zdCBOVCA9IC9cXC9lbXNnWy0vXUlEMy9pO1xuY2xhc3MgVVQge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy50aW1lT2Zmc2V0ID0gMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMudmlkZW9UcmFjayA9IHZvaWQgMCwgdGhpcy5hdWRpb1RyYWNrID0gdm9pZCAwLCB0aGlzLmlkM1RyYWNrID0gdm9pZCAwLCB0aGlzLnR4dFRyYWNrID0gdm9pZCAwLCB0aGlzLmNvbmZpZyA9IHQ7XG4gIH1cbiAgcmVzZXRUaW1lU3RhbXAoKSB7XG4gIH1cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHRoaXMudmlkZW9UcmFjayA9IGpyKFwidmlkZW9cIiwgMSksIG8gPSB0aGlzLmF1ZGlvVHJhY2sgPSBqcihcImF1ZGlvXCIsIDEpLCBhID0gdGhpcy50eHRUcmFjayA9IGpyKFwidGV4dFwiLCAxKTtcbiAgICBpZiAodGhpcy5pZDNUcmFjayA9IGpyKFwiaWQzXCIsIDEpLCB0aGlzLnRpbWVPZmZzZXQgPSAwLCAhKGUgIT0gbnVsbCAmJiBlLmJ5dGVMZW5ndGgpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGwgPSBEZyhlKTtcbiAgICBpZiAobC52aWRlbykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpZDogYyxcbiAgICAgICAgdGltZXNjYWxlOiB1LFxuICAgICAgICBjb2RlYzogZCxcbiAgICAgICAgc3VwcGxlbWVudGFsOiBoXG4gICAgICB9ID0gbC52aWRlbztcbiAgICAgIGkuaWQgPSBjLCBpLnRpbWVzY2FsZSA9IGEudGltZXNjYWxlID0gdSwgaS5jb2RlYyA9IGQsIGkuc3VwcGxlbWVudGFsID0gaDtcbiAgICB9XG4gICAgaWYgKGwuYXVkaW8pIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaWQ6IGMsXG4gICAgICAgIHRpbWVzY2FsZTogdSxcbiAgICAgICAgY29kZWM6IGRcbiAgICAgIH0gPSBsLmF1ZGlvO1xuICAgICAgby5pZCA9IGMsIG8udGltZXNjYWxlID0gdSwgby5jb2RlYyA9IGQ7XG4gICAgfVxuICAgIGEuaWQgPSBMZy50ZXh0LCBpLnNhbXBsZUR1cmF0aW9uID0gMCwgaS5kdXJhdGlvbiA9IG8uZHVyYXRpb24gPSBuO1xuICB9XG4gIHJlc2V0Q29udGlndWl0eSgpIHtcbiAgICB0aGlzLnJlbWFpbmRlckRhdGEgPSBudWxsO1xuICB9XG4gIHN0YXRpYyBwcm9iZShlKSB7XG4gICAgcmV0dXJuIEJTKGUpO1xuICB9XG4gIGRlbXV4KGUsIHQpIHtcbiAgICB0aGlzLnRpbWVPZmZzZXQgPSB0O1xuICAgIGxldCByID0gZTtcbiAgICBjb25zdCBuID0gdGhpcy52aWRlb1RyYWNrLCBpID0gdGhpcy50eHRUcmFjaztcbiAgICBpZiAodGhpcy5jb25maWcucHJvZ3Jlc3NpdmUpIHtcbiAgICAgIHRoaXMucmVtYWluZGVyRGF0YSAmJiAociA9IF9yKHRoaXMucmVtYWluZGVyRGF0YSwgZSkpO1xuICAgICAgY29uc3QgYSA9IFZTKHIpO1xuICAgICAgdGhpcy5yZW1haW5kZXJEYXRhID0gYS5yZW1haW5kZXIsIG4uc2FtcGxlcyA9IGEudmFsaWQgfHwgbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICB9IGVsc2VcbiAgICAgIG4uc2FtcGxlcyA9IHI7XG4gICAgY29uc3QgbyA9IHRoaXMuZXh0cmFjdElEM1RyYWNrKG4sIHQpO1xuICAgIHJldHVybiBpLnNhbXBsZXMgPSByaCh0LCBuKSwge1xuICAgICAgdmlkZW9UcmFjazogbixcbiAgICAgIGF1ZGlvVHJhY2s6IHRoaXMuYXVkaW9UcmFjayxcbiAgICAgIGlkM1RyYWNrOiBvLFxuICAgICAgdGV4dFRyYWNrOiB0aGlzLnR4dFRyYWNrXG4gICAgfTtcbiAgfVxuICBmbHVzaCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy50aW1lT2Zmc2V0LCB0ID0gdGhpcy52aWRlb1RyYWNrLCByID0gdGhpcy50eHRUcmFjaztcbiAgICB0LnNhbXBsZXMgPSB0aGlzLnJlbWFpbmRlckRhdGEgfHwgbmV3IFVpbnQ4QXJyYXkoKSwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbDtcbiAgICBjb25zdCBuID0gdGhpcy5leHRyYWN0SUQzVHJhY2sodCwgdGhpcy50aW1lT2Zmc2V0KTtcbiAgICByZXR1cm4gci5zYW1wbGVzID0gcmgoZSwgdCksIHtcbiAgICAgIHZpZGVvVHJhY2s6IHQsXG4gICAgICBhdWRpb1RyYWNrOiBqcigpLFxuICAgICAgaWQzVHJhY2s6IG4sXG4gICAgICB0ZXh0VHJhY2s6IGpyKClcbiAgICB9O1xuICB9XG4gIGV4dHJhY3RJRDNUcmFjayhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaWQzVHJhY2s7XG4gICAgaWYgKGUuc2FtcGxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG4gPSBHZShlLnNhbXBsZXMsIFtcImVtc2dcIl0pO1xuICAgICAgbiAmJiBuLmZvckVhY2goKGkpID0+IHtcbiAgICAgICAgY29uc3QgbyA9IEtTKGkpO1xuICAgICAgICBpZiAoTlQudGVzdChvLnNjaGVtZUlkVXJpKSkge1xuICAgICAgICAgIGNvbnN0IGEgPSBOaChvLCB0KTtcbiAgICAgICAgICBsZXQgbCA9IG8uZXZlbnREdXJhdGlvbiA9PT0gNDI5NDk2NzI5NSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IG8uZXZlbnREdXJhdGlvbiAvIG8udGltZVNjYWxlO1xuICAgICAgICAgIGwgPD0gMWUtMyAmJiAobCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgICAgY29uc3QgYyA9IG8ucGF5bG9hZDtcbiAgICAgICAgICByLnNhbXBsZXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjLFxuICAgICAgICAgICAgbGVuOiBjLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBkdHM6IGEsXG4gICAgICAgICAgICBwdHM6IGEsXG4gICAgICAgICAgICB0eXBlOiBici5lbXNnLFxuICAgICAgICAgICAgZHVyYXRpb246IGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5lbmFibGVFbXNnS0xWTWV0YWRhdGEgJiYgby5zY2hlbWVJZFVyaS5zdGFydHNXaXRoKFwidXJuOm1pc2I6S0xWOmJpbjoxOTEwLjFcIikpIHtcbiAgICAgICAgICBjb25zdCBhID0gTmgobywgdCk7XG4gICAgICAgICAgci5zYW1wbGVzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogby5wYXlsb2FkLFxuICAgICAgICAgICAgbGVuOiBvLnBheWxvYWQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIGR0czogYSxcbiAgICAgICAgICAgIHB0czogYSxcbiAgICAgICAgICAgIHR5cGU6IGJyLm1pc2JrbHYsXG4gICAgICAgICAgICBkdXJhdGlvbjogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICBkZW11eFNhbXBsZUFlcyhlLCB0LCByKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlRoZSBNUDQgZGVtdXhlciBkb2VzIG5vdCBzdXBwb3J0IFNBTVBMRS1BRVMgZGVjcnlwdGlvblwiKSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IG51bGwsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGwsIHRoaXMudmlkZW9UcmFjayA9IHRoaXMuYXVkaW9UcmFjayA9IHRoaXMuaWQzVHJhY2sgPSB0aGlzLnR4dFRyYWNrID0gdm9pZCAwO1xuICB9XG59XG5mdW5jdGlvbiBOaChzLCBlKSB7XG4gIHJldHVybiB1ZShzLnByZXNlbnRhdGlvblRpbWUpID8gcy5wcmVzZW50YXRpb25UaW1lIC8gcy50aW1lU2NhbGUgOiBlICsgcy5wcmVzZW50YXRpb25UaW1lRGVsdGEgLyBzLnRpbWVTY2FsZTtcbn1cbmNsYXNzICRUIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgcikge1xuICAgIHRoaXMua2V5RGF0YSA9IHZvaWQgMCwgdGhpcy5kZWNyeXB0ZXIgPSB2b2lkIDAsIHRoaXMua2V5RGF0YSA9IHIsIHRoaXMuZGVjcnlwdGVyID0gbmV3IHZ1KHQsIHtcbiAgICAgIHJlbW92ZVBLQ1M3UGFkZGluZzogITFcbiAgICB9KTtcbiAgfVxuICBkZWNyeXB0QnVmZmVyKGUpIHtcbiAgICByZXR1cm4gdGhpcy5kZWNyeXB0ZXIuZGVjcnlwdChlLCB0aGlzLmtleURhdGEua2V5LmJ1ZmZlciwgdGhpcy5rZXlEYXRhLml2LmJ1ZmZlciwgT3MuY2JjKTtcbiAgfVxuICAvLyBBQUMgLSBlbmNyeXB0IGFsbCBmdWxsIDE2IGJ5dGVzIGJsb2NrcyBzdGFydGluZyBmcm9tIG9mZnNldCAxNlxuICBkZWNyeXB0QWFjU2FtcGxlKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gZVt0XS51bml0O1xuICAgIGlmIChuLmxlbmd0aCA8PSAxNilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gbi5zdWJhcnJheSgxNiwgbi5sZW5ndGggLSBuLmxlbmd0aCAlIDE2KSwgbyA9IGkuYnVmZmVyLnNsaWNlKGkuYnl0ZU9mZnNldCwgaS5ieXRlT2Zmc2V0ICsgaS5sZW5ndGgpO1xuICAgIHRoaXMuZGVjcnlwdEJ1ZmZlcihvKS50aGVuKChhKSA9PiB7XG4gICAgICBjb25zdCBsID0gbmV3IFVpbnQ4QXJyYXkoYSk7XG4gICAgICBuLnNldChsLCAxNiksIHRoaXMuZGVjcnlwdGVyLmlzU3luYygpIHx8IHRoaXMuZGVjcnlwdEFhY1NhbXBsZXMoZSwgdCArIDEsIHIpO1xuICAgIH0pLmNhdGNoKHIpO1xuICB9XG4gIGRlY3J5cHRBYWNTYW1wbGVzKGUsIHQsIHIpIHtcbiAgICBmb3IgKDsgOyB0KyspIHtcbiAgICAgIGlmICh0ID49IGUubGVuZ3RoKSB7XG4gICAgICAgIHIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoZVt0XS51bml0Lmxlbmd0aCA8IDMyKSAmJiAodGhpcy5kZWNyeXB0QWFjU2FtcGxlKGUsIHQsIHIpLCAhdGhpcy5kZWNyeXB0ZXIuaXNTeW5jKCkpKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIC8vIEFWQyAtIGVuY3J5cHQgb25lIDE2IGJ5dGVzIGJsb2NrIG91dCBvZiB0ZW4sIHN0YXJ0aW5nIGZyb20gb2Zmc2V0IDMyXG4gIGdldEF2Y0VuY3J5cHRlZERhdGEoZSkge1xuICAgIGNvbnN0IHQgPSBNYXRoLmZsb29yKChlLmxlbmd0aCAtIDQ4KSAvIDE2MCkgKiAxNiArIDE2LCByID0gbmV3IEludDhBcnJheSh0KTtcbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDMyOyBpIDwgZS5sZW5ndGggLSAxNjsgaSArPSAxNjAsIG4gKz0gMTYpXG4gICAgICByLnNldChlLnN1YmFycmF5KGksIGkgKyAxNiksIG4pO1xuICAgIHJldHVybiByO1xuICB9XG4gIGdldEF2Y0RlY3J5cHRlZFVuaXQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheSh0KTtcbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDMyOyBpIDwgZS5sZW5ndGggLSAxNjsgaSArPSAxNjAsIG4gKz0gMTYpXG4gICAgICBlLnNldChyLnN1YmFycmF5KG4sIG4gKyAxNiksIGkpO1xuICAgIHJldHVybiBlO1xuICB9XG4gIGRlY3J5cHRBdmNTYW1wbGUoZSwgdCwgciwgbiwgaSkge1xuICAgIGNvbnN0IG8gPSBNZyhpLmRhdGEpLCBhID0gdGhpcy5nZXRBdmNFbmNyeXB0ZWREYXRhKG8pO1xuICAgIHRoaXMuZGVjcnlwdEJ1ZmZlcihhLmJ1ZmZlcikudGhlbigobCkgPT4ge1xuICAgICAgaS5kYXRhID0gdGhpcy5nZXRBdmNEZWNyeXB0ZWRVbml0KG8sIGwpLCB0aGlzLmRlY3J5cHRlci5pc1N5bmMoKSB8fCB0aGlzLmRlY3J5cHRBdmNTYW1wbGVzKGUsIHQsIHIgKyAxLCBuKTtcbiAgICB9KS5jYXRjaChuKTtcbiAgfVxuICBkZWNyeXB0QXZjU2FtcGxlcyhlLCB0LCByLCBuKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGRlY3J5cHQgc2FtcGxlcyBvZiB0eXBlIFVpbnQ4QXJyYXlcIik7XG4gICAgZm9yICg7IDsgdCsrLCByID0gMCkge1xuICAgICAgaWYgKHQgPj0gZS5sZW5ndGgpIHtcbiAgICAgICAgbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpID0gZVt0XS51bml0cztcbiAgICAgIGZvciAoOyAhKHIgPj0gaS5sZW5ndGgpOyByKyspIHtcbiAgICAgICAgY29uc3QgbyA9IGlbcl07XG4gICAgICAgIGlmICghKG8uZGF0YS5sZW5ndGggPD0gNDggfHwgby50eXBlICE9PSAxICYmIG8udHlwZSAhPT0gNSkgJiYgKHRoaXMuZGVjcnlwdEF2Y1NhbXBsZShlLCB0LCByLCBuLCBvKSwgIXRoaXMuZGVjcnlwdGVyLmlzU3luYygpKSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyB4cCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuVmlkZW9TYW1wbGUgPSBudWxsO1xuICB9XG4gIGNyZWF0ZVZpZGVvU2FtcGxlKGUsIHQsIHIpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBlLFxuICAgICAgZnJhbWU6ICExLFxuICAgICAgcHRzOiB0LFxuICAgICAgZHRzOiByLFxuICAgICAgdW5pdHM6IFtdLFxuICAgICAgbGVuZ3RoOiAwXG4gICAgfTtcbiAgfVxuICBnZXRMYXN0TmFsVW5pdChlKSB7XG4gICAgdmFyIHQ7XG4gICAgbGV0IHIgPSB0aGlzLlZpZGVvU2FtcGxlLCBuO1xuICAgIGlmICgoIXIgfHwgci51bml0cy5sZW5ndGggPT09IDApICYmIChyID0gZVtlLmxlbmd0aCAtIDFdKSwgKHQgPSByKSAhPSBudWxsICYmIHQudW5pdHMpIHtcbiAgICAgIGNvbnN0IGkgPSByLnVuaXRzO1xuICAgICAgbiA9IGlbaS5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgcHVzaEFjY2Vzc1VuaXQoZSwgdCkge1xuICAgIGlmIChlLnVuaXRzLmxlbmd0aCAmJiBlLmZyYW1lKSB7XG4gICAgICBpZiAoZS5wdHMgPT09IHZvaWQgMCkge1xuICAgICAgICBjb25zdCByID0gdC5zYW1wbGVzLCBuID0gci5sZW5ndGg7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgY29uc3QgaSA9IHJbbiAtIDFdO1xuICAgICAgICAgIGUucHRzID0gaS5wdHMsIGUuZHRzID0gaS5kdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdC5kcm9wcGVkKys7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0LnNhbXBsZXMucHVzaChlKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VOQUx1KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdC5ieXRlTGVuZ3RoO1xuICAgIGxldCBpID0gZS5uYWx1U3RhdGUgfHwgMDtcbiAgICBjb25zdCBvID0gaSwgYSA9IFtdO1xuICAgIGxldCBsID0gMCwgYywgdSwgZCwgaCA9IC0xLCBmID0gMDtcbiAgICBmb3IgKGkgPT09IC0xICYmIChoID0gMCwgZiA9IHRoaXMuZ2V0TkFMdVR5cGUodCwgMCksIGkgPSAwLCBsID0gMSk7IGwgPCBuOyApIHtcbiAgICAgIGlmIChjID0gdFtsKytdLCAhaSkge1xuICAgICAgICBpID0gYyA/IDAgOiAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpID09PSAxKSB7XG4gICAgICAgIGkgPSBjID8gMCA6IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFjKVxuICAgICAgICBpID0gMztcbiAgICAgIGVsc2UgaWYgKGMgPT09IDEpIHtcbiAgICAgICAgaWYgKHUgPSBsIC0gaSAtIDEsIGggPj0gMCkge1xuICAgICAgICAgIGNvbnN0IHAgPSB7XG4gICAgICAgICAgICBkYXRhOiB0LnN1YmFycmF5KGgsIHUpLFxuICAgICAgICAgICAgdHlwZTogZlxuICAgICAgICAgIH07XG4gICAgICAgICAgYS5wdXNoKHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmdldExhc3ROYWxVbml0KGUuc2FtcGxlcyk7XG4gICAgICAgICAgcCAmJiAobyAmJiBsIDw9IDQgLSBvICYmIHAuc3RhdGUgJiYgKHAuZGF0YSA9IHAuZGF0YS5zdWJhcnJheSgwLCBwLmRhdGEuYnl0ZUxlbmd0aCAtIG8pKSwgdSA+IDAgJiYgKHAuZGF0YSA9IF9yKHAuZGF0YSwgdC5zdWJhcnJheSgwLCB1KSksIHAuc3RhdGUgPSAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgbCA8IG4gPyAoZCA9IHRoaXMuZ2V0TkFMdVR5cGUodCwgbCksIGggPSBsLCBmID0gZCwgaSA9IDApIDogaSA9IC0xO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGkgPSAwO1xuICAgIH1cbiAgICBpZiAoaCA+PSAwICYmIGkgPj0gMCkge1xuICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgZGF0YTogdC5zdWJhcnJheShoLCBuKSxcbiAgICAgICAgdHlwZTogZixcbiAgICAgICAgc3RhdGU6IGlcbiAgICAgIH07XG4gICAgICBhLnB1c2gocCk7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcCA9IHRoaXMuZ2V0TGFzdE5hbFVuaXQoZS5zYW1wbGVzKTtcbiAgICAgIHAgJiYgKHAuZGF0YSA9IF9yKHAuZGF0YSwgdCkpO1xuICAgIH1cbiAgICByZXR1cm4gZS5uYWx1U3RhdGUgPSBpLCBhO1xuICB9XG59XG5jbGFzcyBabiB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmRhdGEgPSB2b2lkIDAsIHRoaXMuYnl0ZXNBdmFpbGFibGUgPSB2b2lkIDAsIHRoaXMud29yZCA9IHZvaWQgMCwgdGhpcy5iaXRzQXZhaWxhYmxlID0gdm9pZCAwLCB0aGlzLmRhdGEgPSBlLCB0aGlzLmJ5dGVzQXZhaWxhYmxlID0gZS5ieXRlTGVuZ3RoLCB0aGlzLndvcmQgPSAwLCB0aGlzLmJpdHNBdmFpbGFibGUgPSAwO1xuICB9XG4gIC8vICgpOnZvaWRcbiAgbG9hZFdvcmQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuZGF0YSwgdCA9IHRoaXMuYnl0ZXNBdmFpbGFibGUsIHIgPSBlLmJ5dGVMZW5ndGggLSB0LCBuID0gbmV3IFVpbnQ4QXJyYXkoNCksIGkgPSBNYXRoLm1pbig0LCB0KTtcbiAgICBpZiAoaSA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGJ5dGVzIGF2YWlsYWJsZVwiKTtcbiAgICBuLnNldChlLnN1YmFycmF5KHIsIHIgKyBpKSksIHRoaXMud29yZCA9IG5ldyBEYXRhVmlldyhuLmJ1ZmZlcikuZ2V0VWludDMyKDApLCB0aGlzLmJpdHNBdmFpbGFibGUgPSBpICogOCwgdGhpcy5ieXRlc0F2YWlsYWJsZSAtPSBpO1xuICB9XG4gIC8vIChjb3VudDppbnQpOnZvaWRcbiAgc2tpcEJpdHMoZSkge1xuICAgIGxldCB0O1xuICAgIGUgPSBNYXRoLm1pbihlLCB0aGlzLmJ5dGVzQXZhaWxhYmxlICogOCArIHRoaXMuYml0c0F2YWlsYWJsZSksIHRoaXMuYml0c0F2YWlsYWJsZSA+IGUgPyAodGhpcy53b3JkIDw8PSBlLCB0aGlzLmJpdHNBdmFpbGFibGUgLT0gZSkgOiAoZSAtPSB0aGlzLmJpdHNBdmFpbGFibGUsIHQgPSBlID4+IDMsIGUgLT0gdCA8PCAzLCB0aGlzLmJ5dGVzQXZhaWxhYmxlIC09IHQsIHRoaXMubG9hZFdvcmQoKSwgdGhpcy53b3JkIDw8PSBlLCB0aGlzLmJpdHNBdmFpbGFibGUgLT0gZSk7XG4gIH1cbiAgLy8gKHNpemU6aW50KTp1aW50XG4gIHJlYWRCaXRzKGUpIHtcbiAgICBsZXQgdCA9IE1hdGgubWluKHRoaXMuYml0c0F2YWlsYWJsZSwgZSk7XG4gICAgY29uc3QgciA9IHRoaXMud29yZCA+Pj4gMzIgLSB0O1xuICAgIGlmIChlID4gMzIgJiYgcnQuZXJyb3IoXCJDYW5ub3QgcmVhZCBtb3JlIHRoYW4gMzIgYml0cyBhdCBhIHRpbWVcIiksIHRoaXMuYml0c0F2YWlsYWJsZSAtPSB0LCB0aGlzLmJpdHNBdmFpbGFibGUgPiAwKVxuICAgICAgdGhpcy53b3JkIDw8PSB0O1xuICAgIGVsc2UgaWYgKHRoaXMuYnl0ZXNBdmFpbGFibGUgPiAwKVxuICAgICAgdGhpcy5sb2FkV29yZCgpO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGJpdHMgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB0ID0gZSAtIHQsIHQgPiAwICYmIHRoaXMuYml0c0F2YWlsYWJsZSA/IHIgPDwgdCB8IHRoaXMucmVhZEJpdHModCkgOiByO1xuICB9XG4gIC8vICgpOnVpbnRcbiAgc2tpcExaKCkge1xuICAgIGxldCBlO1xuICAgIGZvciAoZSA9IDA7IGUgPCB0aGlzLmJpdHNBdmFpbGFibGU7ICsrZSlcbiAgICAgIGlmICgodGhpcy53b3JkICYgMjE0NzQ4MzY0OCA+Pj4gZSkgIT09IDApXG4gICAgICAgIHJldHVybiB0aGlzLndvcmQgPDw9IGUsIHRoaXMuYml0c0F2YWlsYWJsZSAtPSBlLCBlO1xuICAgIHJldHVybiB0aGlzLmxvYWRXb3JkKCksIGUgKyB0aGlzLnNraXBMWigpO1xuICB9XG4gIC8vICgpOnZvaWRcbiAgc2tpcFVFRygpIHtcbiAgICB0aGlzLnNraXBCaXRzKDEgKyB0aGlzLnNraXBMWigpKTtcbiAgfVxuICAvLyAoKTp2b2lkXG4gIHNraXBFRygpIHtcbiAgICB0aGlzLnNraXBCaXRzKDEgKyB0aGlzLnNraXBMWigpKTtcbiAgfVxuICAvLyAoKTp1aW50XG4gIHJlYWRVRUcoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuc2tpcExaKCk7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoZSArIDEpIC0gMTtcbiAgfVxuICAvLyAoKTppbnRcbiAgcmVhZEVHKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnJlYWRVRUcoKTtcbiAgICByZXR1cm4gMSAmIGUgPyAxICsgZSA+Pj4gMSA6IC0xICogKGUgPj4+IDEpO1xuICB9XG4gIC8vIFNvbWUgY29udmVuaWVuY2UgZnVuY3Rpb25zXG4gIC8vIDpCb29sZWFuXG4gIHJlYWRCb29sZWFuKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKDEpID09PSAxO1xuICB9XG4gIC8vICgpOmludFxuICByZWFkVUJ5dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoOCk7XG4gIH1cbiAgLy8gKCk6aW50XG4gIHJlYWRVU2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoMTYpO1xuICB9XG4gIC8vICgpOmludFxuICByZWFkVUludCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkQml0cygzMik7XG4gIH1cbn1cbmNsYXNzIEdUIGV4dGVuZHMgeHAge1xuICBwYXJzZVBFUyhlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHRoaXMucGFyc2VOQUx1KGUsIHIuZGF0YSwgbik7XG4gICAgbGV0IG8gPSB0aGlzLlZpZGVvU2FtcGxlLCBhLCBsID0gITE7XG4gICAgci5kYXRhID0gbnVsbCwgbyAmJiBpLmxlbmd0aCAmJiAhZS5hdWRGb3VuZCAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgbyA9IHRoaXMuVmlkZW9TYW1wbGUgPSB0aGlzLmNyZWF0ZVZpZGVvU2FtcGxlKCExLCByLnB0cywgci5kdHMpKSwgaS5mb3JFYWNoKChjKSA9PiB7XG4gICAgICB2YXIgdSwgZDtcbiAgICAgIHN3aXRjaCAoYy50eXBlKSB7XG4gICAgICAgIC8vIE5EUlxuICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICBsZXQgeSA9ICExO1xuICAgICAgICAgIGEgPSAhMDtcbiAgICAgICAgICBjb25zdCBFID0gYy5kYXRhO1xuICAgICAgICAgIGlmIChsICYmIEUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucmVhZFNsaWNlVHlwZShFKTtcbiAgICAgICAgICAgIChiID09PSAyIHx8IGIgPT09IDQgfHwgYiA9PT0gNyB8fCBiID09PSA5KSAmJiAoeSA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIHZhciBoO1xuICAgICAgICAgICAgKGggPSBvKSAhPSBudWxsICYmIGguZnJhbWUgJiYgIW8ua2V5ICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITAsIHIucHRzLCByLmR0cykpLCBvLmZyYW1lID0gITAsIG8ua2V5ID0geTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgYSA9ICEwLCAodSA9IG8pICE9IG51bGwgJiYgdS5mcmFtZSAmJiAhby5rZXkgJiYgKHRoaXMucHVzaEFjY2Vzc1VuaXQobywgZSksIG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gbnVsbCksIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMCwgci5wdHMsIHIuZHRzKSksIG8ua2V5ID0gITAsIG8uZnJhbWUgPSAhMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU0VJXG4gICAgICAgIGNhc2UgNjoge1xuICAgICAgICAgIGEgPSAhMCwgZ3UoYy5kYXRhLCAxLCByLnB0cywgdC5zYW1wbGVzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDc6IHtcbiAgICAgICAgICB2YXIgZiwgcDtcbiAgICAgICAgICBhID0gITAsIGwgPSAhMDtcbiAgICAgICAgICBjb25zdCB5ID0gYy5kYXRhLCBFID0gdGhpcy5yZWFkU1BTKHkpO1xuICAgICAgICAgIGlmICghZS5zcHMgfHwgZS53aWR0aCAhPT0gRS53aWR0aCB8fCBlLmhlaWdodCAhPT0gRS5oZWlnaHQgfHwgKChmID0gZS5waXhlbFJhdGlvKSA9PSBudWxsID8gdm9pZCAwIDogZlswXSkgIT09IEUucGl4ZWxSYXRpb1swXSB8fCAoKHAgPSBlLnBpeGVsUmF0aW8pID09IG51bGwgPyB2b2lkIDAgOiBwWzFdKSAhPT0gRS5waXhlbFJhdGlvWzFdKSB7XG4gICAgICAgICAgICBlLndpZHRoID0gRS53aWR0aCwgZS5oZWlnaHQgPSBFLmhlaWdodCwgZS5waXhlbFJhdGlvID0gRS5waXhlbFJhdGlvLCBlLnNwcyA9IFt5XTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSB5LnN1YmFycmF5KDEsIDQpO1xuICAgICAgICAgICAgbGV0IFIgPSBcImF2YzEuXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBBID0gMDsgQSA8IDM7IEErKykge1xuICAgICAgICAgICAgICBsZXQgRiA9IGJbQV0udG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICBGLmxlbmd0aCA8IDIgJiYgKEYgPSBcIjBcIiArIEYpLCBSICs9IEY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLmNvZGVjID0gUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUFBTXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBhID0gITAsIGUucHBzID0gW2MuZGF0YV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEFVRFxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgYSA9ICEwLCBlLmF1ZEZvdW5kID0gITAsIChkID0gbykgIT0gbnVsbCAmJiBkLmZyYW1lICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gbnVsbCksIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMSwgci5wdHMsIHIuZHRzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZpbGxlciBEYXRhXG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgYSA9ICEwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGEgPSAhMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG8gJiYgYSAmJiBvLnVuaXRzLnB1c2goYyk7XG4gICAgfSksIG4gJiYgbyAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICB9XG4gIGdldE5BTHVUeXBlKGUsIHQpIHtcbiAgICByZXR1cm4gZVt0XSAmIDMxO1xuICB9XG4gIHJlYWRTbGljZVR5cGUoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgWm4oZSk7XG4gICAgcmV0dXJuIHQucmVhZFVCeXRlKCksIHQucmVhZFVFRygpLCB0LnJlYWRVRUcoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHNjYWxpbmcgbGlzdCBpcyBvcHRpb25hbGx5IHRyYW5zbWl0dGVkIGFzIHBhcnQgb2YgYSBzZXF1ZW5jZSBwYXJhbWV0ZXJcbiAgICogc2V0IGFuZCBpcyBub3QgcmVsZXZhbnQgdG8gdHJhbnNtdXhpbmcuXG4gICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBzY2FsaW5nIGxpc3RcbiAgICogQHNlZSBSZWNvbW1lbmRhdGlvbiBJVFUtVCBILjI2NCwgU2VjdGlvbiA3LjMuMi4xLjEuMVxuICAgKi9cbiAgc2tpcFNjYWxpbmdMaXN0KGUsIHQpIHtcbiAgICBsZXQgciA9IDgsIG4gPSA4LCBpO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgZTsgbysrKVxuICAgICAgbiAhPT0gMCAmJiAoaSA9IHQucmVhZEVHKCksIG4gPSAociArIGkgKyAyNTYpICUgMjU2KSwgciA9IG4gPT09IDAgPyByIDogbjtcbiAgfVxuICAvKipcbiAgICogUmVhZCBhIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYW5kIHJldHVybiBzb21lIGludGVyZXN0aW5nIHZpZGVvXG4gICAqIHByb3BlcnRpZXMuIEEgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpcyB0aGUgSDI2NCBtZXRhZGF0YSB0aGF0XG4gICAqIGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiB1cGNvbWluZyB2aWRlbyBmcmFtZXMuXG4gICAqIEByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGNvbmZpZ3VyYXRpb24gcGFyc2VkIGZyb20gdGhlXG4gICAqIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQsIGluY2x1ZGluZyB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAgICogYXNzb2NpYXRlZCB2aWRlbyBmcmFtZXMuXG4gICAqL1xuICByZWFkU1BTKGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IFpuKGUpO1xuICAgIGxldCByID0gMCwgbiA9IDAsIGkgPSAwLCBvID0gMCwgYSwgbCwgYztcbiAgICBjb25zdCB1ID0gdC5yZWFkVUJ5dGUuYmluZCh0KSwgZCA9IHQucmVhZEJpdHMuYmluZCh0KSwgaCA9IHQucmVhZFVFRy5iaW5kKHQpLCBmID0gdC5yZWFkQm9vbGVhbi5iaW5kKHQpLCBwID0gdC5za2lwQml0cy5iaW5kKHQpLCB5ID0gdC5za2lwRUcuYmluZCh0KSwgRSA9IHQuc2tpcFVFRy5iaW5kKHQpLCBiID0gdGhpcy5za2lwU2NhbGluZ0xpc3QuYmluZCh0aGlzKTtcbiAgICB1KCk7XG4gICAgY29uc3QgUiA9IHUoKTtcbiAgICBpZiAoZCg1KSwgcCgzKSwgdSgpLCBFKCksIFIgPT09IDEwMCB8fCBSID09PSAxMTAgfHwgUiA9PT0gMTIyIHx8IFIgPT09IDI0NCB8fCBSID09PSA0NCB8fCBSID09PSA4MyB8fCBSID09PSA4NiB8fCBSID09PSAxMTggfHwgUiA9PT0gMTI4KSB7XG4gICAgICBjb25zdCBqID0gaCgpO1xuICAgICAgaWYgKGogPT09IDMgJiYgcCgxKSwgRSgpLCBFKCksIHAoMSksIGYoKSlcbiAgICAgICAgZm9yIChsID0gaiAhPT0gMyA/IDggOiAxMiwgYyA9IDA7IGMgPCBsOyBjKyspXG4gICAgICAgICAgZigpICYmIChjIDwgNiA/IGIoMTYsIHQpIDogYig2NCwgdCkpO1xuICAgIH1cbiAgICBFKCk7XG4gICAgY29uc3QgQSA9IGgoKTtcbiAgICBpZiAoQSA9PT0gMClcbiAgICAgIGgoKTtcbiAgICBlbHNlIGlmIChBID09PSAxKVxuICAgICAgZm9yIChwKDEpLCB5KCksIHkoKSwgYSA9IGgoKSwgYyA9IDA7IGMgPCBhOyBjKyspXG4gICAgICAgIHkoKTtcbiAgICBFKCksIHAoMSk7XG4gICAgY29uc3QgRiA9IGgoKSwgTSA9IGgoKSwgSCA9IGQoMSk7XG4gICAgSCA9PT0gMCAmJiBwKDEpLCBwKDEpLCBmKCkgJiYgKHIgPSBoKCksIG4gPSBoKCksIGkgPSBoKCksIG8gPSBoKCkpO1xuICAgIGxldCBLID0gWzEsIDFdO1xuICAgIGlmIChmKCkgJiYgZigpKVxuICAgICAgc3dpdGNoICh1KCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIEsgPSBbMSwgMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBLID0gWzEyLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBLID0gWzEwLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBLID0gWzE2LCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBLID0gWzQwLCAzM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBLID0gWzI0LCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBLID0gWzIwLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBLID0gWzMyLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBLID0gWzgwLCAzM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgSyA9IFsxOCwgMTFdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIEsgPSBbMTUsIDExXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBLID0gWzY0LCAzM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgSyA9IFsxNjAsIDk5XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICBLID0gWzQsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIEsgPSBbMywgMl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgSyA9IFsyLCAxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTU6IHtcbiAgICAgICAgICBLID0gW3UoKSA8PCA4IHwgdSgpLCB1KCkgPDwgOCB8IHUoKV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IE1hdGguY2VpbCgoRiArIDEpICogMTYgLSByICogMiAtIG4gKiAyKSxcbiAgICAgIGhlaWdodDogKDIgLSBIKSAqIChNICsgMSkgKiAxNiAtIChIID8gMiA6IDQpICogKGkgKyBvKSxcbiAgICAgIHBpeGVsUmF0aW86IEtcbiAgICB9O1xuICB9XG59XG5jbGFzcyBWVCBleHRlbmRzIHhwIHtcbiAgY29uc3RydWN0b3IoLi4uZSkge1xuICAgIHN1cGVyKC4uLmUpLCB0aGlzLmluaXRWUFMgPSBudWxsO1xuICB9XG4gIHBhcnNlUEVTKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gdGhpcy5wYXJzZU5BTHUoZSwgci5kYXRhLCBuKTtcbiAgICBsZXQgbyA9IHRoaXMuVmlkZW9TYW1wbGUsIGEsIGwgPSAhMTtcbiAgICByLmRhdGEgPSBudWxsLCBvICYmIGkubGVuZ3RoICYmICFlLmF1ZEZvdW5kICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITEsIHIucHRzLCByLmR0cykpLCBpLmZvckVhY2goKGMpID0+IHtcbiAgICAgIHZhciB1LCBkO1xuICAgICAgc3dpdGNoIChjLnR5cGUpIHtcbiAgICAgICAgLy8gTk9OLUlEUiwgTk9OIFJBTkRPTSBBQ0NFU1MgU0xJQ0VcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMSwgci5wdHMsIHIuZHRzKSksIG8uZnJhbWUgPSAhMCwgYSA9ICEwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBDUkEsIEJMQSAocmFuZG9tIGFjY2VzcyBwaWN0dXJlKVxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGlmIChhID0gITAsIGwpIHtcbiAgICAgICAgICAgIHZhciBoO1xuICAgICAgICAgICAgKGggPSBvKSAhPSBudWxsICYmIGguZnJhbWUgJiYgIW8ua2V5ICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITAsIHIucHRzLCByLmR0cykpLCBvLmtleSA9ICEwLCBvLmZyYW1lID0gITA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIElEUlxuICAgICAgICBjYXNlIDE5OlxuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIGEgPSAhMCwgKHUgPSBvKSAhPSBudWxsICYmIHUuZnJhbWUgJiYgIW8ua2V5ICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpLCBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITAsIHIucHRzLCByLmR0cykpLCBvLmtleSA9ICEwLCBvLmZyYW1lID0gITA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFNFSVxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgIGEgPSAhMCwgZ3UoXG4gICAgICAgICAgICBjLmRhdGEsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICAgLy8gTkFMdSBoZWFkZXIgc2l6ZVxuICAgICAgICAgICAgci5wdHMsXG4gICAgICAgICAgICB0LnNhbXBsZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBWUFNcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBhID0gITAsIGUudnBzIHx8ICh0eXBlb2YgZS5wYXJhbXMgIT0gXCJvYmplY3RcIiAmJiAoZS5wYXJhbXMgPSB7fSksIGUucGFyYW1zID0gbnQoZS5wYXJhbXMsIHRoaXMucmVhZFZQUyhjLmRhdGEpKSwgdGhpcy5pbml0VlBTID0gYy5kYXRhKSwgZS52cHMgPSBbYy5kYXRhXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU1BTXG4gICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgaWYgKGEgPSAhMCwgbCA9ICEwLCBlLnZwcyAhPT0gdm9pZCAwICYmIGUudnBzWzBdICE9PSB0aGlzLmluaXRWUFMgJiYgZS5zcHMgIT09IHZvaWQgMCAmJiAhdGhpcy5tYXRjaFNQUyhlLnNwc1swXSwgYy5kYXRhKSAmJiAodGhpcy5pbml0VlBTID0gZS52cHNbMF0sIGUuc3BzID0gZS5wcHMgPSB2b2lkIDApLCAhZS5zcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSB0aGlzLnJlYWRTUFMoYy5kYXRhKTtcbiAgICAgICAgICAgIGUud2lkdGggPSBmLndpZHRoLCBlLmhlaWdodCA9IGYuaGVpZ2h0LCBlLnBpeGVsUmF0aW8gPSBmLnBpeGVsUmF0aW8sIGUuY29kZWMgPSBmLmNvZGVjU3RyaW5nLCBlLnNwcyA9IFtdLCB0eXBlb2YgZS5wYXJhbXMgIT0gXCJvYmplY3RcIiAmJiAoZS5wYXJhbXMgPSB7fSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gZi5wYXJhbXMpXG4gICAgICAgICAgICAgIGUucGFyYW1zW3BdID0gZi5wYXJhbXNbcF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHVzaFBhcmFtZXRlclNldChlLnNwcywgYy5kYXRhLCBlLnZwcyksIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMCwgci5wdHMsIHIuZHRzKSksIG8ua2V5ID0gITA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFBQU1xuICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgIGlmIChhID0gITAsIHR5cGVvZiBlLnBhcmFtcyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoIWUucHBzKSB7XG4gICAgICAgICAgICAgIGUucHBzID0gW107XG4gICAgICAgICAgICAgIGNvbnN0IGYgPSB0aGlzLnJlYWRQUFMoYy5kYXRhKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBwIGluIGYpXG4gICAgICAgICAgICAgICAgZS5wYXJhbXNbcF0gPSBmW3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoUGFyYW1ldGVyU2V0KGUucHBzLCBjLmRhdGEsIGUudnBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEFDQ0VTUyBVTklUIERFTElNSVRFUlxuICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGEgPSAhMCwgZS5hdWRGb3VuZCA9ICEwLCAoZCA9IG8pICE9IG51bGwgJiYgZC5mcmFtZSAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgbyA9IG51bGwpLCBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITEsIHIucHRzLCByLmR0cykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGEgPSAhMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG8gJiYgYSAmJiBvLnVuaXRzLnB1c2goYyk7XG4gICAgfSksIG4gJiYgbyAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICB9XG4gIHB1c2hQYXJhbWV0ZXJTZXQoZSwgdCwgcikge1xuICAgIChyICYmIHJbMF0gPT09IHRoaXMuaW5pdFZQUyB8fCAhciAmJiAhZS5sZW5ndGgpICYmIGUucHVzaCh0KTtcbiAgfVxuICBnZXROQUx1VHlwZShlLCB0KSB7XG4gICAgcmV0dXJuIChlW3RdICYgMTI2KSA+Pj4gMTtcbiAgfVxuICBlYnNwMnJic3AoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpO1xuICAgIGxldCByID0gMDtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IGUuYnl0ZUxlbmd0aDsgbisrKVxuICAgICAgbiA+PSAyICYmIGVbbl0gPT09IDMgJiYgZVtuIC0gMV0gPT09IDAgJiYgZVtuIC0gMl0gPT09IDAgfHwgKHRbcl0gPSBlW25dLCByKyspO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwgMCwgcik7XG4gIH1cbiAgcHVzaEFjY2Vzc1VuaXQoZSwgdCkge1xuICAgIHN1cGVyLnB1c2hBY2Nlc3NVbml0KGUsIHQpLCB0aGlzLmluaXRWUFMgJiYgKHRoaXMuaW5pdFZQUyA9IG51bGwpO1xuICB9XG4gIHJlYWRWUFMoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgWm4oZSk7XG4gICAgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkQml0cyg0KSwgdC5za2lwQml0cygyKSwgdC5yZWFkQml0cyg2KTtcbiAgICBjb25zdCByID0gdC5yZWFkQml0cygzKSwgbiA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICByZXR1cm4ge1xuICAgICAgbnVtVGVtcG9yYWxMYXllcnM6IHIgKyAxLFxuICAgICAgdGVtcG9yYWxJZE5lc3RlZDogblxuICAgIH07XG4gIH1cbiAgcmVhZFNQUyhlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBabih0aGlzLmVic3AycmJzcChlKSk7XG4gICAgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkQml0cyg0KTtcbiAgICBjb25zdCByID0gdC5yZWFkQml0cygzKTtcbiAgICB0LnJlYWRCb29sZWFuKCk7XG4gICAgY29uc3QgbiA9IHQucmVhZEJpdHMoMiksIGkgPSB0LnJlYWRCb29sZWFuKCksIG8gPSB0LnJlYWRCaXRzKDUpLCBhID0gdC5yZWFkVUJ5dGUoKSwgbCA9IHQucmVhZFVCeXRlKCksIGMgPSB0LnJlYWRVQnl0ZSgpLCB1ID0gdC5yZWFkVUJ5dGUoKSwgZCA9IHQucmVhZFVCeXRlKCksIGggPSB0LnJlYWRVQnl0ZSgpLCBmID0gdC5yZWFkVUJ5dGUoKSwgcCA9IHQucmVhZFVCeXRlKCksIHkgPSB0LnJlYWRVQnl0ZSgpLCBFID0gdC5yZWFkVUJ5dGUoKSwgYiA9IHQucmVhZFVCeXRlKCksIFIgPSBbXSwgQSA9IFtdO1xuICAgIGZvciAobGV0IHllID0gMDsgeWUgPCByOyB5ZSsrKVxuICAgICAgUi5wdXNoKHQucmVhZEJvb2xlYW4oKSksIEEucHVzaCh0LnJlYWRCb29sZWFuKCkpO1xuICAgIGlmIChyID4gMClcbiAgICAgIGZvciAobGV0IHllID0gcjsgeWUgPCA4OyB5ZSsrKVxuICAgICAgICB0LnJlYWRCaXRzKDIpO1xuICAgIGZvciAobGV0IHllID0gMDsgeWUgPCByOyB5ZSsrKVxuICAgICAgUlt5ZV0gJiYgKHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCkpLCBBW3llXSAmJiB0LnJlYWRVQnl0ZSgpO1xuICAgIHQucmVhZFVFRygpO1xuICAgIGNvbnN0IEYgPSB0LnJlYWRVRUcoKTtcbiAgICBGID09IDMgJiYgdC5za2lwQml0cygxKTtcbiAgICBjb25zdCBNID0gdC5yZWFkVUVHKCksIEggPSB0LnJlYWRVRUcoKSwgSyA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICBsZXQgaiA9IDAsIEMgPSAwLCBrID0gMCwgJCA9IDA7XG4gICAgSyAmJiAoaiArPSB0LnJlYWRVRUcoKSwgQyArPSB0LnJlYWRVRUcoKSwgayArPSB0LnJlYWRVRUcoKSwgJCArPSB0LnJlYWRVRUcoKSk7XG4gICAgY29uc3QgVyA9IHQucmVhZFVFRygpLCBfID0gdC5yZWFkVUVHKCksIGcgPSB0LnJlYWRVRUcoKSwgeCA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICBmb3IgKGxldCB5ZSA9IHggPyAwIDogcjsgeWUgPD0gcjsgeWUrKylcbiAgICAgIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCk7XG4gICAgaWYgKHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQucmVhZEJvb2xlYW4oKSAmJiB0LnJlYWRCb29sZWFuKCkpXG4gICAgICBmb3IgKGxldCBiZSA9IDA7IGJlIDwgNDsgYmUrKylcbiAgICAgICAgZm9yIChsZXQgRmUgPSAwOyBGZSA8IChiZSA9PT0gMyA/IDIgOiA2KTsgRmUrKylcbiAgICAgICAgICBpZiAoIXQucmVhZEJvb2xlYW4oKSlcbiAgICAgICAgICAgIHQucmVhZFVFRygpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2UgPSBNYXRoLm1pbig2NCwgMSA8PCA0ICsgKGJlIDw8IDEpKTtcbiAgICAgICAgICAgIGJlID4gMSAmJiB0LnJlYWRFRygpO1xuICAgICAgICAgICAgZm9yIChsZXQgTmUgPSAwOyBOZSA8IHdlOyBOZSsrKVxuICAgICAgICAgICAgICB0LnJlYWRFRygpO1xuICAgICAgICAgIH1cbiAgICB0LnJlYWRCb29sZWFuKCksIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpICYmICh0LnJlYWRVQnl0ZSgpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQucmVhZEJvb2xlYW4oKSk7XG4gICAgY29uc3QgTyA9IHQucmVhZFVFRygpO1xuICAgIGxldCBVID0gMDtcbiAgICBmb3IgKGxldCB5ZSA9IDA7IHllIDwgTzsgeWUrKykge1xuICAgICAgbGV0IGJlID0gITE7XG4gICAgICBpZiAoeWUgIT09IDAgJiYgKGJlID0gdC5yZWFkQm9vbGVhbigpKSwgYmUpIHtcbiAgICAgICAgeWUgPT09IE8gJiYgdC5yZWFkVUVHKCksIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkVUVHKCk7XG4gICAgICAgIGxldCBGZSA9IDA7XG4gICAgICAgIGZvciAobGV0IFhlID0gMDsgWGUgPD0gVTsgWGUrKykge1xuICAgICAgICAgIGNvbnN0IHdlID0gdC5yZWFkQm9vbGVhbigpO1xuICAgICAgICAgIGxldCBOZSA9ICExO1xuICAgICAgICAgIHdlIHx8IChOZSA9IHQucmVhZEJvb2xlYW4oKSksICh3ZSB8fCBOZSkgJiYgRmUrKztcbiAgICAgICAgfVxuICAgICAgICBVID0gRmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBGZSA9IHQucmVhZFVFRygpLCBYZSA9IHQucmVhZFVFRygpO1xuICAgICAgICBVID0gRmUgKyBYZTtcbiAgICAgICAgZm9yIChsZXQgd2UgPSAwOyB3ZSA8IEZlOyB3ZSsrKVxuICAgICAgICAgIHQucmVhZFVFRygpLCB0LnJlYWRCb29sZWFuKCk7XG4gICAgICAgIGZvciAobGV0IHdlID0gMDsgd2UgPCBYZTsgd2UrKylcbiAgICAgICAgICB0LnJlYWRVRUcoKSwgdC5yZWFkQm9vbGVhbigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodC5yZWFkQm9vbGVhbigpKSB7XG4gICAgICBjb25zdCB5ZSA9IHQucmVhZFVFRygpO1xuICAgICAgZm9yIChsZXQgYmUgPSAwOyBiZSA8IHllOyBiZSsrKSB7XG4gICAgICAgIGZvciAobGV0IEZlID0gMDsgRmUgPCBnICsgNDsgRmUrKylcbiAgICAgICAgICB0LnJlYWRCaXRzKDEpO1xuICAgICAgICB0LnJlYWRCaXRzKDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgTCA9IDAsIG0gPSAxLCB2ID0gMSwgUCA9ICEwLCBOID0gMSwgWSA9IDA7XG4gICAgdC5yZWFkQm9vbGVhbigpLCB0LnJlYWRCb29sZWFuKCk7XG4gICAgbGV0IGVlID0gITE7XG4gICAgaWYgKHQucmVhZEJvb2xlYW4oKSkge1xuICAgICAgaWYgKHQucmVhZEJvb2xlYW4oKSkge1xuICAgICAgICBjb25zdCBkdCA9IHQucmVhZFVCeXRlKCksIEplID0gWzEsIDEyLCAxMCwgMTYsIDQwLCAyNCwgMjAsIDMyLCA4MCwgMTgsIDE1LCA2NCwgMTYwLCA0LCAzLCAyXSwgUWUgPSBbMSwgMTEsIDExLCAxMSwgMzMsIDExLCAxMSwgMTEsIDMzLCAxMSwgMTEsIDMzLCA5OSwgMywgMiwgMV07XG4gICAgICAgIGR0ID4gMCAmJiBkdCA8IDE2ID8gKG0gPSBKZVtkdCAtIDFdLCB2ID0gUWVbZHQgLSAxXSkgOiBkdCA9PT0gMjU1ICYmIChtID0gdC5yZWFkQml0cygxNiksIHYgPSB0LnJlYWRCaXRzKDE2KSk7XG4gICAgICB9XG4gICAgICBpZiAodC5yZWFkQm9vbGVhbigpICYmIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpICYmICh0LnJlYWRCaXRzKDMpLCB0LnJlYWRCb29sZWFuKCksIHQucmVhZEJvb2xlYW4oKSAmJiAodC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSkpLCB0LnJlYWRCb29sZWFuKCkgJiYgKHQucmVhZFVFRygpLCB0LnJlYWRVRUcoKSksIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpLCB0LnJlYWRCb29sZWFuKCksIGVlID0gdC5yZWFkQm9vbGVhbigpLCBlZSAmJiAodC5za2lwVUVHKCksIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCkpLCB0LnJlYWRCb29sZWFuKCkgJiYgKE4gPSB0LnJlYWRCaXRzKDMyKSwgWSA9IHQucmVhZEJpdHMoMzIpLCB0LnJlYWRCb29sZWFuKCkgJiYgdC5yZWFkVUVHKCksIHQucmVhZEJvb2xlYW4oKSkpIHtcbiAgICAgICAgY29uc3QgUWUgPSB0LnJlYWRCb29sZWFuKCksIGl0ID0gdC5yZWFkQm9vbGVhbigpO1xuICAgICAgICBsZXQgamUgPSAhMTtcbiAgICAgICAgKFFlIHx8IGl0KSAmJiAoamUgPSB0LnJlYWRCb29sZWFuKCksIGplICYmICh0LnJlYWRVQnl0ZSgpLCB0LnJlYWRCaXRzKDUpLCB0LnJlYWRCb29sZWFuKCksIHQucmVhZEJpdHMoNSkpLCB0LnJlYWRCaXRzKDQpLCB0LnJlYWRCaXRzKDQpLCBqZSAmJiB0LnJlYWRCaXRzKDQpLCB0LnJlYWRCaXRzKDUpLCB0LnJlYWRCaXRzKDUpLCB0LnJlYWRCaXRzKDUpKTtcbiAgICAgICAgZm9yIChsZXQgQiA9IDA7IEIgPD0gcjsgQisrKSB7XG4gICAgICAgICAgUCA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICAgICAgICBjb25zdCBTID0gUCB8fCB0LnJlYWRCb29sZWFuKCk7XG4gICAgICAgICAgbGV0IFQgPSAhMTtcbiAgICAgICAgICBTID8gdC5yZWFkRUcoKSA6IFQgPSB0LnJlYWRCb29sZWFuKCk7XG4gICAgICAgICAgY29uc3QgRyA9IFQgPyAxIDogdC5yZWFkVUVHKCkgKyAxO1xuICAgICAgICAgIGlmIChRZSlcbiAgICAgICAgICAgIGZvciAobGV0IFogPSAwOyBaIDwgRzsgWisrKVxuICAgICAgICAgICAgICB0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCksIGplICYmICh0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCkpLCB0LnNraXBCaXRzKDEpO1xuICAgICAgICAgIGlmIChpdClcbiAgICAgICAgICAgIGZvciAobGV0IFogPSAwOyBaIDwgRzsgWisrKVxuICAgICAgICAgICAgICB0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCksIGplICYmICh0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCkpLCB0LnNraXBCaXRzKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0LnJlYWRCb29sZWFuKCkgJiYgKHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpLCB0LnJlYWRCb29sZWFuKCksIEwgPSB0LnJlYWRVRUcoKSk7XG4gICAgfVxuICAgIGxldCBsZSA9IE0sIFRlID0gSDtcbiAgICBpZiAoSykge1xuICAgICAgbGV0IHllID0gMSwgYmUgPSAxO1xuICAgICAgRiA9PT0gMSA/IHllID0gYmUgPSAyIDogRiA9PSAyICYmICh5ZSA9IDIpLCBsZSA9IE0gLSB5ZSAqIEMgLSB5ZSAqIGosIFRlID0gSCAtIGJlICogJCAtIGJlICogaztcbiAgICB9XG4gICAgY29uc3QgRGUgPSBuID8gW1wiQVwiLCBcIkJcIiwgXCJDXCJdW25dIDogXCJcIiwgemUgPSBhIDw8IDI0IHwgbCA8PCAxNiB8IGMgPDwgOCB8IHU7XG4gICAgbGV0IF9lID0gMDtcbiAgICBmb3IgKGxldCB5ZSA9IDA7IHllIDwgMzI7IHllKyspXG4gICAgICBfZSA9IChfZSB8ICh6ZSA+PiB5ZSAmIDEpIDw8IDMxIC0geWUpID4+PiAwO1xuICAgIGxldCB4ZSA9IF9lLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gbyA9PT0gMSAmJiB4ZSA9PT0gXCIyXCIgJiYgKHhlID0gXCI2XCIpLCB7XG4gICAgICBjb2RlY1N0cmluZzogYGh2YzEuJHtEZX0ke299LiR7eGV9LiR7aSA/IFwiSFwiIDogXCJMXCJ9JHtifS5CMGAsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZ2VuZXJhbF90aWVyX2ZsYWc6IGksXG4gICAgICAgIGdlbmVyYWxfcHJvZmlsZV9pZGM6IG8sXG4gICAgICAgIGdlbmVyYWxfcHJvZmlsZV9zcGFjZTogbixcbiAgICAgICAgZ2VuZXJhbF9wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ3M6IFthLCBsLCBjLCB1XSxcbiAgICAgICAgZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnczogW2QsIGgsIGYsIHAsIHksIEVdLFxuICAgICAgICBnZW5lcmFsX2xldmVsX2lkYzogYixcbiAgICAgICAgYml0X2RlcHRoOiBXICsgOCxcbiAgICAgICAgYml0X2RlcHRoX2x1bWFfbWludXM4OiBXLFxuICAgICAgICBiaXRfZGVwdGhfY2hyb21hX21pbnVzODogXyxcbiAgICAgICAgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzogTCxcbiAgICAgICAgY2hyb21hX2Zvcm1hdF9pZGM6IEYsXG4gICAgICAgIGZyYW1lX3JhdGU6IHtcbiAgICAgICAgICBmaXhlZDogUCxcbiAgICAgICAgICBmcHM6IFkgLyBOXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3aWR0aDogbGUsXG4gICAgICBoZWlnaHQ6IFRlLFxuICAgICAgcGl4ZWxSYXRpbzogW20sIHZdXG4gICAgfTtcbiAgfVxuICByZWFkUFBTKGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IFpuKHRoaXMuZWJzcDJyYnNwKGUpKTtcbiAgICB0LnJlYWRVQnl0ZSgpLCB0LnJlYWRVQnl0ZSgpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQuc2tpcEJpdHMoMiksIHQuc2tpcEJpdHMoMyksIHQuc2tpcEJpdHMoMiksIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwRUcoKSwgdC5za2lwQml0cygyKSwgdC5yZWFkQm9vbGVhbigpICYmIHQuc2tpcFVFRygpLCB0LnNraXBFRygpLCB0LnNraXBFRygpLCB0LnNraXBCaXRzKDQpO1xuICAgIGNvbnN0IG4gPSB0LnJlYWRCb29sZWFuKCksIGkgPSB0LnJlYWRCb29sZWFuKCk7XG4gICAgbGV0IG8gPSAxO1xuICAgIHJldHVybiBpICYmIG4gPyBvID0gMCA6IGkgPyBvID0gMyA6IG4gJiYgKG8gPSAyKSwge1xuICAgICAgcGFyYWxsZWxpc21UeXBlOiBvXG4gICAgfTtcbiAgfVxuICBtYXRjaFNQUyhlLCB0KSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZSkuc3Vic3RyKDMpID09PSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHQpLnN1YnN0cigzKTtcbiAgfVxufVxuY29uc3QgV3QgPSAxODg7XG5jbGFzcyBJcyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICB0aGlzLmxvZ2dlciA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMudHlwZVN1cHBvcnRlZCA9IHZvaWQgMCwgdGhpcy5zYW1wbGVBZXMgPSBudWxsLCB0aGlzLnBtdFBhcnNlZCA9ICExLCB0aGlzLmF1ZGlvQ29kZWMgPSB2b2lkIDAsIHRoaXMudmlkZW9Db2RlYyA9IHZvaWQgMCwgdGhpcy5fcG10SWQgPSAtMSwgdGhpcy5fdmlkZW9UcmFjayA9IHZvaWQgMCwgdGhpcy5fYXVkaW9UcmFjayA9IHZvaWQgMCwgdGhpcy5faWQzVHJhY2sgPSB2b2lkIDAsIHRoaXMuX3R4dFRyYWNrID0gdm9pZCAwLCB0aGlzLmFhY092ZXJGbG93ID0gbnVsbCwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy52aWRlb1BhcnNlciA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IGUsIHRoaXMuY29uZmlnID0gdCwgdGhpcy50eXBlU3VwcG9ydGVkID0gciwgdGhpcy5sb2dnZXIgPSBuLCB0aGlzLnZpZGVvUGFyc2VyID0gbnVsbDtcbiAgfVxuICBzdGF0aWMgcHJvYmUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBJcy5zeW5jT2Zmc2V0KGUpO1xuICAgIHJldHVybiByID4gMCAmJiB0Lndhcm4oYE1QRUcyLVRTIGRldGVjdGVkIGJ1dCBmaXJzdCBzeW5jIHdvcmQgZm91bmQgQCBvZmZzZXQgJHtyfWApLCByICE9PSAtMTtcbiAgfVxuICBzdGF0aWMgc3luY09mZnNldChlKSB7XG4gICAgY29uc3QgdCA9IGUubGVuZ3RoO1xuICAgIGxldCByID0gTWF0aC5taW4oV3QgKiA1LCB0IC0gV3QpICsgMSwgbiA9IDA7XG4gICAgZm9yICg7IG4gPCByOyApIHtcbiAgICAgIGxldCBpID0gITEsIG8gPSAtMSwgYSA9IDA7XG4gICAgICBmb3IgKGxldCBsID0gbjsgbCA8IHQ7IGwgKz0gV3QpXG4gICAgICAgIGlmIChlW2xdID09PSA3MSAmJiAodCAtIGwgPT09IFd0IHx8IGVbbCArIFd0XSA9PT0gNzEpKSB7XG4gICAgICAgICAgaWYgKGErKywgbyA9PT0gLTEgJiYgKG8gPSBsLCBvICE9PSAwICYmIChyID0gTWF0aC5taW4obyArIFd0ICogOTksIGUubGVuZ3RoIC0gV3QpICsgMSkpLCBpIHx8IChpID0gcGMoZSwgbCkgPT09IDApLCBpICYmIGEgPiAxICYmIChvID09PSAwICYmIGEgPiAyIHx8IGwgKyBXdCA+IHIpKVxuICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGEpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIG4rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHJhY2sgbW9kZWwgaW50ZXJuYWwgdG8gZGVtdXhlciB1c2VkIHRvIGRyaXZlIHJlbXV4aW5nIGlucHV0XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlVHJhY2soZSwgdCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250YWluZXI6IGUgPT09IFwidmlkZW9cIiB8fCBlID09PSBcImF1ZGlvXCIgPyBcInZpZGVvL21wMnRcIiA6IHZvaWQgMCxcbiAgICAgIHR5cGU6IGUsXG4gICAgICBpZDogTGdbZV0sXG4gICAgICBwaWQ6IC0xLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLFxuICAgICAgc2FtcGxlczogW10sXG4gICAgICBkcm9wcGVkOiAwLFxuICAgICAgZHVyYXRpb246IGUgPT09IFwiYXVkaW9cIiA/IHQgOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbml0IHNlZ21lbnQgb24gdGhlIGRlbXV4ZXIvcmVtdXhlciBpbnRlcmZhY2UuIE5lZWRlZCBmb3IgZGlzY29udGludWl0aWVzL3RyYWNrLXN3aXRjaGVzIChvciBhdCBzdHJlYW0gc3RhcnQpXG4gICAqIFJlc2V0cyBhbGwgaW50ZXJuYWwgdHJhY2sgaW5zdGFuY2VzIG9mIHRoZSBkZW11eGVyLlxuICAgKi9cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5wbXRQYXJzZWQgPSAhMSwgdGhpcy5fcG10SWQgPSAtMSwgdGhpcy5fdmlkZW9UcmFjayA9IElzLmNyZWF0ZVRyYWNrKFwidmlkZW9cIiksIHRoaXMuX3ZpZGVvVHJhY2suZHVyYXRpb24gPSBuLCB0aGlzLl9hdWRpb1RyYWNrID0gSXMuY3JlYXRlVHJhY2soXCJhdWRpb1wiLCBuKSwgdGhpcy5faWQzVHJhY2sgPSBJcy5jcmVhdGVUcmFjayhcImlkM1wiKSwgdGhpcy5fdHh0VHJhY2sgPSBJcy5jcmVhdGVUcmFjayhcInRleHRcIiksIHRoaXMuX2F1ZGlvVHJhY2suc2VnbWVudENvZGVjID0gXCJhYWNcIiwgdGhpcy52aWRlb1BhcnNlciA9IG51bGwsIHRoaXMuYWFjT3ZlckZsb3cgPSBudWxsLCB0aGlzLnJlbWFpbmRlckRhdGEgPSBudWxsLCB0aGlzLmF1ZGlvQ29kZWMgPSB0LCB0aGlzLnZpZGVvQ29kZWMgPSByO1xuICB9XG4gIHJlc2V0VGltZVN0YW1wKCkge1xuICB9XG4gIHJlc2V0Q29udGlndWl0eSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBfYXVkaW9UcmFjazogZSxcbiAgICAgIF92aWRlb1RyYWNrOiB0LFxuICAgICAgX2lkM1RyYWNrOiByXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5wZXNEYXRhID0gbnVsbCksIHQgJiYgKHQucGVzRGF0YSA9IG51bGwpLCByICYmIChyLnBlc0RhdGEgPSBudWxsKSwgdGhpcy5hYWNPdmVyRmxvdyA9IG51bGwsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGw7XG4gIH1cbiAgZGVtdXgoZSwgdCwgciA9ICExLCBuID0gITEpIHtcbiAgICByIHx8ICh0aGlzLnNhbXBsZUFlcyA9IG51bGwpO1xuICAgIGxldCBpO1xuICAgIGNvbnN0IG8gPSB0aGlzLl92aWRlb1RyYWNrLCBhID0gdGhpcy5fYXVkaW9UcmFjaywgbCA9IHRoaXMuX2lkM1RyYWNrLCBjID0gdGhpcy5fdHh0VHJhY2s7XG4gICAgbGV0IHUgPSBvLnBpZCwgZCA9IG8ucGVzRGF0YSwgaCA9IGEucGlkLCBmID0gbC5waWQsIHAgPSBhLnBlc0RhdGEsIHkgPSBsLnBlc0RhdGEsIEUgPSBudWxsLCBiID0gdGhpcy5wbXRQYXJzZWQsIFIgPSB0aGlzLl9wbXRJZCwgQSA9IGUubGVuZ3RoO1xuICAgIGlmICh0aGlzLnJlbWFpbmRlckRhdGEgJiYgKGUgPSBfcih0aGlzLnJlbWFpbmRlckRhdGEsIGUpLCBBID0gZS5sZW5ndGgsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGwpLCBBIDwgV3QgJiYgIW4pXG4gICAgICByZXR1cm4gdGhpcy5yZW1haW5kZXJEYXRhID0gZSwge1xuICAgICAgICBhdWRpb1RyYWNrOiBhLFxuICAgICAgICB2aWRlb1RyYWNrOiBvLFxuICAgICAgICBpZDNUcmFjazogbCxcbiAgICAgICAgdGV4dFRyYWNrOiBjXG4gICAgICB9O1xuICAgIGNvbnN0IEYgPSBNYXRoLm1heCgwLCBJcy5zeW5jT2Zmc2V0KGUpKTtcbiAgICBBIC09IChBIC0gRikgJSBXdCwgQSA8IGUuYnl0ZUxlbmd0aCAmJiAhbiAmJiAodGhpcy5yZW1haW5kZXJEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsIEEsIGUuYnVmZmVyLmJ5dGVMZW5ndGggLSBBKSk7XG4gICAgbGV0IE0gPSAwO1xuICAgIGZvciAobGV0IEsgPSBGOyBLIDwgQTsgSyArPSBXdClcbiAgICAgIGlmIChlW0tdID09PSA3MSkge1xuICAgICAgICBjb25zdCBqID0gISEoZVtLICsgMV0gJiA2NCksIEMgPSBwYyhlLCBLKSwgayA9IChlW0sgKyAzXSAmIDQ4KSA+PiA0O1xuICAgICAgICBsZXQgJDtcbiAgICAgICAgaWYgKGsgPiAxKSB7XG4gICAgICAgICAgaWYgKCQgPSBLICsgNSArIGVbSyArIDRdLCAkID09PSBLICsgV3QpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgJCA9IEsgKyA0O1xuICAgICAgICBzd2l0Y2ggKEMpIHtcbiAgICAgICAgICBjYXNlIHU6XG4gICAgICAgICAgICBqICYmIChkICYmIChpID0gZ24oZCwgdGhpcy5sb2dnZXIpKSAmJiAodGhpcy5yZWFkeVZpZGVvUGFyc2VyKG8uc2VnbWVudENvZGVjKSwgdGhpcy52aWRlb1BhcnNlciAhPT0gbnVsbCAmJiB0aGlzLnZpZGVvUGFyc2VyLnBhcnNlUEVTKG8sIGMsIGksICExKSksIGQgPSB7XG4gICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICBzaXplOiAwXG4gICAgICAgICAgICB9KSwgZCAmJiAoZC5kYXRhLnB1c2goZS5zdWJhcnJheSgkLCBLICsgV3QpKSwgZC5zaXplICs9IEsgKyBXdCAtICQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBoOlxuICAgICAgICAgICAgaWYgKGopIHtcbiAgICAgICAgICAgICAgaWYgKHAgJiYgKGkgPSBnbihwLCB0aGlzLmxvZ2dlcikpKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYS5zZWdtZW50Q29kZWMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJhYWNcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUFBQ1BFUyhhLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VNUEVHUEVTKGEsIGkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJhYzNcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUFDM1BFUyhhLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICAgIHNpemU6IDBcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAgJiYgKHAuZGF0YS5wdXNoKGUuc3ViYXJyYXkoJCwgSyArIFd0KSksIHAuc2l6ZSArPSBLICsgV3QgLSAkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZjpcbiAgICAgICAgICAgIGogJiYgKHkgJiYgKGkgPSBnbih5LCB0aGlzLmxvZ2dlcikpICYmIHRoaXMucGFyc2VJRDNQRVMobCwgaSksIHkgPSB7XG4gICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICBzaXplOiAwXG4gICAgICAgICAgICB9KSwgeSAmJiAoeS5kYXRhLnB1c2goZS5zdWJhcnJheSgkLCBLICsgV3QpKSwgeS5zaXplICs9IEsgKyBXdCAtICQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaiAmJiAoJCArPSBlWyRdICsgMSksIFIgPSB0aGlzLl9wbXRJZCA9IGpUKGUsICQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSOiB7XG4gICAgICAgICAgICBqICYmICgkICs9IGVbJF0gKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IFcgPSBLVChlLCAkLCB0aGlzLnR5cGVTdXBwb3J0ZWQsIHIsIHRoaXMub2JzZXJ2ZXIsIHRoaXMubG9nZ2VyKTtcbiAgICAgICAgICAgIHUgPSBXLnZpZGVvUGlkLCB1ID4gMCAmJiAoby5waWQgPSB1LCBvLnNlZ21lbnRDb2RlYyA9IFcuc2VnbWVudFZpZGVvQ29kZWMpLCBoID0gVy5hdWRpb1BpZCwgaCA+IDAgJiYgKGEucGlkID0gaCwgYS5zZWdtZW50Q29kZWMgPSBXLnNlZ21lbnRBdWRpb0NvZGVjKSwgZiA9IFcuaWQzUGlkLCBmID4gMCAmJiAobC5waWQgPSBmKSwgRSAhPT0gbnVsbCAmJiAhYiAmJiAodGhpcy5sb2dnZXIud2FybihgTVBFRy1UUyBQTVQgZm91bmQgYXQgJHtLfSBhZnRlciB1bmtub3duIFBJRCAnJHtFfScuIEJhY2t0cmFja2luZyB0byBzeW5jIGJ5dGUgQCR7Rn0gdG8gcGFyc2UgYWxsIFRTIHBhY2tldHMuYCksIEUgPSBudWxsLCBLID0gRiAtIDE4OCksIGIgPSB0aGlzLnBtdFBhcnNlZCA9ICEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgY2FzZSA4MTkxOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIEUgPSBDO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICBNKys7XG4gICAgTSA+IDAgJiYgbWModGhpcy5vYnNlcnZlciwgbmV3IEVycm9yKGBGb3VuZCAke019IFRTIHBhY2tldC9zIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggMHg0N2ApLCB2b2lkIDAsIHRoaXMubG9nZ2VyKSwgby5wZXNEYXRhID0gZCwgYS5wZXNEYXRhID0gcCwgbC5wZXNEYXRhID0geTtcbiAgICBjb25zdCBIID0ge1xuICAgICAgYXVkaW9UcmFjazogYSxcbiAgICAgIHZpZGVvVHJhY2s6IG8sXG4gICAgICBpZDNUcmFjazogbCxcbiAgICAgIHRleHRUcmFjazogY1xuICAgIH07XG4gICAgcmV0dXJuIG4gJiYgdGhpcy5leHRyYWN0UmVtYWluaW5nU2FtcGxlcyhIKSwgSDtcbiAgfVxuICBmbHVzaCgpIHtcbiAgICBjb25zdCB7XG4gICAgICByZW1haW5kZXJEYXRhOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbDtcbiAgICBsZXQgdDtcbiAgICByZXR1cm4gZSA/IHQgPSB0aGlzLmRlbXV4KGUsIC0xLCAhMSwgITApIDogdCA9IHtcbiAgICAgIHZpZGVvVHJhY2s6IHRoaXMuX3ZpZGVvVHJhY2ssXG4gICAgICBhdWRpb1RyYWNrOiB0aGlzLl9hdWRpb1RyYWNrLFxuICAgICAgaWQzVHJhY2s6IHRoaXMuX2lkM1RyYWNrLFxuICAgICAgdGV4dFRyYWNrOiB0aGlzLl90eHRUcmFja1xuICAgIH0sIHRoaXMuZXh0cmFjdFJlbWFpbmluZ1NhbXBsZXModCksIHRoaXMuc2FtcGxlQWVzID8gdGhpcy5kZWNyeXB0KHQsIHRoaXMuc2FtcGxlQWVzKSA6IHQ7XG4gIH1cbiAgZXh0cmFjdFJlbWFpbmluZ1NhbXBsZXMoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF1ZGlvVHJhY2s6IHQsXG4gICAgICB2aWRlb1RyYWNrOiByLFxuICAgICAgaWQzVHJhY2s6IG4sXG4gICAgICB0ZXh0VHJhY2s6IGlcbiAgICB9ID0gZSwgbyA9IHIucGVzRGF0YSwgYSA9IHQucGVzRGF0YSwgbCA9IG4ucGVzRGF0YTtcbiAgICBsZXQgYztcbiAgICBpZiAobyAmJiAoYyA9IGduKG8sIHRoaXMubG9nZ2VyKSkgPyAodGhpcy5yZWFkeVZpZGVvUGFyc2VyKHIuc2VnbWVudENvZGVjKSwgdGhpcy52aWRlb1BhcnNlciAhPT0gbnVsbCAmJiAodGhpcy52aWRlb1BhcnNlci5wYXJzZVBFUyhyLCBpLCBjLCAhMCksIHIucGVzRGF0YSA9IG51bGwpKSA6IHIucGVzRGF0YSA9IG8sIGEgJiYgKGMgPSBnbihhLCB0aGlzLmxvZ2dlcikpKSB7XG4gICAgICBzd2l0Y2ggKHQuc2VnbWVudENvZGVjKSB7XG4gICAgICAgIGNhc2UgXCJhYWNcIjpcbiAgICAgICAgICB0aGlzLnBhcnNlQUFDUEVTKHQsIGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgICAgdGhpcy5wYXJzZU1QRUdQRVModCwgYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJhYzNcIjpcbiAgICAgICAgICB0aGlzLnBhcnNlQUMzUEVTKHQsIGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdC5wZXNEYXRhID0gbnVsbDtcbiAgICB9IGVsc2VcbiAgICAgIGEgIT0gbnVsbCAmJiBhLnNpemUgJiYgdGhpcy5sb2dnZXIubG9nKFwibGFzdCBBQUMgUEVTIHBhY2tldCB0cnVuY2F0ZWQsbWlnaHQgb3ZlcmxhcCBiZXR3ZWVuIGZyYWdtZW50c1wiKSwgdC5wZXNEYXRhID0gYTtcbiAgICBsICYmIChjID0gZ24obCwgdGhpcy5sb2dnZXIpKSA/ICh0aGlzLnBhcnNlSUQzUEVTKG4sIGMpLCBuLnBlc0RhdGEgPSBudWxsKSA6IG4ucGVzRGF0YSA9IGw7XG4gIH1cbiAgZGVtdXhTYW1wbGVBZXMoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSB0aGlzLmRlbXV4KGUsIHIsICEwLCAhdGhpcy5jb25maWcucHJvZ3Jlc3NpdmUpLCBpID0gdGhpcy5zYW1wbGVBZXMgPSBuZXcgJFQodGhpcy5vYnNlcnZlciwgdGhpcy5jb25maWcsIHQpO1xuICAgIHJldHVybiB0aGlzLmRlY3J5cHQobiwgaSk7XG4gIH1cbiAgcmVhZHlWaWRlb1BhcnNlcihlKSB7XG4gICAgdGhpcy52aWRlb1BhcnNlciA9PT0gbnVsbCAmJiAoZSA9PT0gXCJhdmNcIiA/IHRoaXMudmlkZW9QYXJzZXIgPSBuZXcgR1QoKSA6IGUgPT09IFwiaGV2Y1wiICYmICh0aGlzLnZpZGVvUGFyc2VyID0gbmV3IFZUKCkpKTtcbiAgfVxuICBkZWNyeXB0KGUsIHQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXVkaW9UcmFjazogbixcbiAgICAgICAgdmlkZW9UcmFjazogaVxuICAgICAgfSA9IGU7XG4gICAgICBuLnNhbXBsZXMgJiYgbi5zZWdtZW50Q29kZWMgPT09IFwiYWFjXCIgPyB0LmRlY3J5cHRBYWNTYW1wbGVzKG4uc2FtcGxlcywgMCwgKCkgPT4ge1xuICAgICAgICBpLnNhbXBsZXMgPyB0LmRlY3J5cHRBdmNTYW1wbGVzKGkuc2FtcGxlcywgMCwgMCwgKCkgPT4ge1xuICAgICAgICAgIHIoZSk7XG4gICAgICAgIH0pIDogcihlKTtcbiAgICAgIH0pIDogaS5zYW1wbGVzICYmIHQuZGVjcnlwdEF2Y1NhbXBsZXMoaS5zYW1wbGVzLCAwLCAwLCAoKSA9PiB7XG4gICAgICAgIHIoZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMub2JzZXJ2ZXIgJiYgdGhpcy5vYnNlcnZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgdGhpcy5jb25maWcgPSB0aGlzLmxvZ2dlciA9IHRoaXMub2JzZXJ2ZXIgPSBudWxsLCB0aGlzLmFhY092ZXJGbG93ID0gdGhpcy52aWRlb1BhcnNlciA9IHRoaXMucmVtYWluZGVyRGF0YSA9IHRoaXMuc2FtcGxlQWVzID0gbnVsbCwgdGhpcy5fdmlkZW9UcmFjayA9IHRoaXMuX2F1ZGlvVHJhY2sgPSB0aGlzLl9pZDNUcmFjayA9IHRoaXMuX3R4dFRyYWNrID0gdm9pZCAwO1xuICB9XG4gIHBhcnNlQUFDUEVTKGUsIHQpIHtcbiAgICBsZXQgciA9IDA7XG4gICAgY29uc3QgbiA9IHRoaXMuYWFjT3ZlckZsb3c7XG4gICAgbGV0IGkgPSB0LmRhdGE7XG4gICAgaWYgKG4pIHtcbiAgICAgIHRoaXMuYWFjT3ZlckZsb3cgPSBudWxsO1xuICAgICAgY29uc3QgZCA9IG4ubWlzc2luZywgaCA9IG4uc2FtcGxlLnVuaXQuYnl0ZUxlbmd0aDtcbiAgICAgIGlmIChkID09PSAtMSlcbiAgICAgICAgaSA9IF9yKG4uc2FtcGxlLnVuaXQsIGkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGYgPSBoIC0gZDtcbiAgICAgICAgbi5zYW1wbGUudW5pdC5zZXQoaS5zdWJhcnJheSgwLCBkKSwgZiksIGUuc2FtcGxlcy5wdXNoKG4uc2FtcGxlKSwgciA9IG4ubWlzc2luZztcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG8sIGE7XG4gICAgZm9yIChvID0gciwgYSA9IGkubGVuZ3RoOyBvIDwgYSAtIDEgJiYgIW5hKGksIG8pOyBvKyspXG4gICAgICA7XG4gICAgaWYgKG8gIT09IHIpIHtcbiAgICAgIGxldCBkO1xuICAgICAgY29uc3QgaCA9IG8gPCBhIC0gMTtcbiAgICAgIGlmIChoID8gZCA9IGBBQUMgUEVTIGRpZCBub3Qgc3RhcnQgd2l0aCBBRFRTIGhlYWRlcixvZmZzZXQ6JHtvfWAgOiBkID0gXCJObyBBRFRTIGhlYWRlciBmb3VuZCBpbiBBQUMgUEVTXCIsIG1jKHRoaXMub2JzZXJ2ZXIsIG5ldyBFcnJvcihkKSwgaCwgdGhpcy5sb2dnZXIpLCAhaClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjcChlLCB0aGlzLm9ic2VydmVyLCBpLCBvLCB0aGlzLmF1ZGlvQ29kZWMpO1xuICAgIGxldCBsO1xuICAgIGlmICh0LnB0cyAhPT0gdm9pZCAwKVxuICAgICAgbCA9IHQucHRzO1xuICAgIGVsc2UgaWYgKG4pIHtcbiAgICAgIGNvbnN0IGQgPSB1cChlLnNhbXBsZXJhdGUpO1xuICAgICAgbCA9IG4uc2FtcGxlLnB0cyArIGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJbdHNkZW11eGVyXTogQUFDIFBFUyB1bmtub3duIFBUU1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGMgPSAwLCB1O1xuICAgIGZvciAoOyBvIDwgYTsgKVxuICAgICAgaWYgKHUgPSBkcChlLCBpLCBvLCBsLCBjKSwgbyArPSB1Lmxlbmd0aCwgdS5taXNzaW5nKSB7XG4gICAgICAgIHRoaXMuYWFjT3ZlckZsb3cgPSB1O1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZVxuICAgICAgICBmb3IgKGMrKzsgbyA8IGEgLSAxICYmICFuYShpLCBvKTsgbysrKVxuICAgICAgICAgIDtcbiAgfVxuICBwYXJzZU1QRUdQRVMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0LmRhdGEsIG4gPSByLmxlbmd0aDtcbiAgICBsZXQgaSA9IDAsIG8gPSAwO1xuICAgIGNvbnN0IGEgPSB0LnB0cztcbiAgICBpZiAoYSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiW3RzZGVtdXhlcl06IE1QRUcgUEVTIHVua25vd24gUFRTXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKDsgbyA8IG47IClcbiAgICAgIGlmIChtcChyLCBvKSkge1xuICAgICAgICBjb25zdCBsID0gZ3AoZSwgciwgbywgYSwgaSk7XG4gICAgICAgIGlmIChsKVxuICAgICAgICAgIG8gKz0gbC5sZW5ndGgsIGkrKztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlXG4gICAgICAgIG8rKztcbiAgfVxuICBwYXJzZUFDM1BFUyhlLCB0KSB7XG4gICAge1xuICAgICAgY29uc3QgciA9IHQuZGF0YSwgbiA9IHQucHRzO1xuICAgICAgaWYgKG4gPT09IHZvaWQgMCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiW3RzZGVtdXhlcl06IEFDMyBQRVMgdW5rbm93biBQVFNcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSByLmxlbmd0aDtcbiAgICAgIGxldCBvID0gMCwgYSA9IDAsIGw7XG4gICAgICBmb3IgKDsgYSA8IGkgJiYgKGwgPSBFcChlLCByLCBhLCBuLCBvKyspKSA+IDA7IClcbiAgICAgICAgYSArPSBsO1xuICAgIH1cbiAgfVxuICBwYXJzZUlEM1BFUyhlLCB0KSB7XG4gICAgaWYgKHQucHRzID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJbdHNkZW11eGVyXTogSUQzIFBFUyB1bmtub3duIFBUU1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgciA9IG50KHt9LCB0LCB7XG4gICAgICB0eXBlOiB0aGlzLl92aWRlb1RyYWNrID8gYnIuZW1zZyA6IGJyLmF1ZGlvSWQzLFxuICAgICAgZHVyYXRpb246IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgIH0pO1xuICAgIGUuc2FtcGxlcy5wdXNoKHIpO1xuICB9XG59XG5mdW5jdGlvbiBwYyhzLCBlKSB7XG4gIHJldHVybiAoKHNbZSArIDFdICYgMzEpIDw8IDgpICsgc1tlICsgMl07XG59XG5mdW5jdGlvbiBqVChzLCBlKSB7XG4gIHJldHVybiAoc1tlICsgMTBdICYgMzEpIDw8IDggfCBzW2UgKyAxMV07XG59XG5mdW5jdGlvbiBLVChzLCBlLCB0LCByLCBuLCBpKSB7XG4gIGNvbnN0IG8gPSB7XG4gICAgYXVkaW9QaWQ6IC0xLFxuICAgIHZpZGVvUGlkOiAtMSxcbiAgICBpZDNQaWQ6IC0xLFxuICAgIHNlZ21lbnRWaWRlb0NvZGVjOiBcImF2Y1wiLFxuICAgIHNlZ21lbnRBdWRpb0NvZGVjOiBcImFhY1wiXG4gIH0sIGEgPSAoc1tlICsgMV0gJiAxNSkgPDwgOCB8IHNbZSArIDJdLCBsID0gZSArIDMgKyBhIC0gNCwgYyA9IChzW2UgKyAxMF0gJiAxNSkgPDwgOCB8IHNbZSArIDExXTtcbiAgZm9yIChlICs9IDEyICsgYzsgZSA8IGw7ICkge1xuICAgIGNvbnN0IHUgPSBwYyhzLCBlKSwgZCA9IChzW2UgKyAzXSAmIDE1KSA8PCA4IHwgc1tlICsgNF07XG4gICAgc3dpdGNoIChzW2VdKSB7XG4gICAgICBjYXNlIDIwNzpcbiAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgdmwoXCJBRFRTIEFBQ1wiLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAxNTpcbiAgICAgICAgby5hdWRpb1BpZCA9PT0gLTEgJiYgKG8uYXVkaW9QaWQgPSB1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBQYWNrZXRpemVkIG1ldGFkYXRhIChJRDMpXG4gICAgICBjYXNlIDIxOlxuICAgICAgICBvLmlkM1BpZCA9PT0gLTEgJiYgKG8uaWQzUGlkID0gdSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMTk6XG4gICAgICAgIGlmICghcikge1xuICAgICAgICAgIHZsKFwiSC4yNjRcIiwgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgMjc6XG4gICAgICAgIG8udmlkZW9QaWQgPT09IC0xICYmIChvLnZpZGVvUGlkID0gdSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gSVNPL0lFQyAxMTE3Mi0zIChNUEVHLTEgYXVkaW8pXG4gICAgICAvLyBvciBJU08vSUVDIDEzODE4LTMgKE1QRUctMiBoYWx2ZWQgc2FtcGxlIHJhdGUgYXVkaW8pXG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICAgICF0Lm1wZWcgJiYgIXQubXAzID8gaS5sb2coXCJNUEVHIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKSA6IG8uYXVkaW9QaWQgPT09IC0xICYmIChvLmF1ZGlvUGlkID0gdSwgby5zZWdtZW50QXVkaW9Db2RlYyA9IFwibXAzXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTkzOlxuICAgICAgICBpZiAoIXIpIHtcbiAgICAgICAgICB2bChcIkFDLTNcIiwgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgMTI5OlxuICAgICAgICB0LmFjMyA/IG8uYXVkaW9QaWQgPT09IC0xICYmIChvLmF1ZGlvUGlkID0gdSwgby5zZWdtZW50QXVkaW9Db2RlYyA9IFwiYWMzXCIpIDogaS5sb2coXCJBQy0zIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGlmIChvLmF1ZGlvUGlkID09PSAtMSAmJiBkID4gMCkge1xuICAgICAgICAgIGxldCBoID0gZSArIDUsIGYgPSBkO1xuICAgICAgICAgIGZvciAoOyBmID4gMjsgKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHNbaF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAxMDY6XG4gICAgICAgICAgICAgICAgdC5hYzMgIT09ICEwID8gaS5sb2coXCJBQy0zIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciBmb3Igbm93XCIpIDogKG8uYXVkaW9QaWQgPSB1LCBvLnNlZ21lbnRBdWRpb0NvZGVjID0gXCJhYzNcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB5ID0gc1toICsgMV0gKyAyO1xuICAgICAgICAgICAgaCArPSB5LCBmIC09IHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOTQ6XG4gICAgICAvLyBTQU1QTEUtQUVTIEVDM1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAxMzU6XG4gICAgICAgIHJldHVybiBtYyhuLCBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBFQy0zIGluIE0yVFMgZm91bmRcIiksIHZvaWQgMCwgaSksIG87XG4gICAgICBjYXNlIDM2OlxuICAgICAgICBvLnZpZGVvUGlkID09PSAtMSAmJiAoby52aWRlb1BpZCA9IHUsIG8uc2VnbWVudFZpZGVvQ29kZWMgPSBcImhldmNcIiwgaS5sb2coXCJIRVZDIGluIE0yVFMgZm91bmRcIikpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZSArPSBkICsgNTtcbiAgfVxuICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIG1jKHMsIGUsIHQsIHIpIHtcbiAgci53YXJuKGBwYXJzaW5nIGVycm9yOiAke2UubWVzc2FnZX1gKSwgcy5lbWl0KEkuRVJST1IsIEkuRVJST1IsIHtcbiAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICBmYXRhbDogITEsXG4gICAgbGV2ZWxSZXRyeTogdCxcbiAgICBlcnJvcjogZSxcbiAgICByZWFzb246IGUubWVzc2FnZVxuICB9KTtcbn1cbmZ1bmN0aW9uIHZsKHMsIGUpIHtcbiAgZS5sb2coYCR7c30gd2l0aCBBRVMtMTI4LUNCQyBlbmNyeXB0aW9uIGZvdW5kIGluIHVuZW5jcnlwdGVkIHN0cmVhbWApO1xufVxuZnVuY3Rpb24gZ24ocywgZSkge1xuICBsZXQgdCA9IDAsIHIsIG4sIGksIG8sIGE7XG4gIGNvbnN0IGwgPSBzLmRhdGE7XG4gIGlmICghcyB8fCBzLnNpemUgPT09IDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGZvciAoOyBsWzBdLmxlbmd0aCA8IDE5ICYmIGwubGVuZ3RoID4gMTsgKVxuICAgIGxbMF0gPSBfcihsWzBdLCBsWzFdKSwgbC5zcGxpY2UoMSwgMSk7XG4gIGlmIChyID0gbFswXSwgKHJbMF0gPDwgMTYpICsgKHJbMV0gPDwgOCkgKyByWzJdID09PSAxKSB7XG4gICAgaWYgKG4gPSAocls0XSA8PCA4KSArIHJbNV0sIG4gJiYgbiA+IHMuc2l6ZSAtIDYpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB1ID0gcls3XTtcbiAgICB1ICYgMTkyICYmIChvID0gKHJbOV0gJiAxNCkgKiA1MzY4NzA5MTIgKyAvLyAxIDw8IDI5XG4gICAgKHJbMTBdICYgMjU1KSAqIDQxOTQzMDQgKyAvLyAxIDw8IDIyXG4gICAgKHJbMTFdICYgMjU0KSAqIDE2Mzg0ICsgLy8gMSA8PCAxNFxuICAgIChyWzEyXSAmIDI1NSkgKiAxMjggKyAvLyAxIDw8IDdcbiAgICAoclsxM10gJiAyNTQpIC8gMiwgdSAmIDY0ID8gKGEgPSAoclsxNF0gJiAxNCkgKiA1MzY4NzA5MTIgKyAvLyAxIDw8IDI5XG4gICAgKHJbMTVdICYgMjU1KSAqIDQxOTQzMDQgKyAvLyAxIDw8IDIyXG4gICAgKHJbMTZdICYgMjU0KSAqIDE2Mzg0ICsgLy8gMSA8PCAxNFxuICAgIChyWzE3XSAmIDI1NSkgKiAxMjggKyAvLyAxIDw8IDdcbiAgICAoclsxOF0gJiAyNTQpIC8gMiwgbyAtIGEgPiA2MCAqIDllNCAmJiAoZS53YXJuKGAke01hdGgucm91bmQoKG8gLSBhKSAvIDllNCl9cyBkZWx0YSBiZXR3ZWVuIFBUUyBhbmQgRFRTLCBhbGlnbiB0aGVtYCksIG8gPSBhKSkgOiBhID0gbyksIGkgPSByWzhdO1xuICAgIGxldCBkID0gaSArIDk7XG4gICAgaWYgKHMuc2l6ZSA8PSBkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcy5zaXplIC09IGQ7XG4gICAgY29uc3QgaCA9IG5ldyBVaW50OEFycmF5KHMuc2l6ZSk7XG4gICAgZm9yIChsZXQgZiA9IDAsIHAgPSBsLmxlbmd0aDsgZiA8IHA7IGYrKykge1xuICAgICAgciA9IGxbZl07XG4gICAgICBsZXQgeSA9IHIuYnl0ZUxlbmd0aDtcbiAgICAgIGlmIChkKVxuICAgICAgICBpZiAoZCA+IHkpIHtcbiAgICAgICAgICBkIC09IHk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHIgPSByLnN1YmFycmF5KGQpLCB5IC09IGQsIGQgPSAwO1xuICAgICAgaC5zZXQociwgdCksIHQgKz0geTtcbiAgICB9XG4gICAgcmV0dXJuIG4gJiYgKG4gLT0gaSArIDMpLCB7XG4gICAgICBkYXRhOiBoLFxuICAgICAgcHRzOiBvLFxuICAgICAgZHRzOiBhLFxuICAgICAgbGVuOiBuXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNsYXNzIEhUIHtcbiAgc3RhdGljIGdldFNpbGVudEZyYW1lKGUsIHQpIHtcbiAgICBzd2l0Y2ggKGUpIHtcbiAgICAgIGNhc2UgXCJtcDRhLjQwLjJcIjpcbiAgICAgICAgaWYgKHQgPT09IDEpXG4gICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFswLCAyMDAsIDAsIDEyOCwgMzUsIDEyOF0pO1xuICAgICAgICBpZiAodCA9PT0gMilcbiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzMzLCAwLCA3MywgMTQ0LCAyLCAyNSwgMCwgMzUsIDEyOF0pO1xuICAgICAgICBpZiAodCA9PT0gMylcbiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsIDIwMCwgMCwgMTI4LCAzMiwgMTMyLCAxLCAzOCwgNjQsIDgsIDEwMCwgMCwgMTQyXSk7XG4gICAgICAgIGlmICh0ID09PSA0KVxuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMCwgMjAwLCAwLCAxMjgsIDMyLCAxMzIsIDEsIDM4LCA2NCwgOCwgMTAwLCAwLCAxMjgsIDQ0LCAxMjgsIDgsIDIsIDU2XSk7XG4gICAgICAgIGlmICh0ID09PSA1KVxuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMCwgMjAwLCAwLCAxMjgsIDMyLCAxMzIsIDEsIDM4LCA2NCwgOCwgMTAwLCAwLCAxMzAsIDQ4LCA0LCAxNTMsIDAsIDMzLCAxNDQsIDIsIDU2XSk7XG4gICAgICAgIGlmICh0ID09PSA2KVxuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMCwgMjAwLCAwLCAxMjgsIDMyLCAxMzIsIDEsIDM4LCA2NCwgOCwgMTAwLCAwLCAxMzAsIDQ4LCA0LCAxNTMsIDAsIDMzLCAxNDQsIDIsIDAsIDE3OCwgMCwgMzIsIDgsIDIyNF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIGhhbmRsZSBIRS1BQUMgYmVsb3cgKG1wNGEuNDAuNSAvIG1wNGEuNDAuMjkpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodCA9PT0gMSlcbiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzEsIDY0LCAzNCwgMTI4LCAxNjMsIDc4LCAyMzAsIDEyOCwgMTg2LCA4LCAwLCAwLCAwLCAyOCwgNiwgMjQxLCAxOTMsIDEwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTRdKTtcbiAgICAgICAgaWYgKHQgPT09IDIpXG4gICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLCA2NCwgMzQsIDEyOCwgMTYzLCA5NCwgMjMwLCAxMjgsIDE4NiwgOCwgMCwgMCwgMCwgMCwgMTQ5LCAwLCA2LCAyNDEsIDE2MSwgMTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTRdKTtcbiAgICAgICAgaWYgKHQgPT09IDMpXG4gICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLCA2NCwgMzQsIDEyOCwgMTYzLCA5NCwgMjMwLCAxMjgsIDE4NiwgOCwgMCwgMCwgMCwgMCwgMTQ5LCAwLCA2LCAyNDEsIDE2MSwgMTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTRdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5jb25zdCBTcyA9IE1hdGgucG93KDIsIDMyKSAtIDE7XG5jbGFzcyBYIHtcbiAgc3RhdGljIGluaXQoKSB7XG4gICAgWC50eXBlcyA9IHtcbiAgICAgIGF2YzE6IFtdLFxuICAgICAgLy8gY29kaW5nbmFtZVxuICAgICAgYXZjQzogW10sXG4gICAgICBodmMxOiBbXSxcbiAgICAgIGh2Y0M6IFtdLFxuICAgICAgYnRydDogW10sXG4gICAgICBkaW5mOiBbXSxcbiAgICAgIGRyZWY6IFtdLFxuICAgICAgZXNkczogW10sXG4gICAgICBmdHlwOiBbXSxcbiAgICAgIGhkbHI6IFtdLFxuICAgICAgbWRhdDogW10sXG4gICAgICBtZGhkOiBbXSxcbiAgICAgIG1kaWE6IFtdLFxuICAgICAgbWZoZDogW10sXG4gICAgICBtaW5mOiBbXSxcbiAgICAgIG1vb2Y6IFtdLFxuICAgICAgbW9vdjogW10sXG4gICAgICBtcDRhOiBbXSxcbiAgICAgIFwiLm1wM1wiOiBbXSxcbiAgICAgIGRhYzM6IFtdLFxuICAgICAgXCJhYy0zXCI6IFtdLFxuICAgICAgbXZleDogW10sXG4gICAgICBtdmhkOiBbXSxcbiAgICAgIHBhc3A6IFtdLFxuICAgICAgc2R0cDogW10sXG4gICAgICBzdGJsOiBbXSxcbiAgICAgIHN0Y286IFtdLFxuICAgICAgc3RzYzogW10sXG4gICAgICBzdHNkOiBbXSxcbiAgICAgIHN0c3o6IFtdLFxuICAgICAgc3R0czogW10sXG4gICAgICB0ZmR0OiBbXSxcbiAgICAgIHRmaGQ6IFtdLFxuICAgICAgdHJhZjogW10sXG4gICAgICB0cmFrOiBbXSxcbiAgICAgIHRydW46IFtdLFxuICAgICAgdHJleDogW10sXG4gICAgICB0a2hkOiBbXSxcbiAgICAgIHZtaGQ6IFtdLFxuICAgICAgc21oZDogW11cbiAgICB9O1xuICAgIGxldCBlO1xuICAgIGZvciAoZSBpbiBYLnR5cGVzKVxuICAgICAgWC50eXBlcy5oYXNPd25Qcm9wZXJ0eShlKSAmJiAoWC50eXBlc1tlXSA9IFtlLmNoYXJDb2RlQXQoMCksIGUuY2hhckNvZGVBdCgxKSwgZS5jaGFyQ29kZUF0KDIpLCBlLmNoYXJDb2RlQXQoMyldKTtcbiAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCxcbiAgICAgIC8vIHZlcnNpb24gMFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBwcmVfZGVmaW5lZFxuICAgICAgMTE4LFxuICAgICAgMTA1LFxuICAgICAgMTAwLFxuICAgICAgMTAxLFxuICAgICAgLy8gaGFuZGxlcl90eXBlOiAndmlkZSdcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgIDg2LFxuICAgICAgMTA1LFxuICAgICAgMTAwLFxuICAgICAgMTAxLFxuICAgICAgMTExLFxuICAgICAgNzIsXG4gICAgICA5NyxcbiAgICAgIDExMCxcbiAgICAgIDEwMCxcbiAgICAgIDEwOCxcbiAgICAgIDEwMSxcbiAgICAgIDExNCxcbiAgICAgIDBcbiAgICAgIC8vIG5hbWU6ICdWaWRlb0hhbmRsZXInXG4gICAgXSksIHIgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvbiAwXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHByZV9kZWZpbmVkXG4gICAgICAxMTUsXG4gICAgICAxMTEsXG4gICAgICAxMTcsXG4gICAgICAxMTAsXG4gICAgICAvLyBoYW5kbGVyX3R5cGU6ICdzb3VuJ1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgODMsXG4gICAgICAxMTEsXG4gICAgICAxMTcsXG4gICAgICAxMTAsXG4gICAgICAxMDAsXG4gICAgICA3MixcbiAgICAgIDk3LFxuICAgICAgMTEwLFxuICAgICAgMTAwLFxuICAgICAgMTA4LFxuICAgICAgMTAxLFxuICAgICAgMTE0LFxuICAgICAgMFxuICAgICAgLy8gbmFtZTogJ1NvdW5kSGFuZGxlcidcbiAgICBdKTtcbiAgICBYLkhETFJfVFlQRVMgPSB7XG4gICAgICB2aWRlbzogdCxcbiAgICAgIGF1ZGlvOiByXG4gICAgfTtcbiAgICBjb25zdCBuID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCxcbiAgICAgIC8vIHZlcnNpb24gMFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAvLyBlbnRyeV9jb3VudFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMTIsXG4gICAgICAvLyBlbnRyeV9zaXplXG4gICAgICAxMTcsXG4gICAgICAxMTQsXG4gICAgICAxMDgsXG4gICAgICAzMixcbiAgICAgIC8vICd1cmwnIHR5cGVcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uIDBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMVxuICAgICAgLy8gZW50cnlfZmxhZ3NcbiAgICBdKSwgaSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gZW50cnlfY291bnRcbiAgICBdKTtcbiAgICBYLlNUVFMgPSBYLlNUU0MgPSBYLlNUQ08gPSBpLCBYLlNUU1ogPSBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvblxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBzYW1wbGVfc2l6ZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gc2FtcGxlX2NvdW50XG4gICAgXSksIFguVk1IRCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBncmFwaGljc21vZGVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gb3Bjb2xvclxuICAgIF0pLCBYLlNNSEQgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvblxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gYmFsYW5jZVxuICAgICAgMCxcbiAgICAgIDBcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgXSksIFguU1RTRCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uIDBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGZsYWdzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgXSk7XG4gICAgY29uc3QgbyA9IG5ldyBVaW50OEFycmF5KFsxMDUsIDExNSwgMTExLCAxMDldKSwgYSA9IG5ldyBVaW50OEFycmF5KFs5NywgMTE4LCA5OSwgNDldKSwgbCA9IG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAxXSk7XG4gICAgWC5GVFlQID0gWC5ib3goWC50eXBlcy5mdHlwLCBvLCBsLCBvLCBhKSwgWC5ESU5GID0gWC5ib3goWC50eXBlcy5kaW5mLCBYLmJveChYLnR5cGVzLmRyZWYsIG4pKTtcbiAgfVxuICBzdGF0aWMgYm94KGUsIC4uLnQpIHtcbiAgICBsZXQgciA9IDgsIG4gPSB0Lmxlbmd0aDtcbiAgICBjb25zdCBpID0gbjtcbiAgICBmb3IgKDsgbi0tOyApXG4gICAgICByICs9IHRbbl0uYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBvID0gbmV3IFVpbnQ4QXJyYXkocik7XG4gICAgZm9yIChvWzBdID0gciA+PiAyNCAmIDI1NSwgb1sxXSA9IHIgPj4gMTYgJiAyNTUsIG9bMl0gPSByID4+IDggJiAyNTUsIG9bM10gPSByICYgMjU1LCBvLnNldChlLCA0KSwgbiA9IDAsIHIgPSA4OyBuIDwgaTsgbisrKVxuICAgICAgby5zZXQodFtuXSwgciksIHIgKz0gdFtuXS5ieXRlTGVuZ3RoO1xuICAgIHJldHVybiBvO1xuICB9XG4gIHN0YXRpYyBoZGxyKGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5oZGxyLCBYLkhETFJfVFlQRVNbZV0pO1xuICB9XG4gIHN0YXRpYyBtZGF0KGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5tZGF0LCBlKTtcbiAgfVxuICBzdGF0aWMgbWRoZChlLCB0KSB7XG4gICAgdCAqPSBlO1xuICAgIGNvbnN0IHIgPSBNYXRoLmZsb29yKHQgLyAoU3MgKyAxKSksIG4gPSBNYXRoLmZsb29yKHQgJSAoU3MgKyAxKSk7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMubWRoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMSxcbiAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAyLFxuICAgICAgLy8gY3JlYXRpb25fdGltZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDMsXG4gICAgICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgZSA+PiAyNCAmIDI1NSxcbiAgICAgIGUgPj4gMTYgJiAyNTUsXG4gICAgICBlID4+IDggJiAyNTUsXG4gICAgICBlICYgMjU1LFxuICAgICAgLy8gdGltZXNjYWxlXG4gICAgICByID4+IDI0LFxuICAgICAgciA+PiAxNiAmIDI1NSxcbiAgICAgIHIgPj4gOCAmIDI1NSxcbiAgICAgIHIgJiAyNTUsXG4gICAgICBuID4+IDI0LFxuICAgICAgbiA+PiAxNiAmIDI1NSxcbiAgICAgIG4gPj4gOCAmIDI1NSxcbiAgICAgIG4gJiAyNTUsXG4gICAgICA4NSxcbiAgICAgIDE5NixcbiAgICAgIC8vICd1bmQnIGxhbmd1YWdlICh1bmRldGVybWluZWQpXG4gICAgICAwLFxuICAgICAgMFxuICAgIF0pKTtcbiAgfVxuICBzdGF0aWMgbWRpYShlKSB7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMubWRpYSwgWC5tZGhkKGUudGltZXNjYWxlIHx8IDAsIGUuZHVyYXRpb24gfHwgMCksIFguaGRscihlLnR5cGUpLCBYLm1pbmYoZSkpO1xuICB9XG4gIHN0YXRpYyBtZmhkKGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5tZmhkLCBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIGUgPj4gMjQsXG4gICAgICBlID4+IDE2ICYgMjU1LFxuICAgICAgZSA+PiA4ICYgMjU1LFxuICAgICAgZSAmIDI1NVxuICAgICAgLy8gc2VxdWVuY2VfbnVtYmVyXG4gICAgXSkpO1xuICB9XG4gIHN0YXRpYyBtaW5mKGUpIHtcbiAgICByZXR1cm4gZS50eXBlID09PSBcImF1ZGlvXCIgPyBYLmJveChYLnR5cGVzLm1pbmYsIFguYm94KFgudHlwZXMuc21oZCwgWC5TTUhEKSwgWC5ESU5GLCBYLnN0YmwoZSkpIDogWC5ib3goWC50eXBlcy5taW5mLCBYLmJveChYLnR5cGVzLnZtaGQsIFguVk1IRCksIFguRElORiwgWC5zdGJsKGUpKTtcbiAgfVxuICBzdGF0aWMgbW9vZihlLCB0LCByKSB7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMubW9vZiwgWC5tZmhkKGUpLCBYLnRyYWYociwgdCkpO1xuICB9XG4gIHN0YXRpYyBtb292KGUpIHtcbiAgICBsZXQgdCA9IGUubGVuZ3RoO1xuICAgIGNvbnN0IHIgPSBbXTtcbiAgICBmb3IgKDsgdC0tOyApXG4gICAgICByW3RdID0gWC50cmFrKGVbdF0pO1xuICAgIHJldHVybiBYLmJveC5hcHBseShudWxsLCBbWC50eXBlcy5tb292LCBYLm12aGQoZVswXS50aW1lc2NhbGUgfHwgMCwgZVswXS5kdXJhdGlvbiB8fCAwKV0uY29uY2F0KHIpLmNvbmNhdChYLm12ZXgoZSkpKTtcbiAgfVxuICBzdGF0aWMgbXZleChlKSB7XG4gICAgbGV0IHQgPSBlLmxlbmd0aDtcbiAgICBjb25zdCByID0gW107XG4gICAgZm9yICg7IHQtLTsgKVxuICAgICAgclt0XSA9IFgudHJleChlW3RdKTtcbiAgICByZXR1cm4gWC5ib3guYXBwbHkobnVsbCwgW1gudHlwZXMubXZleCwgLi4ucl0pO1xuICB9XG4gIHN0YXRpYyBtdmhkKGUsIHQpIHtcbiAgICB0ICo9IGU7XG4gICAgY29uc3QgciA9IE1hdGguZmxvb3IodCAvIChTcyArIDEpKSwgbiA9IE1hdGguZmxvb3IodCAlIChTcyArIDEpKSwgaSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDEsXG4gICAgICAvLyB2ZXJzaW9uIDFcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGZsYWdzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMixcbiAgICAgIC8vIGNyZWF0aW9uX3RpbWVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAzLFxuICAgICAgLy8gbW9kaWZpY2F0aW9uX3RpbWVcbiAgICAgIGUgPj4gMjQgJiAyNTUsXG4gICAgICBlID4+IDE2ICYgMjU1LFxuICAgICAgZSA+PiA4ICYgMjU1LFxuICAgICAgZSAmIDI1NSxcbiAgICAgIC8vIHRpbWVzY2FsZVxuICAgICAgciA+PiAyNCxcbiAgICAgIHIgPj4gMTYgJiAyNTUsXG4gICAgICByID4+IDggJiAyNTUsXG4gICAgICByICYgMjU1LFxuICAgICAgbiA+PiAyNCxcbiAgICAgIG4gPj4gMTYgJiAyNTUsXG4gICAgICBuID4+IDggJiAyNTUsXG4gICAgICBuICYgMjU1LFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIDEuMCByYXRlXG4gICAgICAxLFxuICAgICAgMCxcbiAgICAgIC8vIDEuMCB2b2x1bWVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDY0LFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gdHJhbnNmb3JtYXRpb246IHVuaXR5IG1hdHJpeFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcHJlX2RlZmluZWRcbiAgICAgIDI1NSxcbiAgICAgIDI1NSxcbiAgICAgIDI1NSxcbiAgICAgIDI1NVxuICAgICAgLy8gbmV4dF90cmFja19JRFxuICAgIF0pO1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLm12aGQsIGkpO1xuICB9XG4gIHN0YXRpYyBzZHRwKGUpIHtcbiAgICBjb25zdCB0ID0gZS5zYW1wbGVzIHx8IFtdLCByID0gbmV3IFVpbnQ4QXJyYXkoNCArIHQubGVuZ3RoKTtcbiAgICBsZXQgbiwgaTtcbiAgICBmb3IgKG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKylcbiAgICAgIGkgPSB0W25dLmZsYWdzLCByW24gKyA0XSA9IGkuZGVwZW5kc09uIDw8IDQgfCBpLmlzRGVwZW5kZWRPbiA8PCAyIHwgaS5oYXNSZWR1bmRhbmN5O1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLnNkdHAsIHIpO1xuICB9XG4gIHN0YXRpYyBzdGJsKGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5zdGJsLCBYLnN0c2QoZSksIFguYm94KFgudHlwZXMuc3R0cywgWC5TVFRTKSwgWC5ib3goWC50eXBlcy5zdHNjLCBYLlNUU0MpLCBYLmJveChYLnR5cGVzLnN0c3osIFguU1RTWiksIFguYm94KFgudHlwZXMuc3RjbywgWC5TVENPKSk7XG4gIH1cbiAgc3RhdGljIGF2YzEoZSkge1xuICAgIGxldCB0ID0gW10sIHIgPSBbXSwgbiwgaSwgbztcbiAgICBmb3IgKG4gPSAwOyBuIDwgZS5zcHMubGVuZ3RoOyBuKyspXG4gICAgICBpID0gZS5zcHNbbl0sIG8gPSBpLmJ5dGVMZW5ndGgsIHQucHVzaChvID4+PiA4ICYgMjU1KSwgdC5wdXNoKG8gJiAyNTUpLCB0ID0gdC5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaSkpO1xuICAgIGZvciAobiA9IDA7IG4gPCBlLnBwcy5sZW5ndGg7IG4rKylcbiAgICAgIGkgPSBlLnBwc1tuXSwgbyA9IGkuYnl0ZUxlbmd0aCwgci5wdXNoKG8gPj4+IDggJiAyNTUpLCByLnB1c2gobyAmIDI1NSksIHIgPSByLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpKSk7XG4gICAgY29uc3QgYSA9IFguYm94KFgudHlwZXMuYXZjQywgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMSxcbiAgICAgIC8vIHZlcnNpb25cbiAgICAgIHRbM10sXG4gICAgICAvLyBwcm9maWxlXG4gICAgICB0WzRdLFxuICAgICAgLy8gcHJvZmlsZSBjb21wYXRcbiAgICAgIHRbNV0sXG4gICAgICAvLyBsZXZlbFxuICAgICAgMjU1LFxuICAgICAgLy8gbGVuZ3RoU2l6ZU1pbnVzT25lLCBoYXJkLWNvZGVkIHRvIDQgYnl0ZXNcbiAgICAgIDIyNCB8IGUuc3BzLmxlbmd0aFxuICAgICAgLy8gM2JpdCByZXNlcnZlZCAoMTExKSArIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzXG4gICAgXS5jb25jYXQodCkuY29uY2F0KFtcbiAgICAgIGUucHBzLmxlbmd0aFxuICAgICAgLy8gbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0c1xuICAgIF0pLmNvbmNhdChyKSkpLCBsID0gZS53aWR0aCwgYyA9IGUuaGVpZ2h0LCB1ID0gZS5waXhlbFJhdGlvWzBdLCBkID0gZS5waXhlbFJhdGlvWzFdO1xuICAgIHJldHVybiBYLmJveChcbiAgICAgIFgudHlwZXMuYXZjMSxcbiAgICAgIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgICAgMCxcbiAgICAgICAgMSxcbiAgICAgICAgLy8gZGF0YV9yZWZlcmVuY2VfaW5kZXhcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcHJlX2RlZmluZWRcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcHJlX2RlZmluZWRcbiAgICAgICAgbCA+PiA4ICYgMjU1LFxuICAgICAgICBsICYgMjU1LFxuICAgICAgICAvLyB3aWR0aFxuICAgICAgICBjID4+IDggJiAyNTUsXG4gICAgICAgIGMgJiAyNTUsXG4gICAgICAgIC8vIGhlaWdodFxuICAgICAgICAwLFxuICAgICAgICA3MixcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gaG9yaXpyZXNvbHV0aW9uXG4gICAgICAgIDAsXG4gICAgICAgIDcyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyB2ZXJ0cmVzb2x1dGlvblxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAxLFxuICAgICAgICAvLyBmcmFtZV9jb3VudFxuICAgICAgICAxOCxcbiAgICAgICAgMTAwLFxuICAgICAgICA5NyxcbiAgICAgICAgMTA1LFxuICAgICAgICAxMDgsXG4gICAgICAgIC8vIGRhaWx5bW90aW9uL2hscy5qc1xuICAgICAgICAxMjEsXG4gICAgICAgIDEwOSxcbiAgICAgICAgMTExLFxuICAgICAgICAxMTYsXG4gICAgICAgIDEwNSxcbiAgICAgICAgMTExLFxuICAgICAgICAxMTAsXG4gICAgICAgIDQ3LFxuICAgICAgICAxMDQsXG4gICAgICAgIDEwOCxcbiAgICAgICAgMTE1LFxuICAgICAgICA0NixcbiAgICAgICAgMTA2LFxuICAgICAgICAxMTUsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIC8vIGNvbXByZXNzb3JuYW1lXG4gICAgICAgIDAsXG4gICAgICAgIDI0LFxuICAgICAgICAvLyBkZXB0aCA9IDI0XG4gICAgICAgIDE3LFxuICAgICAgICAxN1xuICAgICAgXSksXG4gICAgICAvLyBwcmVfZGVmaW5lZCA9IC0xXG4gICAgICBhLFxuICAgICAgWC5ib3goWC50eXBlcy5idHJ0LCBuZXcgVWludDhBcnJheShbXG4gICAgICAgIDAsXG4gICAgICAgIDI4LFxuICAgICAgICAxNTYsXG4gICAgICAgIDEyOCxcbiAgICAgICAgLy8gYnVmZmVyU2l6ZURCXG4gICAgICAgIDAsXG4gICAgICAgIDQ1LFxuICAgICAgICAxOTgsXG4gICAgICAgIDE5MixcbiAgICAgICAgLy8gbWF4Qml0cmF0ZVxuICAgICAgICAwLFxuICAgICAgICA0NSxcbiAgICAgICAgMTk4LFxuICAgICAgICAxOTJcbiAgICAgIF0pKSxcbiAgICAgIC8vIGF2Z0JpdHJhdGVcbiAgICAgIFguYm94KFgudHlwZXMucGFzcCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICB1ID4+IDI0LFxuICAgICAgICAvLyBoU3BhY2luZ1xuICAgICAgICB1ID4+IDE2ICYgMjU1LFxuICAgICAgICB1ID4+IDggJiAyNTUsXG4gICAgICAgIHUgJiAyNTUsXG4gICAgICAgIGQgPj4gMjQsXG4gICAgICAgIC8vIHZTcGFjaW5nXG4gICAgICAgIGQgPj4gMTYgJiAyNTUsXG4gICAgICAgIGQgPj4gOCAmIDI1NSxcbiAgICAgICAgZCAmIDI1NVxuICAgICAgXSkpXG4gICAgKTtcbiAgfVxuICBzdGF0aWMgZXNkcyhlKSB7XG4gICAgY29uc3QgdCA9IGUuY29uZmlnO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvbiAwXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMyxcbiAgICAgIC8vIGRlc2NyaXB0b3JfdHlwZVxuICAgICAgMjUsXG4gICAgICAvLyBsZW5ndGhcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgLy8gZXNfaWRcbiAgICAgIDAsXG4gICAgICAvLyBzdHJlYW1fcHJpb3JpdHlcbiAgICAgIDQsXG4gICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgIDE3LFxuICAgICAgLy8gbGVuZ3RoXG4gICAgICA2NCxcbiAgICAgIC8vIGNvZGVjIDogbXBlZzRfYXVkaW9cbiAgICAgIDIxLFxuICAgICAgLy8gc3RyZWFtX3R5cGVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGJ1ZmZlcl9zaXplXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gbWF4Qml0cmF0ZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGF2Z0JpdHJhdGVcbiAgICAgIDUsXG4gICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgIDIsXG4gICAgICAvLyBsZW5ndGhcbiAgICAgIC4uLnQsXG4gICAgICA2LFxuICAgICAgMSxcbiAgICAgIDJcbiAgICAgIC8vIEdBU3BlY2lmaWNDb25maWcpKTsgLy8gbGVuZ3RoICsgYXVkaW8gY29uZmlnIGRlc2NyaXB0b3JcbiAgICBdKTtcbiAgfVxuICBzdGF0aWMgYXVkaW9TdHNkKGUpIHtcbiAgICBjb25zdCB0ID0gZS5zYW1wbGVyYXRlIHx8IDA7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAvLyBkYXRhX3JlZmVyZW5jZV9pbmRleFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIGUuY2hhbm5lbENvdW50IHx8IDAsXG4gICAgICAvLyBjaGFubmVsY291bnRcbiAgICAgIDAsXG4gICAgICAxNixcbiAgICAgIC8vIHNhbXBsZVNpemU6MTZiaXRzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWQyXG4gICAgICB0ID4+IDggJiAyNTUsXG4gICAgICB0ICYgMjU1LFxuICAgICAgLy9cbiAgICAgIDAsXG4gICAgICAwXG4gICAgXSk7XG4gIH1cbiAgc3RhdGljIG1wNGEoZSkge1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLm1wNGEsIFguYXVkaW9TdHNkKGUpLCBYLmJveChYLnR5cGVzLmVzZHMsIFguZXNkcyhlKSkpO1xuICB9XG4gIHN0YXRpYyBtcDMoZSkge1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzW1wiLm1wM1wiXSwgWC5hdWRpb1N0c2QoZSkpO1xuICB9XG4gIHN0YXRpYyBhYzMoZSkge1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzW1wiYWMtM1wiXSwgWC5hdWRpb1N0c2QoZSksIFguYm94KFgudHlwZXMuZGFjMywgZS5jb25maWcpKTtcbiAgfVxuICBzdGF0aWMgc3RzZChlKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2VnbWVudENvZGVjOiB0XG4gICAgfSA9IGU7XG4gICAgaWYgKGUudHlwZSA9PT0gXCJhdWRpb1wiKSB7XG4gICAgICBpZiAodCA9PT0gXCJhYWNcIilcbiAgICAgICAgcmV0dXJuIFguYm94KFgudHlwZXMuc3RzZCwgWC5TVFNELCBYLm1wNGEoZSkpO1xuICAgICAgaWYgKHQgPT09IFwiYWMzXCIgJiYgZS5jb25maWcpXG4gICAgICAgIHJldHVybiBYLmJveChYLnR5cGVzLnN0c2QsIFguU1RTRCwgWC5hYzMoZSkpO1xuICAgICAgaWYgKHQgPT09IFwibXAzXCIgJiYgZS5jb2RlYyA9PT0gXCJtcDNcIilcbiAgICAgICAgcmV0dXJuIFguYm94KFgudHlwZXMuc3RzZCwgWC5TVFNELCBYLm1wMyhlKSk7XG4gICAgfSBlbHNlIGlmIChlLnBwcyAmJiBlLnNwcykge1xuICAgICAgaWYgKHQgPT09IFwiYXZjXCIpXG4gICAgICAgIHJldHVybiBYLmJveChYLnR5cGVzLnN0c2QsIFguU1RTRCwgWC5hdmMxKGUpKTtcbiAgICAgIGlmICh0ID09PSBcImhldmNcIiAmJiBlLnZwcylcbiAgICAgICAgcmV0dXJuIFguYm94KFgudHlwZXMuc3RzZCwgWC5TVFNELCBYLmh2YzEoZSkpO1xuICAgIH0gZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlkZW8gdHJhY2sgbWlzc2luZyBwcHMgb3Igc3BzXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgJHtlLnR5cGV9IHNlZ21lbnQgY29kZWMgKCR7dH0vJHtlLmNvZGVjfSlgKTtcbiAgfVxuICBzdGF0aWMgdGtoZChlKSB7XG4gICAgY29uc3QgdCA9IGUuaWQsIHIgPSAoZS5kdXJhdGlvbiB8fCAwKSAqIChlLnRpbWVzY2FsZSB8fCAwKSwgbiA9IGUud2lkdGggfHwgMCwgaSA9IGUuaGVpZ2h0IHx8IDAsIG8gPSBNYXRoLmZsb29yKHIgLyAoU3MgKyAxKSksIGEgPSBNYXRoLmZsb29yKHIgJSAoU3MgKyAxKSk7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMudGtoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMSxcbiAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICA3LFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAyLFxuICAgICAgLy8gY3JlYXRpb25fdGltZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDMsXG4gICAgICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgdCA+PiAyNCAmIDI1NSxcbiAgICAgIHQgPj4gMTYgJiAyNTUsXG4gICAgICB0ID4+IDggJiAyNTUsXG4gICAgICB0ICYgMjU1LFxuICAgICAgLy8gdHJhY2tfSURcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgbyA+PiAyNCxcbiAgICAgIG8gPj4gMTYgJiAyNTUsXG4gICAgICBvID4+IDggJiAyNTUsXG4gICAgICBvICYgMjU1LFxuICAgICAgYSA+PiAyNCxcbiAgICAgIGEgPj4gMTYgJiAyNTUsXG4gICAgICBhID4+IDggJiAyNTUsXG4gICAgICBhICYgMjU1LFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBsYXllclxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBhbHRlcm5hdGVfZ3JvdXBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gbm9uLWF1ZGlvIHRyYWNrIHZvbHVtZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICA2NCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHRyYW5zZm9ybWF0aW9uOiB1bml0eSBtYXRyaXhcbiAgICAgIG4gPj4gOCAmIDI1NSxcbiAgICAgIG4gJiAyNTUsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHdpZHRoXG4gICAgICBpID4+IDggJiAyNTUsXG4gICAgICBpICYgMjU1LFxuICAgICAgMCxcbiAgICAgIDBcbiAgICAgIC8vIGhlaWdodFxuICAgIF0pKTtcbiAgfVxuICBzdGF0aWMgdHJhZihlLCB0KSB7XG4gICAgY29uc3QgciA9IFguc2R0cChlKSwgbiA9IGUuaWQsIGkgPSBNYXRoLmZsb29yKHQgLyAoU3MgKyAxKSksIG8gPSBNYXRoLmZsb29yKHQgJSAoU3MgKyAxKSk7XG4gICAgcmV0dXJuIFguYm94KFxuICAgICAgWC50eXBlcy50cmFmLFxuICAgICAgWC5ib3goWC50eXBlcy50ZmhkLCBuZXcgVWludDhBcnJheShbXG4gICAgICAgIDAsXG4gICAgICAgIC8vIHZlcnNpb24gMFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBmbGFnc1xuICAgICAgICBuID4+IDI0LFxuICAgICAgICBuID4+IDE2ICYgMjU1LFxuICAgICAgICBuID4+IDggJiAyNTUsXG4gICAgICAgIG4gJiAyNTVcbiAgICAgICAgLy8gdHJhY2tfSURcbiAgICAgIF0pKSxcbiAgICAgIFguYm94KFgudHlwZXMudGZkdCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAxLFxuICAgICAgICAvLyB2ZXJzaW9uIDFcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gZmxhZ3NcbiAgICAgICAgaSA+PiAyNCxcbiAgICAgICAgaSA+PiAxNiAmIDI1NSxcbiAgICAgICAgaSA+PiA4ICYgMjU1LFxuICAgICAgICBpICYgMjU1LFxuICAgICAgICBvID4+IDI0LFxuICAgICAgICBvID4+IDE2ICYgMjU1LFxuICAgICAgICBvID4+IDggJiAyNTUsXG4gICAgICAgIG8gJiAyNTVcbiAgICAgIF0pKSxcbiAgICAgIFgudHJ1bihlLCByLmxlbmd0aCArIDE2ICsgLy8gdGZoZFxuICAgICAgMjAgKyAvLyB0ZmR0XG4gICAgICA4ICsgLy8gdHJhZiBoZWFkZXJcbiAgICAgIDE2ICsgLy8gbWZoZFxuICAgICAgOCArIC8vIG1vb2YgaGVhZGVyXG4gICAgICA4KSxcbiAgICAgIC8vIG1kYXQgaGVhZGVyXG4gICAgICByXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgYSB0cmFjayBib3guXG4gICAqIEBwYXJhbSB0cmFjayBhIHRyYWNrIGRlZmluaXRpb25cbiAgICovXG4gIHN0YXRpYyB0cmFrKGUpIHtcbiAgICByZXR1cm4gZS5kdXJhdGlvbiA9IGUuZHVyYXRpb24gfHwgNDI5NDk2NzI5NSwgWC5ib3goWC50eXBlcy50cmFrLCBYLnRraGQoZSksIFgubWRpYShlKSk7XG4gIH1cbiAgc3RhdGljIHRyZXgoZSkge1xuICAgIGNvbnN0IHQgPSBlLmlkO1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLnRyZXgsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uIDBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGZsYWdzXG4gICAgICB0ID4+IDI0LFxuICAgICAgdCA+PiAxNiAmIDI1NSxcbiAgICAgIHQgPj4gOCAmIDI1NSxcbiAgICAgIHQgJiAyNTUsXG4gICAgICAvLyB0cmFja19JRFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIC8vIGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4XG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZGVmYXVsdF9zYW1wbGVfZHVyYXRpb25cbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBkZWZhdWx0X3NhbXBsZV9zaXplXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgICAvLyBkZWZhdWx0X3NhbXBsZV9mbGFnc1xuICAgIF0pKTtcbiAgfVxuICBzdGF0aWMgdHJ1bihlLCB0KSB7XG4gICAgY29uc3QgciA9IGUuc2FtcGxlcyB8fCBbXSwgbiA9IHIubGVuZ3RoLCBpID0gMTIgKyAxNiAqIG4sIG8gPSBuZXcgVWludDhBcnJheShpKTtcbiAgICBsZXQgYSwgbCwgYywgdSwgZCwgaDtcbiAgICBmb3IgKHQgKz0gOCArIGksIG8uc2V0KFtcbiAgICAgIGUudHlwZSA9PT0gXCJ2aWRlb1wiID8gMSA6IDAsXG4gICAgICAvLyB2ZXJzaW9uIDEgZm9yIHZpZGVvIHdpdGggc2lnbmVkLWludCBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRcbiAgICAgIDAsXG4gICAgICAxNSxcbiAgICAgIDEsXG4gICAgICAvLyBmbGFnc1xuICAgICAgbiA+Pj4gMjQgJiAyNTUsXG4gICAgICBuID4+PiAxNiAmIDI1NSxcbiAgICAgIG4gPj4+IDggJiAyNTUsXG4gICAgICBuICYgMjU1LFxuICAgICAgLy8gc2FtcGxlX2NvdW50XG4gICAgICB0ID4+PiAyNCAmIDI1NSxcbiAgICAgIHQgPj4+IDE2ICYgMjU1LFxuICAgICAgdCA+Pj4gOCAmIDI1NSxcbiAgICAgIHQgJiAyNTVcbiAgICAgIC8vIGRhdGFfb2Zmc2V0XG4gICAgXSwgMCksIGEgPSAwOyBhIDwgbjsgYSsrKVxuICAgICAgbCA9IHJbYV0sIGMgPSBsLmR1cmF0aW9uLCB1ID0gbC5zaXplLCBkID0gbC5mbGFncywgaCA9IGwuY3RzLCBvLnNldChbXG4gICAgICAgIGMgPj4+IDI0ICYgMjU1LFxuICAgICAgICBjID4+PiAxNiAmIDI1NSxcbiAgICAgICAgYyA+Pj4gOCAmIDI1NSxcbiAgICAgICAgYyAmIDI1NSxcbiAgICAgICAgLy8gc2FtcGxlX2R1cmF0aW9uXG4gICAgICAgIHUgPj4+IDI0ICYgMjU1LFxuICAgICAgICB1ID4+PiAxNiAmIDI1NSxcbiAgICAgICAgdSA+Pj4gOCAmIDI1NSxcbiAgICAgICAgdSAmIDI1NSxcbiAgICAgICAgLy8gc2FtcGxlX3NpemVcbiAgICAgICAgZC5pc0xlYWRpbmcgPDwgMiB8IGQuZGVwZW5kc09uLFxuICAgICAgICBkLmlzRGVwZW5kZWRPbiA8PCA2IHwgZC5oYXNSZWR1bmRhbmN5IDw8IDQgfCBkLnBhZGRpbmdWYWx1ZSA8PCAxIHwgZC5pc05vblN5bmMsXG4gICAgICAgIGQuZGVncmFkUHJpbyAmIDYxNDQwLFxuICAgICAgICBkLmRlZ3JhZFByaW8gJiAxNSxcbiAgICAgICAgLy8gc2FtcGxlX2ZsYWdzXG4gICAgICAgIGggPj4+IDI0ICYgMjU1LFxuICAgICAgICBoID4+PiAxNiAmIDI1NSxcbiAgICAgICAgaCA+Pj4gOCAmIDI1NSxcbiAgICAgICAgaCAmIDI1NVxuICAgICAgICAvLyBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRcbiAgICAgIF0sIDEyICsgMTYgKiBhKTtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy50cnVuLCBvKTtcbiAgfVxuICBzdGF0aWMgaW5pdFNlZ21lbnQoZSkge1xuICAgIFgudHlwZXMgfHwgWC5pbml0KCk7XG4gICAgY29uc3QgdCA9IFgubW9vdihlKTtcbiAgICByZXR1cm4gX3IoWC5GVFlQLCB0KTtcbiAgfVxuICBzdGF0aWMgaHZjMShlKSB7XG4gICAgY29uc3QgdCA9IGUucGFyYW1zLCByID0gW2UudnBzLCBlLnNwcywgZS5wcHNdLCBuID0gNCwgaSA9IG5ldyBVaW50OEFycmF5KFsxLCB0LmdlbmVyYWxfcHJvZmlsZV9zcGFjZSA8PCA2IHwgKHQuZ2VuZXJhbF90aWVyX2ZsYWcgPyAzMiA6IDApIHwgdC5nZW5lcmFsX3Byb2ZpbGVfaWRjLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzBdLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzFdLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzJdLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzNdLCB0LmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3NbMF0sIHQuZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnc1sxXSwgdC5nZW5lcmFsX2NvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzWzJdLCB0LmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3NbM10sIHQuZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnc1s0XSwgdC5nZW5lcmFsX2NvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzWzVdLCB0LmdlbmVyYWxfbGV2ZWxfaWRjLCAyNDAgfCB0Lm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgPj4gOCwgMjU1ICYgdC5taW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjLCAyNTIgfCB0LnBhcmFsbGVsaXNtVHlwZSwgMjUyIHwgdC5jaHJvbWFfZm9ybWF0X2lkYywgMjQ4IHwgdC5iaXRfZGVwdGhfbHVtYV9taW51czgsIDI0OCB8IHQuYml0X2RlcHRoX2Nocm9tYV9taW51czgsIDAsIHBhcnNlSW50KHQuZnJhbWVfcmF0ZS5mcHMpLCBuIC0gMSB8IHQudGVtcG9yYWxfaWRfbmVzdGVkIDw8IDIgfCB0Lm51bV90ZW1wb3JhbF9sYXllcnMgPDwgMyB8ICh0LmZyYW1lX3JhdGUuZml4ZWQgPyA2NCA6IDApLCByLmxlbmd0aF0pO1xuICAgIGxldCBvID0gaS5sZW5ndGg7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCByLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICBvICs9IDM7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHJbcF0ubGVuZ3RoOyB5ICs9IDEpXG4gICAgICAgIG8gKz0gMiArIHJbcF1beV0ubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBhID0gbmV3IFVpbnQ4QXJyYXkobyk7XG4gICAgYS5zZXQoaSwgMCksIG8gPSBpLmxlbmd0aDtcbiAgICBjb25zdCBsID0gci5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgci5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgYS5zZXQobmV3IFVpbnQ4QXJyYXkoWzMyICsgcCB8IChwID09PSBsID8gMTI4IDogMCksIDAsIHJbcF0ubGVuZ3RoXSksIG8pLCBvICs9IDM7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHJbcF0ubGVuZ3RoOyB5ICs9IDEpXG4gICAgICAgIGEuc2V0KG5ldyBVaW50OEFycmF5KFtyW3BdW3ldLmxlbmd0aCA+PiA4LCByW3BdW3ldLmxlbmd0aCAmIDI1NV0pLCBvKSwgbyArPSAyLCBhLnNldChyW3BdW3ldLCBvKSwgbyArPSByW3BdW3ldLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgYyA9IFguYm94KFgudHlwZXMuaHZjQywgYSksIHUgPSBlLndpZHRoLCBkID0gZS5oZWlnaHQsIGggPSBlLnBpeGVsUmF0aW9bMF0sIGYgPSBlLnBpeGVsUmF0aW9bMV07XG4gICAgcmV0dXJuIFguYm94KFxuICAgICAgWC50eXBlcy5odmMxLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAxLFxuICAgICAgICAvLyBkYXRhX3JlZmVyZW5jZV9pbmRleFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBwcmVfZGVmaW5lZFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBwcmVfZGVmaW5lZFxuICAgICAgICB1ID4+IDggJiAyNTUsXG4gICAgICAgIHUgJiAyNTUsXG4gICAgICAgIC8vIHdpZHRoXG4gICAgICAgIGQgPj4gOCAmIDI1NSxcbiAgICAgICAgZCAmIDI1NSxcbiAgICAgICAgLy8gaGVpZ2h0XG4gICAgICAgIDAsXG4gICAgICAgIDcyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBob3JpenJlc29sdXRpb25cbiAgICAgICAgMCxcbiAgICAgICAgNzIsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIC8vIHZlcnRyZXNvbHV0aW9uXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIC8vIHJlc2VydmVkXG4gICAgICAgIDAsXG4gICAgICAgIDEsXG4gICAgICAgIC8vIGZyYW1lX2NvdW50XG4gICAgICAgIDE4LFxuICAgICAgICAxMDAsXG4gICAgICAgIDk3LFxuICAgICAgICAxMDUsXG4gICAgICAgIDEwOCxcbiAgICAgICAgLy8gZGFpbHltb3Rpb24vaGxzLmpzXG4gICAgICAgIDEyMSxcbiAgICAgICAgMTA5LFxuICAgICAgICAxMTEsXG4gICAgICAgIDExNixcbiAgICAgICAgMTA1LFxuICAgICAgICAxMTEsXG4gICAgICAgIDExMCxcbiAgICAgICAgNDcsXG4gICAgICAgIDEwNCxcbiAgICAgICAgMTA4LFxuICAgICAgICAxMTUsXG4gICAgICAgIDQ2LFxuICAgICAgICAxMDYsXG4gICAgICAgIDExNSxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gY29tcHJlc3Nvcm5hbWVcbiAgICAgICAgMCxcbiAgICAgICAgMjQsXG4gICAgICAgIC8vIGRlcHRoID0gMjRcbiAgICAgICAgMTcsXG4gICAgICAgIDE3XG4gICAgICBdKSxcbiAgICAgIC8vIHByZV9kZWZpbmVkID0gLTFcbiAgICAgIGMsXG4gICAgICBYLmJveChYLnR5cGVzLmJ0cnQsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMCxcbiAgICAgICAgMjgsXG4gICAgICAgIDE1NixcbiAgICAgICAgMTI4LFxuICAgICAgICAvLyBidWZmZXJTaXplREJcbiAgICAgICAgMCxcbiAgICAgICAgNDUsXG4gICAgICAgIDE5OCxcbiAgICAgICAgMTkyLFxuICAgICAgICAvLyBtYXhCaXRyYXRlXG4gICAgICAgIDAsXG4gICAgICAgIDQ1LFxuICAgICAgICAxOTgsXG4gICAgICAgIDE5MlxuICAgICAgXSkpLFxuICAgICAgLy8gYXZnQml0cmF0ZVxuICAgICAgWC5ib3goWC50eXBlcy5wYXNwLCBuZXcgVWludDhBcnJheShbXG4gICAgICAgIGggPj4gMjQsXG4gICAgICAgIC8vIGhTcGFjaW5nXG4gICAgICAgIGggPj4gMTYgJiAyNTUsXG4gICAgICAgIGggPj4gOCAmIDI1NSxcbiAgICAgICAgaCAmIDI1NSxcbiAgICAgICAgZiA+PiAyNCxcbiAgICAgICAgLy8gdlNwYWNpbmdcbiAgICAgICAgZiA+PiAxNiAmIDI1NSxcbiAgICAgICAgZiA+PiA4ICYgMjU1LFxuICAgICAgICBmICYgMjU1XG4gICAgICBdKSlcbiAgICApO1xuICB9XG59XG5YLnR5cGVzID0gdm9pZCAwO1xuWC5IRExSX1RZUEVTID0gdm9pZCAwO1xuWC5TVFRTID0gdm9pZCAwO1xuWC5TVFNDID0gdm9pZCAwO1xuWC5TVENPID0gdm9pZCAwO1xuWC5TVFNaID0gdm9pZCAwO1xuWC5WTUhEID0gdm9pZCAwO1xuWC5TTUhEID0gdm9pZCAwO1xuWC5TVFNEID0gdm9pZCAwO1xuWC5GVFlQID0gdm9pZCAwO1xuWC5ESU5GID0gdm9pZCAwO1xuY29uc3QgU3AgPSA5ZTQ7XG5mdW5jdGlvbiBDdShzLCBlLCB0ID0gMSwgciA9ICExKSB7XG4gIGNvbnN0IG4gPSBzICogZSAqIHQ7XG4gIHJldHVybiByID8gTWF0aC5yb3VuZChuKSA6IG47XG59XG5mdW5jdGlvbiBxVChzLCBlLCB0ID0gMSwgciA9ICExKSB7XG4gIHJldHVybiBDdShzLCBlLCAxIC8gdCwgcik7XG59XG5mdW5jdGlvbiBxbihzLCBlID0gITEpIHtcbiAgcmV0dXJuIEN1KHMsIDFlMywgMSAvIFNwLCBlKTtcbn1cbmZ1bmN0aW9uIFdUKHMsIGUgPSAxKSB7XG4gIHJldHVybiBDdShzLCBTcCwgMSAvIGUpO1xufVxuY29uc3QgelQgPSAxMCAqIDFlMywgWVQgPSAxMDI0LCBaVCA9IDExNTIsIFhUID0gMTUzNjtcbmxldCBwbiA9IG51bGwsIEVsID0gbnVsbDtcbmZ1bmN0aW9uIFVoKHMsIGUsIHQsIHIpIHtcbiAgcmV0dXJuIHtcbiAgICBkdXJhdGlvbjogZSxcbiAgICBzaXplOiB0LFxuICAgIGN0czogcixcbiAgICBmbGFnczoge1xuICAgICAgaXNMZWFkaW5nOiAwLFxuICAgICAgaXNEZXBlbmRlZE9uOiAwLFxuICAgICAgaGFzUmVkdW5kYW5jeTogMCxcbiAgICAgIGRlZ3JhZFByaW86IDAsXG4gICAgICBkZXBlbmRzT246IHMgPyAyIDogMSxcbiAgICAgIGlzTm9uU3luYzogcyA/IDAgOiAxXG4gICAgfVxuICB9O1xufVxuY2xhc3MgbW8gZXh0ZW5kcyBMciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICBpZiAoc3VwZXIoXCJtcDQtcmVtdXhlclwiLCBuKSwgdGhpcy5vYnNlcnZlciA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMudHlwZVN1cHBvcnRlZCA9IHZvaWQgMCwgdGhpcy5JU0dlbmVyYXRlZCA9ICExLCB0aGlzLl9pbml0UFRTID0gbnVsbCwgdGhpcy5faW5pdERUUyA9IG51bGwsIHRoaXMubmV4dFZpZGVvVHMgPSBudWxsLCB0aGlzLm5leHRBdWRpb1RzID0gbnVsbCwgdGhpcy52aWRlb1NhbXBsZUR1cmF0aW9uID0gbnVsbCwgdGhpcy5pc0F1ZGlvQ29udGlndW91cyA9ICExLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gITEsIHRoaXMudmlkZW9UcmFja0NvbmZpZyA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IGUsIHRoaXMuY29uZmlnID0gdCwgdGhpcy50eXBlU3VwcG9ydGVkID0gciwgdGhpcy5JU0dlbmVyYXRlZCA9ICExLCBwbiA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbyA9IChuYXZpZ2F0b3IudXNlckFnZW50IHx8IFwiXCIpLm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvaSk7XG4gICAgICBwbiA9IG8gPyBwYXJzZUludChvWzFdKSA6IDA7XG4gICAgfVxuICAgIGlmIChFbCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgaSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhZmFyaVxcLyhcXGQrKS9pKTtcbiAgICAgIEVsID0gaSA/IHBhcnNlSW50KGlbMV0pIDogMDtcbiAgICB9XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMudmlkZW9UcmFja0NvbmZpZyA9IHRoaXMuX2luaXRQVFMgPSB0aGlzLl9pbml0RFRTID0gbnVsbDtcbiAgfVxuICByZXNldFRpbWVTdGFtcChlKSB7XG4gICAgdGhpcy5sb2coXCJpbml0UFRTICYgaW5pdERUUyByZXNldFwiKSwgdGhpcy5faW5pdFBUUyA9IHRoaXMuX2luaXREVFMgPSBlO1xuICB9XG4gIHJlc2V0TmV4dFRpbWVzdGFtcCgpIHtcbiAgICB0aGlzLmxvZyhcInJlc2V0IG5leHQgdGltZXN0YW1wXCIpLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gITEsIHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMgPSAhMTtcbiAgfVxuICByZXNldEluaXRTZWdtZW50KCkge1xuICAgIHRoaXMubG9nKFwiSVNHZW5lcmF0ZWQgZmxhZyByZXNldFwiKSwgdGhpcy5JU0dlbmVyYXRlZCA9ICExLCB0aGlzLnZpZGVvVHJhY2tDb25maWcgPSB2b2lkIDA7XG4gIH1cbiAgZ2V0VmlkZW9TdGFydFB0cyhlKSB7XG4gICAgbGV0IHQgPSAhMTtcbiAgICBjb25zdCByID0gZVswXS5wdHMsIG4gPSBlLnJlZHVjZSgoaSwgbykgPT4ge1xuICAgICAgbGV0IGEgPSBvLnB0cywgbCA9IGEgLSBpO1xuICAgICAgcmV0dXJuIGwgPCAtNDI5NDk2NzI5NiAmJiAodCA9ICEwLCBhID0gQXIoYSwgciksIGwgPSBhIC0gaSksIGwgPiAwID8gaSA6IGE7XG4gICAgfSwgcik7XG4gICAgcmV0dXJuIHQgJiYgdGhpcy5kZWJ1ZyhcIlBUUyByb2xsb3ZlciBkZXRlY3RlZFwiKSwgbjtcbiAgfVxuICByZW11eChlLCB0LCByLCBuLCBpLCBvLCBhLCBsKSB7XG4gICAgbGV0IGMsIHUsIGQsIGgsIGYsIHAsIHkgPSBpLCBFID0gaTtcbiAgICBjb25zdCBiID0gZS5waWQgPiAtMSwgUiA9IHQucGlkID4gLTEsIEEgPSB0LnNhbXBsZXMubGVuZ3RoLCBGID0gZS5zYW1wbGVzLmxlbmd0aCA+IDAsIE0gPSBhICYmIEEgPiAwIHx8IEEgPiAxO1xuICAgIGlmICgoIWIgfHwgRikgJiYgKCFSIHx8IE0pIHx8IHRoaXMuSVNHZW5lcmF0ZWQgfHwgYSkge1xuICAgICAgaWYgKHRoaXMuSVNHZW5lcmF0ZWQpIHtcbiAgICAgICAgdmFyIEssIGosIEMsIGs7XG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLnZpZGVvVHJhY2tDb25maWc7XG4gICAgICAgIChnICYmICh0LndpZHRoICE9PSBnLndpZHRoIHx8IHQuaGVpZ2h0ICE9PSBnLmhlaWdodCB8fCAoKEsgPSB0LnBpeGVsUmF0aW8pID09IG51bGwgPyB2b2lkIDAgOiBLWzBdKSAhPT0gKChqID0gZy5waXhlbFJhdGlvKSA9PSBudWxsID8gdm9pZCAwIDogalswXSkgfHwgKChDID0gdC5waXhlbFJhdGlvKSA9PSBudWxsID8gdm9pZCAwIDogQ1sxXSkgIT09ICgoayA9IGcucGl4ZWxSYXRpbykgPT0gbnVsbCA/IHZvaWQgMCA6IGtbMV0pKSB8fCAhZyAmJiBNIHx8IHRoaXMubmV4dEF1ZGlvVHMgPT09IG51bGwgJiYgRikgJiYgdGhpcy5yZXNldEluaXRTZWdtZW50KCk7XG4gICAgICB9XG4gICAgICB0aGlzLklTR2VuZXJhdGVkIHx8IChkID0gdGhpcy5nZW5lcmF0ZUlTKGUsIHQsIGksIG8pKTtcbiAgICAgIGNvbnN0ICQgPSB0aGlzLmlzVmlkZW9Db250aWd1b3VzO1xuICAgICAgbGV0IFcgPSAtMSwgXztcbiAgICAgIGlmIChNICYmIChXID0gSlQodC5zYW1wbGVzKSwgISQgJiYgdGhpcy5jb25maWcuZm9yY2VLZXlGcmFtZU9uRGlzY29udGludWl0eSkpXG4gICAgICAgIGlmIChwID0gITAsIFcgPiAwKSB7XG4gICAgICAgICAgdGhpcy53YXJuKGBEcm9wcGVkICR7V30gb3V0IG9mICR7QX0gdmlkZW8gc2FtcGxlcyBkdWUgdG8gYSBtaXNzaW5nIGtleWZyYW1lYCk7XG4gICAgICAgICAgY29uc3QgZyA9IHRoaXMuZ2V0VmlkZW9TdGFydFB0cyh0LnNhbXBsZXMpO1xuICAgICAgICAgIHQuc2FtcGxlcyA9IHQuc2FtcGxlcy5zbGljZShXKSwgdC5kcm9wcGVkICs9IFcsIEUgKz0gKHQuc2FtcGxlc1swXS5wdHMgLSBnKSAvIHQuaW5wdXRUaW1lU2NhbGUsIF8gPSBFO1xuICAgICAgICB9IGVsc2UgVyA9PT0gLTEgJiYgKHRoaXMud2FybihgTm8ga2V5ZnJhbWUgZm91bmQgb3V0IG9mICR7QX0gdmlkZW8gc2FtcGxlc2ApLCBwID0gITEpO1xuICAgICAgaWYgKHRoaXMuSVNHZW5lcmF0ZWQpIHtcbiAgICAgICAgaWYgKEYgJiYgTSkge1xuICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLmdldFZpZGVvU3RhcnRQdHModC5zYW1wbGVzKSwgdyA9IChBcihlLnNhbXBsZXNbMF0ucHRzLCBnKSAtIGcpIC8gdC5pbnB1dFRpbWVTY2FsZTtcbiAgICAgICAgICB5ICs9IE1hdGgubWF4KDAsIHcpLCBFICs9IE1hdGgubWF4KDAsIC13KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRikge1xuICAgICAgICAgIGlmIChlLnNhbXBsZXJhdGUgfHwgKHRoaXMud2FybihcInJlZ2VuZXJhdGUgSW5pdFNlZ21lbnQgYXMgYXVkaW8gZGV0ZWN0ZWRcIiksIGQgPSB0aGlzLmdlbmVyYXRlSVMoZSwgdCwgaSwgbykpLCB1ID0gdGhpcy5yZW11eEF1ZGlvKGUsIHksIHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMsIG8sIFIgfHwgTSB8fCBsID09PSBwZS5BVURJTyA/IEUgOiB2b2lkIDApLCBNKSB7XG4gICAgICAgICAgICBjb25zdCBnID0gdSA/IHUuZW5kUFRTIC0gdS5zdGFydFBUUyA6IDA7XG4gICAgICAgICAgICB0LmlucHV0VGltZVNjYWxlIHx8ICh0aGlzLndhcm4oXCJyZWdlbmVyYXRlIEluaXRTZWdtZW50IGFzIHZpZGVvIGRldGVjdGVkXCIpLCBkID0gdGhpcy5nZW5lcmF0ZUlTKGUsIHQsIGksIG8pKSwgYyA9IHRoaXMucmVtdXhWaWRlbyh0LCBFLCAkLCBnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBNICYmIChjID0gdGhpcy5yZW11eFZpZGVvKHQsIEUsICQsIDApKTtcbiAgICAgICAgYyAmJiAoYy5maXJzdEtleUZyYW1lID0gVywgYy5pbmRlcGVuZGVudCA9IFcgIT09IC0xLCBjLmZpcnN0S2V5RnJhbWVQVFMgPSBfKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuSVNHZW5lcmF0ZWQgJiYgdGhpcy5faW5pdFBUUyAmJiB0aGlzLl9pbml0RFRTICYmIChyLnNhbXBsZXMubGVuZ3RoICYmIChmID0gYnAociwgaSwgdGhpcy5faW5pdFBUUywgdGhpcy5faW5pdERUUykpLCBuLnNhbXBsZXMubGVuZ3RoICYmIChoID0gVHAobiwgaSwgdGhpcy5faW5pdFBUUykpKSwge1xuICAgICAgYXVkaW86IHUsXG4gICAgICB2aWRlbzogYyxcbiAgICAgIGluaXRTZWdtZW50OiBkLFxuICAgICAgaW5kZXBlbmRlbnQ6IHAsXG4gICAgICB0ZXh0OiBoLFxuICAgICAgaWQzOiBmXG4gICAgfTtcbiAgfVxuICBnZW5lcmF0ZUlTKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gZS5zYW1wbGVzLCBvID0gdC5zYW1wbGVzLCBhID0gdGhpcy50eXBlU3VwcG9ydGVkLCBsID0ge30sIGMgPSB0aGlzLl9pbml0UFRTO1xuICAgIGxldCB1ID0gIWMgfHwgbiwgZCA9IFwiYXVkaW8vbXA0XCIsIGgsIGYsIHAsIHkgPSAtMTtcbiAgICBpZiAodSAmJiAoaCA9IGYgPSAxIC8gMCksIGUuY29uZmlnICYmIGkubGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKGUudGltZXNjYWxlID0gZS5zYW1wbGVyYXRlLCBlLnNlZ21lbnRDb2RlYykge1xuICAgICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgICAgYS5tcGVnID8gKGQgPSBcImF1ZGlvL21wZWdcIiwgZS5jb2RlYyA9IFwiXCIpIDogYS5tcDMgJiYgKGUuY29kZWMgPSBcIm1wM1wiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImFjM1wiOlxuICAgICAgICAgIGUuY29kZWMgPSBcImFjLTNcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGwuYXVkaW8gPSB7XG4gICAgICAgIGlkOiBcImF1ZGlvXCIsXG4gICAgICAgIGNvbnRhaW5lcjogZCxcbiAgICAgICAgY29kZWM6IGUuY29kZWMsXG4gICAgICAgIGluaXRTZWdtZW50OiBlLnNlZ21lbnRDb2RlYyA9PT0gXCJtcDNcIiAmJiBhLm1wZWcgPyBuZXcgVWludDhBcnJheSgwKSA6IFguaW5pdFNlZ21lbnQoW2VdKSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGUuY2hhbm5lbENvdW50XG4gICAgICAgIH1cbiAgICAgIH0sIHUgJiYgKHkgPSBlLmlkLCBwID0gZS5pbnB1dFRpbWVTY2FsZSwgIWMgfHwgcCAhPT0gYy50aW1lc2NhbGUgPyBoID0gZiA9IGlbMF0ucHRzIC0gTWF0aC5yb3VuZChwICogcikgOiB1ID0gITEpO1xuICAgIH1cbiAgICBpZiAodC5zcHMgJiYgdC5wcHMgJiYgby5sZW5ndGgpIHtcbiAgICAgIGlmICh0LnRpbWVzY2FsZSA9IHQuaW5wdXRUaW1lU2NhbGUsIGwudmlkZW8gPSB7XG4gICAgICAgIGlkOiBcIm1haW5cIixcbiAgICAgICAgY29udGFpbmVyOiBcInZpZGVvL21wNFwiLFxuICAgICAgICBjb2RlYzogdC5jb2RlYyxcbiAgICAgICAgaW5pdFNlZ21lbnQ6IFguaW5pdFNlZ21lbnQoW3RdKSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB3aWR0aDogdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHQuaGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0sIHUpXG4gICAgICAgIGlmICh5ID0gdC5pZCwgcCA9IHQuaW5wdXRUaW1lU2NhbGUsICFjIHx8IHAgIT09IGMudGltZXNjYWxlKSB7XG4gICAgICAgICAgY29uc3QgRSA9IHRoaXMuZ2V0VmlkZW9TdGFydFB0cyhvKSwgYiA9IE1hdGgucm91bmQocCAqIHIpO1xuICAgICAgICAgIGYgPSBNYXRoLm1pbihmLCBBcihvWzBdLmR0cywgRSkgLSBiKSwgaCA9IE1hdGgubWluKGgsIEUgLSBiKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdSA9ICExO1xuICAgICAgdGhpcy52aWRlb1RyYWNrQ29uZmlnID0ge1xuICAgICAgICB3aWR0aDogdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0LmhlaWdodCxcbiAgICAgICAgcGl4ZWxSYXRpbzogdC5waXhlbFJhdGlvXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMobCkubGVuZ3RoKVxuICAgICAgcmV0dXJuIHRoaXMuSVNHZW5lcmF0ZWQgPSAhMCwgdSA/IChjICYmIHRoaXMud2FybihgVGltZXN0YW1wcyBhdCBwbGF5bGlzdCB0aW1lOiAke24gPyBcIlwiIDogXCJ+XCJ9JHtyfSAke2ggLyBwfSAhPSBpbml0UFRTOiAke2MuYmFzZVRpbWUgLyBjLnRpbWVzY2FsZX0gKCR7Yy5iYXNlVGltZX0vJHtjLnRpbWVzY2FsZX0pIHRyYWNrSWQ6ICR7Yy50cmFja0lkfWApLCB0aGlzLmxvZyhgRm91bmQgaW5pdFBUUyBhdCBwbGF5bGlzdCB0aW1lOiAke3J9IG9mZnNldDogJHtoIC8gcH0gKCR7aH0vJHtwfSkgdHJhY2tJZDogJHt5fWApLCB0aGlzLl9pbml0UFRTID0ge1xuICAgICAgICBiYXNlVGltZTogaCxcbiAgICAgICAgdGltZXNjYWxlOiBwLFxuICAgICAgICB0cmFja0lkOiB5XG4gICAgICB9LCB0aGlzLl9pbml0RFRTID0ge1xuICAgICAgICBiYXNlVGltZTogZixcbiAgICAgICAgdGltZXNjYWxlOiBwLFxuICAgICAgICB0cmFja0lkOiB5XG4gICAgICB9KSA6IGggPSBwID0gdm9pZCAwLCB7XG4gICAgICAgIHRyYWNrczogbCxcbiAgICAgICAgaW5pdFBUUzogaCxcbiAgICAgICAgdGltZXNjYWxlOiBwLFxuICAgICAgICB0cmFja0lkOiB5XG4gICAgICB9O1xuICB9XG4gIHJlbXV4VmlkZW8oZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSBlLmlucHV0VGltZVNjYWxlLCBvID0gZS5zYW1wbGVzLCBhID0gW10sIGwgPSBvLmxlbmd0aCwgYyA9IHRoaXMuX2luaXRQVFMsIHUgPSBjLmJhc2VUaW1lICogaSAvIGMudGltZXNjYWxlO1xuICAgIGxldCBkID0gdGhpcy5uZXh0VmlkZW9UcywgaCA9IDgsIGYgPSB0aGlzLnZpZGVvU2FtcGxlRHVyYXRpb24sIHAsIHksIEUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGIgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIFIgPSAhMTtcbiAgICBpZiAoIXIgfHwgZCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgTCA9IHUgKyB0ICogaSwgbSA9IG9bMF0ucHRzIC0gQXIob1swXS5kdHMsIG9bMF0ucHRzKTtcbiAgICAgIHBuICYmIGQgIT09IG51bGwgJiYgTWF0aC5hYnMoTCAtIG0gLSAoZCArIHUpKSA8IDE1ZTMgPyByID0gITAgOiBkID0gTCAtIG0gLSB1O1xuICAgIH1cbiAgICBjb25zdCBBID0gZCArIHU7XG4gICAgZm9yIChsZXQgTCA9IDA7IEwgPCBsOyBMKyspIHtcbiAgICAgIGNvbnN0IG0gPSBvW0xdO1xuICAgICAgbS5wdHMgPSBBcihtLnB0cywgQSksIG0uZHRzID0gQXIobS5kdHMsIEEpLCBtLmR0cyA8IG9bTCA+IDAgPyBMIC0gMSA6IExdLmR0cyAmJiAoUiA9ICEwKTtcbiAgICB9XG4gICAgUiAmJiBvLnNvcnQoZnVuY3Rpb24oTCwgbSkge1xuICAgICAgY29uc3QgdiA9IEwuZHRzIC0gbS5kdHMsIFAgPSBMLnB0cyAtIG0ucHRzO1xuICAgICAgcmV0dXJuIHYgfHwgUDtcbiAgICB9KSwgcCA9IG9bMF0uZHRzLCB5ID0gb1tvLmxlbmd0aCAtIDFdLmR0cztcbiAgICBjb25zdCBGID0geSAtIHAsIE0gPSBGID8gTWF0aC5yb3VuZChGIC8gKGwgLSAxKSkgOiBmIHx8IGUuaW5wdXRUaW1lU2NhbGUgLyAzMDtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgTCA9IHAgLSBBLCBtID0gTCA+IE0sIHYgPSBMIDwgLTE7XG4gICAgICBpZiAoKG0gfHwgdikgJiYgKG0gPyB0aGlzLndhcm4oYCR7KGUuc2VnbWVudENvZGVjIHx8IFwiXCIpLnRvVXBwZXJDYXNlKCl9OiAke3FuKEwsICEwKX0gbXMgKCR7TH1kdHMpIGhvbGUgYmV0d2VlbiBmcmFnbWVudHMgZGV0ZWN0ZWQgYXQgJHt0LnRvRml4ZWQoMyl9YCkgOiB0aGlzLndhcm4oYCR7KGUuc2VnbWVudENvZGVjIHx8IFwiXCIpLnRvVXBwZXJDYXNlKCl9OiAke3FuKC1MLCAhMCl9IG1zICgke0x9ZHRzKSBvdmVybGFwcGluZyBiZXR3ZWVuIGZyYWdtZW50cyBkZXRlY3RlZCBhdCAke3QudG9GaXhlZCgzKX1gKSwgIXYgfHwgQSA+PSBvWzBdLnB0cyB8fCBwbikpIHtcbiAgICAgICAgcCA9IEE7XG4gICAgICAgIGNvbnN0IFAgPSBvWzBdLnB0cyAtIEw7XG4gICAgICAgIGlmIChtKVxuICAgICAgICAgIG9bMF0uZHRzID0gcCwgb1swXS5wdHMgPSBQO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsZXQgTiA9ICEwO1xuICAgICAgICAgIGZvciAobGV0IFkgPSAwOyBZIDwgby5sZW5ndGggJiYgIShvW1ldLmR0cyA+IFAgJiYgTik7IFkrKykge1xuICAgICAgICAgICAgY29uc3QgZWUgPSBvW1ldLnB0cztcbiAgICAgICAgICAgIGlmIChvW1ldLmR0cyAtPSBMLCBvW1ldLnB0cyAtPSBMLCBZIDwgby5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGllID0gb1tZICsgMV0ucHRzLCBsZSA9IG9bWV0ucHRzLCBUZSA9IGllIDw9IGxlLCBEZSA9IGllIDw9IGVlO1xuICAgICAgICAgICAgICBOID0gVGUgPT0gRGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBWaWRlbzogSW5pdGlhbCBQVFMvRFRTIGFkanVzdGVkOiAke3FuKFAsICEwKX0vJHtxbihwLCAhMCl9LCBkZWx0YTogJHtxbihMLCAhMCl9IG1zYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHAgPSBNYXRoLm1heCgwLCBwKTtcbiAgICBsZXQgSCA9IDAsIEsgPSAwLCBqID0gcDtcbiAgICBmb3IgKGxldCBMID0gMDsgTCA8IGw7IEwrKykge1xuICAgICAgY29uc3QgbSA9IG9bTF0sIHYgPSBtLnVuaXRzLCBQID0gdi5sZW5ndGg7XG4gICAgICBsZXQgTiA9IDA7XG4gICAgICBmb3IgKGxldCBZID0gMDsgWSA8IFA7IFkrKylcbiAgICAgICAgTiArPSB2W1ldLmRhdGEubGVuZ3RoO1xuICAgICAgSyArPSBOLCBIICs9IFAsIG0ubGVuZ3RoID0gTiwgbS5kdHMgPCBqID8gKG0uZHRzID0gaiwgaiArPSBNIC8gNCB8IDAgfHwgMSkgOiBqID0gbS5kdHMsIEUgPSBNYXRoLm1pbihtLnB0cywgRSksIGIgPSBNYXRoLm1heChtLnB0cywgYik7XG4gICAgfVxuICAgIHkgPSBvW2wgLSAxXS5kdHM7XG4gICAgY29uc3QgQyA9IEsgKyA0ICogSCArIDg7XG4gICAgbGV0IGs7XG4gICAgdHJ5IHtcbiAgICAgIGsgPSBuZXcgVWludDhBcnJheShDKTtcbiAgICB9IGNhdGNoIChMKSB7XG4gICAgICB0aGlzLm9ic2VydmVyLmVtaXQoSS5FUlJPUiwgSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5NVVhfRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouUkVNVVhfQUxMT0NfRVJST1IsXG4gICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgZXJyb3I6IEwsXG4gICAgICAgIGJ5dGVzOiBDLFxuICAgICAgICByZWFzb246IGBmYWlsIGFsbG9jYXRpbmcgdmlkZW8gbWRhdCAke0N9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0ICQgPSBuZXcgRGF0YVZpZXcoay5idWZmZXIpO1xuICAgICQuc2V0VWludDMyKDAsIEMpLCBrLnNldChYLnR5cGVzLm1kYXQsIDQpO1xuICAgIGxldCBXID0gITEsIF8gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGcgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHcgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgZm9yIChsZXQgTCA9IDA7IEwgPCBsOyBMKyspIHtcbiAgICAgIGNvbnN0IG0gPSBvW0xdLCB2ID0gbS51bml0cztcbiAgICAgIGxldCBQID0gMDtcbiAgICAgIGZvciAobGV0IGVlID0gMCwgaWUgPSB2Lmxlbmd0aDsgZWUgPCBpZTsgZWUrKykge1xuICAgICAgICBjb25zdCBsZSA9IHZbZWVdLCBUZSA9IGxlLmRhdGEsIERlID0gbGUuZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAkLnNldFVpbnQzMihoLCBEZSksIGggKz0gNCwgay5zZXQoVGUsIGgpLCBoICs9IERlLCBQICs9IDQgKyBEZTtcbiAgICAgIH1cbiAgICAgIGxldCBOO1xuICAgICAgaWYgKEwgPCBsIC0gMSlcbiAgICAgICAgZiA9IG9bTCArIDFdLmR0cyAtIG0uZHRzLCBOID0gb1tMICsgMV0ucHRzIC0gbS5wdHM7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZWUgPSB0aGlzLmNvbmZpZywgaWUgPSBMID4gMCA/IG0uZHRzIC0gb1tMIC0gMV0uZHRzIDogTTtcbiAgICAgICAgaWYgKE4gPSBMID4gMCA/IG0ucHRzIC0gb1tMIC0gMV0ucHRzIDogTSwgZWUuc3RyZXRjaFNob3J0VmlkZW9UcmFjayAmJiB0aGlzLm5leHRBdWRpb1RzICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgbGUgPSBNYXRoLmZsb29yKGVlLm1heEJ1ZmZlckhvbGUgKiBpKSwgVGUgPSAobiA/IEUgKyBuICogaSA6IHRoaXMubmV4dEF1ZGlvVHMgKyB1KSAtIG0ucHRzO1xuICAgICAgICAgIFRlID4gbGUgPyAoZiA9IFRlIC0gaWUsIGYgPCAwID8gZiA9IGllIDogVyA9ICEwLCB0aGlzLmxvZyhgSXQgaXMgYXBwcm94aW1hdGVseSAke1RlIC8gOTB9IG1zIHRvIHRoZSBuZXh0IHNlZ21lbnQ7IHVzaW5nIGR1cmF0aW9uICR7ZiAvIDkwfSBtcyBmb3IgdGhlIGxhc3QgdmlkZW8gZnJhbWUuYCkpIDogZiA9IGllO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBmID0gaWU7XG4gICAgICB9XG4gICAgICBjb25zdCBZID0gTWF0aC5yb3VuZChtLnB0cyAtIG0uZHRzKTtcbiAgICAgIF8gPSBNYXRoLm1pbihfLCBmKSwgeCA9IE1hdGgubWF4KHgsIGYpLCBnID0gTWF0aC5taW4oZywgTiksIHcgPSBNYXRoLm1heCh3LCBOKSwgYS5wdXNoKFVoKG0ua2V5LCBmLCBQLCBZKSk7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCkge1xuICAgICAgaWYgKHBuKSB7XG4gICAgICAgIGlmIChwbiA8IDcwKSB7XG4gICAgICAgICAgY29uc3QgTCA9IGFbMF0uZmxhZ3M7XG4gICAgICAgICAgTC5kZXBlbmRzT24gPSAyLCBMLmlzTm9uU3luYyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoRWwgJiYgdyAtIGcgPCB4IC0gXyAmJiBNIC8geCA8IDAuMDI1ICYmIGFbMF0uY3RzID09PSAwKSB7XG4gICAgICAgIHRoaXMud2FybihcIkZvdW5kIGlycmVndWxhciBnYXBzIGluIHNhbXBsZSBkdXJhdGlvbi4gVXNpbmcgUFRTIGluc3RlYWQgb2YgRFRTIHRvIGRldGVybWluZSBNUDQgc2FtcGxlIGR1cmF0aW9uLlwiKTtcbiAgICAgICAgbGV0IEwgPSBwO1xuICAgICAgICBmb3IgKGxldCBtID0gMCwgdiA9IGEubGVuZ3RoOyBtIDwgdjsgbSsrKSB7XG4gICAgICAgICAgY29uc3QgUCA9IEwgKyBhW21dLmR1cmF0aW9uLCBOID0gTCArIGFbbV0uY3RzO1xuICAgICAgICAgIGlmIChtIDwgdiAtIDEpIHtcbiAgICAgICAgICAgIGNvbnN0IFkgPSBQICsgYVttICsgMV0uY3RzO1xuICAgICAgICAgICAgYVttXS5kdXJhdGlvbiA9IFkgLSBOO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgYVttXS5kdXJhdGlvbiA9IG0gPyBhW20gLSAxXS5kdXJhdGlvbiA6IE07XG4gICAgICAgICAgYVttXS5jdHMgPSAwLCBMID0gUDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmID0gVyB8fCAhZiA/IE0gOiBmO1xuICAgIGNvbnN0IEQgPSB5ICsgZjtcbiAgICB0aGlzLm5leHRWaWRlb1RzID0gZCA9IEQgLSB1LCB0aGlzLnZpZGVvU2FtcGxlRHVyYXRpb24gPSBmLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gITA7XG4gICAgY29uc3QgViA9IHtcbiAgICAgIGRhdGExOiBYLm1vb2YoZS5zZXF1ZW5jZU51bWJlcisrLCBwLCBudChlLCB7XG4gICAgICAgIHNhbXBsZXM6IGFcbiAgICAgIH0pKSxcbiAgICAgIGRhdGEyOiBrLFxuICAgICAgc3RhcnRQVFM6IChFIC0gdSkgLyBpLFxuICAgICAgZW5kUFRTOiAoYiArIGYgLSB1KSAvIGksXG4gICAgICBzdGFydERUUzogKHAgLSB1KSAvIGksXG4gICAgICBlbmREVFM6IGQgLyBpLFxuICAgICAgdHlwZTogXCJ2aWRlb1wiLFxuICAgICAgaGFzQXVkaW86ICExLFxuICAgICAgaGFzVmlkZW86ICEwLFxuICAgICAgbmI6IGEubGVuZ3RoLFxuICAgICAgZHJvcHBlZDogZS5kcm9wcGVkXG4gICAgfTtcbiAgICByZXR1cm4gZS5zYW1wbGVzID0gW10sIGUuZHJvcHBlZCA9IDAsIFY7XG4gIH1cbiAgZ2V0U2FtcGxlc1BlckZyYW1lKGUpIHtcbiAgICBzd2l0Y2ggKGUuc2VnbWVudENvZGVjKSB7XG4gICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgIHJldHVybiBaVDtcbiAgICAgIGNhc2UgXCJhYzNcIjpcbiAgICAgICAgcmV0dXJuIFhUO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFlUO1xuICAgIH1cbiAgfVxuICByZW11eEF1ZGlvKGUsIHQsIHIsIG4sIGkpIHtcbiAgICBjb25zdCBvID0gZS5pbnB1dFRpbWVTY2FsZSwgYSA9IGUuc2FtcGxlcmF0ZSA/IGUuc2FtcGxlcmF0ZSA6IG8sIGwgPSBvIC8gYSwgYyA9IHRoaXMuZ2V0U2FtcGxlc1BlckZyYW1lKGUpLCB1ID0gYyAqIGwsIGQgPSB0aGlzLl9pbml0UFRTLCBoID0gZS5zZWdtZW50Q29kZWMgPT09IFwibXAzXCIgJiYgdGhpcy50eXBlU3VwcG9ydGVkLm1wZWcsIGYgPSBbXSwgcCA9IGkgIT09IHZvaWQgMDtcbiAgICBsZXQgeSA9IGUuc2FtcGxlcywgRSA9IGggPyAwIDogOCwgYiA9IHRoaXMubmV4dEF1ZGlvVHMgfHwgLTE7XG4gICAgY29uc3QgUiA9IGQuYmFzZVRpbWUgKiBvIC8gZC50aW1lc2NhbGUsIEEgPSBSICsgdCAqIG87XG4gICAgaWYgKHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMgPSByID0gciB8fCB5Lmxlbmd0aCAmJiBiID4gMCAmJiAobiAmJiBNYXRoLmFicyhBIC0gKGIgKyBSKSkgPCA5ZTMgfHwgTWF0aC5hYnMoQXIoeVswXS5wdHMsIEEpIC0gKGIgKyBSKSkgPCAyMCAqIHUpLCB5LmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgdy5wdHMgPSBBcih3LnB0cywgQSk7XG4gICAgfSksICFyIHx8IGIgPCAwKSB7XG4gICAgICBpZiAoeSA9IHkuZmlsdGVyKCh3KSA9PiB3LnB0cyA+PSAwKSwgIXkubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgICBpID09PSAwID8gYiA9IDAgOiBuICYmICFwID8gYiA9IE1hdGgubWF4KDAsIEEgLSBSKSA6IGIgPSB5WzBdLnB0cyAtIFI7XG4gICAgfVxuICAgIGlmIChlLnNlZ21lbnRDb2RlYyA9PT0gXCJhYWNcIikge1xuICAgICAgY29uc3QgdyA9IHRoaXMuY29uZmlnLm1heEF1ZGlvRnJhbWVzRHJpZnQ7XG4gICAgICBmb3IgKGxldCBEID0gMCwgTyA9IGIgKyBSOyBEIDwgeS5sZW5ndGg7IEQrKykge1xuICAgICAgICBjb25zdCBVID0geVtEXSwgViA9IFUucHRzLCBMID0gViAtIE8sIG0gPSBNYXRoLmFicygxZTMgKiBMIC8gbyk7XG4gICAgICAgIGlmIChMIDw9IC13ICogdSAmJiBwKVxuICAgICAgICAgIEQgPT09IDAgJiYgKHRoaXMud2FybihgQXVkaW8gZnJhbWUgQCAkeyhWIC8gbykudG9GaXhlZCgzKX1zIG92ZXJsYXBzIG1hcmtlciBieSAke01hdGgucm91bmQoMWUzICogTCAvIG8pfSBtcy5gKSwgdGhpcy5uZXh0QXVkaW9UcyA9IGIgPSBWIC0gUiwgTyA9IFYpO1xuICAgICAgICBlbHNlIGlmIChMID49IHcgKiB1ICYmIG0gPCB6VCAmJiBwKSB7XG4gICAgICAgICAgbGV0IHYgPSBNYXRoLnJvdW5kKEwgLyB1KTtcbiAgICAgICAgICBmb3IgKE8gPSBWIC0gdiAqIHU7IE8gPCAwICYmIHYgJiYgdTsgKVxuICAgICAgICAgICAgdi0tLCBPICs9IHU7XG4gICAgICAgICAgRCA9PT0gMCAmJiAodGhpcy5uZXh0QXVkaW9UcyA9IGIgPSBPIC0gUiksIHRoaXMud2FybihgSW5qZWN0aW5nICR7dn0gYXVkaW8gZnJhbWVzIEAgJHsoKE8gLSBSKSAvIG8pLnRvRml4ZWQoMyl9cyBkdWUgdG8gJHtNYXRoLnJvdW5kKDFlMyAqIEwgLyBvKX0gbXMgZ2FwLmApO1xuICAgICAgICAgIGZvciAobGV0IFAgPSAwOyBQIDwgdjsgUCsrKSB7XG4gICAgICAgICAgICBsZXQgTiA9IEhULmdldFNpbGVudEZyYW1lKGUucGFyc2VkQ29kZWMgfHwgZS5tYW5pZmVzdENvZGVjIHx8IGUuY29kZWMsIGUuY2hhbm5lbENvdW50KTtcbiAgICAgICAgICAgIE4gfHwgKHRoaXMubG9nKFwiVW5hYmxlIHRvIGdldCBzaWxlbnQgZnJhbWUgZm9yIGdpdmVuIGF1ZGlvIGNvZGVjOyBkdXBsaWNhdGluZyBsYXN0IGZyYW1lIGluc3RlYWQuXCIpLCBOID0gVS51bml0LnN1YmFycmF5KCkpLCB5LnNwbGljZShELCAwLCB7XG4gICAgICAgICAgICAgIHVuaXQ6IE4sXG4gICAgICAgICAgICAgIHB0czogT1xuICAgICAgICAgICAgfSksIE8gKz0gdSwgRCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBVLnB0cyA9IE8sIE8gKz0gdTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IEYgPSBudWxsLCBNID0gbnVsbCwgSCwgSyA9IDAsIGogPSB5Lmxlbmd0aDtcbiAgICBmb3IgKDsgai0tOyApXG4gICAgICBLICs9IHlbal0udW5pdC5ieXRlTGVuZ3RoO1xuICAgIGZvciAobGV0IHcgPSAwLCBEID0geS5sZW5ndGg7IHcgPCBEOyB3KyspIHtcbiAgICAgIGNvbnN0IE8gPSB5W3ddLCBVID0gTy51bml0O1xuICAgICAgbGV0IFYgPSBPLnB0cztcbiAgICAgIGlmIChNICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG0gPSBmW3cgLSAxXTtcbiAgICAgICAgbS5kdXJhdGlvbiA9IE1hdGgucm91bmQoKFYgLSBNKSAvIGwpO1xuICAgICAgfSBlbHNlIGlmIChyICYmIGUuc2VnbWVudENvZGVjID09PSBcImFhY1wiICYmIChWID0gYiArIFIpLCBGID0gViwgSyA+IDApIHtcbiAgICAgICAgSyArPSBFO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEggPSBuZXcgVWludDhBcnJheShLKTtcbiAgICAgICAgfSBjYXRjaCAobSkge1xuICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZW1pdChJLkVSUk9SLCBJLkVSUk9SLCB7XG4gICAgICAgICAgICB0eXBlOiB2ZS5NVVhfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLlJFTVVYX0FMTE9DX0VSUk9SLFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZXJyb3I6IG0sXG4gICAgICAgICAgICBieXRlczogSyxcbiAgICAgICAgICAgIHJlYXNvbjogYGZhaWwgYWxsb2NhdGluZyBhdWRpbyBtZGF0ICR7S31gXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGggfHwgKG5ldyBEYXRhVmlldyhILmJ1ZmZlcikuc2V0VWludDMyKDAsIEspLCBILnNldChYLnR5cGVzLm1kYXQsIDQpKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm47XG4gICAgICBILnNldChVLCBFKTtcbiAgICAgIGNvbnN0IEwgPSBVLmJ5dGVMZW5ndGg7XG4gICAgICBFICs9IEwsIGYucHVzaChVaCghMCwgYywgTCwgMCkpLCBNID0gVjtcbiAgICB9XG4gICAgY29uc3QgQyA9IGYubGVuZ3RoO1xuICAgIGlmICghQylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBrID0gZltmLmxlbmd0aCAtIDFdO1xuICAgIGIgPSBNIC0gUiwgdGhpcy5uZXh0QXVkaW9UcyA9IGIgKyBsICogay5kdXJhdGlvbjtcbiAgICBjb25zdCAkID0gaCA/IG5ldyBVaW50OEFycmF5KDApIDogWC5tb29mKGUuc2VxdWVuY2VOdW1iZXIrKywgRiAvIGwsIG50KHt9LCBlLCB7XG4gICAgICBzYW1wbGVzOiBmXG4gICAgfSkpO1xuICAgIGUuc2FtcGxlcyA9IFtdO1xuICAgIGNvbnN0IFcgPSAoRiAtIFIpIC8gbywgXyA9IGIgLyBvLCB4ID0ge1xuICAgICAgZGF0YTE6ICQsXG4gICAgICBkYXRhMjogSCxcbiAgICAgIHN0YXJ0UFRTOiBXLFxuICAgICAgZW5kUFRTOiBfLFxuICAgICAgc3RhcnREVFM6IFcsXG4gICAgICBlbmREVFM6IF8sXG4gICAgICB0eXBlOiBcImF1ZGlvXCIsXG4gICAgICBoYXNBdWRpbzogITAsXG4gICAgICBoYXNWaWRlbzogITEsXG4gICAgICBuYjogQ1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMgPSAhMCwgeDtcbiAgfVxufVxuZnVuY3Rpb24gQXIocywgZSkge1xuICBsZXQgdDtcbiAgaWYgKGUgPT09IG51bGwpXG4gICAgcmV0dXJuIHM7XG4gIGZvciAoZSA8IHMgPyB0ID0gLTg1ODk5MzQ1OTIgOiB0ID0gODU4OTkzNDU5MjsgTWF0aC5hYnMocyAtIGUpID4gNDI5NDk2NzI5NjsgKVxuICAgIHMgKz0gdDtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBKVChzKSB7XG4gIGZvciAobGV0IGUgPSAwOyBlIDwgcy5sZW5ndGg7IGUrKylcbiAgICBpZiAoc1tlXS5rZXkpXG4gICAgICByZXR1cm4gZTtcbiAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gYnAocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gcy5zYW1wbGVzLmxlbmd0aDtcbiAgaWYgKCFuKVxuICAgIHJldHVybjtcbiAgY29uc3QgaSA9IHMuaW5wdXRUaW1lU2NhbGU7XG4gIGZvciAobGV0IGEgPSAwOyBhIDwgbjsgYSsrKSB7XG4gICAgY29uc3QgbCA9IHMuc2FtcGxlc1thXTtcbiAgICBsLnB0cyA9IEFyKGwucHRzIC0gdC5iYXNlVGltZSAqIGkgLyB0LnRpbWVzY2FsZSwgZSAqIGkpIC8gaSwgbC5kdHMgPSBBcihsLmR0cyAtIHIuYmFzZVRpbWUgKiBpIC8gci50aW1lc2NhbGUsIGUgKiBpKSAvIGk7XG4gIH1cbiAgY29uc3QgbyA9IHMuc2FtcGxlcztcbiAgcmV0dXJuIHMuc2FtcGxlcyA9IFtdLCB7XG4gICAgc2FtcGxlczogb1xuICB9O1xufVxuZnVuY3Rpb24gVHAocywgZSwgdCkge1xuICBjb25zdCByID0gcy5zYW1wbGVzLmxlbmd0aDtcbiAgaWYgKCFyKVxuICAgIHJldHVybjtcbiAgY29uc3QgbiA9IHMuaW5wdXRUaW1lU2NhbGU7XG4gIGZvciAobGV0IG8gPSAwOyBvIDwgcjsgbysrKSB7XG4gICAgY29uc3QgYSA9IHMuc2FtcGxlc1tvXTtcbiAgICBhLnB0cyA9IEFyKGEucHRzIC0gdC5iYXNlVGltZSAqIG4gLyB0LnRpbWVzY2FsZSwgZSAqIG4pIC8gbjtcbiAgfVxuICBzLnNhbXBsZXMuc29ydCgobywgYSkgPT4gby5wdHMgLSBhLnB0cyk7XG4gIGNvbnN0IGkgPSBzLnNhbXBsZXM7XG4gIHJldHVybiBzLnNhbXBsZXMgPSBbXSwge1xuICAgIHNhbXBsZXM6IGlcbiAgfTtcbn1cbmNsYXNzIFFUIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuKSB7XG4gICAgc3VwZXIoXCJwYXNzdGhyb3VnaC1yZW11eGVyXCIsIG4pLCB0aGlzLmVtaXRJbml0U2VnbWVudCA9ICExLCB0aGlzLmF1ZGlvQ29kZWMgPSB2b2lkIDAsIHRoaXMudmlkZW9Db2RlYyA9IHZvaWQgMCwgdGhpcy5pbml0RGF0YSA9IHZvaWQgMCwgdGhpcy5pbml0UFRTID0gbnVsbCwgdGhpcy5pbml0VHJhY2tzID0gdm9pZCAwLCB0aGlzLmxhc3RFbmRUaW1lID0gbnVsbCwgdGhpcy5pc1ZpZGVvQ29udGlndW91cyA9ICExO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gIH1cbiAgcmVzZXRUaW1lU3RhbXAoZSkge1xuICAgIHRoaXMubGFzdEVuZFRpbWUgPSBudWxsO1xuICAgIGNvbnN0IHQgPSB0aGlzLmluaXRQVFM7XG4gICAgdCAmJiBlICYmIHQuYmFzZVRpbWUgPT09IGUuYmFzZVRpbWUgJiYgdC50aW1lc2NhbGUgPT09IGUudGltZXNjYWxlIHx8ICh0aGlzLmluaXRQVFMgPSBlKTtcbiAgfVxuICByZXNldE5leHRUaW1lc3RhbXAoKSB7XG4gICAgdGhpcy5pc1ZpZGVvQ29udGlndW91cyA9ICExLCB0aGlzLmxhc3RFbmRUaW1lID0gbnVsbDtcbiAgfVxuICByZXNldEluaXRTZWdtZW50KGUsIHQsIHIsIG4pIHtcbiAgICB0aGlzLmF1ZGlvQ29kZWMgPSB0LCB0aGlzLnZpZGVvQ29kZWMgPSByLCB0aGlzLmdlbmVyYXRlSW5pdFNlZ21lbnQoZSwgbiksIHRoaXMuZW1pdEluaXRTZWdtZW50ID0gITA7XG4gIH1cbiAgZ2VuZXJhdGVJbml0U2VnbWVudChlLCB0KSB7XG4gICAgbGV0IHtcbiAgICAgIGF1ZGlvQ29kZWM6IHIsXG4gICAgICB2aWRlb0NvZGVjOiBuXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCEoZSAhPSBudWxsICYmIGUuYnl0ZUxlbmd0aCkpIHtcbiAgICAgIHRoaXMuaW5pdFRyYWNrcyA9IHZvaWQgMCwgdGhpcy5pbml0RGF0YSA9IHZvaWQgMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYXVkaW86IGksXG4gICAgICB2aWRlbzogb1xuICAgIH0gPSB0aGlzLmluaXREYXRhID0gRGcoZSk7XG4gICAgaWYgKHQpXG4gICAgICAkUyhlLCB0KTtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IGwgPSBpIHx8IG87XG4gICAgICBsICE9IG51bGwgJiYgbC5lbmNyeXB0ZWQgJiYgdGhpcy53YXJuKGBJbml0IHNlZ21lbnQgd2l0aCBlbmNyeXB0ZWQgdHJhY2sgd2l0aCBoYXMgbm8ga2V5IChcIiR7bC5jb2RlY31cIikhYCk7XG4gICAgfVxuICAgIGkgJiYgKHIgPSAkaChpLCBvdC5BVURJTywgdGhpcykpLCBvICYmIChuID0gJGgobywgb3QuVklERU8sIHRoaXMpKTtcbiAgICBjb25zdCBhID0ge307XG4gICAgaSAmJiBvID8gYS5hdWRpb3ZpZGVvID0ge1xuICAgICAgY29udGFpbmVyOiBcInZpZGVvL21wNFwiLFxuICAgICAgY29kZWM6IHIgKyBcIixcIiArIG4sXG4gICAgICBzdXBwbGVtZW50YWw6IG8uc3VwcGxlbWVudGFsLFxuICAgICAgZW5jcnlwdGVkOiBvLmVuY3J5cHRlZCxcbiAgICAgIGluaXRTZWdtZW50OiBlLFxuICAgICAgaWQ6IFwibWFpblwiXG4gICAgfSA6IGkgPyBhLmF1ZGlvID0ge1xuICAgICAgY29udGFpbmVyOiBcImF1ZGlvL21wNFwiLFxuICAgICAgY29kZWM6IHIsXG4gICAgICBlbmNyeXB0ZWQ6IGkuZW5jcnlwdGVkLFxuICAgICAgaW5pdFNlZ21lbnQ6IGUsXG4gICAgICBpZDogXCJhdWRpb1wiXG4gICAgfSA6IG8gPyBhLnZpZGVvID0ge1xuICAgICAgY29udGFpbmVyOiBcInZpZGVvL21wNFwiLFxuICAgICAgY29kZWM6IG4sXG4gICAgICBzdXBwbGVtZW50YWw6IG8uc3VwcGxlbWVudGFsLFxuICAgICAgZW5jcnlwdGVkOiBvLmVuY3J5cHRlZCxcbiAgICAgIGluaXRTZWdtZW50OiBlLFxuICAgICAgaWQ6IFwibWFpblwiXG4gICAgfSA6IHRoaXMud2FybihcImluaXRTZWdtZW50IGRvZXMgbm90IGNvbnRhaW4gbW9vdiBvciB0cmFrIGJveGVzLlwiKSwgdGhpcy5pbml0VHJhY2tzID0gYTtcbiAgfVxuICByZW11eChlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgdmFyIGEsIGw7XG4gICAgbGV0IHtcbiAgICAgIGluaXRQVFM6IGMsXG4gICAgICBsYXN0RW5kVGltZTogdVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IGQgPSB7XG4gICAgICBhdWRpbzogdm9pZCAwLFxuICAgICAgdmlkZW86IHZvaWQgMCxcbiAgICAgIHRleHQ6IG4sXG4gICAgICBpZDM6IHIsXG4gICAgICBpbml0U2VnbWVudDogdm9pZCAwXG4gICAgfTtcbiAgICB1ZSh1KSB8fCAodSA9IHRoaXMubGFzdEVuZFRpbWUgPSBpIHx8IDApO1xuICAgIGNvbnN0IGggPSB0LnNhbXBsZXM7XG4gICAgaWYgKCFoLmxlbmd0aClcbiAgICAgIHJldHVybiBkO1xuICAgIGNvbnN0IGYgPSB7XG4gICAgICBpbml0UFRTOiB2b2lkIDAsXG4gICAgICB0aW1lc2NhbGU6IHZvaWQgMCxcbiAgICAgIHRyYWNrSWQ6IHZvaWQgMFxuICAgIH07XG4gICAgbGV0IHAgPSB0aGlzLmluaXREYXRhO1xuICAgIGlmICgoYSA9IHApICE9IG51bGwgJiYgYS5sZW5ndGggfHwgKHRoaXMuZ2VuZXJhdGVJbml0U2VnbWVudChoKSwgcCA9IHRoaXMuaW5pdERhdGEpLCAhKChsID0gcCkgIT0gbnVsbCAmJiBsLmxlbmd0aCkpXG4gICAgICByZXR1cm4gdGhpcy53YXJuKFwiRmFpbGVkIHRvIGdlbmVyYXRlIGluaXRTZWdtZW50LlwiKSwgZDtcbiAgICB0aGlzLmVtaXRJbml0U2VnbWVudCAmJiAoZi50cmFja3MgPSB0aGlzLmluaXRUcmFja3MsIHRoaXMuZW1pdEluaXRTZWdtZW50ID0gITEpO1xuICAgIGNvbnN0IHkgPSBHUyhoLCBwLCB0aGlzKSwgRSA9IHAuYXVkaW8gPyB5W3AuYXVkaW8uaWRdIDogbnVsbCwgYiA9IHAudmlkZW8gPyB5W3AudmlkZW8uaWRdIDogbnVsbCwgUiA9IFppKGIsIDEgLyAwKSwgQSA9IFppKEUsIDEgLyAwKSwgRiA9IFppKGIsIDAsICEwKSwgTSA9IFppKEUsIDAsICEwKTtcbiAgICBsZXQgSCA9IGksIEsgPSAwO1xuICAgIGNvbnN0IGogPSBFICYmICghYiB8fCAhYyAmJiBBIDwgUiB8fCBjICYmIGMudHJhY2tJZCA9PT0gcC5hdWRpby5pZCksIEMgPSBqID8gRSA6IGI7XG4gICAgaWYgKEMpIHtcbiAgICAgIGNvbnN0IE8gPSBDLnRpbWVzY2FsZSwgVSA9IEMuc3RhcnQgLSBpICogTywgViA9IGogPyBwLmF1ZGlvLmlkIDogcC52aWRlby5pZDtcbiAgICAgIEggPSBDLnN0YXJ0IC8gTywgSyA9IGogPyBNIC0gQSA6IEYgLSBSLCAobyB8fCAhYykgJiYgKGUyKGMsIEgsIGksIEspIHx8IE8gIT09IGMudGltZXNjYWxlKSAmJiAoYyAmJiB0aGlzLndhcm4oYFRpbWVzdGFtcHMgYXQgcGxheWxpc3QgdGltZTogJHtvID8gXCJcIiA6IFwiflwifSR7aX0gJHtVIC8gT30gIT0gaW5pdFBUUzogJHtjLmJhc2VUaW1lIC8gYy50aW1lc2NhbGV9ICgke2MuYmFzZVRpbWV9LyR7Yy50aW1lc2NhbGV9KSB0cmFja0lkOiAke2MudHJhY2tJZH1gKSwgdGhpcy5sb2coYEZvdW5kIGluaXRQVFMgYXQgcGxheWxpc3QgdGltZTogJHtpfSBvZmZzZXQ6ICR7SCAtIGl9ICgke1V9LyR7T30pIHRyYWNrSWQ6ICR7Vn1gKSwgYyA9IG51bGwsIGYuaW5pdFBUUyA9IFUsIGYudGltZXNjYWxlID0gTywgZi50cmFja0lkID0gVik7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLndhcm4oYE5vIGF1ZGlvIG9yIHZpZGVvIHNhbXBsZXMgZm91bmQgZm9yIGluaXRQVFMgYXQgcGxheWxpc3QgdGltZTogJHtpfWApO1xuICAgIGMgPyAoZi5pbml0UFRTID0gYy5iYXNlVGltZSwgZi50aW1lc2NhbGUgPSBjLnRpbWVzY2FsZSwgZi50cmFja0lkID0gYy50cmFja0lkKSA6ICgoIWYudGltZXNjYWxlIHx8IGYudHJhY2tJZCA9PT0gdm9pZCAwIHx8IGYuaW5pdFBUUyA9PT0gdm9pZCAwKSAmJiAodGhpcy53YXJuKFwiQ291bGQgbm90IHNldCBpbml0UFRTXCIpLCBmLmluaXRQVFMgPSBILCBmLnRpbWVzY2FsZSA9IDEsIGYudHJhY2tJZCA9IC0xKSwgdGhpcy5pbml0UFRTID0gYyA9IHtcbiAgICAgIGJhc2VUaW1lOiBmLmluaXRQVFMsXG4gICAgICB0aW1lc2NhbGU6IGYudGltZXNjYWxlLFxuICAgICAgdHJhY2tJZDogZi50cmFja0lkXG4gICAgfSk7XG4gICAgY29uc3QgayA9IEggLSBjLmJhc2VUaW1lIC8gYy50aW1lc2NhbGUsICQgPSBrICsgSztcbiAgICBLID4gMCA/IHRoaXMubGFzdEVuZFRpbWUgPSAkIDogKHRoaXMud2FybihcIkR1cmF0aW9uIHBhcnNlZCBmcm9tIG1wNCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm9cIiksIHRoaXMucmVzZXROZXh0VGltZXN0YW1wKCkpO1xuICAgIGNvbnN0IFcgPSAhIXAuYXVkaW8sIF8gPSAhIXAudmlkZW87XG4gICAgbGV0IGcgPSBcIlwiO1xuICAgIFcgJiYgKGcgKz0gXCJhdWRpb1wiKSwgXyAmJiAoZyArPSBcInZpZGVvXCIpO1xuICAgIGNvbnN0IHggPSAocC5hdWRpbyA/IHAuYXVkaW8uZW5jcnlwdGVkIDogITEpIHx8IChwLnZpZGVvID8gcC52aWRlby5lbmNyeXB0ZWQgOiAhMSksIHcgPSB7XG4gICAgICBkYXRhMTogaCxcbiAgICAgIHN0YXJ0UFRTOiBrLFxuICAgICAgc3RhcnREVFM6IGssXG4gICAgICBlbmRQVFM6ICQsXG4gICAgICBlbmREVFM6ICQsXG4gICAgICB0eXBlOiBnLFxuICAgICAgaGFzQXVkaW86IFcsXG4gICAgICBoYXNWaWRlbzogXyxcbiAgICAgIG5iOiAxLFxuICAgICAgZHJvcHBlZDogMCxcbiAgICAgIGVuY3J5cHRlZDogeFxuICAgIH07XG4gICAgZC5hdWRpbyA9IFcgJiYgIV8gPyB3IDogdm9pZCAwLCBkLnZpZGVvID0gXyA/IHcgOiB2b2lkIDA7XG4gICAgY29uc3QgRCA9IGIgPT0gbnVsbCA/IHZvaWQgMCA6IGIuc2FtcGxlQ291bnQ7XG4gICAgaWYgKEQpIHtcbiAgICAgIGNvbnN0IE8gPSBiLmtleUZyYW1lSW5kZXgsIFUgPSBPICE9PSAtMTtcbiAgICAgIHcubmIgPSBELCB3LmRyb3BwZWQgPSBPID09PSAwIHx8IHRoaXMuaXNWaWRlb0NvbnRpZ3VvdXMgPyAwIDogVSA/IE8gOiBELCB3LmluZGVwZW5kZW50ID0gVSwgdy5maXJzdEtleUZyYW1lID0gTywgVSAmJiBiLmtleUZyYW1lU3RhcnQgJiYgKHcuZmlyc3RLZXlGcmFtZVBUUyA9IChiLmtleUZyYW1lU3RhcnQgLSBjLmJhc2VUaW1lKSAvIGMudGltZXNjYWxlKSwgdGhpcy5pc1ZpZGVvQ29udGlndW91cyB8fCAoZC5pbmRlcGVuZGVudCA9IFUpLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzIHx8ICh0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gVSksIHcuZHJvcHBlZCAmJiB0aGlzLndhcm4oYGZtcDQgZG9lcyBub3Qgc3RhcnQgd2l0aCBJRFI6IGZpcnN0SURSICR7T30vJHtEfSBkcm9wcGVkOiAke3cuZHJvcHBlZH0gc3RhcnQ6ICR7dy5maXJzdEtleUZyYW1lUFRTIHx8IFwiTkFcIn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGQuaW5pdFNlZ21lbnQgPSBmLCBkLmlkMyA9IGJwKHIsIGksIGMsIGMpLCBuLnNhbXBsZXMubGVuZ3RoICYmIChkLnRleHQgPSBUcChuLCBpLCBjKSksIGQ7XG4gIH1cbn1cbmZ1bmN0aW9uIFppKHMsIGUsIHQgPSAhMSkge1xuICByZXR1cm4gKHMgPT0gbnVsbCA/IHZvaWQgMCA6IHMuc3RhcnQpICE9PSB2b2lkIDAgPyAocy5zdGFydCArICh0ID8gcy5kdXJhdGlvbiA6IDApKSAvIHMudGltZXNjYWxlIDogZTtcbn1cbmZ1bmN0aW9uIGUyKHMsIGUsIHQsIHIpIHtcbiAgaWYgKHMgPT09IG51bGwpXG4gICAgcmV0dXJuICEwO1xuICBjb25zdCBuID0gTWF0aC5tYXgociwgMSksIGkgPSBlIC0gcy5iYXNlVGltZSAvIHMudGltZXNjYWxlO1xuICByZXR1cm4gTWF0aC5hYnMoaSAtIHQpID4gbjtcbn1cbmZ1bmN0aW9uICRoKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHMuY29kZWM7XG4gIHJldHVybiByICYmIHIubGVuZ3RoID4gNCA/IHIgOiBlID09PSBvdC5BVURJTyA/IHIgPT09IFwiZWMtM1wiIHx8IHIgPT09IFwiYWMtM1wiIHx8IHIgPT09IFwiYWxhY1wiID8gciA6IHIgPT09IFwiZkxhQ1wiIHx8IHIgPT09IFwiT3B1c1wiID8gWG8ociwgITEpIDogKHQud2FybihgVW5oYW5kbGVkIGF1ZGlvIGNvZGVjIFwiJHtyfVwiIGluIG1wNCBNQVBgKSwgciB8fCBcIm1wNGFcIikgOiAodC53YXJuKGBVbmhhbmRsZWQgdmlkZW8gY29kZWMgXCIke3J9XCIgaW4gbXA0IE1BUGApLCByIHx8IFwiYXZjMVwiKTtcbn1cbmxldCBscztcbnRyeSB7XG4gIGxzID0gc2VsZi5wZXJmb3JtYW5jZS5ub3cuYmluZChzZWxmLnBlcmZvcm1hbmNlKTtcbn0gY2F0Y2gge1xuICBscyA9IERhdGUubm93O1xufVxuY29uc3QgeW8gPSBbe1xuICBkZW11eDogVVQsXG4gIHJlbXV4OiBRVFxufSwge1xuICBkZW11eDogSXMsXG4gIHJlbXV4OiBtb1xufSwge1xuICBkZW11eDogT1QsXG4gIHJlbXV4OiBtb1xufSwge1xuICBkZW11eDogRlQsXG4gIHJlbXV4OiBtb1xufV07XG55by5zcGxpY2UoMiwgMCwge1xuICBkZW11eDogQlQsXG4gIHJlbXV4OiBtb1xufSk7XG5jbGFzcyBHaCB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgICB0aGlzLmFzeW5jUmVzdWx0ID0gITEsIHRoaXMubG9nZ2VyID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gdm9pZCAwLCB0aGlzLnR5cGVTdXBwb3J0ZWQgPSB2b2lkIDAsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLmlkID0gdm9pZCAwLCB0aGlzLmRlbXV4ZXIgPSB2b2lkIDAsIHRoaXMucmVtdXhlciA9IHZvaWQgMCwgdGhpcy5kZWNyeXB0ZXIgPSB2b2lkIDAsIHRoaXMucHJvYmUgPSB2b2lkIDAsIHRoaXMuZGVjcnlwdGlvblByb21pc2UgPSBudWxsLCB0aGlzLnRyYW5zbXV4Q29uZmlnID0gdm9pZCAwLCB0aGlzLmN1cnJlbnRUcmFuc211eFN0YXRlID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gZSwgdGhpcy50eXBlU3VwcG9ydGVkID0gdCwgdGhpcy5jb25maWcgPSByLCB0aGlzLmlkID0gaSwgdGhpcy5sb2dnZXIgPSBvO1xuICB9XG4gIGNvbmZpZ3VyZShlKSB7XG4gICAgdGhpcy50cmFuc211eENvbmZpZyA9IGUsIHRoaXMuZGVjcnlwdGVyICYmIHRoaXMuZGVjcnlwdGVyLnJlc2V0KCk7XG4gIH1cbiAgcHVzaChlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHIudHJhbnNtdXhpbmc7XG4gICAgaS5leGVjdXRlU3RhcnQgPSBscygpO1xuICAgIGxldCBvID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgY29uc3Qge1xuICAgICAgY3VycmVudFRyYW5zbXV4U3RhdGU6IGEsXG4gICAgICB0cmFuc211eENvbmZpZzogbFxuICAgIH0gPSB0aGlzO1xuICAgIG4gJiYgKHRoaXMuY3VycmVudFRyYW5zbXV4U3RhdGUgPSBuKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250aWd1b3VzOiBjLFxuICAgICAgZGlzY29udGludWl0eTogdSxcbiAgICAgIHRyYWNrU3dpdGNoOiBkLFxuICAgICAgYWNjdXJhdGVUaW1lT2Zmc2V0OiBoLFxuICAgICAgdGltZU9mZnNldDogZixcbiAgICAgIGluaXRTZWdtZW50Q2hhbmdlOiBwXG4gICAgfSA9IG4gfHwgYSwge1xuICAgICAgYXVkaW9Db2RlYzogeSxcbiAgICAgIHZpZGVvQ29kZWM6IEUsXG4gICAgICBkZWZhdWx0SW5pdFB0czogYixcbiAgICAgIGR1cmF0aW9uOiBSLFxuICAgICAgaW5pdFNlZ21lbnREYXRhOiBBXG4gICAgfSA9IGwsIEYgPSB0MihvLCB0KTtcbiAgICBpZiAoRiAmJiBJbihGLm1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGogPSB0aGlzLmdldERlY3J5cHRlcigpLCBDID0gU3UoRi5tZXRob2QpO1xuICAgICAgaWYgKGouaXNTeW5jKCkpIHtcbiAgICAgICAgbGV0IGsgPSBqLnNvZnR3YXJlRGVjcnlwdChvLCBGLmtleS5idWZmZXIsIEYuaXYuYnVmZmVyLCBDKTtcbiAgICAgICAgaWYgKHIucGFydCA+IC0xKSB7XG4gICAgICAgICAgY29uc3QgVyA9IGouZmx1c2goKTtcbiAgICAgICAgICBrID0gVyAmJiBXLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWspXG4gICAgICAgICAgcmV0dXJuIGkuZXhlY3V0ZUVuZCA9IGxzKCksIHhsKHIpO1xuICAgICAgICBvID0gbmV3IFVpbnQ4QXJyYXkoayk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIHRoaXMuYXN5bmNSZXN1bHQgPSAhMCwgdGhpcy5kZWNyeXB0aW9uUHJvbWlzZSA9IGoud2ViQ3J5cHRvRGVjcnlwdChvLCBGLmtleS5idWZmZXIsIEYuaXYuYnVmZmVyLCBDKS50aGVuKChrKSA9PiB7XG4gICAgICAgICAgY29uc3QgJCA9IHRoaXMucHVzaChrLCBudWxsLCByKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0aW9uUHJvbWlzZSA9IG51bGwsICQ7XG4gICAgICAgIH0pLCB0aGlzLmRlY3J5cHRpb25Qcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBNID0gdGhpcy5uZWVkc1Byb2JpbmcodSwgZCk7XG4gICAgaWYgKE0pIHtcbiAgICAgIGNvbnN0IGogPSB0aGlzLmNvbmZpZ3VyZVRyYW5zbXV4ZXIobyk7XG4gICAgICBpZiAoailcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oYFt0cmFuc211eGVyXSAke2oubWVzc2FnZX1gKSwgdGhpcy5vYnNlcnZlci5lbWl0KEkuRVJST1IsIEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgZXJyb3I6IGosXG4gICAgICAgICAgcmVhc29uOiBqLm1lc3NhZ2VcbiAgICAgICAgfSksIGkuZXhlY3V0ZUVuZCA9IGxzKCksIHhsKHIpO1xuICAgIH1cbiAgICAodSB8fCBkIHx8IHAgfHwgTSkgJiYgdGhpcy5yZXNldEluaXRTZWdtZW50KEEsIHksIEUsIFIsIHQpLCAodSB8fCBwIHx8IE0pICYmIHRoaXMucmVzZXRJbml0aWFsVGltZXN0YW1wKGIpLCBjIHx8IHRoaXMucmVzZXRDb250aWd1aXR5KCk7XG4gICAgY29uc3QgSCA9IHRoaXMudHJhbnNtdXgobywgRiwgZiwgaCwgcik7XG4gICAgdGhpcy5hc3luY1Jlc3VsdCA9IHhpKEgpO1xuICAgIGNvbnN0IEsgPSB0aGlzLmN1cnJlbnRUcmFuc211eFN0YXRlO1xuICAgIHJldHVybiBLLmNvbnRpZ3VvdXMgPSAhMCwgSy5kaXNjb250aW51aXR5ID0gITEsIEsudHJhY2tTd2l0Y2ggPSAhMSwgaS5leGVjdXRlRW5kID0gbHMoKSwgSDtcbiAgfVxuICAvLyBEdWUgdG8gZGF0YSBjYWNoaW5nLCBmbHVzaCBjYWxscyBjYW4gcHJvZHVjZSBtb3JlIHRoYW4gb25lIFRyYW5zbXV4ZXJSZXN1bHQgKGhlbmNlIHRoZSBBcnJheSB0eXBlKVxuICBmbHVzaChlKSB7XG4gICAgY29uc3QgdCA9IGUudHJhbnNtdXhpbmc7XG4gICAgdC5leGVjdXRlU3RhcnQgPSBscygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGRlY3J5cHRlcjogcixcbiAgICAgIGN1cnJlbnRUcmFuc211eFN0YXRlOiBuLFxuICAgICAgZGVjcnlwdGlvblByb21pc2U6IGlcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoaSlcbiAgICAgIHJldHVybiB0aGlzLmFzeW5jUmVzdWx0ID0gITAsIGkudGhlbigoKSA9PiB0aGlzLmZsdXNoKGUpKTtcbiAgICBjb25zdCBvID0gW10sIHtcbiAgICAgIHRpbWVPZmZzZXQ6IGFcbiAgICB9ID0gbjtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgZCA9IHIuZmx1c2goKTtcbiAgICAgIGQgJiYgby5wdXNoKHRoaXMucHVzaChkLmJ1ZmZlciwgbnVsbCwgZSkpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBkZW11eGVyOiBsLFxuICAgICAgcmVtdXhlcjogY1xuICAgIH0gPSB0aGlzO1xuICAgIGlmICghbCB8fCAhYykge1xuICAgICAgdC5leGVjdXRlRW5kID0gbHMoKTtcbiAgICAgIGNvbnN0IGQgPSBbeGwoZSldO1xuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNSZXN1bHQgPyBQcm9taXNlLnJlc29sdmUoZCkgOiBkO1xuICAgIH1cbiAgICBjb25zdCB1ID0gbC5mbHVzaChhKTtcbiAgICByZXR1cm4geGkodSkgPyAodGhpcy5hc3luY1Jlc3VsdCA9ICEwLCB1LnRoZW4oKGQpID0+ICh0aGlzLmZsdXNoUmVtdXgobywgZCwgZSksIG8pKSkgOiAodGhpcy5mbHVzaFJlbXV4KG8sIHUsIGUpLCB0aGlzLmFzeW5jUmVzdWx0ID8gUHJvbWlzZS5yZXNvbHZlKG8pIDogbyk7XG4gIH1cbiAgZmx1c2hSZW11eChlLCB0LCByKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXVkaW9UcmFjazogbixcbiAgICAgIHZpZGVvVHJhY2s6IGksXG4gICAgICBpZDNUcmFjazogbyxcbiAgICAgIHRleHRUcmFjazogYVxuICAgIH0gPSB0LCB7XG4gICAgICBhY2N1cmF0ZVRpbWVPZmZzZXQ6IGwsXG4gICAgICB0aW1lT2Zmc2V0OiBjXG4gICAgfSA9IHRoaXMuY3VycmVudFRyYW5zbXV4U3RhdGU7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBbdHJhbnNtdXhlci50c106IEZsdXNoZWQgJHt0aGlzLmlkfSBzbjogJHtyLnNufSR7ci5wYXJ0ID4gLTEgPyBcIiBwYXJ0OiBcIiArIHIucGFydCA6IFwiXCJ9IG9mICR7dGhpcy5pZCA9PT0gcGUuTUFJTiA/IFwibGV2ZWxcIiA6IFwidHJhY2tcIn0gJHtyLmxldmVsfWApO1xuICAgIGNvbnN0IHUgPSB0aGlzLnJlbXV4ZXIucmVtdXgobiwgaSwgbywgYSwgYywgbCwgITAsIHRoaXMuaWQpO1xuICAgIGUucHVzaCh7XG4gICAgICByZW11eFJlc3VsdDogdSxcbiAgICAgIGNodW5rTWV0YTogclxuICAgIH0pLCByLnRyYW5zbXV4aW5nLmV4ZWN1dGVFbmQgPSBscygpO1xuICB9XG4gIHJlc2V0SW5pdGlhbFRpbWVzdGFtcChlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGVtdXhlcjogdCxcbiAgICAgIHJlbXV4ZXI6IHJcbiAgICB9ID0gdGhpcztcbiAgICAhdCB8fCAhciB8fCAodC5yZXNldFRpbWVTdGFtcChlKSwgci5yZXNldFRpbWVTdGFtcChlKSk7XG4gIH1cbiAgcmVzZXRDb250aWd1aXR5KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRlbXV4ZXI6IGUsXG4gICAgICByZW11eGVyOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgIWUgfHwgIXQgfHwgKGUucmVzZXRDb250aWd1aXR5KCksIHQucmVzZXROZXh0VGltZXN0YW1wKCkpO1xuICB9XG4gIHJlc2V0SW5pdFNlZ21lbnQoZSwgdCwgciwgbiwgaSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRlbXV4ZXI6IG8sXG4gICAgICByZW11eGVyOiBhXG4gICAgfSA9IHRoaXM7XG4gICAgIW8gfHwgIWEgfHwgKG8ucmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSwgYS5yZXNldEluaXRTZWdtZW50KGUsIHQsIHIsIGkpKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVtdXhlciAmJiAodGhpcy5kZW11eGVyLmRlc3Ryb3koKSwgdGhpcy5kZW11eGVyID0gdm9pZCAwKSwgdGhpcy5yZW11eGVyICYmICh0aGlzLnJlbXV4ZXIuZGVzdHJveSgpLCB0aGlzLnJlbXV4ZXIgPSB2b2lkIDApO1xuICB9XG4gIHRyYW5zbXV4KGUsIHQsIHIsIG4sIGkpIHtcbiAgICBsZXQgbztcbiAgICByZXR1cm4gdCAmJiB0Lm1ldGhvZCA9PT0gXCJTQU1QTEUtQUVTXCIgPyBvID0gdGhpcy50cmFuc211eFNhbXBsZUFlcyhlLCB0LCByLCBuLCBpKSA6IG8gPSB0aGlzLnRyYW5zbXV4VW5lbmNyeXB0ZWQoZSwgciwgbiwgaSksIG87XG4gIH1cbiAgdHJhbnNtdXhVbmVuY3J5cHRlZChlLCB0LCByLCBuKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXVkaW9UcmFjazogaSxcbiAgICAgIHZpZGVvVHJhY2s6IG8sXG4gICAgICBpZDNUcmFjazogYSxcbiAgICAgIHRleHRUcmFjazogbFxuICAgIH0gPSB0aGlzLmRlbXV4ZXIuZGVtdXgoZSwgdCwgITEsICF0aGlzLmNvbmZpZy5wcm9ncmVzc2l2ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbXV4UmVzdWx0OiB0aGlzLnJlbXV4ZXIucmVtdXgoaSwgbywgYSwgbCwgdCwgciwgITEsIHRoaXMuaWQpLFxuICAgICAgY2h1bmtNZXRhOiBuXG4gICAgfTtcbiAgfVxuICB0cmFuc211eFNhbXBsZUFlcyhlLCB0LCByLCBuLCBpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVtdXhlci5kZW11eFNhbXBsZUFlcyhlLCB0LCByKS50aGVuKChvKSA9PiAoe1xuICAgICAgcmVtdXhSZXN1bHQ6IHRoaXMucmVtdXhlci5yZW11eChvLmF1ZGlvVHJhY2ssIG8udmlkZW9UcmFjaywgby5pZDNUcmFjaywgby50ZXh0VHJhY2ssIHIsIG4sICExLCB0aGlzLmlkKSxcbiAgICAgIGNodW5rTWV0YTogaVxuICAgIH0pKTtcbiAgfVxuICBjb25maWd1cmVUcmFuc211eGVyKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWc6IHQsXG4gICAgICBvYnNlcnZlcjogcixcbiAgICAgIHR5cGVTdXBwb3J0ZWQ6IG5cbiAgICB9ID0gdGhpcztcbiAgICBsZXQgaTtcbiAgICBmb3IgKGxldCBkID0gMCwgaCA9IHlvLmxlbmd0aDsgZCA8IGg7IGQrKykge1xuICAgICAgdmFyIG87XG4gICAgICBpZiAoKG8gPSB5b1tkXS5kZW11eCkgIT0gbnVsbCAmJiBvLnByb2JlKGUsIHRoaXMubG9nZ2VyKSkge1xuICAgICAgICBpID0geW9bZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm4gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgZGVtdXhlciBieSBwcm9iaW5nIGZyYWdtZW50IGRhdGFcIik7XG4gICAgY29uc3QgYSA9IHRoaXMuZGVtdXhlciwgbCA9IHRoaXMucmVtdXhlciwgYyA9IGkucmVtdXgsIHUgPSBpLmRlbXV4O1xuICAgICghbCB8fCAhKGwgaW5zdGFuY2VvZiBjKSkgJiYgKHRoaXMucmVtdXhlciA9IG5ldyBjKHIsIHQsIG4sIHRoaXMubG9nZ2VyKSksICghYSB8fCAhKGEgaW5zdGFuY2VvZiB1KSkgJiYgKHRoaXMuZGVtdXhlciA9IG5ldyB1KHIsIHQsIG4sIHRoaXMubG9nZ2VyKSwgdGhpcy5wcm9iZSA9IHUucHJvYmUpO1xuICB9XG4gIG5lZWRzUHJvYmluZyhlLCB0KSB7XG4gICAgcmV0dXJuICF0aGlzLmRlbXV4ZXIgfHwgIXRoaXMucmVtdXhlciB8fCBlIHx8IHQ7XG4gIH1cbiAgZ2V0RGVjcnlwdGVyKCkge1xuICAgIGxldCBlID0gdGhpcy5kZWNyeXB0ZXI7XG4gICAgcmV0dXJuIGUgfHwgKGUgPSB0aGlzLmRlY3J5cHRlciA9IG5ldyB2dSh0aGlzLmNvbmZpZykpLCBlO1xuICB9XG59XG5mdW5jdGlvbiB0MihzLCBlKSB7XG4gIGxldCB0ID0gbnVsbDtcbiAgcmV0dXJuIHMuYnl0ZUxlbmd0aCA+IDAgJiYgKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUua2V5KSAhPSBudWxsICYmIGUuaXYgIT09IG51bGwgJiYgZS5tZXRob2QgIT0gbnVsbCAmJiAodCA9IGUpLCB0O1xufVxuY29uc3QgeGwgPSAocykgPT4gKHtcbiAgcmVtdXhSZXN1bHQ6IHt9LFxuICBjaHVua01ldGE6IHNcbn0pO1xuZnVuY3Rpb24geGkocykge1xuICByZXR1cm4gXCJ0aGVuXCIgaW4gcyAmJiBzLnRoZW4gaW5zdGFuY2VvZiBGdW5jdGlvbjtcbn1cbmNsYXNzIHIyIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciwgbiwgaSkge1xuICAgIHRoaXMuYXVkaW9Db2RlYyA9IHZvaWQgMCwgdGhpcy52aWRlb0NvZGVjID0gdm9pZCAwLCB0aGlzLmluaXRTZWdtZW50RGF0YSA9IHZvaWQgMCwgdGhpcy5kdXJhdGlvbiA9IHZvaWQgMCwgdGhpcy5kZWZhdWx0SW5pdFB0cyA9IHZvaWQgMCwgdGhpcy5hdWRpb0NvZGVjID0gZSwgdGhpcy52aWRlb0NvZGVjID0gdCwgdGhpcy5pbml0U2VnbWVudERhdGEgPSByLCB0aGlzLmR1cmF0aW9uID0gbiwgdGhpcy5kZWZhdWx0SW5pdFB0cyA9IGkgfHwgbnVsbDtcbiAgfVxufVxuY2xhc3MgczIge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgdGhpcy5kaXNjb250aW51aXR5ID0gdm9pZCAwLCB0aGlzLmNvbnRpZ3VvdXMgPSB2b2lkIDAsIHRoaXMuYWNjdXJhdGVUaW1lT2Zmc2V0ID0gdm9pZCAwLCB0aGlzLnRyYWNrU3dpdGNoID0gdm9pZCAwLCB0aGlzLnRpbWVPZmZzZXQgPSB2b2lkIDAsIHRoaXMuaW5pdFNlZ21lbnRDaGFuZ2UgPSB2b2lkIDAsIHRoaXMuZGlzY29udGludWl0eSA9IGUsIHRoaXMuY29udGlndW91cyA9IHQsIHRoaXMuYWNjdXJhdGVUaW1lT2Zmc2V0ID0gciwgdGhpcy50cmFja1N3aXRjaCA9IG4sIHRoaXMudGltZU9mZnNldCA9IGksIHRoaXMuaW5pdFNlZ21lbnRDaGFuZ2UgPSBvO1xuICB9XG59XG5sZXQgVmggPSAwO1xuY2xhc3Mgd3Age1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5lcnJvciA9IG51bGwsIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmlkID0gdm9pZCAwLCB0aGlzLmluc3RhbmNlTm8gPSBWaCsrLCB0aGlzLm9ic2VydmVyID0gdm9pZCAwLCB0aGlzLmZyYWcgPSBudWxsLCB0aGlzLnBhcnQgPSBudWxsLCB0aGlzLnVzZVdvcmtlciA9IHZvaWQgMCwgdGhpcy53b3JrZXJDb250ZXh0ID0gbnVsbCwgdGhpcy50cmFuc211eGVyID0gbnVsbCwgdGhpcy5vblRyYW5zbXV4Q29tcGxldGUgPSB2b2lkIDAsIHRoaXMub25GbHVzaCA9IHZvaWQgMCwgdGhpcy5vbldvcmtlck1lc3NhZ2UgPSAobCkgPT4ge1xuICAgICAgY29uc3QgYyA9IGwuZGF0YSwgdSA9IHRoaXMuaGxzO1xuICAgICAgaWYgKCEoIXUgfHwgIShjICE9IG51bGwgJiYgYy5ldmVudCkgfHwgYy5pbnN0YW5jZU5vICE9PSB0aGlzLmluc3RhbmNlTm8pKVxuICAgICAgICBzd2l0Y2ggKGMuZXZlbnQpIHtcbiAgICAgICAgICBjYXNlIFwiaW5pdFwiOiB7XG4gICAgICAgICAgICB2YXIgZDtcbiAgICAgICAgICAgIGNvbnN0IGggPSAoZCA9IHRoaXMud29ya2VyQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IGQub2JqZWN0VVJMO1xuICAgICAgICAgICAgaCAmJiBzZWxmLlVSTC5yZXZva2VPYmplY3RVUkwoaCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInRyYW5zbXV4Q29tcGxldGVcIjoge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmFuc211eENvbXBsZXRlKGMuZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImZsdXNoXCI6IHtcbiAgICAgICAgICAgIHRoaXMub25GbHVzaChjLmRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHBhc3MgbG9ncyBmcm9tIHRoZSB3b3JrZXIgdGhyZWFkIHRvIHRoZSBtYWluIGxvZ2dlclxuICAgICAgICAgIGNhc2UgXCJ3b3JrZXJMb2dcIjoge1xuICAgICAgICAgICAgdS5sb2dnZXJbYy5kYXRhLmxvZ1R5cGVdICYmIHUubG9nZ2VyW2MuZGF0YS5sb2dUeXBlXShjLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYy5kYXRhID0gYy5kYXRhIHx8IHt9LCBjLmRhdGEuZnJhZyA9IHRoaXMuZnJhZywgYy5kYXRhLnBhcnQgPSB0aGlzLnBhcnQsIGMuZGF0YS5pZCA9IHRoaXMuaWQsIHUudHJpZ2dlcihjLmV2ZW50LCBjLmRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgdGhpcy5vbldvcmtlckVycm9yID0gKGwpID0+IHtcbiAgICAgIGlmICghdGhpcy5obHMpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBuZXcgRXJyb3IoYCR7bC5tZXNzYWdlfSAgKCR7bC5maWxlbmFtZX06JHtsLmxpbmVub30pYCk7XG4gICAgICB0aGlzLmhscy5jb25maWcuZW5hYmxlV29ya2VyID0gITEsIHRoaXMuaGxzLmxvZ2dlci53YXJuKGBFcnJvciBpbiBcIiR7dGhpcy5pZH1cIiBXZWIgV29ya2VyLCBmYWxsYmFjayB0byBpbmxpbmVgKSwgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLklOVEVSTkFMX0VYQ0VQVElPTixcbiAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICBldmVudDogXCJkZW11eGVyV29ya2VyXCIsXG4gICAgICAgIGVycm9yOiBjXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGkgPSBlLmNvbmZpZztcbiAgICB0aGlzLmhscyA9IGUsIHRoaXMuaWQgPSB0LCB0aGlzLnVzZVdvcmtlciA9ICEhaS5lbmFibGVXb3JrZXIsIHRoaXMub25UcmFuc211eENvbXBsZXRlID0gciwgdGhpcy5vbkZsdXNoID0gbjtcbiAgICBjb25zdCBvID0gKGwsIGMpID0+IHtcbiAgICAgIGMgPSBjIHx8IHt9LCBjLmZyYWcgPSB0aGlzLmZyYWcgfHwgdm9pZCAwLCBsID09PSBJLkVSUk9SICYmIChjID0gYywgYy5wYXJlbnQgPSB0aGlzLmlkLCBjLnBhcnQgPSB0aGlzLnBhcnQsIHRoaXMuZXJyb3IgPSBjLmVycm9yKSwgdGhpcy5obHMudHJpZ2dlcihsLCBjKTtcbiAgICB9O1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgd3UoKSwgdGhpcy5vYnNlcnZlci5vbihJLkZSQUdfREVDUllQVEVELCBvKSwgdGhpcy5vYnNlcnZlci5vbihJLkVSUk9SLCBvKTtcbiAgICBjb25zdCBhID0gaWgoaS5wcmVmZXJNYW5hZ2VkTWVkaWFTb3VyY2UpO1xuICAgIGlmICh0aGlzLnVzZVdvcmtlciAmJiB0eXBlb2YgV29ya2VyIDwgXCJ1XCIpIHtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmhscy5sb2dnZXI7XG4gICAgICBpZiAoaS53b3JrZXJQYXRoIHx8IGFUKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpLndvcmtlclBhdGggPyAobC5sb2coYGxvYWRpbmcgV2ViIFdvcmtlciAke2kud29ya2VyUGF0aH0gZm9yIFwiJHt0fVwiYCksIHRoaXMud29ya2VyQ29udGV4dCA9IGNUKGkud29ya2VyUGF0aCkpIDogKGwubG9nKGBpbmplY3RpbmcgV2ViIFdvcmtlciBmb3IgXCIke3R9XCJgKSwgdGhpcy53b3JrZXJDb250ZXh0ID0gbFQoKSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgd29ya2VyOiB1XG4gICAgICAgICAgfSA9IHRoaXMud29ya2VyQ29udGV4dDtcbiAgICAgICAgICB1LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMub25Xb3JrZXJNZXNzYWdlKSwgdS5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5vbldvcmtlckVycm9yKSwgdS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpbnN0YW5jZU5vOiB0aGlzLmluc3RhbmNlTm8sXG4gICAgICAgICAgICBjbWQ6IFwiaW5pdFwiLFxuICAgICAgICAgICAgdHlwZVN1cHBvcnRlZDogYSxcbiAgICAgICAgICAgIGlkOiB0LFxuICAgICAgICAgICAgY29uZmlnOiBhdChpKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoICh1KSB7XG4gICAgICAgICAgbC53YXJuKGBFcnJvciBzZXR0aW5nIHVwIFwiJHt0fVwiIFdlYiBXb3JrZXIsIGZhbGxiYWNrIHRvIGlubGluZWAsIHUpLCB0aGlzLnRlcm1pbmF0ZVdvcmtlcigpLCB0aGlzLmVycm9yID0gbnVsbCwgdGhpcy50cmFuc211eGVyID0gbmV3IEdoKHRoaXMub2JzZXJ2ZXIsIGEsIGksIFwiXCIsIHQsIGUubG9nZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudHJhbnNtdXhlciA9IG5ldyBHaCh0aGlzLm9ic2VydmVyLCBhLCBpLCBcIlwiLCB0LCBlLmxvZ2dlcik7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuZnJhZyA9IG51bGwsIHRoaXMucGFydCA9IG51bGwsIHRoaXMud29ya2VyQ29udGV4dCkge1xuICAgICAgY29uc3QgZSA9IHRoaXMuaW5zdGFuY2VObztcbiAgICAgIHRoaXMuaW5zdGFuY2VObyA9IFZoKys7XG4gICAgICBjb25zdCB0ID0gdGhpcy5obHMuY29uZmlnLCByID0gaWgodC5wcmVmZXJNYW5hZ2VkTWVkaWFTb3VyY2UpO1xuICAgICAgdGhpcy53b3JrZXJDb250ZXh0Lndvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGluc3RhbmNlTm86IHRoaXMuaW5zdGFuY2VObyxcbiAgICAgICAgY21kOiBcInJlc2V0XCIsXG4gICAgICAgIHJlc2V0Tm86IGUsXG4gICAgICAgIHR5cGVTdXBwb3J0ZWQ6IHIsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBjb25maWc6IGF0KHQpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgdGVybWluYXRlV29ya2VyKCkge1xuICAgIGlmICh0aGlzLndvcmtlckNvbnRleHQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd29ya2VyOiBlXG4gICAgICB9ID0gdGhpcy53b3JrZXJDb250ZXh0O1xuICAgICAgdGhpcy53b3JrZXJDb250ZXh0ID0gbnVsbCwgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm9uV29ya2VyTWVzc2FnZSksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMub25Xb3JrZXJFcnJvciksIHVUKHRoaXMuaGxzLmNvbmZpZy53b3JrZXJQYXRoKTtcbiAgICB9XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy53b3JrZXJDb250ZXh0KVxuICAgICAgdGhpcy50ZXJtaW5hdGVXb3JrZXIoKSwgdGhpcy5vbldvcmtlck1lc3NhZ2UgPSB0aGlzLm9uV29ya2VyRXJyb3IgPSBudWxsO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdCA9IHRoaXMudHJhbnNtdXhlcjtcbiAgICAgIHQgJiYgKHQuZGVzdHJveSgpLCB0aGlzLnRyYW5zbXV4ZXIgPSBudWxsKTtcbiAgICB9XG4gICAgY29uc3QgZSA9IHRoaXMub2JzZXJ2ZXI7XG4gICAgZSAmJiBlLnJlbW92ZUFsbExpc3RlbmVycygpLCB0aGlzLmZyYWcgPSBudWxsLCB0aGlzLnBhcnQgPSBudWxsLCB0aGlzLm9ic2VydmVyID0gbnVsbCwgdGhpcy5obHMgPSBudWxsO1xuICB9XG4gIHB1c2goZSwgdCwgciwgbiwgaSwgbywgYSwgbCwgYywgdSkge1xuICAgIHZhciBkLCBoO1xuICAgIGMudHJhbnNtdXhpbmcuc3RhcnQgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGluc3RhbmNlTm86IGYsXG4gICAgICB0cmFuc211eGVyOiBwXG4gICAgfSA9IHRoaXMsIHkgPSBvID8gby5zdGFydCA6IGkuc3RhcnQsIEUgPSBpLmRlY3J5cHRkYXRhLCBiID0gdGhpcy5mcmFnLCBSID0gIShiICYmIGkuY2MgPT09IGIuY2MpLCBBID0gIShiICYmIGMubGV2ZWwgPT09IGIubGV2ZWwpLCBGID0gYiA/IGMuc24gLSBiLnNuIDogLTEsIE0gPSB0aGlzLnBhcnQgPyBjLnBhcnQgLSB0aGlzLnBhcnQuaW5kZXggOiAtMSwgSCA9IEYgPT09IDAgJiYgYy5pZCA+IDEgJiYgYy5pZCA9PT0gKGIgPT0gbnVsbCA/IHZvaWQgMCA6IGIuc3RhdHMuY2h1bmtDb3VudCksIEsgPSAhQSAmJiAoRiA9PT0gMSB8fCBGID09PSAwICYmIChNID09PSAxIHx8IEggJiYgTSA8PSAwKSksIGogPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgIChBIHx8IEYgfHwgaS5zdGF0cy5wYXJzaW5nLnN0YXJ0ID09PSAwKSAmJiAoaS5zdGF0cy5wYXJzaW5nLnN0YXJ0ID0gaiksIG8gJiYgKE0gfHwgIUspICYmIChvLnN0YXRzLnBhcnNpbmcuc3RhcnQgPSBqKTtcbiAgICBjb25zdCBDID0gIShiICYmICgoZCA9IGkuaW5pdFNlZ21lbnQpID09IG51bGwgPyB2b2lkIDAgOiBkLnVybCkgPT09ICgoaCA9IGIuaW5pdFNlZ21lbnQpID09IG51bGwgPyB2b2lkIDAgOiBoLnVybCkpLCBrID0gbmV3IHMyKFIsIEssIGwsIEEsIHksIEMpO1xuICAgIGlmICghSyB8fCBSIHx8IEMpIHtcbiAgICAgIHRoaXMuaGxzLmxvZ2dlci5sb2coYFt0cmFuc211eGVyLWludGVyZmFjZV06IFN0YXJ0aW5nIG5ldyB0cmFuc211eCBzZXNzaW9uIGZvciAke2kudHlwZX0gc246ICR7Yy5zbn0ke2MucGFydCA+IC0xID8gXCIgcGFydDogXCIgKyBjLnBhcnQgOiBcIlwifSAke3RoaXMuaWQgPT09IHBlLk1BSU4gPyBcImxldmVsXCIgOiBcInRyYWNrXCJ9OiAke2MubGV2ZWx9IGlkOiAke2MuaWR9XG4gICAgICAgIGRpc2NvbnRpbnVpdHk6ICR7Un1cbiAgICAgICAgdHJhY2tTd2l0Y2g6ICR7QX1cbiAgICAgICAgY29udGlndW91czogJHtLfVxuICAgICAgICBhY2N1cmF0ZVRpbWVPZmZzZXQ6ICR7bH1cbiAgICAgICAgdGltZU9mZnNldDogJHt5fVxuICAgICAgICBpbml0U2VnbWVudENoYW5nZTogJHtDfWApO1xuICAgICAgY29uc3QgJCA9IG5ldyByMihyLCBuLCB0LCBhLCB1KTtcbiAgICAgIHRoaXMuY29uZmlndXJlVHJhbnNtdXhlcigkKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJhZyA9IGksIHRoaXMucGFydCA9IG8sIHRoaXMud29ya2VyQ29udGV4dClcbiAgICAgIHRoaXMud29ya2VyQ29udGV4dC53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBpbnN0YW5jZU5vOiBmLFxuICAgICAgICBjbWQ6IFwiZGVtdXhcIixcbiAgICAgICAgZGF0YTogZSxcbiAgICAgICAgZGVjcnlwdGRhdGE6IEUsXG4gICAgICAgIGNodW5rTWV0YTogYyxcbiAgICAgICAgc3RhdGU6IGtcbiAgICAgIH0sIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IFtlXSA6IFtdKTtcbiAgICBlbHNlIGlmIChwKSB7XG4gICAgICBjb25zdCAkID0gcC5wdXNoKGUsIEUsIGMsIGspO1xuICAgICAgeGkoJCkgPyAkLnRoZW4oKFcpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVUcmFuc211eENvbXBsZXRlKFcpO1xuICAgICAgfSkuY2F0Y2goKFcpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc211eGVyRXJyb3IoVywgYywgXCJ0cmFuc211eGVyLWludGVyZmFjZSBwdXNoIGVycm9yXCIpO1xuICAgICAgfSkgOiB0aGlzLmhhbmRsZVRyYW5zbXV4Q29tcGxldGUoJCk7XG4gICAgfVxuICB9XG4gIGZsdXNoKGUpIHtcbiAgICBlLnRyYW5zbXV4aW5nLnN0YXJ0ID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCB7XG4gICAgICBpbnN0YW5jZU5vOiB0LFxuICAgICAgdHJhbnNtdXhlcjogclxuICAgIH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLndvcmtlckNvbnRleHQpXG4gICAgICB0aGlzLndvcmtlckNvbnRleHQud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgaW5zdGFuY2VObzogdCxcbiAgICAgICAgY21kOiBcImZsdXNoXCIsXG4gICAgICAgIGNodW5rTWV0YTogZVxuICAgICAgfSk7XG4gICAgZWxzZSBpZiAocikge1xuICAgICAgY29uc3QgbiA9IHIuZmx1c2goZSk7XG4gICAgICB4aShuKSA/IG4udGhlbigoaSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZsdXNoUmVzdWx0KGksIGUpO1xuICAgICAgfSkuY2F0Y2goKGkpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc211eGVyRXJyb3IoaSwgZSwgXCJ0cmFuc211eGVyLWludGVyZmFjZSBmbHVzaCBlcnJvclwiKTtcbiAgICAgIH0pIDogdGhpcy5oYW5kbGVGbHVzaFJlc3VsdChuLCBlKTtcbiAgICB9XG4gIH1cbiAgdHJhbnNtdXhlckVycm9yKGUsIHQsIHIpIHtcbiAgICB0aGlzLmhscyAmJiAodGhpcy5lcnJvciA9IGUsIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICAgIGNodW5rTWV0YTogdCxcbiAgICAgIGZyYWc6IHRoaXMuZnJhZyB8fCB2b2lkIDAsXG4gICAgICBwYXJ0OiB0aGlzLnBhcnQgfHwgdm9pZCAwLFxuICAgICAgZmF0YWw6ICExLFxuICAgICAgZXJyb3I6IGUsXG4gICAgICBlcnI6IGUsXG4gICAgICByZWFzb246IHJcbiAgICB9KSk7XG4gIH1cbiAgaGFuZGxlRmx1c2hSZXN1bHQoZSwgdCkge1xuICAgIGUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVUcmFuc211eENvbXBsZXRlKHIpO1xuICAgIH0pLCB0aGlzLm9uRmx1c2godCk7XG4gIH1cbiAgY29uZmlndXJlVHJhbnNtdXhlcihlKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5zdGFuY2VObzogdCxcbiAgICAgIHRyYW5zbXV4ZXI6IHJcbiAgICB9ID0gdGhpcztcbiAgICB0aGlzLndvcmtlckNvbnRleHQgPyB0aGlzLndvcmtlckNvbnRleHQud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgIGluc3RhbmNlTm86IHQsXG4gICAgICBjbWQ6IFwiY29uZmlndXJlXCIsXG4gICAgICBjb25maWc6IGVcbiAgICB9KSA6IHIgJiYgci5jb25maWd1cmUoZSk7XG4gIH1cbiAgaGFuZGxlVHJhbnNtdXhDb21wbGV0ZShlKSB7XG4gICAgZS5jaHVua01ldGEudHJhbnNtdXhpbmcuZW5kID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgdGhpcy5vblRyYW5zbXV4Q29tcGxldGUoZSk7XG4gIH1cbn1cbmNvbnN0IGpoID0gMTAwO1xuY2xhc3MgbjIgZXh0ZW5kcyBUdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICBzdXBlcihlLCB0LCByLCBcImF1ZGlvLXN0cmVhbS1jb250cm9sbGVyXCIsIHBlLkFVRElPKSwgdGhpcy5tYWluQW5jaG9yID0gbnVsbCwgdGhpcy5tYWluRnJhZ0xvYWRpbmcgPSBudWxsLCB0aGlzLmF1ZGlvT25seSA9ICExLCB0aGlzLmJ1ZmZlcmVkVHJhY2sgPSBudWxsLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdGhpcy50cmFja0lkID0gLTEsIHRoaXMud2FpdGluZ0RhdGEgPSBudWxsLCB0aGlzLm1haW5EZXRhaWxzID0gbnVsbCwgdGhpcy5mbHVzaGluZyA9ICExLCB0aGlzLmJ1ZmZlckZsdXNoZWQgPSAhMSwgdGhpcy5jYWNoZWRUcmFja0xvYWRlZERhdGEgPSBudWxsLCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgb25IYW5kbGVyRGVzdHJveWluZygpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgc3VwZXIub25IYW5kbGVyRGVzdHJveWluZygpLCB0aGlzLnJlc2V0SXRlbSgpO1xuICB9XG4gIHJlc2V0SXRlbSgpIHtcbiAgICB0aGlzLm1haW5EZXRhaWxzID0gdGhpcy5tYWluQW5jaG9yID0gdGhpcy5tYWluRnJhZ0xvYWRpbmcgPSB0aGlzLmJ1ZmZlcmVkVHJhY2sgPSB0aGlzLnN3aXRjaGluZ1RyYWNrID0gdGhpcy53YWl0aW5nRGF0YSA9IHRoaXMuY2FjaGVkVHJhY2tMb2FkZWREYXRhID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBzdXBlci5yZWdpc3Rlckxpc3RlbmVycygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5MRVZFTF9MT0FERUQsIHRoaXMub25MZXZlbExvYWRlZCwgdGhpcyksIGUub24oSS5BVURJT19UUkFDS1NfVVBEQVRFRCwgdGhpcy5vbkF1ZGlvVHJhY2tzVXBkYXRlZCwgdGhpcyksIGUub24oSS5BVURJT19UUkFDS19TV0lUQ0hJTkcsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoaW5nLCB0aGlzKSwgZS5vbihJLkFVRElPX1RSQUNLX0xPQURFRCwgdGhpcy5vbkF1ZGlvVHJhY2tMb2FkZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX1JFU0VULCB0aGlzLm9uQnVmZmVyUmVzZXQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0NSRUFURUQsIHRoaXMub25CdWZmZXJDcmVhdGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSEVELCB0aGlzLm9uQnVmZmVyRmx1c2hlZCwgdGhpcyksIGUub24oSS5JTklUX1BUU19GT1VORCwgdGhpcy5vbkluaXRQdHNGb3VuZCwgdGhpcyksIGUub24oSS5GUkFHX0xPQURJTkcsIHRoaXMub25GcmFnTG9hZGluZywgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUgJiYgKHN1cGVyLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgZS5vZmYoSS5MRVZFTF9MT0FERUQsIHRoaXMub25MZXZlbExvYWRlZCwgdGhpcyksIGUub2ZmKEkuQVVESU9fVFJBQ0tTX1VQREFURUQsIHRoaXMub25BdWRpb1RyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkFVRElPX1RSQUNLX1NXSVRDSElORywgdGhpcy5vbkF1ZGlvVHJhY2tTd2l0Y2hpbmcsIHRoaXMpLCBlLm9mZihJLkFVRElPX1RSQUNLX0xPQURFRCwgdGhpcy5vbkF1ZGlvVHJhY2tMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9SRVNFVCwgdGhpcy5vbkJ1ZmZlclJlc2V0LCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQ1JFQVRFRCwgdGhpcy5vbkJ1ZmZlckNyZWF0ZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfRkxVU0hFRCwgdGhpcy5vbkJ1ZmZlckZsdXNoZWQsIHRoaXMpLCBlLm9mZihJLklOSVRfUFRTX0ZPVU5ELCB0aGlzLm9uSW5pdFB0c0ZvdW5kLCB0aGlzKSwgZS5vZmYoSS5GUkFHX0xPQURJTkcsIHRoaXMub25GcmFnTG9hZGluZywgdGhpcyksIGUub2ZmKEkuRlJBR19CVUZGRVJFRCwgdGhpcy5vbkZyYWdCdWZmZXJlZCwgdGhpcykpO1xuICB9XG4gIC8vIElOSVRfUFRTX0ZPVU5EIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB2aWRlbyB0cmFjayBwYXJzZWQgaW4gdGhlIHN0cmVhbS1jb250cm9sbGVyIGhhcyBhIG5ldyBQVFMgdmFsdWVcbiAgb25Jbml0UHRzRm91bmQoZSwge1xuICAgIGZyYWc6IHQsXG4gICAgaWQ6IHIsXG4gICAgaW5pdFBUUzogbixcbiAgICB0aW1lc2NhbGU6IGksXG4gICAgdHJhY2tJZDogb1xuICB9KSB7XG4gICAgaWYgKHIgPT09IHBlLk1BSU4pIHtcbiAgICAgIGNvbnN0IGEgPSB0LmNjLCBsID0gdGhpcy5mcmFnQ3VycmVudDtcbiAgICAgIGlmICh0aGlzLmluaXRQVFNbYV0gPSB7XG4gICAgICAgIGJhc2VUaW1lOiBuLFxuICAgICAgICB0aW1lc2NhbGU6IGksXG4gICAgICAgIHRyYWNrSWQ6IG9cbiAgICAgIH0sIHRoaXMubG9nKGBJbml0UFRTIGZvciBjYzogJHthfSBmb3VuZCBmcm9tIG1haW46ICR7biAvIGl9ICgke259LyR7aX0pIHRyYWNrSWQ6ICR7b31gKSwgdGhpcy5tYWluQW5jaG9yID0gdCwgdGhpcy5zdGF0ZSA9PT0gbmUuV0FJVElOR19JTklUX1BUUykge1xuICAgICAgICBjb25zdCBjID0gdGhpcy53YWl0aW5nRGF0YTtcbiAgICAgICAgKCFjICYmICF0aGlzLmxvYWRpbmdQYXJ0cyB8fCBjICYmIGMuZnJhZy5jYyAhPT0gYSkgJiYgdGhpcy5zeW5jV2l0aEFuY2hvcih0LCBjID09IG51bGwgPyB2b2lkIDAgOiBjLmZyYWcpO1xuICAgICAgfSBlbHNlICF0aGlzLmhscy5oYXNFbm91Z2hUb1N0YXJ0ICYmIGwgJiYgbC5jYyAhPT0gYSA/IChsLmFib3J0UmVxdWVzdHMoKSwgdGhpcy5zeW5jV2l0aEFuY2hvcih0LCBsKSkgOiB0aGlzLnN0YXRlID09PSBuZS5JRExFICYmIHRoaXMudGljaygpO1xuICAgIH1cbiAgfVxuICBnZXRMb2FkUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuICF0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiB0aGlzLm5leHRMb2FkUG9zaXRpb24gPj0gMCA/IHRoaXMubmV4dExvYWRQb3NpdGlvbiA6IHN1cGVyLmdldExvYWRQb3NpdGlvbigpO1xuICB9XG4gIHN5bmNXaXRoQW5jaG9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gKChyID0gdGhpcy5tYWluRnJhZ0xvYWRpbmcpID09IG51bGwgPyB2b2lkIDAgOiByLmZyYWcpIHx8IG51bGw7XG4gICAgaWYgKHQgJiYgKG4gPT0gbnVsbCA/IHZvaWQgMCA6IG4uY2MpID09PSB0LmNjKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSAobiB8fCBlKS5jYywgbyA9IHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCksIGEgPSB0aGlzLmdldExvYWRQb3NpdGlvbigpLCBsID0gVmcobywgaSwgYSk7XG4gICAgbCAmJiAodGhpcy5sb2coYFN5bmNpbmcgd2l0aCBtYWluIGZyYWcgYXQgJHtsLnN0YXJ0fSBjYyAke2wuY2N9YCksIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITEsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGwuc3RhcnQsIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKSwgdGhpcy5zdGF0ZSA9PT0gbmUuSURMRSAmJiB0aGlzLmRvVGlja0lkbGUoKSk7XG4gIH1cbiAgc3RhcnRMb2FkKGUsIHQpIHtcbiAgICBpZiAoIXRoaXMubGV2ZWxzKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSBlLCB0aGlzLnN0YXRlID0gbmUuU1RPUFBFRDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgciA9IHRoaXMubGFzdEN1cnJlbnRUaW1lO1xuICAgIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5zZXRJbnRlcnZhbChqaCksIHIgPiAwICYmIGUgPT09IC0xID8gKHRoaXMubG9nKGBPdmVycmlkZSBzdGFydFBvc2l0aW9uIHdpdGggbGFzdEN1cnJlbnRUaW1lIEAke3IudG9GaXhlZCgzKX1gKSwgZSA9IHIsIHRoaXMuc3RhdGUgPSBuZS5JRExFKSA6IHRoaXMuc3RhdGUgPSBuZS5XQUlUSU5HX1RSQUNLLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUgKyB0aGlzLnRpbWVsaW5lT2Zmc2V0LCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0ID8gLTEgOiBlLCB0aGlzLnRpY2soKTtcbiAgfVxuICBkb1RpY2soKSB7XG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlIG5lLklETEU6XG4gICAgICAgIHRoaXMuZG9UaWNrSWRsZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgbmUuV0FJVElOR19UUkFDSzoge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbGV2ZWxzOiBlLFxuICAgICAgICAgIHRyYWNrSWQ6IHRcbiAgICAgICAgfSA9IHRoaXMsIHIgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlW3RdLCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5kZXRhaWxzO1xuICAgICAgICBpZiAobiAmJiAhdGhpcy53YWl0Rm9yTGl2ZShyKSkge1xuICAgICAgICAgIGlmICh0aGlzLndhaXRGb3JDZG5UdW5lSW4obikpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB0aGlzLnN0YXRlID0gbmUuV0FJVElOR19JTklUX1BUUztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgbmUuRlJBR19MT0FESU5HX1dBSVRJTkdfUkVUUlk6IHtcbiAgICAgICAgdGhpcy5jaGVja1JldHJ5RGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgbmUuV0FJVElOR19JTklUX1BUUzoge1xuICAgICAgICBjb25zdCBlID0gdGhpcy53YWl0aW5nRGF0YTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmcmFnOiB0LFxuICAgICAgICAgICAgcGFydDogcixcbiAgICAgICAgICAgIGNhY2hlOiBuLFxuICAgICAgICAgICAgY29tcGxldGU6IGlcbiAgICAgICAgICB9ID0gZSwgbyA9IHRoaXMubWFpbkFuY2hvcjtcbiAgICAgICAgICBpZiAodGhpcy5pbml0UFRTW3QuY2NdICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHRoaXMud2FpdGluZ0RhdGEgPSBudWxsLCB0aGlzLnN0YXRlID0gbmUuRlJBR19MT0FESU5HO1xuICAgICAgICAgICAgY29uc3QgYSA9IG4uZmx1c2goKS5idWZmZXIsIGwgPSB7XG4gICAgICAgICAgICAgIGZyYWc6IHQsXG4gICAgICAgICAgICAgIHBhcnQ6IHIsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IGEsXG4gICAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRnJhZ21lbnRMb2FkUHJvZ3Jlc3MobCksIGkgJiYgc3VwZXIuX2hhbmRsZUZyYWdtZW50TG9hZENvbXBsZXRlKGwpO1xuICAgICAgICAgIH0gZWxzZSBvICYmIG8uY2MgIT09IGUuZnJhZy5jYyAmJiB0aGlzLnN5bmNXaXRoQW5jaG9yKG8sIGUuZnJhZyk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVGlja0VuZCgpO1xuICB9XG4gIHJlc2V0TG9hZGluZ1N0YXRlKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLndhaXRpbmdEYXRhO1xuICAgIGUgJiYgKHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUuZnJhZyksIHRoaXMud2FpdGluZ0RhdGEgPSBudWxsKSwgc3VwZXIucmVzZXRMb2FkaW5nU3RhdGUoKTtcbiAgfVxuICBvblRpY2tFbmQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICE9IG51bGwgJiYgZS5yZWFkeVN0YXRlICYmICh0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUuY3VycmVudFRpbWUpO1xuICB9XG4gIGRvVGlja0lkbGUoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiB0LFxuICAgICAgbGV2ZWxzOiByLFxuICAgICAgbWVkaWE6IG4sXG4gICAgICB0cmFja0lkOiBpXG4gICAgfSA9IHRoaXMsIG8gPSB0LmNvbmZpZztcbiAgICBpZiAoIXRoaXMuYnVmZmVyaW5nIHx8ICFuICYmICF0aGlzLnByaW1hcnlQcmVmZXRjaCAmJiAodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgfHwgIW8uc3RhcnRGcmFnUHJlZmV0Y2gpIHx8ICEociAhPSBudWxsICYmIHJbaV0pKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSByW2ldLCBsID0gYS5kZXRhaWxzO1xuICAgIGlmICghbCB8fCB0aGlzLndhaXRGb3JMaXZlKGEpIHx8IHRoaXMud2FpdEZvckNkblR1bmVJbihsKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfVFJBQ0ssIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGMgPSB0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7XG4gICAgdGhpcy5idWZmZXJGbHVzaGVkICYmIGMgJiYgKHRoaXMuYnVmZmVyRmx1c2hlZCA9ICExLCB0aGlzLmFmdGVyQnVmZmVyRmx1c2hlZChjLCBvdC5BVURJTywgcGUuQVVESU8pKTtcbiAgICBjb25zdCB1ID0gdGhpcy5nZXRGd2RCdWZmZXJJbmZvKGMsIHBlLkFVRElPKTtcbiAgICBpZiAodSA9PT0gbnVsbClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc3dpdGNoaW5nVHJhY2sgJiYgdGhpcy5fc3RyZWFtRW5kZWQodSwgbCkpIHtcbiAgICAgIHQudHJpZ2dlcihJLkJVRkZFUl9FT1MsIHtcbiAgICAgICAgdHlwZTogXCJhdWRpb1wiXG4gICAgICB9KSwgdGhpcy5zdGF0ZSA9IG5lLkVOREVEO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gdS5sZW4sIGggPSB0Lm1heEJ1ZmZlckxlbmd0aCwgZiA9IGwuZnJhZ21lbnRzLCBwID0gZlswXS5zdGFydCwgeSA9IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCksIEUgPSB0aGlzLmZsdXNoaW5nID8geSA6IHUuZW5kO1xuICAgIGlmICh0aGlzLnN3aXRjaGluZ1RyYWNrICYmIG4pIHtcbiAgICAgIGNvbnN0IEEgPSB5O1xuICAgICAgbC5QVFNLbm93biAmJiBBIDwgcCAmJiAodS5lbmQgPiBwIHx8IHUubmV4dFN0YXJ0KSAmJiAodGhpcy5sb2coXCJBbHQgYXVkaW8gdHJhY2sgYWhlYWQgb2YgbWFpbiB0cmFjaywgc2VlayB0byBzdGFydCBvZiBhbHQgYXVkaW8gdHJhY2tcIiksIG4uY3VycmVudFRpbWUgPSBwICsgMC4wNSk7XG4gICAgfVxuICAgIGlmIChkID49IGggJiYgIXRoaXMuc3dpdGNoaW5nVHJhY2sgJiYgRSA8IGZbZi5sZW5ndGggLSAxXS5zdGFydClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgYiA9IHRoaXMuZ2V0TmV4dEZyYWdtZW50KEUsIGwpO1xuICAgIGlmIChiICYmIHRoaXMuaXNMb29wTG9hZGluZyhiLCBFKSAmJiAoYiA9IHRoaXMuZ2V0TmV4dEZyYWdtZW50TG9vcExvYWRpbmcoYiwgbCwgdSwgcGUuTUFJTiwgaCkpLCAhYikge1xuICAgICAgdGhpcy5idWZmZXJGbHVzaGVkID0gITA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBSID0gKChlID0gdGhpcy5tYWluRnJhZ0xvYWRpbmcpID09IG51bGwgPyB2b2lkIDAgOiBlLmZyYWcpIHx8IG51bGw7XG4gICAgaWYgKCF0aGlzLmF1ZGlvT25seSAmJiB0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiBSICYmIFZ0KGIpICYmICFiLmVuZExpc3QgJiYgKCFsLmxpdmUgfHwgIXRoaXMubG9hZGluZ1BhcnRzICYmIEUgPCB0aGlzLmhscy5saXZlU3luY1Bvc2l0aW9uKSAmJiAodGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoUikgPT09IEh0Lk9LICYmICh0aGlzLm1haW5GcmFnTG9hZGluZyA9IFIgPSBudWxsKSwgUiAmJiBWdChSKSkpIHtcbiAgICAgIGlmIChiLnN0YXJ0ID4gUi5lbmQpIHtcbiAgICAgICAgY29uc3QgRiA9IHRoaXMuZnJhZ21lbnRUcmFja2VyLmdldEZyYWdBdFBvcyhFLCBwZS5NQUlOKTtcbiAgICAgICAgRiAmJiBGLmVuZCA+IFIuZW5kICYmIChSID0gRiwgdGhpcy5tYWluRnJhZ0xvYWRpbmcgPSB7XG4gICAgICAgICAgZnJhZzogRixcbiAgICAgICAgICB0YXJnZXRCdWZmZXJUaW1lOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGIuc3RhcnQgPiBSLmVuZClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvYWRGcmFnbWVudChiLCBhLCBFKTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLmJ1ZmZlckZsdXNoZWQgPSB0aGlzLmZsdXNoaW5nID0gITEsIHN1cGVyLm9uTWVkaWFEZXRhY2hpbmcoZSwgdCk7XG4gIH1cbiAgb25BdWRpb1RyYWNrc1VwZGF0ZWQoZSwge1xuICAgIGF1ZGlvVHJhY2tzOiB0XG4gIH0pIHtcbiAgICB0aGlzLnJlc2V0VHJhbnNtdXhlcigpLCB0aGlzLmxldmVscyA9IHQubWFwKChyKSA9PiBuZXcgbWkocikpO1xuICB9XG4gIG9uQXVkaW9UcmFja1N3aXRjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9ICEhdC51cmw7XG4gICAgdGhpcy50cmFja0lkID0gdC5pZDtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnQ3VycmVudDogblxuICAgIH0gPSB0aGlzO1xuICAgIG4gJiYgKG4uYWJvcnRSZXF1ZXN0cygpLCB0aGlzLnJlbW92ZVVuYnVmZmVyZWRGcmFncyhuLnN0YXJ0KSksIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKSwgciA/ICh0aGlzLnN3aXRjaGluZ1RyYWNrID0gdCwgdGhpcy5mbHVzaEF1ZGlvSWZOZWVkZWQodCksIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc2V0SW50ZXJ2YWwoamgpLCB0aGlzLnN0YXRlID0gbmUuSURMRSwgdGhpcy50aWNrKCkpKSA6ICh0aGlzLnJlc2V0VHJhbnNtdXhlcigpLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdGhpcy5idWZmZXJlZFRyYWNrID0gdCwgdGhpcy5jbGVhckludGVydmFsKCkpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKCkge1xuICAgIHN1cGVyLm9uTWFuaWZlc3RMb2FkaW5nKCksIHRoaXMuYnVmZmVyRmx1c2hlZCA9IHRoaXMuZmx1c2hpbmcgPSB0aGlzLmF1ZGlvT25seSA9ICExLCB0aGlzLnJlc2V0SXRlbSgpLCB0aGlzLnRyYWNrSWQgPSAtMTtcbiAgfVxuICBvbkxldmVsTG9hZGVkKGUsIHQpIHtcbiAgICB0aGlzLm1haW5EZXRhaWxzID0gdC5kZXRhaWxzO1xuICAgIGNvbnN0IHIgPSB0aGlzLmNhY2hlZFRyYWNrTG9hZGVkRGF0YTtcbiAgICByICYmICh0aGlzLmNhY2hlZFRyYWNrTG9hZGVkRGF0YSA9IG51bGwsIHRoaXMub25BdWRpb1RyYWNrTG9hZGVkKEkuQVVESU9fVFJBQ0tfTE9BREVELCByKSk7XG4gIH1cbiAgb25BdWRpb1RyYWNrTG9hZGVkKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbHM6IG5cbiAgICB9ID0gdGhpcywge1xuICAgICAgZGV0YWlsczogaSxcbiAgICAgIGlkOiBvLFxuICAgICAgZ3JvdXBJZDogYSxcbiAgICAgIHRyYWNrOiBsXG4gICAgfSA9IHQ7XG4gICAgaWYgKCFuKSB7XG4gICAgICB0aGlzLndhcm4oYEF1ZGlvIHRyYWNrcyByZXNldCB3aGlsZSBsb2FkaW5nIHRyYWNrICR7b30gXCIke2wubmFtZX1cIiBvZiBcIiR7YX1cImApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjID0gdGhpcy5tYWluRGV0YWlscztcbiAgICBpZiAoIWMgfHwgaS5lbmRDQyA+IGMuZW5kQ0MgfHwgYy5leHBpcmVkKSB7XG4gICAgICB0aGlzLmNhY2hlZFRyYWNrTG9hZGVkRGF0YSA9IHQsIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5XQUlUSU5HX1RSQUNLKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jYWNoZWRUcmFja0xvYWRlZERhdGEgPSBudWxsLCB0aGlzLmxvZyhgQXVkaW8gdHJhY2sgJHtvfSBcIiR7bC5uYW1lfVwiIG9mIFwiJHthfVwiIGxvYWRlZCBbJHtpLnN0YXJ0U059LCR7aS5lbmRTTn1dJHtpLmxhc3RQYXJ0U24gPyBgW3BhcnQtJHtpLmxhc3RQYXJ0U259LSR7aS5sYXN0UGFydEluZGV4fV1gIDogXCJcIn0sZHVyYXRpb246JHtpLnRvdGFsZHVyYXRpb259YCk7XG4gICAgY29uc3QgdSA9IG5bb107XG4gICAgbGV0IGQgPSAwO1xuICAgIGlmIChpLmxpdmUgfHwgKHIgPSB1LmRldGFpbHMpICE9IG51bGwgJiYgci5saXZlKSB7XG4gICAgICBpZiAodGhpcy5jaGVja0xpdmVVcGRhdGUoaSksIGkuZGVsdGFVcGRhdGVGYWlsZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICh1LmRldGFpbHMpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIGQgPSB0aGlzLmFsaWduUGxheWxpc3RzKGksIHUuZGV0YWlscywgKGggPSB0aGlzLmxldmVsTGFzdExvYWRlZCkgPT0gbnVsbCA/IHZvaWQgMCA6IGguZGV0YWlscyk7XG4gICAgICB9XG4gICAgICBpLmFsaWduZWRTbGlkaW5nIHx8IChucChpLCBjKSwgaS5hbGlnbmVkU2xpZGluZyB8fCBzYShpLCBjKSwgZCA9IGkuZnJhZ21lbnRTdGFydCk7XG4gICAgfVxuICAgIHUuZGV0YWlscyA9IGksIHRoaXMubGV2ZWxMYXN0TG9hZGVkID0gdSwgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgfHwgdGhpcy5zZXRTdGFydFBvc2l0aW9uKGMsIGQpLCB0aGlzLmhscy50cmlnZ2VyKEkuQVVESU9fVFJBQ0tfVVBEQVRFRCwge1xuICAgICAgZGV0YWlsczogaSxcbiAgICAgIGlkOiBvLFxuICAgICAgZ3JvdXBJZDogdC5ncm91cElkXG4gICAgfSksIHRoaXMuc3RhdGUgPT09IG5lLldBSVRJTkdfVFJBQ0sgJiYgIXRoaXMud2FpdEZvckNkblR1bmVJbihpKSAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpLCB0aGlzLnRpY2soKTtcbiAgfVxuICBfaGFuZGxlRnJhZ21lbnRMb2FkUHJvZ3Jlc3MoZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSBlLmZyYWcsIHtcbiAgICAgIHBhcnQ6IG4sXG4gICAgICBwYXlsb2FkOiBpXG4gICAgfSA9IGUsIHtcbiAgICAgIGNvbmZpZzogbyxcbiAgICAgIHRyYWNrSWQ6IGEsXG4gICAgICBsZXZlbHM6IGxcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWwpIHtcbiAgICAgIHRoaXMud2FybihgQXVkaW8gdHJhY2tzIHdlcmUgcmVzZXQgd2hpbGUgZnJhZ21lbnQgbG9hZCB3YXMgaW4gcHJvZ3Jlc3MuIEZyYWdtZW50ICR7ci5zbn0gb2YgbGV2ZWwgJHtyLmxldmVsfSB3aWxsIG5vdCBiZSBidWZmZXJlZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjID0gbFthXTtcbiAgICBpZiAoIWMpIHtcbiAgICAgIHRoaXMud2FybihcIkF1ZGlvIHRyYWNrIGlzIHVuZGVmaW5lZCBvbiBmcmFnbWVudCBsb2FkIHByb2dyZXNzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1ID0gYy5kZXRhaWxzO1xuICAgIGlmICghdSkge1xuICAgICAgdGhpcy53YXJuKFwiQXVkaW8gdHJhY2sgZGV0YWlscyB1bmRlZmluZWQgb24gZnJhZ21lbnQgbG9hZCBwcm9ncmVzc1wiKSwgdGhpcy5yZW1vdmVVbmJ1ZmZlcmVkRnJhZ3Moci5zdGFydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBvLmRlZmF1bHRBdWRpb0NvZGVjIHx8IGMuYXVkaW9Db2RlYyB8fCBcIm1wNGEuNDAuMlwiO1xuICAgIGxldCBoID0gdGhpcy50cmFuc211eGVyO1xuICAgIGggfHwgKGggPSB0aGlzLnRyYW5zbXV4ZXIgPSBuZXcgd3AodGhpcy5obHMsIHBlLkFVRElPLCB0aGlzLl9oYW5kbGVUcmFuc211eENvbXBsZXRlLmJpbmQodGhpcyksIHRoaXMuX2hhbmRsZVRyYW5zbXV4ZXJGbHVzaC5iaW5kKHRoaXMpKSk7XG4gICAgY29uc3QgZiA9IHRoaXMuaW5pdFBUU1tyLmNjXSwgcCA9ICh0ID0gci5pbml0U2VnbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZGF0YTtcbiAgICBpZiAoZiAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBFID0gbiA/IG4uaW5kZXggOiAtMSwgYiA9IEUgIT09IC0xLCBSID0gbmV3IEV1KHIubGV2ZWwsIHIuc24sIHIuc3RhdHMuY2h1bmtDb3VudCwgaS5ieXRlTGVuZ3RoLCBFLCBiKTtcbiAgICAgIGgucHVzaChpLCBwLCBkLCBcIlwiLCByLCBuLCB1LnRvdGFsZHVyYXRpb24sICExLCBSLCBmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2coYFVua25vd24gdmlkZW8gUFRTIGZvciBjYyAke3IuY2N9LCB3YWl0aW5nIGZvciB2aWRlbyBQVFMgYmVmb3JlIGRlbXV4aW5nIGF1ZGlvIGZyYWcgJHtyLnNufSBvZiBbJHt1LnN0YXJ0U059ICwke3UuZW5kU059XSx0cmFjayAke2F9YCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNhY2hlOiB5XG4gICAgICB9ID0gdGhpcy53YWl0aW5nRGF0YSA9IHRoaXMud2FpdGluZ0RhdGEgfHwge1xuICAgICAgICBmcmFnOiByLFxuICAgICAgICBwYXJ0OiBuLFxuICAgICAgICBjYWNoZTogbmV3IGlwKCksXG4gICAgICAgIGNvbXBsZXRlOiAhMVxuICAgICAgfTtcbiAgICAgIHkucHVzaChuZXcgVWludDhBcnJheShpKSksIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5XQUlUSU5HX0lOSVRfUFRTKTtcbiAgICB9XG4gIH1cbiAgX2hhbmRsZUZyYWdtZW50TG9hZENvbXBsZXRlKGUpIHtcbiAgICBpZiAodGhpcy53YWl0aW5nRGF0YSkge1xuICAgICAgdGhpcy53YWl0aW5nRGF0YS5jb21wbGV0ZSA9ICEwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5faGFuZGxlRnJhZ21lbnRMb2FkQ29tcGxldGUoZSk7XG4gIH1cbiAgb25CdWZmZXJSZXNldCgpIHtcbiAgICB0aGlzLm1lZGlhQnVmZmVyID0gbnVsbDtcbiAgfVxuICBvbkJ1ZmZlckNyZWF0ZWQoZSwgdCkge1xuICAgIHRoaXMuYnVmZmVyRmx1c2hlZCA9IHRoaXMuZmx1c2hpbmcgPSAhMTtcbiAgICBjb25zdCByID0gdC50cmFja3MuYXVkaW87XG4gICAgciAmJiAodGhpcy5tZWRpYUJ1ZmZlciA9IHIuYnVmZmVyIHx8IG51bGwpO1xuICB9XG4gIG9uRnJhZ0xvYWRpbmcoZSwgdCkge1xuICAgICF0aGlzLmF1ZGlvT25seSAmJiB0LmZyYWcudHlwZSA9PT0gcGUuTUFJTiAmJiBWdCh0LmZyYWcpICYmICh0aGlzLm1haW5GcmFnTG9hZGluZyA9IHQsIHRoaXMuc3RhdGUgPT09IG5lLklETEUgJiYgdGhpcy50aWNrKCkpO1xuICB9XG4gIG9uRnJhZ0J1ZmZlcmVkKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgcGFydDogblxuICAgIH0gPSB0O1xuICAgIGlmIChyLnR5cGUgIT09IHBlLkFVRElPKSB7XG4gICAgICAhdGhpcy5hdWRpb09ubHkgJiYgci50eXBlID09PSBwZS5NQUlOICYmICFyLmVsZW1lbnRhcnlTdHJlYW1zLnZpZGVvICYmICFyLmVsZW1lbnRhcnlTdHJlYW1zLmF1ZGlvdmlkZW8gJiYgKHRoaXMuYXVkaW9Pbmx5ID0gITAsIHRoaXMubWFpbkZyYWdMb2FkaW5nID0gbnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyYWdDb250ZXh0Q2hhbmdlZChyKSkge1xuICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCAke3Iuc259JHtuID8gXCIgcDogXCIgKyBuLmluZGV4IDogXCJcIn0gb2YgbGV2ZWwgJHtyLmxldmVsfSBmaW5pc2hlZCBidWZmZXJpbmcsIGJ1dCB3YXMgYWJvcnRlZC4gc3RhdGU6ICR7dGhpcy5zdGF0ZX0sIGF1ZGlvU3dpdGNoOiAke3RoaXMuc3dpdGNoaW5nVHJhY2sgPyB0aGlzLnN3aXRjaGluZ1RyYWNrLm5hbWUgOiBcImZhbHNlXCJ9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChWdChyKSkge1xuICAgICAgdGhpcy5mcmFnUHJldmlvdXMgPSByO1xuICAgICAgY29uc3QgaSA9IHRoaXMuc3dpdGNoaW5nVHJhY2s7XG4gICAgICBpICYmICh0aGlzLmJ1ZmZlcmVkVHJhY2sgPSBpLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSEVELCB0dCh7fSwgaSkpKTtcbiAgICB9XG4gICAgdGhpcy5mcmFnQnVmZmVyZWRDb21wbGV0ZShyLCBuKSwgdGhpcy5tZWRpYSAmJiB0aGlzLnRpY2soKTtcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBpZiAodC5mYXRhbCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IG5lLkVSUk9SO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHQuZGV0YWlscykge1xuICAgICAgY2FzZSBKLkZSQUdfR0FQOlxuICAgICAgY2FzZSBKLkZSQUdfUEFSU0lOR19FUlJPUjpcbiAgICAgIGNhc2UgSi5GUkFHX0RFQ1JZUFRfRVJST1I6XG4gICAgICBjYXNlIEouRlJBR19MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLkZSQUdfTE9BRF9USU1FT1VUOlxuICAgICAgY2FzZSBKLktFWV9MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLktFWV9MT0FEX1RJTUVPVVQ6XG4gICAgICAgIHRoaXMub25GcmFnbWVudE9yS2V5TG9hZEVycm9yKHBlLkFVRElPLCB0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEouQVVESU9fVFJBQ0tfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5BVURJT19UUkFDS19MT0FEX1RJTUVPVVQ6XG4gICAgICBjYXNlIEouTEVWRUxfUEFSU0lOR19FUlJPUjpcbiAgICAgICAgIXQubGV2ZWxSZXRyeSAmJiB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX1RSQUNLICYmICgociA9IHQuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIudHlwZSkgPT09IEtlLkFVRElPX1RSQUNLICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLkJVRkZFUl9BRERfQ09ERUNfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX0FQUEVORF9FUlJPUjpcbiAgICAgICAgaWYgKHQucGFyZW50ICE9PSBcImF1ZGlvXCIpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlZHVjZUxlbmd0aEFuZEZsdXNoQnVmZmVyKHQpIHx8IHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEouQlVGRkVSX0ZVTExfRVJST1I6XG4gICAgICAgIGlmICh0LnBhcmVudCAhPT0gXCJhdWRpb1wiKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5yZWR1Y2VMZW5ndGhBbmRGbHVzaEJ1ZmZlcih0KSAmJiAodGhpcy5idWZmZXJlZFRyYWNrID0gbnVsbCwgc3VwZXIuZmx1c2hNYWluQnVmZmVyKDAsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgXCJhdWRpb1wiKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLklOVEVSTkFMX0VYQ0VQVElPTjpcbiAgICAgICAgdGhpcy5yZWNvdmVyV29ya2VyRXJyb3IodCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBvbkJ1ZmZlckZsdXNoaW5nKGUsIHtcbiAgICB0eXBlOiB0XG4gIH0pIHtcbiAgICB0ICE9PSBvdC5WSURFTyAmJiAodGhpcy5mbHVzaGluZyA9ICEwKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoZWQoZSwge1xuICAgIHR5cGU6IHRcbiAgfSkge1xuICAgIGlmICh0ICE9PSBvdC5WSURFTykge1xuICAgICAgdGhpcy5mbHVzaGluZyA9ICExLCB0aGlzLmJ1ZmZlckZsdXNoZWQgPSAhMCwgdGhpcy5zdGF0ZSA9PT0gbmUuRU5ERUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5JRExFKTtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhQnVmZmVyIHx8IHRoaXMubWVkaWE7XG4gICAgICByICYmICh0aGlzLmFmdGVyQnVmZmVyRmx1c2hlZChyLCB0LCBwZS5BVURJTyksIHRoaXMudGljaygpKTtcbiAgICB9XG4gIH1cbiAgX2hhbmRsZVRyYW5zbXV4Q29tcGxldGUoZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSBcImF1ZGlvXCIsIHtcbiAgICAgIGhsczogblxuICAgIH0gPSB0aGlzLCB7XG4gICAgICByZW11eFJlc3VsdDogaSxcbiAgICAgIGNodW5rTWV0YTogb1xuICAgIH0gPSBlLCBhID0gdGhpcy5nZXRDdXJyZW50Q29udGV4dChvKTtcbiAgICBpZiAoIWEpIHtcbiAgICAgIHRoaXMucmVzZXRXaGVuTWlzc2luZ0NvbnRleHQobyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IGwsXG4gICAgICBwYXJ0OiBjLFxuICAgICAgbGV2ZWw6IHVcbiAgICB9ID0gYSwge1xuICAgICAgZGV0YWlsczogZFxuICAgIH0gPSB1LCB7XG4gICAgICBhdWRpbzogaCxcbiAgICAgIHRleHQ6IGYsXG4gICAgICBpZDM6IHAsXG4gICAgICBpbml0U2VnbWVudDogeVxuICAgIH0gPSBpO1xuICAgIGlmICh0aGlzLmZyYWdDb250ZXh0Q2hhbmdlZChsKSB8fCAhZCkge1xuICAgICAgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQobCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID0gbmUuUEFSU0lORywgdGhpcy5zd2l0Y2hpbmdUcmFjayAmJiBoICYmIHRoaXMuY29tcGxldGVBdWRpb1N3aXRjaCh0aGlzLnN3aXRjaGluZ1RyYWNrKSwgeSAhPSBudWxsICYmIHkudHJhY2tzKSB7XG4gICAgICBjb25zdCBFID0gbC5pbml0U2VnbWVudCB8fCBsO1xuICAgICAgaWYgKHRoaXMudW5oYW5kbGVkRW5jcnlwdGlvbkVycm9yKHksIGwpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLl9idWZmZXJJbml0U2VnbWVudCh1LCB5LnRyYWNrcywgRSwgbyksIG4udHJpZ2dlcihJLkZSQUdfUEFSU0lOR19JTklUX1NFR01FTlQsIHtcbiAgICAgICAgZnJhZzogRSxcbiAgICAgICAgaWQ6IHIsXG4gICAgICAgIHRyYWNrczogeS50cmFja3NcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGFydFBUUzogRSxcbiAgICAgICAgZW5kUFRTOiBiLFxuICAgICAgICBzdGFydERUUzogUixcbiAgICAgICAgZW5kRFRTOiBBXG4gICAgICB9ID0gaDtcbiAgICAgIGMgJiYgKGMuZWxlbWVudGFyeVN0cmVhbXNbb3QuQVVESU9dID0ge1xuICAgICAgICBzdGFydFBUUzogRSxcbiAgICAgICAgZW5kUFRTOiBiLFxuICAgICAgICBzdGFydERUUzogUixcbiAgICAgICAgZW5kRFRTOiBBXG4gICAgICB9KSwgbC5zZXRFbGVtZW50YXJ5U3RyZWFtSW5mbyhvdC5BVURJTywgRSwgYiwgUiwgQSksIHRoaXMuYnVmZmVyRnJhZ21lbnREYXRhKGgsIGwsIGMsIG8pO1xuICAgIH1cbiAgICBpZiAocCAhPSBudWxsICYmICh0ID0gcC5zYW1wbGVzKSAhPSBudWxsICYmIHQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBFID0gbnQoe1xuICAgICAgICBpZDogcixcbiAgICAgICAgZnJhZzogbCxcbiAgICAgICAgZGV0YWlsczogZFxuICAgICAgfSwgcCk7XG4gICAgICBuLnRyaWdnZXIoSS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIEUpO1xuICAgIH1cbiAgICBpZiAoZikge1xuICAgICAgY29uc3QgRSA9IG50KHtcbiAgICAgICAgaWQ6IHIsXG4gICAgICAgIGZyYWc6IGwsXG4gICAgICAgIGRldGFpbHM6IGRcbiAgICAgIH0sIGYpO1xuICAgICAgbi50cmlnZ2VyKEkuRlJBR19QQVJTSU5HX1VTRVJEQVRBLCBFKTtcbiAgICB9XG4gIH1cbiAgX2J1ZmZlckluaXRTZWdtZW50KGUsIHQsIHIsIG4pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gbmUuUEFSU0lORyB8fCAodC52aWRlbyAmJiBkZWxldGUgdC52aWRlbywgdC5hdWRpb3ZpZGVvICYmIGRlbGV0ZSB0LmF1ZGlvdmlkZW8sICF0LmF1ZGlvKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gdC5hdWRpbztcbiAgICBpLmlkID0gcGUuQVVESU87XG4gICAgY29uc3QgbyA9IGUuYXVkaW9Db2RlYztcbiAgICB0aGlzLmxvZyhgSW5pdCBhdWRpbyBidWZmZXIsIGNvbnRhaW5lcjoke2kuY29udGFpbmVyfSwgY29kZWNzW2xldmVsL3BhcnNlZF09WyR7b30vJHtpLmNvZGVjfV1gKSwgbyAmJiBvLnNwbGl0KFwiLFwiKS5sZW5ndGggPT09IDEgJiYgKGkubGV2ZWxDb2RlYyA9IG8pLCB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0NPREVDUywgdCk7XG4gICAgY29uc3QgYSA9IGkuaW5pdFNlZ21lbnQ7XG4gICAgaWYgKGEgIT0gbnVsbCAmJiBhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGwgPSB7XG4gICAgICAgIHR5cGU6IFwiYXVkaW9cIixcbiAgICAgICAgZnJhZzogcixcbiAgICAgICAgcGFydDogbnVsbCxcbiAgICAgICAgY2h1bmtNZXRhOiBuLFxuICAgICAgICBwYXJlbnQ6IHIudHlwZSxcbiAgICAgICAgZGF0YTogYVxuICAgICAgfTtcbiAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQVBQRU5ESU5HLCBsKTtcbiAgICB9XG4gICAgdGhpcy50aWNrSW1tZWRpYXRlKCk7XG4gIH1cbiAgbG9hZEZyYWdtZW50KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoZSk7XG4gICAgaWYgKHRoaXMuc3dpdGNoaW5nVHJhY2sgfHwgbiA9PT0gSHQuTk9UX0xPQURFRCB8fCBuID09PSBIdC5QQVJUSUFMKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGlmICghVnQoZSkpXG4gICAgICAgIHRoaXMuX2xvYWRJbml0U2VnbWVudChlLCB0KTtcbiAgICAgIGVsc2UgaWYgKChpID0gdC5kZXRhaWxzKSAhPSBudWxsICYmIGkubGl2ZSAmJiAhdGhpcy5pbml0UFRTW2UuY2NdKSB7XG4gICAgICAgIHRoaXMubG9nKGBXYWl0aW5nIGZvciB2aWRlbyBQVFMgaW4gY29udGludWl0eSBjb3VudGVyICR7ZS5jY30gb2YgbGl2ZSBzdHJlYW0gYmVmb3JlIGxvYWRpbmcgYXVkaW8gZnJhZ21lbnQgJHtlLnNufSBvZiBsZXZlbCAke3RoaXMudHJhY2tJZH1gKSwgdGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfSU5JVF9QVFM7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLm1haW5EZXRhaWxzO1xuICAgICAgICBvICYmIG8uZnJhZ21lbnRTdGFydCAhPT0gdC5kZXRhaWxzLmZyYWdtZW50U3RhcnQgJiYgc2EodC5kZXRhaWxzLCBvKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBzdXBlci5sb2FkRnJhZ21lbnQoZSwgdCwgcik7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmNsZWFyVHJhY2tlcklmTmVlZGVkKGUpO1xuICB9XG4gIGZsdXNoQXVkaW9JZk5lZWRlZChlKSB7XG4gICAgaWYgKHRoaXMubWVkaWEgJiYgdGhpcy5idWZmZXJlZFRyYWNrKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWU6IHQsXG4gICAgICAgIGxhbmc6IHIsXG4gICAgICAgIGFzc29jTGFuZzogbixcbiAgICAgICAgY2hhcmFjdGVyaXN0aWNzOiBpLFxuICAgICAgICBhdWRpb0NvZGVjOiBvLFxuICAgICAgICBjaGFubmVsczogYVxuICAgICAgfSA9IHRoaXMuYnVmZmVyZWRUcmFjaztcbiAgICAgIHFzKHtcbiAgICAgICAgbmFtZTogdCxcbiAgICAgICAgbGFuZzogcixcbiAgICAgICAgYXNzb2NMYW5nOiBuLFxuICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IGksXG4gICAgICAgIGF1ZGlvQ29kZWM6IG8sXG4gICAgICAgIGNoYW5uZWxzOiBhXG4gICAgICB9LCBlLCBVcykgfHwgKFFvKGUudXJsLCB0aGlzLmhscykgPyAodGhpcy5sb2coXCJTd2l0Y2hpbmcgYXVkaW8gdHJhY2sgOiBmbHVzaGluZyBhbGwgYXVkaW9cIiksIHN1cGVyLmZsdXNoTWFpbkJ1ZmZlcigwLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIFwiYXVkaW9cIiksIHRoaXMuYnVmZmVyZWRUcmFjayA9IG51bGwpIDogdGhpcy5idWZmZXJlZFRyYWNrID0gZSk7XG4gICAgfVxuICB9XG4gIGNvbXBsZXRlQXVkaW9Td2l0Y2goZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogdFxuICAgIH0gPSB0aGlzO1xuICAgIHRoaXMuZmx1c2hBdWRpb0lmTmVlZGVkKGUpLCB0aGlzLmJ1ZmZlcmVkVHJhY2sgPSBlLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdC50cmlnZ2VyKEkuQVVESU9fVFJBQ0tfU1dJVENIRUQsIHR0KHt9LCBlKSk7XG4gIH1cbn1cbmNsYXNzIGt1IGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5jYW5Mb2FkID0gITEsIHRoaXMudGltZXIgPSAtMSwgdGhpcy5obHMgPSBlO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMuaGxzID0gdGhpcy5sb2cgPSB0aGlzLndhcm4gPSBudWxsO1xuICB9XG4gIGNsZWFyVGltZXIoKSB7XG4gICAgdGhpcy50aW1lciAhPT0gLTEgJiYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gLTEpO1xuICB9XG4gIHN0YXJ0TG9hZCgpIHtcbiAgICB0aGlzLmNhbkxvYWQgPSAhMCwgdGhpcy5sb2FkUGxheWxpc3QoKTtcbiAgfVxuICBzdG9wTG9hZCgpIHtcbiAgICB0aGlzLmNhbkxvYWQgPSAhMSwgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgc3dpdGNoUGFyYW1zKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdCA9PSBudWxsID8gdm9pZCAwIDogdC5yZW5kaXRpb25SZXBvcnRzO1xuICAgIGlmIChuKSB7XG4gICAgICBsZXQgaSA9IC0xO1xuICAgICAgZm9yIChsZXQgbyA9IDA7IG8gPCBuLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBuW29dO1xuICAgICAgICBsZXQgbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsID0gbmV3IHNlbGYuVVJMKGEuVVJJLCB0LnVybCkuaHJlZjtcbiAgICAgICAgfSBjYXRjaCAoYykge1xuICAgICAgICAgIHRoaXMud2FybihgQ291bGQgbm90IGNvbnN0cnVjdCBuZXcgVVJMIGZvciBSZW5kaXRpb24gUmVwb3J0OiAke2N9YCksIGwgPSBhLlVSSSB8fCBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsID09PSBlKSB7XG4gICAgICAgICAgaSA9IG87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBsID09PSBlLnN1YnN0cmluZygwLCBsLmxlbmd0aCkgJiYgKGkgPSBvKTtcbiAgICAgIH1cbiAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBvID0gbltpXSwgYSA9IHBhcnNlSW50KG9bXCJMQVNULU1TTlwiXSkgfHwgdC5sYXN0UGFydFNuO1xuICAgICAgICBsZXQgbCA9IHBhcnNlSW50KG9bXCJMQVNULVBBUlRcIl0pIHx8IHQubGFzdFBhcnRJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuaGxzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSkge1xuICAgICAgICAgIGNvbnN0IHUgPSBNYXRoLm1pbih0LmFnZSAtIHQucGFydFRhcmdldCwgdC50YXJnZXRkdXJhdGlvbik7XG4gICAgICAgICAgbCA+PSAwICYmIHUgPiB0LnBhcnRUYXJnZXQgJiYgKGwgKz0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYyA9IHIgJiYgb2gocik7XG4gICAgICAgIHJldHVybiBuZXcgYWgoYSwgbCA+PSAwID8gbCA6IHZvaWQgMCwgYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvYWRQbGF5bGlzdChlKSB7XG4gICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgbG9hZGluZ1BsYXlsaXN0KGUsIHQpIHtcbiAgICB0aGlzLmNsZWFyVGltZXIoKTtcbiAgfVxuICBzaG91bGRMb2FkUGxheWxpc3QoZSkge1xuICAgIHJldHVybiB0aGlzLmNhbkxvYWQgJiYgISFlICYmICEhZS51cmwgJiYgKCFlLmRldGFpbHMgfHwgZS5kZXRhaWxzLmxpdmUpO1xuICB9XG4gIGdldFVybFdpdGhEaXJlY3RpdmVzKGUsIHQpIHtcbiAgICBpZiAodClcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0LmFkZERpcmVjdGl2ZXMoZSk7XG4gICAgICB9IGNhdGNoIChyKSB7XG4gICAgICAgIHRoaXMud2FybihgQ291bGQgbm90IGNvbnN0cnVjdCBuZXcgVVJMIHdpdGggSExTIERlbGl2ZXJ5IERpcmVjdGl2ZXM6ICR7cn1gKTtcbiAgICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBwbGF5bGlzdExvYWRlZChlLCB0LCByKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGV0YWlsczogbixcbiAgICAgIHN0YXRzOiBpXG4gICAgfSA9IHQsIG8gPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpLCBhID0gaS5sb2FkaW5nLmZpcnN0ID8gTWF0aC5tYXgoMCwgbyAtIGkubG9hZGluZy5maXJzdCkgOiAwO1xuICAgIG4uYWR2YW5jZWREYXRlVGltZSA9IERhdGUubm93KCkgLSBhO1xuICAgIGNvbnN0IGwgPSB0aGlzLmhscy5jb25maWcudGltZWxpbmVPZmZzZXQ7XG4gICAgaWYgKGwgIT09IG4uYXBwbGllZFRpbWVsaW5lT2Zmc2V0KSB7XG4gICAgICBjb25zdCB1ID0gTWF0aC5tYXgobCB8fCAwLCAwKTtcbiAgICAgIG4uYXBwbGllZFRpbWVsaW5lT2Zmc2V0ID0gdSwgbi5mcmFnbWVudHMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBkLnNldFN0YXJ0KGQucGxheWxpc3RPZmZzZXQgKyB1KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobi5saXZlIHx8IHIgIT0gbnVsbCAmJiByLmxpdmUpIHtcbiAgICAgIGNvbnN0IHUgPSBcImxldmVsSW5mb1wiIGluIHQgPyB0LmxldmVsSW5mbyA6IHQudHJhY2s7XG4gICAgICBpZiAobi5yZWxvYWRlZChyKSwgciAmJiBuLmZyYWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIFpiKHIsIG4sIHRoaXMpO1xuICAgICAgICBjb25zdCBSID0gbi5wbGF5bGlzdFBhcnNpbmdFcnJvcjtcbiAgICAgICAgaWYgKFIpIHtcbiAgICAgICAgICB0aGlzLndhcm4oUik7XG4gICAgICAgICAgY29uc3QgQSA9IHRoaXMuaGxzO1xuICAgICAgICAgIGlmICghQS5jb25maWcuaWdub3JlUGxheWxpc3RQYXJzaW5nRXJyb3JzKSB7XG4gICAgICAgICAgICB2YXIgYztcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IEZcbiAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgQS50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgICAgICAgZGV0YWlsczogSi5MRVZFTF9QQVJTSU5HX0VSUk9SLFxuICAgICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICAgIHVybDogbi51cmwsXG4gICAgICAgICAgICAgIGVycm9yOiBSLFxuICAgICAgICAgICAgICByZWFzb246IFIubWVzc2FnZSxcbiAgICAgICAgICAgICAgbGV2ZWw6IHQubGV2ZWwgfHwgdm9pZCAwLFxuICAgICAgICAgICAgICBwYXJlbnQ6IChjID0gbi5mcmFnbWVudHNbMF0pID09IG51bGwgPyB2b2lkIDAgOiBjLnR5cGUsXG4gICAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBGLFxuICAgICAgICAgICAgICBzdGF0czogaVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG4ucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuLnJlcXVlc3RTY2hlZHVsZWQgPT09IC0xICYmIChuLnJlcXVlc3RTY2hlZHVsZWQgPSBpLmxvYWRpbmcuc3RhcnQpO1xuICAgICAgY29uc3QgZCA9IHRoaXMuaGxzLm1haW5Gb3J3YXJkQnVmZmVySW5mbywgaCA9IGQgPyBkLmVuZCAtIGQubGVuIDogMCwgZiA9IChuLmVkZ2UgLSBoKSAqIDFlMywgcCA9IFFnKG4sIGYpO1xuICAgICAgaWYgKG4ucmVxdWVzdFNjaGVkdWxlZCArIHAgPCBvID8gbi5yZXF1ZXN0U2NoZWR1bGVkID0gbyA6IG4ucmVxdWVzdFNjaGVkdWxlZCArPSBwLCB0aGlzLmxvZyhgbGl2ZSBwbGF5bGlzdCAke2V9ICR7bi5hZHZhbmNlZCA/IFwiUkVGUkVTSEVEIFwiICsgbi5sYXN0UGFydFNuICsgXCItXCIgKyBuLmxhc3RQYXJ0SW5kZXggOiBuLnVwZGF0ZWQgPyBcIlVQREFURURcIiA6IFwiTUlTU0VEXCJ9YCksICF0aGlzLmNhbkxvYWQgfHwgIW4ubGl2ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHksIEUsIGI7XG4gICAgICBpZiAobi5jYW5CbG9ja1JlbG9hZCAmJiBuLmVuZFNOICYmIG4uYWR2YW5jZWQpIHtcbiAgICAgICAgY29uc3QgUiA9IHRoaXMuaGxzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSwgQSA9IG4ubGFzdFBhcnRTbiwgRiA9IG4uZW5kU04sIE0gPSBuLmxhc3RQYXJ0SW5kZXgsIEggPSBNICE9PSAtMSwgSyA9IEEgPT09IEY7XG4gICAgICAgIEggPyBLID8gKEUgPSBGICsgMSwgYiA9IFIgPyAwIDogTSkgOiAoRSA9IEEsIGIgPSBSID8gTSArIDEgOiBuLm1heFBhcnRJbmRleCkgOiBFID0gRiArIDE7XG4gICAgICAgIGNvbnN0IGogPSBuLmFnZSwgQyA9IGogKyBuLmFnZUhlYWRlcjtcbiAgICAgICAgbGV0IGsgPSBNYXRoLm1pbihDIC0gbi5wYXJ0VGFyZ2V0LCBuLnRhcmdldGR1cmF0aW9uICogMS41KTtcbiAgICAgICAgaWYgKGsgPiAwKSB7XG4gICAgICAgICAgaWYgKEMgPiBuLnRhcmdldGR1cmF0aW9uICogMylcbiAgICAgICAgICAgIHRoaXMubG9nKGBQbGF5bGlzdCBsYXN0IGFkdmFuY2VkICR7ai50b0ZpeGVkKDIpfXMgYWdvLiBPbWl0dGluZyBzZWdtZW50IGFuZCBwYXJ0IGRpcmVjdGl2ZXMuYCksIEUgPSB2b2lkIDAsIGIgPSB2b2lkIDA7XG4gICAgICAgICAgZWxzZSBpZiAociAhPSBudWxsICYmIHIudHVuZUluR29hbCAmJiBDIC0gbi5wYXJ0VGFyZ2V0ID4gci50dW5lSW5Hb2FsKVxuICAgICAgICAgICAgdGhpcy53YXJuKGBDRE4gVHVuZS1pbiBnb2FsIGluY3JlYXNlZCBmcm9tOiAke3IudHVuZUluR29hbH0gdG86ICR7a30gd2l0aCBwbGF5bGlzdCBhZ2U6ICR7bi5hZ2V9YCksIGsgPSAwO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgJCA9IE1hdGguZmxvb3IoayAvIG4udGFyZ2V0ZHVyYXRpb24pO1xuICAgICAgICAgICAgaWYgKEUgKz0gJCwgYiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFcgPSBNYXRoLnJvdW5kKGsgJSBuLnRhcmdldGR1cmF0aW9uIC8gbi5wYXJ0VGFyZ2V0KTtcbiAgICAgICAgICAgICAgYiArPSBXO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYENETiBUdW5lLWluIGFnZTogJHtuLmFnZUhlYWRlcn1zIGxhc3QgYWR2YW5jZWQgJHtqLnRvRml4ZWQoMil9cyBnb2FsOiAke2t9IHNraXAgc24gJHskfSB0byBwYXJ0ICR7Yn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbi50dW5lSW5Hb2FsID0gaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeSA9IHRoaXMuZ2V0RGVsaXZlcnlEaXJlY3RpdmVzKG4sIHQuZGVsaXZlcnlEaXJlY3RpdmVzLCBFLCBiKSwgUiB8fCAhSykge1xuICAgICAgICAgIG4ucmVxdWVzdFNjaGVkdWxlZCA9IG8sIHRoaXMubG9hZGluZ1BsYXlsaXN0KHUsIHkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIChuLmNhbkJsb2NrUmVsb2FkIHx8IG4uY2FuU2tpcFVudGlsKSAmJiAoeSA9IHRoaXMuZ2V0RGVsaXZlcnlEaXJlY3RpdmVzKG4sIHQuZGVsaXZlcnlEaXJlY3RpdmVzLCBFLCBiKSk7XG4gICAgICB5ICYmIEUgIT09IHZvaWQgMCAmJiBuLmNhbkJsb2NrUmVsb2FkICYmIChuLnJlcXVlc3RTY2hlZHVsZWQgPSBpLmxvYWRpbmcuZmlyc3QgKyBNYXRoLm1heChwIC0gYSAqIDIsIHAgLyAyKSksIHRoaXMuc2NoZWR1bGVMb2FkaW5nKHUsIHksIG4pO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgc2NoZWR1bGVMb2FkaW5nKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gciB8fCBlLmRldGFpbHM7XG4gICAgaWYgKCFuKSB7XG4gICAgICB0aGlzLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIG8gPSBuLnJlcXVlc3RTY2hlZHVsZWQ7XG4gICAgaWYgKGkgPj0gbykge1xuICAgICAgdGhpcy5sb2FkaW5nUGxheWxpc3QoZSwgdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGEgPSBvIC0gaTtcbiAgICB0aGlzLmxvZyhgcmVsb2FkIGxpdmUgcGxheWxpc3QgJHtlLm5hbWUgfHwgZS5iaXRyYXRlICsgXCJicHNcIn0gaW4gJHtNYXRoLnJvdW5kKGEpfSBtc2ApLCB0aGlzLmNsZWFyVGltZXIoKSwgdGhpcy50aW1lciA9IHNlbGYuc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRpbmdQbGF5bGlzdChlLCB0KSwgYSk7XG4gIH1cbiAgZ2V0RGVsaXZlcnlEaXJlY3RpdmVzKGUsIHQsIHIsIG4pIHtcbiAgICBsZXQgaSA9IG9oKGUpO1xuICAgIHJldHVybiB0ICE9IG51bGwgJiYgdC5za2lwICYmIGUuZGVsdGFVcGRhdGVGYWlsZWQgJiYgKHIgPSB0Lm1zbiwgbiA9IHQucGFydCwgaSA9IGdvLk5vKSwgbmV3IGFoKHIsIG4sIGkpO1xuICB9XG4gIGNoZWNrUmV0cnkoZSkge1xuICAgIGNvbnN0IHQgPSBlLmRldGFpbHMsIHIgPSBlYShlKSwgbiA9IGUuZXJyb3JBY3Rpb24sIHtcbiAgICAgIGFjdGlvbjogaSxcbiAgICAgIHJldHJ5Q291bnQ6IG8gPSAwLFxuICAgICAgcmV0cnlDb25maWc6IGFcbiAgICB9ID0gbiB8fCB7fSwgbCA9ICEhbiAmJiAhIWEgJiYgKGkgPT09IFp0LlJldHJ5UmVxdWVzdCB8fCAhbi5yZXNvbHZlZCAmJiBpID09PSBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94KTtcbiAgICBpZiAobCkge1xuICAgICAgdmFyIGM7XG4gICAgICBpZiAobyA+PSBhLm1heE51bVJldHJ5KVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBpZiAociAmJiAoYyA9IGUuY29udGV4dCkgIT0gbnVsbCAmJiBjLmRlbGl2ZXJ5RGlyZWN0aXZlcylcbiAgICAgICAgdGhpcy53YXJuKGBSZXRyeWluZyBwbGF5bGlzdCBsb2FkaW5nICR7byArIDF9LyR7YS5tYXhOdW1SZXRyeX0gYWZ0ZXIgXCIke3R9XCIgd2l0aG91dCBkZWxpdmVyeS1kaXJlY3RpdmVzYCksIHRoaXMubG9hZFBsYXlsaXN0KCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgdSA9IHl1KGEsIG8pO1xuICAgICAgICB0aGlzLmNsZWFyVGltZXIoKSwgdGhpcy50aW1lciA9IHNlbGYuc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRQbGF5bGlzdCgpLCB1KSwgdGhpcy53YXJuKGBSZXRyeWluZyBwbGF5bGlzdCBsb2FkaW5nICR7byArIDF9LyR7YS5tYXhOdW1SZXRyeX0gYWZ0ZXIgXCIke3R9XCIgaW4gJHt1fW1zYCk7XG4gICAgICB9XG4gICAgICBlLmxldmVsUmV0cnkgPSAhMCwgbi5yZXNvbHZlZCA9ICEwO1xuICAgIH1cbiAgICByZXR1cm4gbDtcbiAgfVxufVxuZnVuY3Rpb24gQXAocywgZSkge1xuICBpZiAocy5sZW5ndGggIT09IGUubGVuZ3RoKVxuICAgIHJldHVybiAhMTtcbiAgZm9yIChsZXQgdCA9IDA7IHQgPCBzLmxlbmd0aDsgdCsrKVxuICAgIGlmICghU2koc1t0XS5hdHRycywgZVt0XS5hdHRycykpXG4gICAgICByZXR1cm4gITE7XG4gIHJldHVybiAhMDtcbn1cbmZ1bmN0aW9uIFNpKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHNbXCJTVEFCTEUtUkVORElUSU9OLUlEXCJdO1xuICByZXR1cm4gciAmJiAhdCA/IHIgPT09IGVbXCJTVEFCTEUtUkVORElUSU9OLUlEXCJdIDogISh0IHx8IFtcIkxBTkdVQUdFXCIsIFwiTkFNRVwiLCBcIkNIQVJBQ1RFUklTVElDU1wiLCBcIkFVVE9TRUxFQ1RcIiwgXCJERUZBVUxUXCIsIFwiRk9SQ0VEXCIsIFwiQVNTT0MtTEFOR1VBR0VcIl0pLnNvbWUoKG4pID0+IHNbbl0gIT09IGVbbl0pO1xufVxuZnVuY3Rpb24geWMocywgZSkge1xuICByZXR1cm4gZS5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSBzLm5hbWUudG9Mb3dlckNhc2UoKSAmJiAoIWUubGFuZ3VhZ2UgfHwgZS5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpID09PSAocy5sYW5nIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkpO1xufVxuY2xhc3MgaTIgZXh0ZW5kcyBrdSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBzdXBlcihlLCBcImF1ZGlvLXRyYWNrLWNvbnRyb2xsZXJcIiksIHRoaXMudHJhY2tzID0gW10sIHRoaXMuZ3JvdXBJZHMgPSBudWxsLCB0aGlzLnRyYWNrc0luR3JvdXAgPSBbXSwgdGhpcy50cmFja0lkID0gLTEsIHRoaXMuY3VycmVudFRyYWNrID0gbnVsbCwgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMCwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfU1dJVENISU5HLCB0aGlzLm9uTGV2ZWxTd2l0Y2hpbmcsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfTE9BREVELCB0aGlzLm9uQXVkaW9UcmFja0xvYWRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1NXSVRDSElORywgdGhpcy5vbkxldmVsU3dpdGNoaW5nLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19MT0FERUQsIHRoaXMub25BdWRpb1RyYWNrTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLnRyYWNrcy5sZW5ndGggPSAwLCB0aGlzLnRyYWNrc0luR3JvdXAubGVuZ3RoID0gMCwgdGhpcy5jdXJyZW50VHJhY2sgPSBudWxsLCBzdXBlci5kZXN0cm95KCk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy50cmFja3MgPSBbXSwgdGhpcy50cmFja3NJbkdyb3VwID0gW10sIHRoaXMuZ3JvdXBJZHMgPSBudWxsLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGwsIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLnNlbGVjdERlZmF1bHRUcmFjayA9ICEwO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIHRoaXMudHJhY2tzID0gdC5hdWRpb1RyYWNrcyB8fCBbXTtcbiAgfVxuICBvbkF1ZGlvVHJhY2tMb2FkZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGRldGFpbHM6IGlcbiAgICB9ID0gdCwgbyA9IHRoaXMudHJhY2tzSW5Hcm91cFtyXTtcbiAgICBpZiAoIW8gfHwgby5ncm91cElkICE9PSBuKSB7XG4gICAgICB0aGlzLndhcm4oYEF1ZGlvIHRyYWNrIHdpdGggaWQ6JHtyfSBhbmQgZ3JvdXA6JHtufSBub3QgZm91bmQgaW4gYWN0aXZlIGdyb3VwICR7byA9PSBudWxsID8gdm9pZCAwIDogby5ncm91cElkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhID0gby5kZXRhaWxzO1xuICAgIG8uZGV0YWlscyA9IHQuZGV0YWlscywgdGhpcy5sb2coYEF1ZGlvIHRyYWNrICR7cn0gXCIke28ubmFtZX1cIiBsYW5nOiR7by5sYW5nfSBncm91cDoke259IGxvYWRlZCBbJHtpLnN0YXJ0U059LSR7aS5lbmRTTn1dYCksIHIgPT09IHRoaXMudHJhY2tJZCAmJiB0aGlzLnBsYXlsaXN0TG9hZGVkKHIsIHQsIGEpO1xuICB9XG4gIG9uTGV2ZWxMb2FkaW5nKGUsIHQpIHtcbiAgICB0aGlzLnN3aXRjaExldmVsKHQubGV2ZWwpO1xuICB9XG4gIG9uTGV2ZWxTd2l0Y2hpbmcoZSwgdCkge1xuICAgIHRoaXMuc3dpdGNoTGV2ZWwodC5sZXZlbCk7XG4gIH1cbiAgc3dpdGNoTGV2ZWwoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmhscy5sZXZlbHNbZV07XG4gICAgaWYgKCF0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSB0LmF1ZGlvR3JvdXBzIHx8IG51bGwsIG4gPSB0aGlzLmdyb3VwSWRzO1xuICAgIGxldCBpID0gdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgaWYgKCFyIHx8IChuID09IG51bGwgPyB2b2lkIDAgOiBuLmxlbmd0aCkgIT09IChyID09IG51bGwgPyB2b2lkIDAgOiByLmxlbmd0aCkgfHwgciAhPSBudWxsICYmIHIuc29tZSgoYSkgPT4gKG4gPT0gbnVsbCA/IHZvaWQgMCA6IG4uaW5kZXhPZihhKSkgPT09IC0xKSkge1xuICAgICAgdGhpcy5ncm91cElkcyA9IHIsIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGw7XG4gICAgICBjb25zdCBhID0gdGhpcy50cmFja3MuZmlsdGVyKChoKSA9PiAhciB8fCByLmluZGV4T2YoaC5ncm91cElkKSAhPT0gLTEpO1xuICAgICAgaWYgKGEubGVuZ3RoKVxuICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRUcmFjayAmJiAhYS5zb21lKChoKSA9PiBoLmRlZmF1bHQpICYmICh0aGlzLnNlbGVjdERlZmF1bHRUcmFjayA9ICExKSwgYS5mb3JFYWNoKChoLCBmKSA9PiB7XG4gICAgICAgICAgaC5pZCA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZiAoIWkgJiYgIXRoaXMudHJhY2tzSW5Hcm91cC5sZW5ndGgpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMudHJhY2tzSW5Hcm91cCA9IGE7XG4gICAgICBjb25zdCBsID0gdGhpcy5obHMuY29uZmlnLmF1ZGlvUHJlZmVyZW5jZTtcbiAgICAgIGlmICghaSAmJiBsKSB7XG4gICAgICAgIGNvbnN0IGggPSBXcihsLCBhLCBVcyk7XG4gICAgICAgIGlmIChoID4gLTEpXG4gICAgICAgICAgaSA9IGFbaF07XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGYgPSBXcihsLCB0aGlzLnRyYWNrcyk7XG4gICAgICAgICAgaSA9IHRoaXMudHJhY2tzW2ZdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgYyA9IHRoaXMuZmluZFRyYWNrSWQoaSk7XG4gICAgICBjID09PSAtMSAmJiBpICYmIChjID0gdGhpcy5maW5kVHJhY2tJZChudWxsKSk7XG4gICAgICBjb25zdCB1ID0ge1xuICAgICAgICBhdWRpb1RyYWNrczogYVxuICAgICAgfTtcbiAgICAgIHRoaXMubG9nKGBVcGRhdGluZyBhdWRpbyB0cmFja3MsICR7YS5sZW5ndGh9IHRyYWNrKHMpIGZvdW5kIGluIGdyb3VwKHMpOiAke3IgPT0gbnVsbCA/IHZvaWQgMCA6IHIuam9pbihcIixcIil9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5BVURJT19UUkFDS1NfVVBEQVRFRCwgdSk7XG4gICAgICBjb25zdCBkID0gdGhpcy50cmFja0lkO1xuICAgICAgaWYgKGMgIT09IC0xICYmIGQgPT09IC0xKVxuICAgICAgICB0aGlzLnNldEF1ZGlvVHJhY2soYyk7XG4gICAgICBlbHNlIGlmIChhLmxlbmd0aCAmJiBkID09PSAtMSkge1xuICAgICAgICB2YXIgbztcbiAgICAgICAgY29uc3QgaCA9IG5ldyBFcnJvcihgTm8gYXVkaW8gdHJhY2sgc2VsZWN0ZWQgZm9yIGN1cnJlbnQgYXVkaW8gZ3JvdXAtSUQocyk6ICR7KG8gPSB0aGlzLmdyb3VwSWRzKSA9PSBudWxsID8gdm9pZCAwIDogby5qb2luKFwiLFwiKX0gdHJhY2sgY291bnQ6ICR7YS5sZW5ndGh9YCk7XG4gICAgICAgIHRoaXMud2FybihoLm1lc3NhZ2UpLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkFVRElPX1RSQUNLX0xPQURfRVJST1IsXG4gICAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICAgIGVycm9yOiBoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICB0LmZhdGFsIHx8ICF0LmNvbnRleHQgfHwgdC5jb250ZXh0LnR5cGUgPT09IEtlLkFVRElPX1RSQUNLICYmIHQuY29udGV4dC5pZCA9PT0gdGhpcy50cmFja0lkICYmICghdGhpcy5ncm91cElkcyB8fCB0aGlzLmdyb3VwSWRzLmluZGV4T2YodC5jb250ZXh0Lmdyb3VwSWQpICE9PSAtMSkgJiYgdGhpcy5jaGVja1JldHJ5KHQpO1xuICB9XG4gIGdldCBhbGxBdWRpb1RyYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3M7XG4gIH1cbiAgZ2V0IGF1ZGlvVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrc0luR3JvdXA7XG4gIH1cbiAgZ2V0IGF1ZGlvVHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tJZDtcbiAgfVxuICBzZXQgYXVkaW9UcmFjayhlKSB7XG4gICAgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMSwgdGhpcy5zZXRBdWRpb1RyYWNrKGUpO1xuICB9XG4gIHNldEF1ZGlvT3B0aW9uKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHM7XG4gICAgaWYgKHQuY29uZmlnLmF1ZGlvUHJlZmVyZW5jZSA9IGUsIGUpIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLmFsbEF1ZGlvVHJhY2tzO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITEsIHIubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICAgICAgaWYgKG4gJiYgcXMoZSwgbiwgVXMpKVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBjb25zdCBpID0gV3IoZSwgdGhpcy50cmFja3NJbkdyb3VwLCBVcyk7XG4gICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy50cmFja3NJbkdyb3VwW2ldO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNldEF1ZGlvVHJhY2soaSksIG87XG4gICAgICAgIH0gZWxzZSBpZiAobikge1xuICAgICAgICAgIGxldCBvID0gdC5sb2FkTGV2ZWw7XG4gICAgICAgICAgbyA9PT0gLTEgJiYgKG8gPSB0LmZpcnN0QXV0b0xldmVsKTtcbiAgICAgICAgICBjb25zdCBhID0gbWIoZSwgdC5sZXZlbHMsIHIsIG8sIFVzKTtcbiAgICAgICAgICBpZiAoYSA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB0Lm5leHRMb2FkTGV2ZWwgPSBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmNoYW5uZWxzIHx8IGUuYXVkaW9Db2RlYykge1xuICAgICAgICAgIGNvbnN0IG8gPSBXcihlLCByKTtcbiAgICAgICAgICBpZiAobyA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHJbb107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc2V0QXVkaW9UcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMudHJhY2tzSW5Hcm91cDtcbiAgICBpZiAoZSA8IDAgfHwgZSA+PSB0Lmxlbmd0aCkge1xuICAgICAgdGhpcy53YXJuKGBJbnZhbGlkIGF1ZGlvIHRyYWNrIGlkOiAke2V9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITE7XG4gICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRyYWNrLCBuID0gdFtlXSwgaSA9IG4uZGV0YWlscyAmJiAhbi5kZXRhaWxzLmxpdmU7XG4gICAgaWYgKGUgPT09IHRoaXMudHJhY2tJZCAmJiBuID09PSByICYmIGkgfHwgKHRoaXMubG9nKGBTd2l0Y2hpbmcgdG8gYXVkaW8tdHJhY2sgJHtlfSBcIiR7bi5uYW1lfVwiIGxhbmc6JHtuLmxhbmd9IGdyb3VwOiR7bi5ncm91cElkfSBjaGFubmVsczoke24uY2hhbm5lbHN9YCksIHRoaXMudHJhY2tJZCA9IGUsIHRoaXMuY3VycmVudFRyYWNrID0gbiwgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSElORywgdHQoe30sIG4pKSwgaSkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IHRoaXMuc3dpdGNoUGFyYW1zKG4udXJsLCByID09IG51bGwgPyB2b2lkIDAgOiByLmRldGFpbHMsIG4uZGV0YWlscyk7XG4gICAgdGhpcy5sb2FkUGxheWxpc3Qobyk7XG4gIH1cbiAgZmluZFRyYWNrSWQoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnRyYWNrc0luR3JvdXA7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICBjb25zdCBuID0gdFtyXTtcbiAgICAgIGlmICghKHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrICYmICFuLmRlZmF1bHQpICYmICghZSB8fCBxcyhlLCBuLCBVcykpKVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgbGFuZzogbixcbiAgICAgICAgYXNzb2NMYW5nOiBpLFxuICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IG8sXG4gICAgICAgIGF1ZGlvQ29kZWM6IGEsXG4gICAgICAgIGNoYW5uZWxzOiBsXG4gICAgICB9ID0gZTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgdC5sZW5ndGg7IGMrKykge1xuICAgICAgICBjb25zdCB1ID0gdFtjXTtcbiAgICAgICAgaWYgKHFzKHtcbiAgICAgICAgICBuYW1lOiByLFxuICAgICAgICAgIGxhbmc6IG4sXG4gICAgICAgICAgYXNzb2NMYW5nOiBpLFxuICAgICAgICAgIGNoYXJhY3RlcmlzdGljczogbyxcbiAgICAgICAgICBhdWRpb0NvZGVjOiBhLFxuICAgICAgICAgIGNoYW5uZWxzOiBsXG4gICAgICAgIH0sIHUsIFVzKSlcbiAgICAgICAgICByZXR1cm4gYztcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgdC5sZW5ndGg7IGMrKykge1xuICAgICAgICBjb25zdCB1ID0gdFtjXTtcbiAgICAgICAgaWYgKFNpKGUuYXR0cnMsIHUuYXR0cnMsIFtcIkxBTkdVQUdFXCIsIFwiQVNTT0MtTEFOR1VBR0VcIiwgXCJDSEFSQUNURVJJU1RJQ1NcIl0pKVxuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB0Lmxlbmd0aDsgYysrKSB7XG4gICAgICAgIGNvbnN0IHUgPSB0W2NdO1xuICAgICAgICBpZiAoU2koZS5hdHRycywgdS5hdHRycywgW1wiTEFOR1VBR0VcIl0pKVxuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgbG9hZFBsYXlsaXN0KGUpIHtcbiAgICBzdXBlci5sb2FkUGxheWxpc3QoKTtcbiAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgdGhpcy5zaG91bGRMb2FkUGxheWxpc3QodCkgJiYgUW8odC51cmwsIHRoaXMuaGxzKSAmJiB0aGlzLnNjaGVkdWxlTG9hZGluZyh0LCBlKTtcbiAgfVxuICBsb2FkaW5nUGxheWxpc3QoZSwgdCkge1xuICAgIHN1cGVyLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICBjb25zdCByID0gZS5pZCwgbiA9IGUuZ3JvdXBJZCwgaSA9IHRoaXMuZ2V0VXJsV2l0aERpcmVjdGl2ZXMoZS51cmwsIHQpLCBvID0gZS5kZXRhaWxzLCBhID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5hZ2U7XG4gICAgdGhpcy5sb2coYExvYWRpbmcgYXVkaW8tdHJhY2sgJHtyfSBcIiR7ZS5uYW1lfVwiIGxhbmc6JHtlLmxhbmd9IGdyb3VwOiR7bn0keyh0ID09IG51bGwgPyB2b2lkIDAgOiB0Lm1zbikgIT09IHZvaWQgMCA/IFwiIGF0IHNuIFwiICsgdC5tc24gKyBcIiBwYXJ0IFwiICsgdC5wYXJ0IDogXCJcIn0ke2EgJiYgby5saXZlID8gXCIgYWdlIFwiICsgYS50b0ZpeGVkKDEpICsgKG8udHlwZSAmJiBcIiBcIiArIG8udHlwZSB8fCBcIlwiKSA6IFwiXCJ9ICR7aX1gKSwgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX0xPQURJTkcsIHtcbiAgICAgIHVybDogaSxcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogdCB8fCBudWxsLFxuICAgICAgdHJhY2s6IGVcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgbzIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy50cmFja3MgPSB2b2lkIDAsIHRoaXMucXVldWVzID0ge1xuICAgICAgdmlkZW86IFtdLFxuICAgICAgYXVkaW86IFtdLFxuICAgICAgYXVkaW92aWRlbzogW11cbiAgICB9LCB0aGlzLnRyYWNrcyA9IGU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnRyYWNrcyA9IHRoaXMucXVldWVzID0gbnVsbDtcbiAgfVxuICBhcHBlbmQoZSwgdCwgcikge1xuICAgIGlmICh0aGlzLnF1ZXVlcyA9PT0gbnVsbCB8fCB0aGlzLnRyYWNrcyA9PT0gbnVsbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gdGhpcy5xdWV1ZXNbdF07XG4gICAgbi5wdXNoKGUpLCBuLmxlbmd0aCA9PT0gMSAmJiAhciAmJiB0aGlzLmV4ZWN1dGVOZXh0KHQpO1xuICB9XG4gIGFwcGVuZEJsb2NrZXIoZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCkgPT4ge1xuICAgICAgY29uc3QgciA9IHtcbiAgICAgICAgbGFiZWw6IFwiYXN5bmMtYmxvY2tlclwiLFxuICAgICAgICBleGVjdXRlOiB0LFxuICAgICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5hcHBlbmQociwgZSk7XG4gICAgfSk7XG4gIH1cbiAgcHJlcGVuZEJsb2NrZXIoZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWVzKSB7XG4gICAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgICAgbGFiZWw6IFwiYXN5bmMtYmxvY2tlci1wcmVwZW5kXCIsXG4gICAgICAgICAgZXhlY3V0ZTogdCxcbiAgICAgICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnF1ZXVlc1tlXS51bnNoaWZ0KHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJlbW92ZUJsb2NrZXJzKCkge1xuICAgIHRoaXMucXVldWVzICE9PSBudWxsICYmIFt0aGlzLnF1ZXVlcy52aWRlbywgdGhpcy5xdWV1ZXMuYXVkaW8sIHRoaXMucXVldWVzLmF1ZGlvdmlkZW9dLmZvckVhY2goKGUpID0+IHtcbiAgICAgIHZhciB0O1xuICAgICAgY29uc3QgciA9ICh0ID0gZVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQubGFiZWw7XG4gICAgICAociA9PT0gXCJhc3luYy1ibG9ja2VyXCIgfHwgciA9PT0gXCJhc3luYy1ibG9ja2VyLXByZXBlbmRcIikgJiYgKGVbMF0uZXhlY3V0ZSgpLCBlLnNwbGljZSgwLCAxKSk7XG4gICAgfSk7XG4gIH1cbiAgdW5ibG9ja0F1ZGlvKGUpIHtcbiAgICBpZiAodGhpcy5xdWV1ZXMgPT09IG51bGwpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5xdWV1ZXMuYXVkaW9bMF0gPT09IGUgJiYgdGhpcy5zaGlmdEFuZEV4ZWN1dGVOZXh0KFwiYXVkaW9cIik7XG4gIH1cbiAgZXhlY3V0ZU5leHQoZSkge1xuICAgIGlmICh0aGlzLnF1ZXVlcyA9PT0gbnVsbCB8fCB0aGlzLnRyYWNrcyA9PT0gbnVsbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5xdWV1ZXNbZV07XG4gICAgaWYgKHQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuID0gdFswXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG4uZXhlY3V0ZSgpO1xuICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICB2YXIgcjtcbiAgICAgICAgaWYgKG4ub25FcnJvcihpKSwgdGhpcy5xdWV1ZXMgPT09IG51bGwgfHwgdGhpcy50cmFja3MgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBvID0gKHIgPSB0aGlzLnRyYWNrc1tlXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuYnVmZmVyO1xuICAgICAgICBvICE9IG51bGwgJiYgby51cGRhdGluZyB8fCB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNoaWZ0QW5kRXhlY3V0ZU5leHQoZSkge1xuICAgIHRoaXMucXVldWVzICE9PSBudWxsICYmICh0aGlzLnF1ZXVlc1tlXS5zaGlmdCgpLCB0aGlzLmV4ZWN1dGVOZXh0KGUpKTtcbiAgfVxuICBjdXJyZW50KGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gKCh0ID0gdGhpcy5xdWV1ZXMpID09IG51bGwgPyB2b2lkIDAgOiB0W2VdWzBdKSB8fCBudWxsO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHF1ZXVlczogZSxcbiAgICAgIHRyYWNrczogdFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBlID09PSBudWxsIHx8IHQgPT09IG51bGwgPyBcIjxkZXN0cm95ZWQ+XCIgOiBgXG4ke3RoaXMubGlzdChcInZpZGVvXCIpfVxuJHt0aGlzLmxpc3QoXCJhdWRpb1wiKX1cbiR7dGhpcy5saXN0KFwiYXVkaW92aWRlb1wiKX19YDtcbiAgfVxuICBsaXN0KGUpIHtcbiAgICB2YXIgdCwgcjtcbiAgICByZXR1cm4gKHQgPSB0aGlzLnF1ZXVlcykgIT0gbnVsbCAmJiB0W2VdIHx8IChyID0gdGhpcy50cmFja3MpICE9IG51bGwgJiYgcltlXSA/IGAke2V9OiAoJHt0aGlzLmxpc3RTYkluZm8oZSl9KSAke3RoaXMubGlzdE9wcyhlKX1gIDogXCJcIjtcbiAgfVxuICBsaXN0U2JJbmZvKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCByID0gKHQgPSB0aGlzLnRyYWNrcykgPT0gbnVsbCA/IHZvaWQgMCA6IHRbZV0sIG4gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmJ1ZmZlcjtcbiAgICByZXR1cm4gbiA/IGBTb3VyY2VCdWZmZXIke24udXBkYXRpbmcgPyBcIiB1cGRhdGluZ1wiIDogXCJcIn0ke3IuZW5kZWQgPyBcIiBlbmRlZFwiIDogXCJcIn0ke3IuZW5kaW5nID8gXCIgZW5kaW5nXCIgOiBcIlwifWAgOiBcIm5vbmVcIjtcbiAgfVxuICBsaXN0T3BzKGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gKCh0ID0gdGhpcy5xdWV1ZXMpID09IG51bGwgPyB2b2lkIDAgOiB0W2VdLm1hcCgocikgPT4gci5sYWJlbCkuam9pbihcIiwgXCIpKSB8fCBcIlwiO1xuICB9XG59XG5jb25zdCBLaCA9IC8oYXZjWzEyMzRdfGh2YzF8aGV2MXxkdmhbMWVdfHZwMDl8YXYwMSkoPzpcXC5bXi4sXSspKy8sIElwID0gXCJIbHNKc1RyYWNrUmVtb3ZlZEVycm9yXCI7XG5jbGFzcyBhMiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUpLCB0aGlzLm5hbWUgPSBJcDtcbiAgfVxufVxuY2xhc3MgbDIgZXh0ZW5kcyBMciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcihcImJ1ZmZlci1jb250cm9sbGVyXCIsIGUubG9nZ2VyKSwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuZnJhZ21lbnRUcmFja2VyID0gdm9pZCAwLCB0aGlzLmRldGFpbHMgPSBudWxsLCB0aGlzLl9vYmplY3RVcmwgPSBudWxsLCB0aGlzLm9wZXJhdGlvblF1ZXVlID0gbnVsbCwgdGhpcy5idWZmZXJDb2RlY0V2ZW50c1RvdGFsID0gMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsLCB0aGlzLmxhc3RNcGVnQXVkaW9DaHVuayA9IG51bGwsIHRoaXMuYmxvY2tlZEF1ZGlvQXBwZW5kID0gbnVsbCwgdGhpcy5sYXN0VmlkZW9BcHBlbmRFbmQgPSAwLCB0aGlzLmFwcGVuZFNvdXJjZSA9IHZvaWQgMCwgdGhpcy50cmFuc2ZlckRhdGEgPSB2b2lkIDAsIHRoaXMub3ZlcnJpZGVzID0gdm9pZCAwLCB0aGlzLmFwcGVuZEVycm9ycyA9IHtcbiAgICAgIGF1ZGlvOiAwLFxuICAgICAgdmlkZW86IDAsXG4gICAgICBhdWRpb3ZpZGVvOiAwXG4gICAgfSwgdGhpcy50cmFja3MgPSB7fSwgdGhpcy5zb3VyY2VCdWZmZXJzID0gW1tudWxsLCBudWxsXSwgW251bGwsIG51bGxdXSwgdGhpcy5fb25FbmRTdHJlYW1pbmcgPSAocikgPT4ge1xuICAgICAgdmFyIG47XG4gICAgICB0aGlzLmhscyAmJiAoKG4gPSB0aGlzLm1lZGlhU291cmNlKSA9PSBudWxsID8gdm9pZCAwIDogbi5yZWFkeVN0YXRlKSA9PT0gXCJvcGVuXCIgJiYgdGhpcy5obHMucGF1c2VCdWZmZXJpbmcoKTtcbiAgICB9LCB0aGlzLl9vblN0YXJ0U3RyZWFtaW5nID0gKHIpID0+IHtcbiAgICAgIHRoaXMuaGxzICYmIHRoaXMuaGxzLnJlc3VtZUJ1ZmZlcmluZygpO1xuICAgIH0sIHRoaXMuX29uTWVkaWFTb3VyY2VPcGVuID0gKHIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVkaWE6IG4sXG4gICAgICAgIG1lZGlhU291cmNlOiBpXG4gICAgICB9ID0gdGhpcztcbiAgICAgIHIgJiYgdGhpcy5sb2coXCJNZWRpYSBzb3VyY2Ugb3BlbmVkXCIpLCAhKCFuIHx8ICFpKSAmJiAoaS5yZW1vdmVFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLCB0aGlzLl9vbk1lZGlhU291cmNlT3BlbiksIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVtcHRpZWRcIiwgdGhpcy5fb25NZWRpYUVtcHRpZWQpLCB0aGlzLnVwZGF0ZUR1cmF0aW9uKCksIHRoaXMuaGxzLnRyaWdnZXIoSS5NRURJQV9BVFRBQ0hFRCwge1xuICAgICAgICBtZWRpYTogbixcbiAgICAgICAgbWVkaWFTb3VyY2U6IGlcbiAgICAgIH0pLCB0aGlzLm1lZGlhU291cmNlICE9PSBudWxsICYmIHRoaXMuY2hlY2tQZW5kaW5nVHJhY2tzKCkpO1xuICAgIH0sIHRoaXMuX29uTWVkaWFTb3VyY2VDbG9zZSA9ICgpID0+IHtcbiAgICAgIHRoaXMubG9nKFwiTWVkaWEgc291cmNlIGNsb3NlZFwiKTtcbiAgICB9LCB0aGlzLl9vbk1lZGlhU291cmNlRW5kZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxvZyhcIk1lZGlhIHNvdXJjZSBlbmRlZFwiKTtcbiAgICB9LCB0aGlzLl9vbk1lZGlhRW1wdGllZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVkaWFTcmM6IHIsXG4gICAgICAgIF9vYmplY3RVcmw6IG5cbiAgICAgIH0gPSB0aGlzO1xuICAgICAgciAhPT0gbiAmJiB0aGlzLmVycm9yKGBNZWRpYSBlbGVtZW50IHNyYyB3YXMgc2V0IHdoaWxlIGF0dGFjaGluZyBNZWRpYVNvdXJjZSAoJHtufSA+ICR7cn0pYCk7XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLmZyYWdtZW50VHJhY2tlciA9IHQsIHRoaXMuYXBwZW5kU291cmNlID0gQ1MoTXMoZS5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlKSksIHRoaXMuaW5pdFRyYWNrcygpLCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgaGFzU291cmNlVHlwZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudHJhY2tzKS5sZW5ndGggPiAwO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuZGV0YWlscyA9IG51bGwsIHRoaXMubGFzdE1wZWdBdWRpb0NodW5rID0gdGhpcy5ibG9ja2VkQXVkaW9BcHBlbmQgPSBudWxsLCB0aGlzLnRyYW5zZmVyRGF0YSA9IHRoaXMub3ZlcnJpZGVzID0gdm9pZCAwLCB0aGlzLm9wZXJhdGlvblF1ZXVlICYmICh0aGlzLm9wZXJhdGlvblF1ZXVlLmRlc3Ryb3koKSwgdGhpcy5vcGVyYXRpb25RdWV1ZSA9IG51bGwpLCB0aGlzLmhscyA9IHRoaXMuZnJhZ21lbnRUcmFja2VyID0gbnVsbCwgdGhpcy5fb25NZWRpYVNvdXJjZU9wZW4gPSB0aGlzLl9vbk1lZGlhU291cmNlQ2xvc2UgPSBudWxsLCB0aGlzLl9vbk1lZGlhU291cmNlRW5kZWQgPSBudWxsLCB0aGlzLl9vblN0YXJ0U3RyZWFtaW5nID0gdGhpcy5fb25FbmRTdHJlYW1pbmcgPSBudWxsO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9SRVNFVCwgdGhpcy5vbkJ1ZmZlclJlc2V0LCB0aGlzKSwgZS5vbihJLkJVRkZFUl9BUFBFTkRJTkcsIHRoaXMub25CdWZmZXJBcHBlbmRpbmcsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0NPREVDUywgdGhpcy5vbkJ1ZmZlckNvZGVjcywgdGhpcyksIGUub24oSS5CVUZGRVJfRU9TLCB0aGlzLm9uQnVmZmVyRW9zLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19QQVJTRUQsIHRoaXMub25GcmFnUGFyc2VkLCB0aGlzKSwgZS5vbihJLkZSQUdfQ0hBTkdFRCwgdGhpcy5vbkZyYWdDaGFuZ2VkLCB0aGlzKSwgZS5vbihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vZmYoSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpLCBlLm9mZihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfUkVTRVQsIHRoaXMub25CdWZmZXJSZXNldCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0FQUEVORElORywgdGhpcy5vbkJ1ZmZlckFwcGVuZGluZywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0NPREVDUywgdGhpcy5vbkJ1ZmZlckNvZGVjcywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0VPUywgdGhpcy5vbkJ1ZmZlckVvcywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNISU5HLCB0aGlzLm9uQnVmZmVyRmx1c2hpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfUEFSU0VELCB0aGlzLm9uRnJhZ1BhcnNlZCwgdGhpcyksIGUub2ZmKEkuRlJBR19DSEFOR0VELCB0aGlzLm9uRnJhZ0NoYW5nZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIHRyYW5zZmVyTWVkaWEoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGUsXG4gICAgICBtZWRpYVNvdXJjZTogdFxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHIgPSB7fTtcbiAgICBpZiAodGhpcy5vcGVyYXRpb25RdWV1ZSkge1xuICAgICAgY29uc3QgaSA9IHRoaXMuaXNVcGRhdGluZygpO1xuICAgICAgaSB8fCB0aGlzLm9wZXJhdGlvblF1ZXVlLnJlbW92ZUJsb2NrZXJzKCk7XG4gICAgICBjb25zdCBvID0gdGhpcy5pc1F1ZXVlZCgpO1xuICAgICAgKGkgfHwgbykgJiYgdGhpcy53YXJuKGBUcmFuc2ZlcmluZyBNZWRpYVNvdXJjZSB3aXRoJHtvID8gXCIgb3BlcmF0aW9ucyBpbiBxdWV1ZVwiIDogXCJcIn0ke2kgPyBcIiB1cGRhdGluZyBTb3VyY2VCdWZmZXIocylcIiA6IFwiXCJ9ICR7dGhpcy5vcGVyYXRpb25RdWV1ZX1gKSwgdGhpcy5vcGVyYXRpb25RdWV1ZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSB0aGlzLnRyYW5zZmVyRGF0YTtcbiAgICByZXR1cm4gIXRoaXMuc291cmNlQnVmZmVyQ291bnQgJiYgbiAmJiBuLm1lZGlhU291cmNlID09PSB0ID8gbnQociwgbi50cmFja3MpIDogdGhpcy5zb3VyY2VCdWZmZXJzLmZvckVhY2goKGkpID0+IHtcbiAgICAgIGNvbnN0IFtvXSA9IGk7XG4gICAgICBvICYmIChyW29dID0gbnQoe30sIHRoaXMudHJhY2tzW29dKSwgdGhpcy5yZW1vdmVCdWZmZXIobykpLCBpWzBdID0gaVsxXSA9IG51bGw7XG4gICAgfSksIHtcbiAgICAgIG1lZGlhOiBlLFxuICAgICAgbWVkaWFTb3VyY2U6IHQsXG4gICAgICB0cmFja3M6IHJcbiAgICB9O1xuICB9XG4gIGluaXRUcmFja3MoKSB7XG4gICAgY29uc3QgZSA9IHt9O1xuICAgIHRoaXMuc291cmNlQnVmZmVycyA9IFtbbnVsbCwgbnVsbF0sIFtudWxsLCBudWxsXV0sIHRoaXMudHJhY2tzID0gZSwgdGhpcy5yZXNldFF1ZXVlKCksIHRoaXMucmVzZXRBcHBlbmRFcnJvcnMoKSwgdGhpcy5sYXN0TXBlZ0F1ZGlvQ2h1bmsgPSB0aGlzLmJsb2NrZWRBdWRpb0FwcGVuZCA9IG51bGwsIHRoaXMubGFzdFZpZGVvQXBwZW5kRW5kID0gMDtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzVG90YWwgPSAwLCB0aGlzLmRldGFpbHMgPSBudWxsO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGxldCBuID0gMjtcbiAgICAodC5hdWRpbyAmJiAhdC52aWRlbyB8fCAhdC5hbHRBdWRpbykgJiYgKG4gPSAxKSwgdGhpcy5idWZmZXJDb2RlY0V2ZW50c1RvdGFsID0gbiwgdGhpcy5sb2coYCR7bn0gYnVmZmVyQ29kZWMgZXZlbnQocykgZXhwZWN0ZWQuYCksIChyID0gdGhpcy50cmFuc2ZlckRhdGEpICE9IG51bGwgJiYgci5tZWRpYVNvdXJjZSAmJiB0aGlzLnNvdXJjZUJ1ZmZlckNvdW50ICYmIG4gJiYgdGhpcy5idWZmZXJDcmVhdGVkKCk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMubWVkaWEgPSB0Lm1lZGlhO1xuICAgIHRoaXMudHJhbnNmZXJEYXRhID0gdGhpcy5vdmVycmlkZXMgPSB2b2lkIDA7XG4gICAgY29uc3QgbiA9IE1zKHRoaXMuYXBwZW5kU291cmNlKTtcbiAgICBpZiAobikge1xuICAgICAgY29uc3QgaSA9ICEhdC5tZWRpYVNvdXJjZTtcbiAgICAgIChpIHx8IHQub3ZlcnJpZGVzKSAmJiAodGhpcy50cmFuc2ZlckRhdGEgPSB0LCB0aGlzLm92ZXJyaWRlcyA9IHQub3ZlcnJpZGVzKTtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLm1lZGlhU291cmNlID0gdC5tZWRpYVNvdXJjZSB8fCBuZXcgbigpO1xuICAgICAgaWYgKHRoaXMuYXNzaWduTWVkaWFTb3VyY2UobyksIGkpXG4gICAgICAgIHRoaXMuX29iamVjdFVybCA9IHIuc3JjLCB0aGlzLmF0dGFjaFRyYW5zZmVycmVkKCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuX29iamVjdFVybCA9IHNlbGYuVVJMLmNyZWF0ZU9iamVjdFVSTChvKTtcbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kU291cmNlKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByLnJlbW92ZUF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIGNvbnN0IGwgPSBzZWxmLk1hbmFnZWRNZWRpYVNvdXJjZTtcbiAgICAgICAgICAgIHIuZGlzYWJsZVJlbW90ZVBsYXliYWNrID0gci5kaXNhYmxlUmVtb3RlUGxheWJhY2sgfHwgbCAmJiBvIGluc3RhbmNlb2YgbCwgSGgociksIGMyKHIsIGEpLCByLmxvYWQoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHIuc3JjID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByLnNyYyA9IGE7XG4gICAgICB9XG4gICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJlbXB0aWVkXCIsIHRoaXMuX29uTWVkaWFFbXB0aWVkKTtcbiAgICB9XG4gIH1cbiAgYXNzaWduTWVkaWFTb3VyY2UoZSkge1xuICAgIHZhciB0LCByO1xuICAgIHRoaXMubG9nKGAkeygodCA9IHRoaXMudHJhbnNmZXJEYXRhKSA9PSBudWxsID8gdm9pZCAwIDogdC5tZWRpYVNvdXJjZSkgPT09IGUgPyBcInRyYW5zZmVycmVkXCIgOiBcImNyZWF0ZWRcIn0gbWVkaWEgc291cmNlOiAkeyhyID0gZS5jb25zdHJ1Y3RvcikgPT0gbnVsbCA/IHZvaWQgMCA6IHIubmFtZX1gKSwgZS5hZGRFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLCB0aGlzLl9vbk1lZGlhU291cmNlT3BlbiksIGUuYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZWVuZGVkXCIsIHRoaXMuX29uTWVkaWFTb3VyY2VFbmRlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZWNsb3NlXCIsIHRoaXMuX29uTWVkaWFTb3VyY2VDbG9zZSksIHRoaXMuYXBwZW5kU291cmNlICYmIChlLmFkZEV2ZW50TGlzdGVuZXIoXCJzdGFydHN0cmVhbWluZ1wiLCB0aGlzLl9vblN0YXJ0U3RyZWFtaW5nKSwgZS5hZGRFdmVudExpc3RlbmVyKFwiZW5kc3RyZWFtaW5nXCIsIHRoaXMuX29uRW5kU3RyZWFtaW5nKSk7XG4gIH1cbiAgYXR0YWNoVHJhbnNmZXJyZWQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWEsIHQgPSB0aGlzLnRyYW5zZmVyRGF0YTtcbiAgICBpZiAoIXQgfHwgIWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMudHJhY2tzLCBuID0gdC50cmFja3MsIGkgPSBuID8gT2JqZWN0LmtleXMobikgOiBudWxsLCBvID0gaSA/IGkubGVuZ3RoIDogMCwgYSA9ICgpID0+IHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1lZGlhICYmIHRoaXMubWVkaWFTb3VyY2VPcGVuT3JFbmRlZCAmJiB0aGlzLl9vbk1lZGlhU291cmNlT3BlbigpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAobiAmJiBpICYmIG8pIHtcbiAgICAgIGlmICghdGhpcy50cmFja3NSZWFkeSkge1xuICAgICAgICB0aGlzLmhscy5jb25maWcuc3RhcnRGcmFnUHJlZmV0Y2ggPSAhMCwgdGhpcy5sb2coXCJhdHRhY2hUcmFuc2ZlcnJlZDogd2FpdGluZyBmb3IgU291cmNlQnVmZmVyIHRyYWNrIGluZm9cIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvZyhgYXR0YWNoVHJhbnNmZXJyZWQ6IChidWZmZXJDb2RlY0V2ZW50c1RvdGFsICR7dGhpcy5idWZmZXJDb2RlY0V2ZW50c1RvdGFsfSlcbnJlcXVpcmVkIHRyYWNrczogJHthdChyLCAobCwgYykgPT4gbCA9PT0gXCJpbml0U2VnbWVudFwiID8gdm9pZCAwIDogYyl9O1xudHJhbnNmZXIgdHJhY2tzOiAke2F0KG4sIChsLCBjKSA9PiBsID09PSBcImluaXRTZWdtZW50XCIgPyB2b2lkIDAgOiBjKX19YCksICFBZyhuLCByKSkge1xuICAgICAgICB0Lm1lZGlhU291cmNlID0gbnVsbCwgdC50cmFja3MgPSB2b2lkIDA7XG4gICAgICAgIGNvbnN0IGwgPSBlLmN1cnJlbnRUaW1lLCBjID0gdGhpcy5kZXRhaWxzLCB1ID0gTWF0aC5tYXgobCwgKGMgPT0gbnVsbCA/IHZvaWQgMCA6IGMuZnJhZ21lbnRzWzBdLnN0YXJ0KSB8fCAwKTtcbiAgICAgICAgaWYgKHUgLSBsID4gMSkge1xuICAgICAgICAgIHRoaXMubG9nKGBhdHRhY2hUcmFuc2ZlcnJlZDogd2FpdGluZyBmb3IgcGxheWJhY2sgdG8gcmVhY2ggbmV3IHRyYWNrcyBzdGFydCB0aW1lICR7bH0gLT4gJHt1fWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhcm4oYGF0dGFjaFRyYW5zZmVycmVkOiByZXNldHRpbmcgTWVkaWFTb3VyY2UgZm9yIGluY29tcGF0aWJsZSB0cmFja3MgKFwiJHtPYmplY3Qua2V5cyhuKX1cIi0+XCIke09iamVjdC5rZXlzKHIpfVwiKSBzdGFydCB0aW1lOiAke3V9IGN1cnJlbnRUaW1lOiAke2x9YCksIHRoaXMub25NZWRpYURldGFjaGluZyhJLk1FRElBX0RFVEFDSElORywge30pLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcoSS5NRURJQV9BVFRBQ0hJTkcsIHQpLCBlLmN1cnJlbnRUaW1lID0gdTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2ZlckRhdGEgPSB2b2lkIDAsIGkuZm9yRWFjaCgobCkgPT4ge1xuICAgICAgICBjb25zdCBjID0gbCwgdSA9IG5bY107XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgY29uc3QgZCA9IHUuYnVmZmVyO1xuICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gdGhpcy5mcmFnbWVudFRyYWNrZXIsIGYgPSB1LmlkO1xuICAgICAgICAgICAgaWYgKGguaGFzRnJhZ21lbnRzKGYpIHx8IGguaGFzUGFydHMoZikpIHtcbiAgICAgICAgICAgICAgY29uc3QgRSA9IENlLmdldEJ1ZmZlcmVkKGQpO1xuICAgICAgICAgICAgICBoLmRldGVjdEV2aWN0ZWRGcmFnbWVudHMoYywgRSwgZiwgbnVsbCwgITApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcCA9IFNsKGMpLCB5ID0gW2MsIGRdO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJzW3BdID0geSwgZC51cGRhdGluZyAmJiB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIHRoaXMub3BlcmF0aW9uUXVldWUucHJlcGVuZEJsb2NrZXIoYyksIHRoaXMudHJhY2tTb3VyY2VCdWZmZXIoYywgdSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwgYSgpLCB0aGlzLmJ1ZmZlckNyZWF0ZWQoKTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMubG9nKFwiYXR0YWNoVHJhbnNmZXJyZWQ6IE1lZGlhU291cmNlIHcvbyBTb3VyY2VCdWZmZXJzXCIpLCBhKCk7XG4gIH1cbiAgZ2V0IG1lZGlhU291cmNlT3Blbk9yRW5kZWQoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3QgdCA9IChlID0gdGhpcy5tZWRpYVNvdXJjZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gdCA9PT0gXCJvcGVuXCIgfHwgdCA9PT0gXCJlbmRlZFwiO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAhIXQudHJhbnNmZXJNZWRpYTtcbiAgICB0aGlzLnRyYW5zZmVyRGF0YSA9IHRoaXMub3ZlcnJpZGVzID0gdm9pZCAwO1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBuLFxuICAgICAgbWVkaWFTb3VyY2U6IGksXG4gICAgICBfb2JqZWN0VXJsOiBvXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKGkpIHtcbiAgICAgIGlmICh0aGlzLmxvZyhgbWVkaWEgc291cmNlICR7ciA/IFwidHJhbnNmZXJyaW5nXCIgOiBcImRldGFjaGluZ1wifWApLCByKVxuICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMuZm9yRWFjaCgoW2FdKSA9PiB7XG4gICAgICAgICAgYSAmJiB0aGlzLnJlbW92ZUJ1ZmZlcihhKTtcbiAgICAgICAgfSksIHRoaXMucmVzZXRRdWV1ZSgpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm1lZGlhU291cmNlT3Blbk9yRW5kZWQpIHtcbiAgICAgICAgICBjb25zdCBhID0gaS5yZWFkeVN0YXRlID09PSBcIm9wZW5cIjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbCA9IGkuc291cmNlQnVmZmVycztcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSBsLmxlbmd0aDsgYy0tOyApXG4gICAgICAgICAgICAgIGEgJiYgbFtjXS5hYm9ydCgpLCBpLnJlbW92ZVNvdXJjZUJ1ZmZlcihsW2NdKTtcbiAgICAgICAgICAgIGEgJiYgaS5lbmRPZlN0cmVhbSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGwpIHtcbiAgICAgICAgICAgIHRoaXMud2Fybihgb25NZWRpYURldGFjaGluZzogJHtsLm1lc3NhZ2V9IHdoaWxlIGNhbGxpbmcgZW5kT2ZTdHJlYW1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJDb3VudCAmJiB0aGlzLm9uQnVmZmVyUmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIiwgdGhpcy5fb25NZWRpYVNvdXJjZU9wZW4pLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VlbmRlZFwiLCB0aGlzLl9vbk1lZGlhU291cmNlRW5kZWQpLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VjbG9zZVwiLCB0aGlzLl9vbk1lZGlhU291cmNlQ2xvc2UpLCB0aGlzLmFwcGVuZFNvdXJjZSAmJiAoaS5yZW1vdmVFdmVudExpc3RlbmVyKFwic3RhcnRzdHJlYW1pbmdcIiwgdGhpcy5fb25TdGFydFN0cmVhbWluZyksIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVuZHN0cmVhbWluZ1wiLCB0aGlzLl9vbkVuZFN0cmVhbWluZykpLCB0aGlzLm1lZGlhU291cmNlID0gbnVsbCwgdGhpcy5fb2JqZWN0VXJsID0gbnVsbDtcbiAgICB9XG4gICAgbiAmJiAobi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZW1wdGllZFwiLCB0aGlzLl9vbk1lZGlhRW1wdGllZCksIHIgfHwgKG8gJiYgc2VsZi5VUkwucmV2b2tlT2JqZWN0VVJMKG8pLCB0aGlzLm1lZGlhU3JjID09PSBvID8gKG4ucmVtb3ZlQXR0cmlidXRlKFwic3JjXCIpLCB0aGlzLmFwcGVuZFNvdXJjZSAmJiBIaChuKSwgbi5sb2FkKCkpIDogdGhpcy53YXJuKFwibWVkaWF8c291cmNlLnNyYyB3YXMgY2hhbmdlZCBieSBhIHRoaXJkIHBhcnR5IC0gc2tpcCBjbGVhbnVwXCIpKSwgdGhpcy5tZWRpYSA9IG51bGwpLCB0aGlzLmhscy50cmlnZ2VyKEkuTUVESUFfREVUQUNIRUQsIHQpO1xuICB9XG4gIG9uQnVmZmVyUmVzZXQoKSB7XG4gICAgdGhpcy5zb3VyY2VCdWZmZXJzLmZvckVhY2goKFtlXSkgPT4ge1xuICAgICAgZSAmJiB0aGlzLnJlc2V0QnVmZmVyKGUpO1xuICAgIH0pLCB0aGlzLmluaXRUcmFja3MoKTtcbiAgfVxuICByZXNldEJ1ZmZlcihlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3QgciA9ICh0ID0gdGhpcy50cmFja3NbZV0pID09IG51bGwgPyB2b2lkIDAgOiB0LmJ1ZmZlcjtcbiAgICBpZiAodGhpcy5yZW1vdmVCdWZmZXIoZSksIHIpXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbjtcbiAgICAgICAgKG4gPSB0aGlzLm1lZGlhU291cmNlKSAhPSBudWxsICYmIG4uc291cmNlQnVmZmVycy5sZW5ndGggJiYgdGhpcy5tZWRpYVNvdXJjZS5yZW1vdmVTb3VyY2VCdWZmZXIocik7XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIHRoaXMud2Fybihgb25CdWZmZXJSZXNldCAke2V9YCwgaSk7XG4gICAgICB9XG4gICAgZGVsZXRlIHRoaXMudHJhY2tzW2VdO1xuICB9XG4gIHJlbW92ZUJ1ZmZlcihlKSB7XG4gICAgdGhpcy5yZW1vdmVCdWZmZXJMaXN0ZW5lcnMoZSksIHRoaXMuc291cmNlQnVmZmVyc1tTbChlKV0gPSBbbnVsbCwgbnVsbF07XG4gICAgY29uc3QgdCA9IHRoaXMudHJhY2tzW2VdO1xuICAgIHQgJiYgKHQuYnVmZmVyID0gdm9pZCAwKTtcbiAgfVxuICByZXNldFF1ZXVlKCkge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgJiYgdGhpcy5vcGVyYXRpb25RdWV1ZS5kZXN0cm95KCksIHRoaXMub3BlcmF0aW9uUXVldWUgPSBuZXcgbzIodGhpcy50cmFja3MpO1xuICB9XG4gIG9uQnVmZmVyQ29kZWNzKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gdGhpcy50cmFja3MsIGkgPSBPYmplY3Qua2V5cyh0KTtcbiAgICB0aGlzLmxvZyhgQlVGRkVSX0NPREVDUzogXCIke2l9XCIgKGN1cnJlbnQgU0IgY291bnQgJHt0aGlzLnNvdXJjZUJ1ZmZlckNvdW50fSlgKTtcbiAgICBjb25zdCBvID0gXCJhdWRpb3ZpZGVvXCIgaW4gdCAmJiAobi5hdWRpbyB8fCBuLnZpZGVvKSB8fCBuLmF1ZGlvdmlkZW8gJiYgKFwiYXVkaW9cIiBpbiB0IHx8IFwidmlkZW9cIiBpbiB0KSwgYSA9ICFvICYmIHRoaXMuc291cmNlQnVmZmVyQ291bnQgJiYgdGhpcy5tZWRpYSAmJiBpLnNvbWUoKGwpID0+ICFuW2xdKTtcbiAgICBpZiAobyB8fCBhKSB7XG4gICAgICB0aGlzLndhcm4oYFVuc3VwcG9ydGVkIHRyYW5zaXRpb24gYmV0d2VlbiBcIiR7T2JqZWN0LmtleXMobil9XCIgYW5kIFwiJHtpfVwiIFNvdXJjZUJ1ZmZlcnNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICB2YXIgYywgdTtcbiAgICAgIGNvbnN0IGQgPSB0W2xdLCB7XG4gICAgICAgIGlkOiBoLFxuICAgICAgICBjb2RlYzogZixcbiAgICAgICAgbGV2ZWxDb2RlYzogcCxcbiAgICAgICAgY29udGFpbmVyOiB5LFxuICAgICAgICBtZXRhZGF0YTogRSxcbiAgICAgICAgc3VwcGxlbWVudGFsOiBiXG4gICAgICB9ID0gZDtcbiAgICAgIGxldCBSID0gbltsXTtcbiAgICAgIGNvbnN0IEEgPSAoYyA9IHRoaXMudHJhbnNmZXJEYXRhKSA9PSBudWxsIHx8IChjID0gYy50cmFja3MpID09IG51bGwgPyB2b2lkIDAgOiBjW2xdLCBGID0gQSAhPSBudWxsICYmIEEuYnVmZmVyID8gQSA6IFIsIE0gPSAoRiA9PSBudWxsID8gdm9pZCAwIDogRi5wZW5kaW5nQ29kZWMpIHx8IChGID09IG51bGwgPyB2b2lkIDAgOiBGLmNvZGVjKSwgSCA9IEYgPT0gbnVsbCA/IHZvaWQgMCA6IEYubGV2ZWxDb2RlYztcbiAgICAgIFIgfHwgKFIgPSBuW2xdID0ge1xuICAgICAgICBidWZmZXI6IHZvaWQgMCxcbiAgICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgICAgY29kZWM6IGYsXG4gICAgICAgIHN1cHBsZW1lbnRhbDogYixcbiAgICAgICAgY29udGFpbmVyOiB5LFxuICAgICAgICBsZXZlbENvZGVjOiBwLFxuICAgICAgICBtZXRhZGF0YTogRSxcbiAgICAgICAgaWQ6IGhcbiAgICAgIH0pO1xuICAgICAgY29uc3QgSyA9IGZvKE0sIEgpLCBqID0gSyA9PSBudWxsID8gdm9pZCAwIDogSy5yZXBsYWNlKEtoLCBcIiQxXCIpO1xuICAgICAgbGV0IEMgPSBmbyhmLCBwKTtcbiAgICAgIGNvbnN0IGsgPSAodSA9IEMpID09IG51bGwgPyB2b2lkIDAgOiB1LnJlcGxhY2UoS2gsIFwiJDFcIik7XG4gICAgICBDICYmIEsgJiYgaiAhPT0gayAmJiAobC5zbGljZSgwLCA1KSA9PT0gXCJhdWRpb1wiICYmIChDID0gWG8oQywgdGhpcy5hcHBlbmRTb3VyY2UpKSwgdGhpcy5sb2coYHN3aXRjaGluZyBjb2RlYyAke019IHRvICR7Q31gKSwgQyAhPT0gKFIucGVuZGluZ0NvZGVjIHx8IFIuY29kZWMpICYmIChSLnBlbmRpbmdDb2RlYyA9IEMpLCBSLmNvbnRhaW5lciA9IHksIHRoaXMuYXBwZW5kQ2hhbmdlVHlwZShsLCB5LCBDKSk7XG4gICAgfSksICh0aGlzLnRyYWNrc1JlYWR5IHx8IHRoaXMuc291cmNlQnVmZmVyQ291bnQpICYmICh0LnRyYWNrcyA9IHRoaXMuc291cmNlQnVmZmVyVHJhY2tzKSwgIXRoaXMuc291cmNlQnVmZmVyQ291bnQgJiYgKHRoaXMuYnVmZmVyQ29kZWNFdmVudHNUb3RhbCA+IDEgJiYgIXRoaXMudHJhY2tzLnZpZGVvICYmICF0LnZpZGVvICYmICgociA9IHQuYXVkaW8pID09IG51bGwgPyB2b2lkIDAgOiByLmlkKSA9PT0gXCJtYWluXCIgJiYgKHRoaXMubG9nKFwiTWFpbiBhdWRpby1vbmx5XCIpLCB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzVG90YWwgPSAxKSwgdGhpcy5tZWRpYVNvdXJjZU9wZW5PckVuZGVkICYmIHRoaXMuY2hlY2tQZW5kaW5nVHJhY2tzKCkpO1xuICB9XG4gIGdldCBzb3VyY2VCdWZmZXJUcmFja3MoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudHJhY2tzKS5yZWR1Y2UoKGUsIHQpID0+IHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnRyYWNrc1t0XTtcbiAgICAgIHJldHVybiBlW3RdID0ge1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgY29udGFpbmVyOiByLmNvbnRhaW5lcixcbiAgICAgICAgY29kZWM6IHIuY29kZWMsXG4gICAgICAgIGxldmVsQ29kZWM6IHIubGV2ZWxDb2RlY1xuICAgICAgfSwgZTtcbiAgICB9LCB7fSk7XG4gIH1cbiAgYXBwZW5kQ2hhbmdlVHlwZShlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IGAke3R9O2NvZGVjcz0ke3J9YCwgaSA9IHtcbiAgICAgIGxhYmVsOiBgY2hhbmdlLXR5cGU9JHtufWAsXG4gICAgICBleGVjdXRlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLnRyYWNrc1tlXTtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICBjb25zdCBhID0gby5idWZmZXI7XG4gICAgICAgICAgYSAhPSBudWxsICYmIGEuY2hhbmdlVHlwZSAmJiAodGhpcy5sb2coYGNoYW5naW5nICR7ZX0gc291cmNlQnVmZmVyIHR5cGUgdG8gJHtufWApLCBhLmNoYW5nZVR5cGUobiksIG8uY29kZWMgPSByLCBvLmNvbnRhaW5lciA9IHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hpZnRBbmRFeGVjdXRlTmV4dChlKTtcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChvKSA9PiB7XG4gICAgICAgIHRoaXMud2FybihgRmFpbGVkIHRvIGNoYW5nZSAke2V9IFNvdXJjZUJ1ZmZlciB0eXBlYCwgbyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFwcGVuZChpLCBlLCB0aGlzLmlzUGVuZGluZyh0aGlzLnRyYWNrc1tlXSkpO1xuICB9XG4gIGJsb2NrQXVkaW8oZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSBlLnN0YXJ0LCBuID0gciArIGUuZHVyYXRpb24gKiAwLjA1O1xuICAgIGlmICgoKHQgPSB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRBcHBlbmRlZEZyYWcociwgcGUuTUFJTikpID09IG51bGwgPyB2b2lkIDAgOiB0LmdhcCkgPT09ICEwKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSB7XG4gICAgICBsYWJlbDogXCJibG9jay1hdWRpb1wiLFxuICAgICAgZXhlY3V0ZTogKCkgPT4ge1xuICAgICAgICB2YXIgYTtcbiAgICAgICAgY29uc3QgbCA9IHRoaXMudHJhY2tzLnZpZGVvO1xuICAgICAgICAodGhpcy5sYXN0VmlkZW9BcHBlbmRFbmQgPiBuIHx8IGwgIT0gbnVsbCAmJiBsLmJ1ZmZlciAmJiBDZS5pc0J1ZmZlcmVkKGwuYnVmZmVyLCBuKSB8fCAoKGEgPSB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRBcHBlbmRlZEZyYWcobiwgcGUuTUFJTikpID09IG51bGwgPyB2b2lkIDAgOiBhLmdhcCkgPT09ICEwKSAmJiAodGhpcy5ibG9ja2VkQXVkaW9BcHBlbmQgPSBudWxsLCB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQoXCJhdWRpb1wiKSk7XG4gICAgICB9LFxuICAgICAgb25TdGFydDogKCkgPT4ge1xuICAgICAgfSxcbiAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoYSkgPT4ge1xuICAgICAgICB0aGlzLndhcm4oXCJFcnJvciBleGVjdXRpbmcgYmxvY2stYXVkaW8gb3BlcmF0aW9uXCIsIGEpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5ibG9ja2VkQXVkaW9BcHBlbmQgPSB7XG4gICAgICBvcDogbyxcbiAgICAgIGZyYWc6IGVcbiAgICB9LCB0aGlzLmFwcGVuZChvLCBcImF1ZGlvXCIsICEwKTtcbiAgfVxuICB1bmJsb2NrQXVkaW8oKSB7XG4gICAgY29uc3Qge1xuICAgICAgYmxvY2tlZEF1ZGlvQXBwZW5kOiBlLFxuICAgICAgb3BlcmF0aW9uUXVldWU6IHRcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIHQgJiYgKHRoaXMuYmxvY2tlZEF1ZGlvQXBwZW5kID0gbnVsbCwgdC51bmJsb2NrQXVkaW8oZS5vcCkpO1xuICB9XG4gIG9uQnVmZmVyQXBwZW5kaW5nKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB0cmFja3M6IHJcbiAgICB9ID0gdGhpcywge1xuICAgICAgZGF0YTogbixcbiAgICAgIHR5cGU6IGksXG4gICAgICBwYXJlbnQ6IG8sXG4gICAgICBmcmFnOiBhLFxuICAgICAgcGFydDogbCxcbiAgICAgIGNodW5rTWV0YTogYyxcbiAgICAgIG9mZnNldDogdVxuICAgIH0gPSB0LCBkID0gYy5idWZmZXJpbmdbaV0sIHtcbiAgICAgIHNuOiBoLFxuICAgICAgY2M6IGZcbiAgICB9ID0gYSwgcCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgZC5zdGFydCA9IHA7XG4gICAgY29uc3QgeSA9IGEuc3RhdHMuYnVmZmVyaW5nLCBFID0gbCA/IGwuc3RhdHMuYnVmZmVyaW5nIDogbnVsbDtcbiAgICB5LnN0YXJ0ID09PSAwICYmICh5LnN0YXJ0ID0gcCksIEUgJiYgRS5zdGFydCA9PT0gMCAmJiAoRS5zdGFydCA9IHApO1xuICAgIGNvbnN0IGIgPSByLmF1ZGlvO1xuICAgIGxldCBSID0gITE7XG4gICAgaSA9PT0gXCJhdWRpb1wiICYmIChiID09IG51bGwgPyB2b2lkIDAgOiBiLmNvbnRhaW5lcikgPT09IFwiYXVkaW8vbXBlZ1wiICYmIChSID0gIXRoaXMubGFzdE1wZWdBdWRpb0NodW5rIHx8IGMuaWQgPT09IDEgfHwgdGhpcy5sYXN0TXBlZ0F1ZGlvQ2h1bmsuc24gIT09IGMuc24sIHRoaXMubGFzdE1wZWdBdWRpb0NodW5rID0gYyk7XG4gICAgY29uc3QgQSA9IHIudmlkZW8sIEYgPSBBID09IG51bGwgPyB2b2lkIDAgOiBBLmJ1ZmZlcjtcbiAgICBpZiAoRiAmJiBoICE9PSBcImluaXRTZWdtZW50XCIpIHtcbiAgICAgIGNvbnN0IEsgPSBsIHx8IGEsIGogPSB0aGlzLmJsb2NrZWRBdWRpb0FwcGVuZDtcbiAgICAgIGlmIChpID09PSBcImF1ZGlvXCIgJiYgbyAhPT0gXCJtYWluXCIgJiYgIXRoaXMuYmxvY2tlZEF1ZGlvQXBwZW5kICYmICEoQS5lbmRpbmcgfHwgQS5lbmRlZCkpIHtcbiAgICAgICAgY29uc3QgayA9IEsuc3RhcnQgKyBLLmR1cmF0aW9uICogMC4wNSwgJCA9IEYuYnVmZmVyZWQsIFcgPSB0aGlzLmN1cnJlbnRPcChcInZpZGVvXCIpO1xuICAgICAgICAhJC5sZW5ndGggJiYgIVcgPyB0aGlzLmJsb2NrQXVkaW8oSykgOiAhVyAmJiAhQ2UuaXNCdWZmZXJlZChGLCBrKSAmJiB0aGlzLmxhc3RWaWRlb0FwcGVuZEVuZCA8IGsgJiYgdGhpcy5ibG9ja0F1ZGlvKEspO1xuICAgICAgfSBlbHNlIGlmIChpID09PSBcInZpZGVvXCIpIHtcbiAgICAgICAgY29uc3QgQyA9IEsuZW5kO1xuICAgICAgICBpZiAoaikge1xuICAgICAgICAgIGNvbnN0IGsgPSBqLmZyYWcuc3RhcnQ7XG4gICAgICAgICAgKEMgPiBrIHx8IEMgPCB0aGlzLmxhc3RWaWRlb0FwcGVuZEVuZCB8fCBDZS5pc0J1ZmZlcmVkKEYsIGspKSAmJiB0aGlzLnVuYmxvY2tBdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdFZpZGVvQXBwZW5kRW5kID0gQztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgTSA9IChsIHx8IGEpLnN0YXJ0LCBIID0ge1xuICAgICAgbGFiZWw6IGBhcHBlbmQtJHtpfWAsXG4gICAgICBleGVjdXRlOiAoKSA9PiB7XG4gICAgICAgIHZhciBLO1xuICAgICAgICBkLmV4ZWN1dGVTdGFydCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIGNvbnN0IGogPSAoSyA9IHRoaXMudHJhY2tzW2ldKSA9PSBudWxsID8gdm9pZCAwIDogSy5idWZmZXI7XG4gICAgICAgIGogJiYgKFIgPyB0aGlzLnVwZGF0ZVRpbWVzdGFtcE9mZnNldChqLCBNLCAwLjEsIGksIGgsIGYpIDogdSAhPT0gdm9pZCAwICYmIHVlKHUpICYmIHRoaXMudXBkYXRlVGltZXN0YW1wT2Zmc2V0KGosIHUsIDFlLTYsIGksIGgsIGYpKSwgdGhpcy5hcHBlbmRFeGVjdXRvcihuLCBpKTtcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBLID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgZC5leGVjdXRlRW5kID0gZC5lbmQgPSBLLCB5LmZpcnN0ID09PSAwICYmICh5LmZpcnN0ID0gSyksIEUgJiYgRS5maXJzdCA9PT0gMCAmJiAoRS5maXJzdCA9IEspO1xuICAgICAgICBjb25zdCBqID0ge307XG4gICAgICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbQywga10pID0+IHtcbiAgICAgICAgICBDICYmIChqW0NdID0gQ2UuZ2V0QnVmZmVyZWQoaykpO1xuICAgICAgICB9KSwgdGhpcy5hcHBlbmRFcnJvcnNbaV0gPSAwLCBpID09PSBcImF1ZGlvXCIgfHwgaSA9PT0gXCJ2aWRlb1wiID8gdGhpcy5hcHBlbmRFcnJvcnMuYXVkaW92aWRlbyA9IDAgOiAodGhpcy5hcHBlbmRFcnJvcnMuYXVkaW8gPSAwLCB0aGlzLmFwcGVuZEVycm9ycy52aWRlbyA9IDApLCB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0FQUEVOREVELCB7XG4gICAgICAgICAgdHlwZTogaSxcbiAgICAgICAgICBmcmFnOiBhLFxuICAgICAgICAgIHBhcnQ6IGwsXG4gICAgICAgICAgY2h1bmtNZXRhOiBjLFxuICAgICAgICAgIHBhcmVudDogYS50eXBlLFxuICAgICAgICAgIHRpbWVSYW5nZXM6IGpcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKEspID0+IHtcbiAgICAgICAgdmFyIGo7XG4gICAgICAgIGNvbnN0IEMgPSB7XG4gICAgICAgICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgICAgICAgcGFyZW50OiBhLnR5cGUsXG4gICAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfQVBQRU5EX0VSUk9SLFxuICAgICAgICAgIHNvdXJjZUJ1ZmZlck5hbWU6IGksXG4gICAgICAgICAgZnJhZzogYSxcbiAgICAgICAgICBwYXJ0OiBsLFxuICAgICAgICAgIGNodW5rTWV0YTogYyxcbiAgICAgICAgICBlcnJvcjogSyxcbiAgICAgICAgICBlcnI6IEssXG4gICAgICAgICAgZmF0YWw6ICExXG4gICAgICAgIH0sIGsgPSAoaiA9IHRoaXMubWVkaWEpID09IG51bGwgPyB2b2lkIDAgOiBqLmVycm9yO1xuICAgICAgICBpZiAoSy5jb2RlID09PSBET01FeGNlcHRpb24uUVVPVEFfRVhDRUVERURfRVJSIHx8IEsubmFtZSA9PSBcIlF1b3RhRXhjZWVkZWRFcnJvclwiIHx8IFwicXVvdGFcIiBpbiBLKVxuICAgICAgICAgIEMuZGV0YWlscyA9IEouQlVGRkVSX0ZVTExfRVJST1I7XG4gICAgICAgIGVsc2UgaWYgKEsuY29kZSA9PT0gRE9NRXhjZXB0aW9uLklOVkFMSURfU1RBVEVfRVJSICYmIHRoaXMubWVkaWFTb3VyY2VPcGVuT3JFbmRlZCAmJiAhaylcbiAgICAgICAgICBDLmVycm9yQWN0aW9uID0gQW4oITApO1xuICAgICAgICBlbHNlIGlmIChLLm5hbWUgPT09IElwICYmIHRoaXMuc291cmNlQnVmZmVyQ291bnQgPT09IDApXG4gICAgICAgICAgQy5lcnJvckFjdGlvbiA9IEFuKCEwKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgJCA9ICsrdGhpcy5hcHBlbmRFcnJvcnNbaV07XG4gICAgICAgICAgdGhpcy53YXJuKGBGYWlsZWQgJHskfS8ke3RoaXMuaGxzLmNvbmZpZy5hcHBlbmRFcnJvck1heFJldHJ5fSB0aW1lcyB0byBhcHBlbmQgc2VnbWVudCBpbiBcIiR7aX1cIiBzb3VyY2VCdWZmZXIgKCR7ayB8fCBcIm5vIG1lZGlhIGVycm9yXCJ9KWApLCAoJCA+PSB0aGlzLmhscy5jb25maWcuYXBwZW5kRXJyb3JNYXhSZXRyeSB8fCBrKSAmJiAoQy5mYXRhbCA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIEMpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5sb2coYHF1ZXVpbmcgXCIke2l9XCIgYXBwZW5kIHNuOiAke2h9JHtsID8gXCIgcDogXCIgKyBsLmluZGV4IDogXCJcIn0gb2YgJHthLnR5cGUgPT09IHBlLk1BSU4gPyBcImxldmVsXCIgOiBcInRyYWNrXCJ9ICR7YS5sZXZlbH0gY2M6ICR7Zn1gKSwgdGhpcy5hcHBlbmQoSCwgaSwgdGhpcy5pc1BlbmRpbmcodGhpcy50cmFja3NbaV0pKTtcbiAgfVxuICBnZXRGbHVzaE9wKGUsIHQsIHIpIHtcbiAgICByZXR1cm4gdGhpcy5sb2coYHF1ZXVpbmcgXCIke2V9XCIgcmVtb3ZlICR7dH0tJHtyfWApLCB7XG4gICAgICBsYWJlbDogXCJyZW1vdmVcIixcbiAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVFeGVjdXRvcihlLCB0LCByKTtcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0ZMVVNIRUQsIHtcbiAgICAgICAgICB0eXBlOiBlXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChuKSA9PiB7XG4gICAgICAgIHRoaXMud2FybihgRmFpbGVkIHRvIHJlbW92ZSAke3R9LSR7cn0gZnJvbSBcIiR7ZX1cIiBTb3VyY2VCdWZmZXJgLCBuKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIG9uQnVmZmVyRmx1c2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGU6IHIsXG4gICAgICBzdGFydE9mZnNldDogbixcbiAgICAgIGVuZE9mZnNldDogaVxuICAgIH0gPSB0O1xuICAgIHIgPyB0aGlzLmFwcGVuZCh0aGlzLmdldEZsdXNoT3AociwgbiwgaSksIHIpIDogdGhpcy5zb3VyY2VCdWZmZXJzLmZvckVhY2goKFtvXSkgPT4ge1xuICAgICAgbyAmJiB0aGlzLmFwcGVuZCh0aGlzLmdldEZsdXNoT3AobywgbiwgaSksIG8pO1xuICAgIH0pO1xuICB9XG4gIG9uRnJhZ1BhcnNlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHBhcnQ6IG5cbiAgICB9ID0gdCwgaSA9IFtdLCBvID0gbiA/IG4uZWxlbWVudGFyeVN0cmVhbXMgOiByLmVsZW1lbnRhcnlTdHJlYW1zO1xuICAgIG9bb3QuQVVESU9WSURFT10gPyBpLnB1c2goXCJhdWRpb3ZpZGVvXCIpIDogKG9bb3QuQVVESU9dICYmIGkucHVzaChcImF1ZGlvXCIpLCBvW290LlZJREVPXSAmJiBpLnB1c2goXCJ2aWRlb1wiKSk7XG4gICAgY29uc3QgYSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGwgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgci5zdGF0cy5idWZmZXJpbmcuZW5kID0gbCwgbiAmJiAobi5zdGF0cy5idWZmZXJpbmcuZW5kID0gbCk7XG4gICAgICBjb25zdCBjID0gbiA/IG4uc3RhdHMgOiByLnN0YXRzO1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkZSQUdfQlVGRkVSRUQsIHtcbiAgICAgICAgZnJhZzogcixcbiAgICAgICAgcGFydDogbixcbiAgICAgICAgc3RhdHM6IGMsXG4gICAgICAgIGlkOiByLnR5cGVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaS5sZW5ndGggPT09IDAgJiYgdGhpcy53YXJuKGBGcmFnbWVudHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBFbGVtZW50YXJ5U3RyZWFtVHlwZSBzZXQuIHR5cGU6ICR7ci50eXBlfSBsZXZlbDogJHtyLmxldmVsfSBzbjogJHtyLnNufWApLCB0aGlzLmJsb2NrQnVmZmVycyhhLCBpKS5jYXRjaCgobCkgPT4ge1xuICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCBidWZmZXJlZCBjYWxsYmFjayAke2x9YCksIHRoaXMuc3RlcE9wZXJhdGlvblF1ZXVlKHRoaXMuc291cmNlQnVmZmVyVHlwZXMpO1xuICAgIH0pO1xuICB9XG4gIG9uRnJhZ0NoYW5nZWQoZSwgdCkge1xuICAgIHRoaXMudHJpbUJ1ZmZlcnMoKTtcbiAgfVxuICBnZXQgYnVmZmVyZWRUb0VuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VCdWZmZXJDb3VudCA+IDAgJiYgIXRoaXMuc291cmNlQnVmZmVycy5zb21lKChbZV0pID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLnRyYWNrc1tlXTtcbiAgICAgICAgaWYgKHQpXG4gICAgICAgICAgcmV0dXJuICF0LmVuZGVkIHx8IHQuZW5kaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuICExO1xuICAgIH0pO1xuICB9XG4gIC8vIG9uIEJVRkZFUl9FT1MgbWFyayBtYXRjaGluZyBzb3VyY2VidWZmZXIocykgYXMgXCJlbmRpbmdcIiBhbmQgXCJlbmRlZFwiIGFuZCBxdWV1ZSBlbmRPZlN0cmVhbSBhZnRlciByZW1haW5pbmcgb3BlcmF0aW9ucyhzKVxuICAvLyBhbiB1bmRlZmluZWQgZGF0YS50eXBlIHdpbGwgbWFyayBhbGwgYnVmZmVycyBhcyBFT1MuXG4gIG9uQnVmZmVyRW9zKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMuZm9yRWFjaCgoW29dKSA9PiB7XG4gICAgICBpZiAobykge1xuICAgICAgICBjb25zdCBhID0gdGhpcy50cmFja3Nbb107XG4gICAgICAgICghdC50eXBlIHx8IHQudHlwZSA9PT0gbykgJiYgKGEuZW5kaW5nID0gITAsIGEuZW5kZWQgfHwgKGEuZW5kZWQgPSAhMCwgdGhpcy5sb2coYCR7b30gYnVmZmVyIHJlYWNoZWQgRU9TYCkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBuID0gKChyID0gdGhpcy5vdmVycmlkZXMpID09IG51bGwgPyB2b2lkIDAgOiByLmVuZE9mU3RyZWFtKSAhPT0gITE7XG4gICAgdGhpcy5zb3VyY2VCdWZmZXJDb3VudCA+IDAgJiYgIXRoaXMuc291cmNlQnVmZmVycy5zb21lKChbb10pID0+IHtcbiAgICAgIHZhciBhO1xuICAgICAgcmV0dXJuIG8gJiYgISgoYSA9IHRoaXMudHJhY2tzW29dKSAhPSBudWxsICYmIGEuZW5kZWQpO1xuICAgIH0pID8gbiA/ICh0aGlzLmxvZyhcIlF1ZXVlaW5nIEVPU1wiKSwgdGhpcy5ibG9ja1VudGlsT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnRyYWNrc0VuZGVkKCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1lZGlhU291cmNlOiBvXG4gICAgICB9ID0gdGhpcztcbiAgICAgIGlmICghbyB8fCBvLnJlYWR5U3RhdGUgIT09IFwib3BlblwiKSB7XG4gICAgICAgIG8gJiYgdGhpcy5sb2coYENvdWxkIG5vdCBjYWxsIG1lZGlhU291cmNlLmVuZE9mU3RyZWFtKCkuIG1lZGlhU291cmNlLnJlYWR5U3RhdGU6ICR7by5yZWFkeVN0YXRlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhcIkNhbGxpbmcgbWVkaWFTb3VyY2UuZW5kT2ZTdHJlYW0oKVwiKSwgby5lbmRPZlN0cmVhbSgpLCB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSRURfVE9fRU5ELCB2b2lkIDApO1xuICAgIH0pKSA6ICh0aGlzLnRyYWNrc0VuZGVkKCksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJFRF9UT19FTkQsIHZvaWQgMCkpIDogdC50eXBlID09PSBcInZpZGVvXCIgJiYgdGhpcy51bmJsb2NrQXVkaW8oKTtcbiAgfVxuICB0cmFja3NFbmRlZCgpIHtcbiAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMuZm9yRWFjaCgoW2VdKSA9PiB7XG4gICAgICBpZiAoZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy50cmFja3NbZV07XG4gICAgICAgIHQgJiYgKHQuZW5kaW5nID0gITEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uTGV2ZWxVcGRhdGVkKGUsIHtcbiAgICBkZXRhaWxzOiB0XG4gIH0pIHtcbiAgICB0LmZyYWdtZW50cy5sZW5ndGggJiYgKHRoaXMuZGV0YWlscyA9IHQsIHRoaXMudXBkYXRlRHVyYXRpb24oKSk7XG4gIH1cbiAgdXBkYXRlRHVyYXRpb24oKSB7XG4gICAgdGhpcy5ibG9ja1VudGlsT3BlbigoKSA9PiB7XG4gICAgICBjb25zdCBlID0gdGhpcy5nZXREdXJhdGlvbkFuZFJhbmdlKCk7XG4gICAgICBlICYmIHRoaXMudXBkYXRlTWVkaWFTb3VyY2UoZSk7XG4gICAgfSk7XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgaWYgKHQuZGV0YWlscyA9PT0gSi5CVUZGRVJfQVBQRU5EX0VSUk9SICYmIHQuZnJhZykge1xuICAgICAgdmFyIHI7XG4gICAgICBjb25zdCBuID0gKHIgPSB0LmVycm9yQWN0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogci5uZXh0QXV0b0xldmVsO1xuICAgICAgdWUobikgJiYgbiAhPT0gdC5mcmFnLmxldmVsICYmIHRoaXMucmVzZXRBcHBlbmRFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcmVzZXRBcHBlbmRFcnJvcnMoKSB7XG4gICAgdGhpcy5hcHBlbmRFcnJvcnMgPSB7XG4gICAgICBhdWRpbzogMCxcbiAgICAgIHZpZGVvOiAwLFxuICAgICAgYXVkaW92aWRlbzogMFxuICAgIH07XG4gIH1cbiAgdHJpbUJ1ZmZlcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlLFxuICAgICAgZGV0YWlsczogdCxcbiAgICAgIG1lZGlhOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFyIHx8IHQgPT09IG51bGwgfHwgIXRoaXMuc291cmNlQnVmZmVyQ291bnQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IGUuY29uZmlnLCBpID0gci5jdXJyZW50VGltZSwgbyA9IHQubGV2ZWxUYXJnZXREdXJhdGlvbiwgYSA9IHQubGl2ZSAmJiBuLmxpdmVCYWNrQnVmZmVyTGVuZ3RoICE9PSBudWxsID8gbi5saXZlQmFja0J1ZmZlckxlbmd0aCA6IG4uYmFja0J1ZmZlckxlbmd0aDtcbiAgICBpZiAodWUoYSkgJiYgYSA+PSAwKSB7XG4gICAgICBjb25zdCBjID0gTWF0aC5tYXgoYSwgbyksIHUgPSBNYXRoLmZsb29yKGkgLyBvKSAqIG8gLSBjO1xuICAgICAgdGhpcy5mbHVzaEJhY2tCdWZmZXIoaSwgbywgdSk7XG4gICAgfVxuICAgIGNvbnN0IGwgPSBuLmZyb250QnVmZmVyRmx1c2hUaHJlc2hvbGQ7XG4gICAgaWYgKHVlKGwpICYmIGwgPiAwKSB7XG4gICAgICBjb25zdCBjID0gTWF0aC5tYXgobi5tYXhCdWZmZXJMZW5ndGgsIGwpLCB1ID0gTWF0aC5tYXgoYywgbyksIGQgPSBNYXRoLmZsb29yKGkgLyBvKSAqIG8gKyB1O1xuICAgICAgdGhpcy5mbHVzaEZyb250QnVmZmVyKGksIG8sIGQpO1xuICAgIH1cbiAgfVxuICBmbHVzaEJhY2tCdWZmZXIoZSwgdCwgcikge1xuICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbbiwgaV0pID0+IHtcbiAgICAgIGlmIChpKSB7XG4gICAgICAgIGNvbnN0IGEgPSBDZS5nZXRCdWZmZXJlZChpKTtcbiAgICAgICAgaWYgKGEubGVuZ3RoID4gMCAmJiByID4gYS5zdGFydCgwKSkge1xuICAgICAgICAgIHZhciBvO1xuICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5CQUNLX0JVRkZFUl9SRUFDSEVELCB7XG4gICAgICAgICAgICBidWZmZXJFbmQ6IHJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBsID0gdGhpcy50cmFja3Nbbl07XG4gICAgICAgICAgaWYgKChvID0gdGhpcy5kZXRhaWxzKSAhPSBudWxsICYmIG8ubGl2ZSlcbiAgICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5MSVZFX0JBQ0tfQlVGRkVSX1JFQUNIRUQsIHtcbiAgICAgICAgICAgICAgYnVmZmVyRW5kOiByXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBlbHNlIGlmIChsICE9IG51bGwgJiYgbC5lbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2coYENhbm5vdCBmbHVzaCAke259IGJhY2sgYnVmZmVyIHdoaWxlIFNvdXJjZUJ1ZmZlciBpcyBpbiBlbmRlZCBzdGF0ZWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0ZMVVNISU5HLCB7XG4gICAgICAgICAgICBzdGFydE9mZnNldDogMCxcbiAgICAgICAgICAgIGVuZE9mZnNldDogcixcbiAgICAgICAgICAgIHR5cGU6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZsdXNoRnJvbnRCdWZmZXIoZSwgdCwgcikge1xuICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbbiwgaV0pID0+IHtcbiAgICAgIGlmIChpKSB7XG4gICAgICAgIGNvbnN0IG8gPSBDZS5nZXRCdWZmZXJlZChpKSwgYSA9IG8ubGVuZ3RoO1xuICAgICAgICBpZiAoYSA8IDIpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBsID0gby5zdGFydChhIC0gMSksIGMgPSBvLmVuZChhIC0gMSk7XG4gICAgICAgIGlmIChyID4gbCB8fCBlID49IGwgJiYgZSA8PSBjKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywge1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBsLFxuICAgICAgICAgIGVuZE9mZnNldDogMSAvIDAsXG4gICAgICAgICAgdHlwZTogblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIE1lZGlhIFNvdXJjZSBkdXJhdGlvbiB0byBjdXJyZW50IGxldmVsIGR1cmF0aW9uIG9yIG92ZXJyaWRlIHRvIEluZmluaXR5IGlmIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXG4gICAqICdsaXZlRHVyYXRpb25JbmZpbml0eWAgaXMgc2V0IHRvIGB0cnVlYFxuICAgKiBNb3JlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlby1kZXYvaGxzLmpzL2lzc3Vlcy8zNTVcbiAgICovXG4gIGdldER1cmF0aW9uQW5kUmFuZ2UoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3Qge1xuICAgICAgZGV0YWlsczogdCxcbiAgICAgIG1lZGlhU291cmNlOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCF0IHx8ICF0aGlzLm1lZGlhIHx8IChyID09IG51bGwgPyB2b2lkIDAgOiByLnJlYWR5U3RhdGUpICE9PSBcIm9wZW5cIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG4gPSB0LmVkZ2U7XG4gICAgaWYgKHQubGl2ZSAmJiB0aGlzLmhscy5jb25maWcubGl2ZUR1cmF0aW9uSW5maW5pdHkpIHtcbiAgICAgIGlmICh0LmZyYWdtZW50cy5sZW5ndGggJiYgci5zZXRMaXZlU2Vla2FibGVSYW5nZSkge1xuICAgICAgICBjb25zdCBjID0gTWF0aC5tYXgoMCwgdC5mcmFnbWVudFN0YXJ0KSwgdSA9IE1hdGgubWF4KGMsIG4pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGR1cmF0aW9uOiAxIC8gMCxcbiAgICAgICAgICBzdGFydDogYyxcbiAgICAgICAgICBlbmQ6IHVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGR1cmF0aW9uOiAxIC8gMFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgaSA9IChlID0gdGhpcy5vdmVycmlkZXMpID09IG51bGwgPyB2b2lkIDAgOiBlLmR1cmF0aW9uO1xuICAgIGlmIChpKVxuICAgICAgcmV0dXJuIHVlKGkpID8ge1xuICAgICAgICBkdXJhdGlvbjogaVxuICAgICAgfSA6IG51bGw7XG4gICAgY29uc3QgbyA9IHRoaXMubWVkaWEuZHVyYXRpb24sIGEgPSB1ZShyLmR1cmF0aW9uKSA/IHIuZHVyYXRpb24gOiAwO1xuICAgIHJldHVybiBuID4gYSAmJiBuID4gbyB8fCAhdWUobykgPyB7XG4gICAgICBkdXJhdGlvbjogblxuICAgIH0gOiBudWxsO1xuICB9XG4gIHVwZGF0ZU1lZGlhU291cmNlKHtcbiAgICBkdXJhdGlvbjogZSxcbiAgICBzdGFydDogdCxcbiAgICBlbmQ6IHJcbiAgfSkge1xuICAgIGNvbnN0IG4gPSB0aGlzLm1lZGlhU291cmNlO1xuICAgICF0aGlzLm1lZGlhIHx8ICFuIHx8IG4ucmVhZHlTdGF0ZSAhPT0gXCJvcGVuXCIgfHwgKG4uZHVyYXRpb24gIT09IGUgJiYgKHVlKGUpICYmIHRoaXMubG9nKGBVcGRhdGluZyBNZWRpYVNvdXJjZSBkdXJhdGlvbiB0byAke2UudG9GaXhlZCgzKX1gKSwgbi5kdXJhdGlvbiA9IGUpLCB0ICE9PSB2b2lkIDAgJiYgciAhPT0gdm9pZCAwICYmICh0aGlzLmxvZyhgTWVkaWFTb3VyY2UgZHVyYXRpb24gaXMgc2V0IHRvICR7bi5kdXJhdGlvbn0uIFNldHRpbmcgc2Vla2FibGUgcmFuZ2UgdG8gJHt0fS0ke3J9LmApLCBuLnNldExpdmVTZWVrYWJsZVJhbmdlKHQsIHIpKSk7XG4gIH1cbiAgZ2V0IHRyYWNrc1JlYWR5KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnBlbmRpbmdUcmFja0NvdW50O1xuICAgIHJldHVybiBlID4gMCAmJiAoZSA+PSB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzVG90YWwgfHwgdGhpcy5pc1BlbmRpbmcodGhpcy50cmFja3MuYXVkaW92aWRlbykpO1xuICB9XG4gIGNoZWNrUGVuZGluZ1RyYWNrcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBidWZmZXJDb2RlY0V2ZW50c1RvdGFsOiBlLFxuICAgICAgcGVuZGluZ1RyYWNrQ291bnQ6IHQsXG4gICAgICB0cmFja3M6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAodGhpcy5sb2coYGNoZWNrUGVuZGluZ1RyYWNrcyAocGVuZGluZzogJHt0fSBjb2RlYyBldmVudHMgZXhwZWN0ZWQ6ICR7ZX0pICR7YXQocil9YCksIHRoaXMudHJhY2tzUmVhZHkpIHtcbiAgICAgIHZhciBuO1xuICAgICAgY29uc3QgaSA9IChuID0gdGhpcy50cmFuc2ZlckRhdGEpID09IG51bGwgPyB2b2lkIDAgOiBuLnRyYWNrcztcbiAgICAgIGkgJiYgT2JqZWN0LmtleXMoaSkubGVuZ3RoID8gdGhpcy5hdHRhY2hUcmFuc2ZlcnJlZCgpIDogdGhpcy5jcmVhdGVTb3VyY2VCdWZmZXJzKCk7XG4gICAgfVxuICB9XG4gIGJ1ZmZlckNyZWF0ZWQoKSB7XG4gICAgaWYgKHRoaXMuc291cmNlQnVmZmVyQ291bnQpIHtcbiAgICAgIGNvbnN0IGUgPSB7fTtcbiAgICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbdCwgcl0pID0+IHtcbiAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy50cmFja3NbdF07XG4gICAgICAgICAgZVt0XSA9IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogcixcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbi5jb250YWluZXIsXG4gICAgICAgICAgICBjb2RlYzogbi5jb2RlYyxcbiAgICAgICAgICAgIHN1cHBsZW1lbnRhbDogbi5zdXBwbGVtZW50YWwsXG4gICAgICAgICAgICBsZXZlbENvZGVjOiBuLmxldmVsQ29kZWMsXG4gICAgICAgICAgICBpZDogbi5pZCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBuLm1ldGFkYXRhXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQ1JFQVRFRCwge1xuICAgICAgICB0cmFja3M6IGVcbiAgICAgIH0pLCB0aGlzLmxvZyhgU291cmNlQnVmZmVycyBjcmVhdGVkLiBSdW5uaW5nIHF1ZXVlOiAke3RoaXMub3BlcmF0aW9uUXVldWV9YCksIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbdF0pID0+IHtcbiAgICAgICAgdGhpcy5leGVjdXRlTmV4dCh0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlID0gbmV3IEVycm9yKFwiY291bGQgbm90IGNyZWF0ZSBzb3VyY2UgYnVmZmVyIGZvciBtZWRpYSBjb2RlYyhzKVwiKTtcbiAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfSU5DT01QQVRJQkxFX0NPREVDU19FUlJPUixcbiAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICBlcnJvcjogZSxcbiAgICAgICAgcmVhc29uOiBlLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjcmVhdGVTb3VyY2VCdWZmZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYWNrczogZSxcbiAgICAgIHNvdXJjZUJ1ZmZlcnM6IHQsXG4gICAgICBtZWRpYVNvdXJjZTogclxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZVNvdXJjZUJ1ZmZlcnMgY2FsbGVkIHdoZW4gbWVkaWFTb3VyY2Ugd2FzIG51bGxcIik7XG4gICAgZm9yIChjb25zdCBpIGluIGUpIHtcbiAgICAgIGNvbnN0IG8gPSBpLCBhID0gZVtvXTtcbiAgICAgIGlmICh0aGlzLmlzUGVuZGluZyhhKSkge1xuICAgICAgICBjb25zdCBsID0gdGhpcy5nZXRUcmFja0NvZGVjKGEsIG8pLCBjID0gYCR7YS5jb250YWluZXJ9O2NvZGVjcz0ke2x9YDtcbiAgICAgICAgYS5jb2RlYyA9IGwsIHRoaXMubG9nKGBjcmVhdGluZyBzb3VyY2VCdWZmZXIoJHtjfSkke3RoaXMuY3VycmVudE9wKG8pID8gXCIgUXVldWVkXCIgOiBcIlwifSAke2F0KGEpfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHUgPSByLmFkZFNvdXJjZUJ1ZmZlcihjKSwgZCA9IFNsKG8pLCBoID0gW28sIHVdO1xuICAgICAgICAgIHRbZF0gPSBoLCBhLmJ1ZmZlciA9IHU7XG4gICAgICAgIH0gY2F0Y2ggKHUpIHtcbiAgICAgICAgICB2YXIgbjtcbiAgICAgICAgICB0aGlzLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gYWRkIHNvdXJjZUJ1ZmZlcjogJHt1Lm1lc3NhZ2V9YCksIHRoaXMuc2hpZnRBbmRFeGVjdXRlTmV4dChvKSwgKG4gPSB0aGlzLm9wZXJhdGlvblF1ZXVlKSA9PSBudWxsIHx8IG4ucmVtb3ZlQmxvY2tlcnMoKSwgZGVsZXRlIHRoaXMudHJhY2tzW29dLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfQUREX0NPREVDX0VSUk9SLFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZXJyb3I6IHUsXG4gICAgICAgICAgICBzb3VyY2VCdWZmZXJOYW1lOiBvLFxuICAgICAgICAgICAgbWltZVR5cGU6IGMsXG4gICAgICAgICAgICBwYXJlbnQ6IGEuaWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFja1NvdXJjZUJ1ZmZlcihvLCBhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWZmZXJDcmVhdGVkKCk7XG4gIH1cbiAgZ2V0VHJhY2tDb2RlYyhlLCB0KSB7XG4gICAgY29uc3QgciA9IGUuc3VwcGxlbWVudGFsO1xuICAgIGxldCBuID0gZS5jb2RlYztcbiAgICByICYmICh0ID09PSBcInZpZGVvXCIgfHwgdCA9PT0gXCJhdWRpb3ZpZGVvXCIpICYmIGdpKHIsIFwidmlkZW9cIikgJiYgKG4gPSBYUyhuLCByKSk7XG4gICAgY29uc3QgaSA9IGZvKG4sIGUubGV2ZWxDb2RlYyk7XG4gICAgcmV0dXJuIGkgPyB0LnNsaWNlKDAsIDUpID09PSBcImF1ZGlvXCIgPyBYbyhpLCB0aGlzLmFwcGVuZFNvdXJjZSkgOiBpIDogXCJcIjtcbiAgfVxuICB0cmFja1NvdXJjZUJ1ZmZlcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHQuYnVmZmVyO1xuICAgIGlmICghcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gdGhpcy5nZXRUcmFja0NvZGVjKHQsIGUpO1xuICAgIHRoaXMudHJhY2tzW2VdID0ge1xuICAgICAgYnVmZmVyOiByLFxuICAgICAgY29kZWM6IG4sXG4gICAgICBjb250YWluZXI6IHQuY29udGFpbmVyLFxuICAgICAgbGV2ZWxDb2RlYzogdC5sZXZlbENvZGVjLFxuICAgICAgc3VwcGxlbWVudGFsOiB0LnN1cHBsZW1lbnRhbCxcbiAgICAgIG1ldGFkYXRhOiB0Lm1ldGFkYXRhLFxuICAgICAgaWQ6IHQuaWQsXG4gICAgICBsaXN0ZW5lcnM6IFtdXG4gICAgfSwgdGhpcy5yZW1vdmVCdWZmZXJMaXN0ZW5lcnMoZSksIHRoaXMuYWRkQnVmZmVyTGlzdGVuZXIoZSwgXCJ1cGRhdGVzdGFydFwiLCB0aGlzLm9uU0JVcGRhdGVTdGFydCksIHRoaXMuYWRkQnVmZmVyTGlzdGVuZXIoZSwgXCJ1cGRhdGVlbmRcIiwgdGhpcy5vblNCVXBkYXRlRW5kKSwgdGhpcy5hZGRCdWZmZXJMaXN0ZW5lcihlLCBcImVycm9yXCIsIHRoaXMub25TQlVwZGF0ZUVycm9yKSwgdGhpcy5hcHBlbmRTb3VyY2UgJiYgdGhpcy5hZGRCdWZmZXJMaXN0ZW5lcihlLCBcImJ1ZmZlcmVkY2hhbmdlXCIsIChpLCBvKSA9PiB7XG4gICAgICBjb25zdCBhID0gby5yZW1vdmVkUmFuZ2VzO1xuICAgICAgYSAhPSBudWxsICYmIGEubGVuZ3RoICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfRkxVU0hFRCwge1xuICAgICAgICB0eXBlOiBpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBnZXQgbWVkaWFTcmMoKSB7XG4gICAgdmFyIGUsIHQ7XG4gICAgY29uc3QgciA9ICgoZSA9IHRoaXMubWVkaWEpID09IG51bGwgfHwgKHQgPSBlLnF1ZXJ5U2VsZWN0b3IpID09IG51bGwgPyB2b2lkIDAgOiB0LmNhbGwoZSwgXCJzb3VyY2VcIikpIHx8IHRoaXMubWVkaWE7XG4gICAgcmV0dXJuIHIgPT0gbnVsbCA/IHZvaWQgMCA6IHIuc3JjO1xuICB9XG4gIG9uU0JVcGRhdGVTdGFydChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudE9wKGUpO1xuICAgIHQgJiYgdC5vblN0YXJ0KCk7XG4gIH1cbiAgb25TQlVwZGF0ZUVuZChlKSB7XG4gICAgdmFyIHQ7XG4gICAgaWYgKCgodCA9IHRoaXMubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiB0LnJlYWR5U3RhdGUpID09PSBcImNsb3NlZFwiKSB7XG4gICAgICB0aGlzLnJlc2V0QnVmZmVyKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5jdXJyZW50T3AoZSk7XG4gICAgciAmJiAoci5vbkNvbXBsZXRlKCksIHRoaXMuc2hpZnRBbmRFeGVjdXRlTmV4dChlKSk7XG4gIH1cbiAgb25TQlVwZGF0ZUVycm9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gbmV3IEVycm9yKGAke2V9IFNvdXJjZUJ1ZmZlciBlcnJvci4gTWVkaWFTb3VyY2UgcmVhZHlTdGF0ZTogJHsociA9IHRoaXMubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiByLnJlYWR5U3RhdGV9YCk7XG4gICAgdGhpcy5lcnJvcihgJHtufWAsIHQpLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgZGV0YWlsczogSi5CVUZGRVJfQVBQRU5ESU5HX0VSUk9SLFxuICAgICAgc291cmNlQnVmZmVyTmFtZTogZSxcbiAgICAgIGVycm9yOiBuLFxuICAgICAgZmF0YWw6ICExXG4gICAgfSk7XG4gICAgY29uc3QgaSA9IHRoaXMuY3VycmVudE9wKGUpO1xuICAgIGkgJiYgaS5vbkVycm9yKG4pO1xuICB9XG4gIHVwZGF0ZVRpbWVzdGFtcE9mZnNldChlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgY29uc3QgYSA9IHQgLSBlLnRpbWVzdGFtcE9mZnNldDtcbiAgICBNYXRoLmFicyhhKSA+PSByICYmICh0aGlzLmxvZyhgVXBkYXRpbmcgJHtufSBTb3VyY2VCdWZmZXIgdGltZXN0YW1wT2Zmc2V0IHRvICR7dH0gKHNuOiAke2l9IGNjOiAke299KWApLCBlLnRpbWVzdGFtcE9mZnNldCA9IHQpO1xuICB9XG4gIC8vIFRoaXMgbWV0aG9kIG11c3QgcmVzdWx0IGluIGFuIHVwZGF0ZWVuZCBldmVudDsgaWYgcmVtb3ZlIGlzIG5vdCBjYWxsZWQsIG9uU0JVcGRhdGVFbmQgbXVzdCBiZSBjYWxsZWQgbWFudWFsbHlcbiAgcmVtb3ZlRXhlY3V0b3IoZSwgdCwgcikge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBuLFxuICAgICAgbWVkaWFTb3VyY2U6IGlcbiAgICB9ID0gdGhpcywgbyA9IHRoaXMudHJhY2tzW2VdLCBhID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5idWZmZXI7XG4gICAgaWYgKCFuIHx8ICFpIHx8ICFhKSB7XG4gICAgICB0aGlzLndhcm4oYEF0dGVtcHRpbmcgdG8gcmVtb3ZlIGZyb20gdGhlICR7ZX0gU291cmNlQnVmZmVyLCBidXQgaXQgZG9lcyBub3QgZXhpc3RgKSwgdGhpcy5zaGlmdEFuZEV4ZWN1dGVOZXh0KGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsID0gdWUobi5kdXJhdGlvbikgPyBuLmR1cmF0aW9uIDogMSAvIDAsIGMgPSB1ZShpLmR1cmF0aW9uKSA/IGkuZHVyYXRpb24gOiAxIC8gMCwgdSA9IE1hdGgubWF4KDAsIHQpLCBkID0gTWF0aC5taW4ociwgbCwgYyk7XG4gICAgZCA+IHUgJiYgKCFvLmVuZGluZyB8fCBvLmVuZGVkKSA/IChvLmVuZGVkID0gITEsIHRoaXMubG9nKGBSZW1vdmluZyBbJHt1fSwke2R9XSBmcm9tIHRoZSAke2V9IFNvdXJjZUJ1ZmZlcmApLCBhLnJlbW92ZSh1LCBkKSkgOiB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQoZSk7XG4gIH1cbiAgLy8gVGhpcyBtZXRob2QgbXVzdCByZXN1bHQgaW4gYW4gdXBkYXRlZW5kIGV2ZW50OyBpZiBhcHBlbmQgaXMgbm90IGNhbGxlZCwgb25TQlVwZGF0ZUVuZCBtdXN0IGJlIGNhbGxlZCBtYW51YWxseVxuICBhcHBlbmRFeGVjdXRvcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMudHJhY2tzW3RdLCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5idWZmZXI7XG4gICAgaWYgKCFuKVxuICAgICAgdGhyb3cgbmV3IGEyKGBBdHRlbXB0aW5nIHRvIGFwcGVuZCB0byB0aGUgJHt0fSBTb3VyY2VCdWZmZXIsIGJ1dCBpdCBkb2VzIG5vdCBleGlzdGApO1xuICAgIHIuZW5kaW5nID0gITEsIHIuZW5kZWQgPSAhMSwgbi5hcHBlbmRCdWZmZXIoZSk7XG4gIH1cbiAgYmxvY2tVbnRpbE9wZW4oZSkge1xuICAgIGlmICh0aGlzLmlzVXBkYXRpbmcoKSB8fCB0aGlzLmlzUXVldWVkKCkpXG4gICAgICB0aGlzLmJsb2NrQnVmZmVycyhlKS5jYXRjaCgodCkgPT4ge1xuICAgICAgICB0aGlzLndhcm4oYFNvdXJjZUJ1ZmZlciBibG9ja2VkIGNhbGxiYWNrICR7dH1gKSwgdGhpcy5zdGVwT3BlcmF0aW9uUXVldWUodGhpcy5zb3VyY2VCdWZmZXJUeXBlcyk7XG4gICAgICB9KTtcbiAgICBlbHNlXG4gICAgICB0cnkge1xuICAgICAgICBlKCk7XG4gICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIHRoaXMud2FybihgQ2FsbGJhY2sgcnVuIHdpdGhvdXQgYmxvY2tpbmcgJHt0aGlzLm9wZXJhdGlvblF1ZXVlfSAke3R9YCk7XG4gICAgICB9XG4gIH1cbiAgaXNVcGRhdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VCdWZmZXJzLnNvbWUoKFtlLCB0XSkgPT4gZSAmJiB0LnVwZGF0aW5nKTtcbiAgfVxuICBpc1F1ZXVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VCdWZmZXJzLnNvbWUoKFtlXSkgPT4gZSAmJiAhIXRoaXMuY3VycmVudE9wKGUpKTtcbiAgfVxuICBpc1BlbmRpbmcoZSkge1xuICAgIHJldHVybiAhIWUgJiYgIWUuYnVmZmVyO1xuICB9XG4gIC8vIEVucXVldWVzIGFuIG9wZXJhdGlvbiB0byBlYWNoIFNvdXJjZUJ1ZmZlciBxdWV1ZSB3aGljaCwgdXBvbiBleGVjdXRpb24sIHJlc29sdmVzIGEgcHJvbWlzZS4gV2hlbiBhbGwgcHJvbWlzZXNcbiAgLy8gcmVzb2x2ZSwgdGhlIG9uVW5ibG9ja2VkIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLiBGdW5jdGlvbnMgY2FsbGluZyB0aGlzIG1ldGhvZCBkbyBub3QgbmVlZCB0byB1bmJsb2NrIHRoZSBxdWV1ZVxuICAvLyB1cG9uIGNvbXBsZXRpb24sIHNpbmNlIHdlIGFscmVhZHkgZG8gaXQgaGVyZVxuICBibG9ja0J1ZmZlcnMoZSwgdCA9IHRoaXMuc291cmNlQnVmZmVyVHlwZXMpIHtcbiAgICBpZiAoIXQubGVuZ3RoKVxuICAgICAgcmV0dXJuIHRoaXMubG9nKFwiQmxvY2tpbmcgb3BlcmF0aW9uIHJlcXVlc3RlZCwgYnV0IG5vIFNvdXJjZUJ1ZmZlcnMgZXhpc3RcIiksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZSk7XG4gICAgY29uc3Qge1xuICAgICAgb3BlcmF0aW9uUXVldWU6IHJcbiAgICB9ID0gdGhpcywgbiA9IHQubWFwKChvKSA9PiB0aGlzLmFwcGVuZEJsb2NrZXIobykpO1xuICAgIHJldHVybiB0Lmxlbmd0aCA+IDEgJiYgISF0aGlzLmJsb2NrZWRBdWRpb0FwcGVuZCAmJiB0aGlzLnVuYmxvY2tBdWRpbygpLCBQcm9taXNlLmFsbChuKS50aGVuKChvKSA9PiB7XG4gICAgICByID09PSB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIChlKCksIHRoaXMuc3RlcE9wZXJhdGlvblF1ZXVlKHRoaXMuc291cmNlQnVmZmVyVHlwZXMpKTtcbiAgICB9KTtcbiAgfVxuICBzdGVwT3BlcmF0aW9uUXVldWUoZSkge1xuICAgIGUuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgdmFyIHI7XG4gICAgICBjb25zdCBuID0gKHIgPSB0aGlzLnRyYWNrc1t0XSkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuYnVmZmVyO1xuICAgICAgIW4gfHwgbi51cGRhdGluZyB8fCB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQodCk7XG4gICAgfSk7XG4gIH1cbiAgYXBwZW5kKGUsIHQsIHIpIHtcbiAgICB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIHRoaXMub3BlcmF0aW9uUXVldWUuYXBwZW5kKGUsIHQsIHIpO1xuICB9XG4gIGFwcGVuZEJsb2NrZXIoZSkge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvblF1ZXVlKVxuICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uUXVldWUuYXBwZW5kQmxvY2tlcihlKTtcbiAgfVxuICBjdXJyZW50T3AoZSkge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblF1ZXVlID8gdGhpcy5vcGVyYXRpb25RdWV1ZS5jdXJyZW50KGUpIDogbnVsbDtcbiAgfVxuICBleGVjdXRlTmV4dChlKSB7XG4gICAgZSAmJiB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIHRoaXMub3BlcmF0aW9uUXVldWUuZXhlY3V0ZU5leHQoZSk7XG4gIH1cbiAgc2hpZnRBbmRFeGVjdXRlTmV4dChlKSB7XG4gICAgdGhpcy5vcGVyYXRpb25RdWV1ZSAmJiB0aGlzLm9wZXJhdGlvblF1ZXVlLnNoaWZ0QW5kRXhlY3V0ZU5leHQoZSk7XG4gIH1cbiAgZ2V0IHBlbmRpbmdUcmFja0NvdW50KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRyYWNrcykucmVkdWNlKChlLCB0KSA9PiBlICsgKHRoaXMuaXNQZW5kaW5nKHRoaXMudHJhY2tzW3RdKSA/IDEgOiAwKSwgMCk7XG4gIH1cbiAgZ2V0IHNvdXJjZUJ1ZmZlckNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUJ1ZmZlcnMucmVkdWNlKChlLCBbdF0pID0+IGUgKyAodCA/IDEgOiAwKSwgMCk7XG4gIH1cbiAgZ2V0IHNvdXJjZUJ1ZmZlclR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUJ1ZmZlcnMubWFwKChbZV0pID0+IGUpLmZpbHRlcigoZSkgPT4gISFlKTtcbiAgfVxuICBhZGRCdWZmZXJMaXN0ZW5lcihlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IHRoaXMudHJhY2tzW2VdO1xuICAgIGlmICghbilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gbi5idWZmZXI7XG4gICAgaWYgKCFpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSByLmJpbmQodGhpcywgZSk7XG4gICAgbi5saXN0ZW5lcnMucHVzaCh7XG4gICAgICBldmVudDogdCxcbiAgICAgIGxpc3RlbmVyOiBvXG4gICAgfSksIGkuYWRkRXZlbnRMaXN0ZW5lcih0LCBvKTtcbiAgfVxuICByZW1vdmVCdWZmZXJMaXN0ZW5lcnMoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnRyYWNrc1tlXTtcbiAgICBpZiAoIXQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHQuYnVmZmVyO1xuICAgIHIgJiYgKHQubGlzdGVuZXJzLmZvckVhY2goKG4pID0+IHtcbiAgICAgIHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLmV2ZW50LCBuLmxpc3RlbmVyKTtcbiAgICB9KSwgdC5saXN0ZW5lcnMubGVuZ3RoID0gMCk7XG4gIH1cbn1cbmZ1bmN0aW9uIEhoKHMpIHtcbiAgY29uc3QgZSA9IHMucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKTtcbiAgW10uc2xpY2UuY2FsbChlKS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgcy5yZW1vdmVDaGlsZCh0KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBjMihzLCBlKSB7XG4gIGNvbnN0IHQgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIik7XG4gIHQudHlwZSA9IFwidmlkZW8vbXA0XCIsIHQuc3JjID0gZSwgcy5hcHBlbmRDaGlsZCh0KTtcbn1cbmZ1bmN0aW9uIFNsKHMpIHtcbiAgcmV0dXJuIHMgPT09IFwiYXVkaW9cIiA/IDEgOiAwO1xufVxuY2xhc3MgRHUge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IHZvaWQgMCwgdGhpcy5maXJzdExldmVsID0gdm9pZCAwLCB0aGlzLm1lZGlhID0gdm9pZCAwLCB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMgPSB2b2lkIDAsIHRoaXMudGltZXIgPSB2b2lkIDAsIHRoaXMuY2xpZW50UmVjdCA9IHZvaWQgMCwgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmhscyA9IGUsIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgdGhpcy5maXJzdExldmVsID0gLTEsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMgPSBbXSwgdGhpcy50aW1lciA9IHZvaWQgMCwgdGhpcy5jbGllbnRSZWN0ID0gbnVsbCwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHNldFN0cmVhbUNvbnRyb2xsZXIoZSkge1xuICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlciA9IGU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmhscyAmJiB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcigpLCB0aGlzLnRpbWVyICYmIHRoaXMuc3RvcENhcHBpbmcoKSwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuY2xpZW50UmVjdCA9IG51bGwsIHRoaXMuaGxzID0gdGhpcy5zdHJlYW1Db250cm9sbGVyID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9uKEkuRlBTX0RST1BfTEVWRUxfQ0FQUElORywgdGhpcy5vbkZwc0Ryb3BMZXZlbENhcHBpbmcsIHRoaXMpLCBlLm9uKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9uKEkuTEVWRUxTX1VQREFURUQsIHRoaXMub25MZXZlbHNVcGRhdGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9DT0RFQ1MsIHRoaXMub25CdWZmZXJDb2RlY3MsIHRoaXMpLCBlLm9uKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9mZihJLkZQU19EUk9QX0xFVkVMX0NBUFBJTkcsIHRoaXMub25GcHNEcm9wTGV2ZWxDYXBwaW5nLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMU19VUERBVEVELCB0aGlzLm9uTGV2ZWxzVXBkYXRlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0NPREVDUywgdGhpcy5vbkJ1ZmZlckNvZGVjcywgdGhpcyksIGUub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpO1xuICB9XG4gIG9uRnBzRHJvcExldmVsQ2FwcGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmxldmVsc1t0LmRyb3BwZWRMZXZlbF07XG4gICAgdGhpcy5pc0xldmVsQWxsb3dlZChyKSAmJiB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMucHVzaCh7XG4gICAgICBiaXRyYXRlOiByLmJpdHJhdGUsXG4gICAgICBoZWlnaHQ6IHIuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHIud2lkdGhcbiAgICB9KTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLm1lZGlhID0gdC5tZWRpYSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgPyB0Lm1lZGlhIDogbnVsbCwgdGhpcy5jbGllbnRSZWN0ID0gbnVsbCwgdGhpcy50aW1lciAmJiB0aGlzLmhscy5sZXZlbHMubGVuZ3RoICYmIHRoaXMuZGV0ZWN0UGxheWVyU2l6ZSgpO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscztcbiAgICB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMgPSBbXSwgdGhpcy5maXJzdExldmVsID0gdC5maXJzdExldmVsLCByLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSAmJiB0LnZpZGVvICYmIHRoaXMuc3RhcnRDYXBwaW5nKCk7XG4gIH1cbiAgb25MZXZlbHNVcGRhdGVkKGUsIHQpIHtcbiAgICB0aGlzLnRpbWVyICYmIHVlKHRoaXMuYXV0b0xldmVsQ2FwcGluZykgJiYgdGhpcy5kZXRlY3RQbGF5ZXJTaXplKCk7XG4gIH1cbiAgLy8gT25seSBhY3RpdmF0ZSBjYXBwaW5nIHdoZW4gcGxheWluZyBhIHZpZGVvIHN0cmVhbTsgb3RoZXJ3aXNlLCBtdWx0aS1iaXRyYXRlIGF1ZGlvLW9ubHkgc3RyZWFtcyB3aWxsIGJlIHJlc3RyaWN0ZWRcbiAgLy8gdG8gdGhlIGZpcnN0IGxldmVsXG4gIG9uQnVmZmVyQ29kZWNzKGUsIHQpIHtcbiAgICB0aGlzLmhscy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemUgJiYgdC52aWRlbyAmJiB0aGlzLnN0YXJ0Q2FwcGluZygpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoKSB7XG4gICAgdGhpcy5zdG9wQ2FwcGluZygpLCB0aGlzLm1lZGlhID0gbnVsbDtcbiAgfVxuICBkZXRlY3RQbGF5ZXJTaXplKCkge1xuICAgIGlmICh0aGlzLm1lZGlhKSB7XG4gICAgICBpZiAodGhpcy5tZWRpYUhlaWdodCA8PSAwIHx8IHRoaXMubWVkaWFXaWR0aCA8PSAwKSB7XG4gICAgICAgIHRoaXMuY2xpZW50UmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGUgPSB0aGlzLmhscy5sZXZlbHM7XG4gICAgICBpZiAoZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuaGxzLCByID0gdGhpcy5nZXRNYXhMZXZlbChlLmxlbmd0aCAtIDEpO1xuICAgICAgICByICE9PSB0aGlzLmF1dG9MZXZlbENhcHBpbmcgJiYgdC5sb2dnZXIubG9nKGBTZXR0aW5nIGF1dG9MZXZlbENhcHBpbmcgdG8gJHtyfTogJHtlW3JdLmhlaWdodH1wQCR7ZVtyXS5iaXRyYXRlfSBmb3IgbWVkaWEgJHt0aGlzLm1lZGlhV2lkdGh9eCR7dGhpcy5tZWRpYUhlaWdodH1gKSwgdC5hdXRvTGV2ZWxDYXBwaW5nID0gciwgdC5hdXRvTGV2ZWxFbmFibGVkICYmIHQuYXV0b0xldmVsQ2FwcGluZyA+IHRoaXMuYXV0b0xldmVsQ2FwcGluZyAmJiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgJiYgdGhpcy5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbFN3aXRjaCgpLCB0aGlzLmF1dG9MZXZlbENhcHBpbmcgPSB0LmF1dG9MZXZlbENhcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qXG4gICAqIHJldHVybnMgbGV2ZWwgc2hvdWxkIGJlIHRoZSBvbmUgd2l0aCB0aGUgZGltZW5zaW9ucyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIG1lZGlhIChwbGF5ZXIpIGRpbWVuc2lvbnMgKHNvIHRoZSB2aWRlbyB3aWxsIGJlIGRvd25zY2FsZWQpXG4gICAqL1xuICBnZXRNYXhMZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaGxzLmxldmVscztcbiAgICBpZiAoIXQubGVuZ3RoKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGNvbnN0IHIgPSB0LmZpbHRlcigobiwgaSkgPT4gdGhpcy5pc0xldmVsQWxsb3dlZChuKSAmJiBpIDw9IGUpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudFJlY3QgPSBudWxsLCBEdS5nZXRNYXhMZXZlbEJ5TWVkaWFTaXplKHIsIHRoaXMubWVkaWFXaWR0aCwgdGhpcy5tZWRpYUhlaWdodCk7XG4gIH1cbiAgc3RhcnRDYXBwaW5nKCkge1xuICAgIHRoaXMudGltZXIgfHwgKHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgc2VsZi5jbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLmRldGVjdFBsYXllclNpemUuYmluZCh0aGlzKSwgMWUzKSwgdGhpcy5kZXRlY3RQbGF5ZXJTaXplKCkpO1xuICB9XG4gIHN0b3BDYXBwaW5nKCkge1xuICAgIHRoaXMucmVzdHJpY3RlZExldmVscyA9IFtdLCB0aGlzLmZpcnN0TGV2ZWwgPSAtMSwgdGhpcy5hdXRvTGV2ZWxDYXBwaW5nID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCB0aGlzLnRpbWVyICYmIChzZWxmLmNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksIHRoaXMudGltZXIgPSB2b2lkIDApO1xuICB9XG4gIGdldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuY2xpZW50UmVjdClcbiAgICAgIHJldHVybiB0aGlzLmNsaWVudFJlY3Q7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWEsIHQgPSB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHIgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdC53aWR0aCA9IHIud2lkdGgsIHQuaGVpZ2h0ID0gci5oZWlnaHQsICF0LndpZHRoICYmICF0LmhlaWdodCAmJiAodC53aWR0aCA9IHIucmlnaHQgLSByLmxlZnQgfHwgZS53aWR0aCB8fCAwLCB0LmhlaWdodCA9IHIuYm90dG9tIC0gci50b3AgfHwgZS5oZWlnaHQgfHwgMCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsaWVudFJlY3QgPSB0LCB0O1xuICB9XG4gIGdldCBtZWRpYVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmdldERpbWVuc2lvbnMoKS53aWR0aCAqIHRoaXMuY29udGVudFNjYWxlRmFjdG9yO1xuICB9XG4gIGdldCBtZWRpYUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkuaGVpZ2h0ICogdGhpcy5jb250ZW50U2NhbGVGYWN0b3I7XG4gIH1cbiAgZ2V0IGNvbnRlbnRTY2FsZUZhY3RvcigpIHtcbiAgICBsZXQgZSA9IDE7XG4gICAgaWYgKCF0aGlzLmhscy5jb25maWcuaWdub3JlRGV2aWNlUGl4ZWxSYXRpbylcbiAgICAgIHRyeSB7XG4gICAgICAgIGUgPSBzZWxmLmRldmljZVBpeGVsUmF0aW87XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4oZSwgdGhpcy5obHMuY29uZmlnLm1heERldmljZVBpeGVsUmF0aW8pO1xuICB9XG4gIGlzTGV2ZWxBbGxvd2VkKGUpIHtcbiAgICByZXR1cm4gIXRoaXMucmVzdHJpY3RlZExldmVscy5zb21lKChyKSA9PiBlLmJpdHJhdGUgPT09IHIuYml0cmF0ZSAmJiBlLndpZHRoID09PSByLndpZHRoICYmIGUuaGVpZ2h0ID09PSByLmhlaWdodCk7XG4gIH1cbiAgc3RhdGljIGdldE1heExldmVsQnlNZWRpYVNpemUoZSwgdCwgcikge1xuICAgIGlmICghKGUgIT0gbnVsbCAmJiBlLmxlbmd0aCkpXG4gICAgICByZXR1cm4gLTE7XG4gICAgY29uc3QgbiA9IChhLCBsKSA9PiBsID8gYS53aWR0aCAhPT0gbC53aWR0aCB8fCBhLmhlaWdodCAhPT0gbC5oZWlnaHQgOiAhMDtcbiAgICBsZXQgaSA9IGUubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBvID0gTWF0aC5tYXgodCwgcik7XG4gICAgZm9yIChsZXQgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICBjb25zdCBsID0gZVthXTtcbiAgICAgIGlmICgobC53aWR0aCA+PSBvIHx8IGwuaGVpZ2h0ID49IG8pICYmIG4obCwgZVthICsgMV0pKSB7XG4gICAgICAgIGkgPSBhO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH1cbn1cbmNvbnN0IHUyID0ge1xuICAvKipcbiAgICogdGV4dCBmaWxlLCBzdWNoIGFzIGEgbWFuaWZlc3Qgb3IgcGxheWxpc3RcbiAgICovXG4gIE1BTklGRVNUOiBcIm1cIixcbiAgLyoqXG4gICAqIGF1ZGlvIG9ubHlcbiAgICovXG4gIEFVRElPOiBcImFcIixcbiAgLyoqXG4gICAqIHZpZGVvIG9ubHlcbiAgICovXG4gIFZJREVPOiBcInZcIixcbiAgLyoqXG4gICAqIG11eGVkIGF1ZGlvIGFuZCB2aWRlb1xuICAgKi9cbiAgTVVYRUQ6IFwiYXZcIixcbiAgLyoqXG4gICAqIGluaXQgc2VnbWVudFxuICAgKi9cbiAgSU5JVDogXCJpXCIsXG4gIC8qKlxuICAgKiBjYXB0aW9uIG9yIHN1YnRpdGxlXG4gICAqL1xuICBDQVBUSU9OOiBcImNcIixcbiAgLyoqXG4gICAqIElTT0JNRkYgdGltZWQgdGV4dCB0cmFja1xuICAgKi9cbiAgVElNRURfVEVYVDogXCJ0dFwiLFxuICAvKipcbiAgICogY3J5cHRvZ3JhcGhpYyBrZXksIGxpY2Vuc2Ugb3IgY2VydGlmaWNhdGUuXG4gICAqL1xuICBLRVk6IFwia1wiLFxuICAvKipcbiAgICogb3RoZXJcbiAgICovXG4gIE9USEVSOiBcIm9cIlxufSwgaHIgPSB1MiwgZDIgPSB7XG4gIC8qKlxuICAgKiBIVFRQIExpdmUgU3RyZWFtaW5nIChITFMpXG4gICAqL1xuICBITFM6IFwiaFwiXG59LCBoMiA9IGQyO1xuY2xhc3MgSnIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgQXJyYXkuaXNBcnJheShlKSAmJiAoZSA9IGUubWFwKChyKSA9PiByIGluc3RhbmNlb2YgSnIgPyByIDogbmV3IEpyKHIpKSksIHRoaXMudmFsdWUgPSBlLCB0aGlzLnBhcmFtcyA9IHQ7XG4gIH1cbn1cbmNvbnN0IGYyID0gXCJEaWN0XCI7XG5mdW5jdGlvbiBnMihzKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHMpID8gSlNPTi5zdHJpbmdpZnkocykgOiBzIGluc3RhbmNlb2YgTWFwID8gXCJNYXB7fVwiIDogcyBpbnN0YW5jZW9mIFNldCA/IFwiU2V0e31cIiA6IHR5cGVvZiBzID09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeShzKSA6IFN0cmluZyhzKTtcbn1cbmZ1bmN0aW9uIHAyKHMsIGUsIHQsIHIpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgZmFpbGVkIHRvICR7c30gXCIke2cyKGUpfVwiIGFzICR7dH1gLCB7XG4gICAgY2F1c2U6IHJcbiAgfSk7XG59XG5mdW5jdGlvbiBRcihzLCBlLCB0KSB7XG4gIHJldHVybiBwMihcInNlcmlhbGl6ZVwiLCBzLCBlLCB0KTtcbn1cbmNsYXNzIF9wIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBlO1xuICB9XG59XG5jb25zdCBxaCA9IFwiQmFyZSBJdGVtXCIsIG0yID0gXCJCb29sZWFuXCI7XG5mdW5jdGlvbiB5MihzKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcImJvb2xlYW5cIilcbiAgICB0aHJvdyBRcihzLCBtMik7XG4gIHJldHVybiBzID8gXCI/MVwiIDogXCI/MFwiO1xufVxuZnVuY3Rpb24gdjIocykge1xuICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLnMpKTtcbn1cbmNvbnN0IEUyID0gXCJCeXRlIFNlcXVlbmNlXCI7XG5mdW5jdGlvbiB4MihzKSB7XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcocykgPT09ICExKVxuICAgIHRocm93IFFyKHMsIEUyKTtcbiAgcmV0dXJuIGA6JHt2MihzKX06YDtcbn1cbmNvbnN0IFMyID0gXCJJbnRlZ2VyXCI7XG5mdW5jdGlvbiBiMihzKSB7XG4gIHJldHVybiBzIDwgLTk5OTk5OTk5OTk5OTk5OSB8fCA5OTk5OTk5OTk5OTk5OTkgPCBzO1xufVxuZnVuY3Rpb24gUnAocykge1xuICBpZiAoYjIocykpXG4gICAgdGhyb3cgUXIocywgUzIpO1xuICByZXR1cm4gcy50b1N0cmluZygpO1xufVxuZnVuY3Rpb24gVDIocykge1xuICByZXR1cm4gYEAke1JwKHMuZ2V0VGltZSgpIC8gMWUzKX1gO1xufVxuZnVuY3Rpb24gTHAocywgZSkge1xuICBpZiAocyA8IDApXG4gICAgcmV0dXJuIC1McCgtcywgZSk7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZSk7XG4gIGlmIChNYXRoLmFicyhzICogdCAlIDEgLSAwLjUpIDwgTnVtYmVyLkVQU0lMT04pIHtcbiAgICBjb25zdCBuID0gTWF0aC5mbG9vcihzICogdCk7XG4gICAgcmV0dXJuIChuICUgMiA9PT0gMCA/IG4gOiBuICsgMSkgLyB0O1xuICB9IGVsc2VcbiAgICByZXR1cm4gTWF0aC5yb3VuZChzICogdCkgLyB0O1xufVxuY29uc3QgdzIgPSBcIkRlY2ltYWxcIjtcbmZ1bmN0aW9uIEEyKHMpIHtcbiAgY29uc3QgZSA9IExwKHMsIDMpO1xuICBpZiAoTWF0aC5mbG9vcihNYXRoLmFicyhlKSkudG9TdHJpbmcoKS5sZW5ndGggPiAxMilcbiAgICB0aHJvdyBRcihzLCB3Mik7XG4gIGNvbnN0IHQgPSBlLnRvU3RyaW5nKCk7XG4gIHJldHVybiB0LmluY2x1ZGVzKFwiLlwiKSA/IHQgOiBgJHt0fS4wYDtcbn1cbmNvbnN0IEkyID0gXCJTdHJpbmdcIiwgXzIgPSAvW1xceDAwLVxceDFmXFx4N2ZdKy87XG5mdW5jdGlvbiBSMihzKSB7XG4gIGlmIChfMi50ZXN0KHMpKVxuICAgIHRocm93IFFyKHMsIEkyKTtcbiAgcmV0dXJuIGBcIiR7cy5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbn1cbmZ1bmN0aW9uIEwyKHMpIHtcbiAgcmV0dXJuIHMuZGVzY3JpcHRpb24gfHwgcy50b1N0cmluZygpLnNsaWNlKDcsIC0xKTtcbn1cbmNvbnN0IEMyID0gXCJUb2tlblwiO1xuZnVuY3Rpb24gV2gocykge1xuICBjb25zdCBlID0gTDIocyk7XG4gIGlmICgvXihbYS16QS1aKl0pKFshIyQlJicqK1xcLS5eX2B8flxcdzovXSopJC8udGVzdChlKSA9PT0gITEpXG4gICAgdGhyb3cgUXIoZSwgQzIpO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHZjKHMpIHtcbiAgc3dpdGNoICh0eXBlb2Ygcykge1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghdWUocykpXG4gICAgICAgIHRocm93IFFyKHMsIHFoKTtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHMpID8gUnAocykgOiBBMihzKTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gUjIocyk7XG4gICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgcmV0dXJuIFdoKHMpO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4geTIocyk7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgaWYgKHMgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICByZXR1cm4gVDIocyk7XG4gICAgICBpZiAocyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpXG4gICAgICAgIHJldHVybiB4MihzKTtcbiAgICAgIGlmIChzIGluc3RhbmNlb2YgX3ApXG4gICAgICAgIHJldHVybiBXaChzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgUXIocywgcWgpO1xuICB9XG59XG5jb25zdCBrMiA9IFwiS2V5XCI7XG5mdW5jdGlvbiBFYyhzKSB7XG4gIGlmICgvXlthLXoqXVthLXowLTlcXC1fLipdKiQvLnRlc3QocykgPT09ICExKVxuICAgIHRocm93IFFyKHMsIGsyKTtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBQdShzKSB7XG4gIHJldHVybiBzID09IG51bGwgPyBcIlwiIDogT2JqZWN0LmVudHJpZXMocykubWFwKChbZSwgdF0pID0+IHQgPT09ICEwID8gYDske0VjKGUpfWAgOiBgOyR7RWMoZSl9PSR7dmModCl9YCkuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIENwKHMpIHtcbiAgcmV0dXJuIHMgaW5zdGFuY2VvZiBKciA/IGAke3ZjKHMudmFsdWUpfSR7UHUocy5wYXJhbXMpfWAgOiB2YyhzKTtcbn1cbmZ1bmN0aW9uIEQyKHMpIHtcbiAgcmV0dXJuIGAoJHtzLnZhbHVlLm1hcChDcCkuam9pbihcIiBcIil9KSR7UHUocy5wYXJhbXMpfWA7XG59XG5mdW5jdGlvbiBQMihzLCBlID0ge1xuICB3aGl0ZXNwYWNlOiAhMFxufSkge1xuICBpZiAodHlwZW9mIHMgIT0gXCJvYmplY3RcIiB8fCBzID09IG51bGwpXG4gICAgdGhyb3cgUXIocywgZjIpO1xuICBjb25zdCB0ID0gcyBpbnN0YW5jZW9mIE1hcCA/IHMuZW50cmllcygpIDogT2JqZWN0LmVudHJpZXMocyksIHIgPSBlICE9IG51bGwgJiYgZS53aGl0ZXNwYWNlID8gXCIgXCIgOiBcIlwiO1xuICByZXR1cm4gQXJyYXkuZnJvbSh0KS5tYXAoKFtuLCBpXSkgPT4ge1xuICAgIGkgaW5zdGFuY2VvZiBKciB8fCAoaSA9IG5ldyBKcihpKSk7XG4gICAgbGV0IG8gPSBFYyhuKTtcbiAgICByZXR1cm4gaS52YWx1ZSA9PT0gITAgPyBvICs9IFB1KGkucGFyYW1zKSA6IChvICs9IFwiPVwiLCBBcnJheS5pc0FycmF5KGkudmFsdWUpID8gbyArPSBEMihpKSA6IG8gKz0gQ3AoaSkpLCBvO1xuICB9KS5qb2luKGAsJHtyfWApO1xufVxuZnVuY3Rpb24ga3AocywgZSkge1xuICByZXR1cm4gUDIocywgZSk7XG59XG5jb25zdCAkciA9IFwiQ01DRC1PYmplY3RcIiwgeXQgPSBcIkNNQ0QtUmVxdWVzdFwiLCBGcyA9IFwiQ01DRC1TZXNzaW9uXCIsIGJzID0gXCJDTUNELVN0YXR1c1wiLCBNMiA9IHtcbiAgLy8gT2JqZWN0XG4gIGJyOiAkcixcbiAgYWI6ICRyLFxuICBkOiAkcixcbiAgb3Q6ICRyLFxuICB0YjogJHIsXG4gIHRwYjogJHIsXG4gIGxiOiAkcixcbiAgdGFiOiAkcixcbiAgbGFiOiAkcixcbiAgdXJsOiAkcixcbiAgLy8gUmVxdWVzdFxuICBwYjogeXQsXG4gIGJsOiB5dCxcbiAgdGJsOiB5dCxcbiAgZGw6IHl0LFxuICBsdGM6IHl0LFxuICBtdHA6IHl0LFxuICBub3I6IHl0LFxuICBucnI6IHl0LFxuICByYzogeXQsXG4gIHNuOiB5dCxcbiAgc3RhOiB5dCxcbiAgc3U6IHl0LFxuICB0dGZiOiB5dCxcbiAgdHRmYmI6IHl0LFxuICB0dGxiOiB5dCxcbiAgY21zZGQ6IHl0LFxuICBjbXNkczogeXQsXG4gIHNtcnQ6IHl0LFxuICBkZjogeXQsXG4gIGNzOiB5dCxcbiAgLy8gVE9ETzogV2hpY2ggaGVhZGVyIHRvIHB1dCB0aGUgYHRzYCBmaWVsZCBpcyBub3QgZGVmaW5lZCB5ZXQuXG4gIHRzOiB5dCxcbiAgLy8gU2Vzc2lvblxuICBjaWQ6IEZzLFxuICBwcjogRnMsXG4gIHNmOiBGcyxcbiAgc2lkOiBGcyxcbiAgc3Q6IEZzLFxuICB2OiBGcyxcbiAgbXNkOiBGcyxcbiAgLy8gU3RhdHVzXG4gIGJzLFxuICBic2Q6IGJzLFxuICBjZG46IGJzLFxuICBydHA6IGJzLFxuICBiZzogYnMsXG4gIHB0OiBicyxcbiAgZWM6IGJzLFxuICBlOiBic1xufSwgTzIgPSB7XG4gIC8qKlxuICAgKiBrZXlzIHdob3NlIHZhbHVlcyB2YXJ5IHdpdGggZWFjaCByZXF1ZXN0LlxuICAgKi9cbiAgUkVRVUVTVDogeXRcbn07XG5mdW5jdGlvbiBCMihzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzKS5yZWR1Y2UoKGUsIHQpID0+IHtcbiAgICB2YXIgcjtcbiAgICByZXR1cm4gKHIgPSBzW3RdKSA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgfHwgci5mb3JFYWNoKChuKSA9PiBlW25dID0gdCksIGU7XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIEYyKHMsIGUpIHtcbiAgY29uc3QgdCA9IHt9O1xuICBpZiAoIXMpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSBPYmplY3Qua2V5cyhzKSwgbiA9IGUgPyBCMihlKSA6IHt9O1xuICByZXR1cm4gci5yZWR1Y2UoKGksIG8pID0+IHtcbiAgICB2YXIgYTtcbiAgICBjb25zdCBsID0gTTJbb10gfHwgbltvXSB8fCBPMi5SRVFVRVNULCBjID0gKGEgPSBpW2xdKSAhPT0gbnVsbCAmJiBhICE9PSB2b2lkIDAgPyBhIDogaVtsXSA9IHt9O1xuICAgIHJldHVybiBjW29dID0gc1tvXSwgaTtcbiAgfSwgdCk7XG59XG5mdW5jdGlvbiBOMihzKSB7XG4gIHJldHVybiBbXCJvdFwiLCBcInNmXCIsIFwic3RcIiwgXCJlXCIsIFwic3RhXCJdLmluY2x1ZGVzKHMpO1xufVxuZnVuY3Rpb24gVTIocykge1xuICByZXR1cm4gdHlwZW9mIHMgPT0gXCJudW1iZXJcIiA/IHVlKHMpIDogcyAhPSBudWxsICYmIHMgIT09IFwiXCIgJiYgcyAhPT0gITE7XG59XG5jb25zdCBEcCA9IFwiZXZlbnRcIjtcbmZ1bmN0aW9uICQyKHMsIGUpIHtcbiAgY29uc3QgdCA9IG5ldyBVUkwocyksIHIgPSBuZXcgVVJMKGUpO1xuICBpZiAodC5vcmlnaW4gIT09IHIub3JpZ2luKVxuICAgIHJldHVybiBzO1xuICBjb25zdCBuID0gdC5wYXRobmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSksIGkgPSByLnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgxLCAtMSk7XG4gIGZvciAoOyBuWzBdID09PSBpWzBdOyApXG4gICAgbi5zaGlmdCgpLCBpLnNoaWZ0KCk7XG4gIGZvciAoOyBpLmxlbmd0aDsgKVxuICAgIGkuc2hpZnQoKSwgbi51bnNoaWZ0KFwiLi5cIik7XG4gIHJldHVybiBuLmpvaW4oXCIvXCIpICsgdC5zZWFyY2ggKyB0Lmhhc2g7XG59XG5jb25zdCB2byA9IChzKSA9PiBNYXRoLnJvdW5kKHMpLCB4YyA9IChzLCBlKSA9PiBBcnJheS5pc0FycmF5KHMpID8gcy5tYXAoKHQpID0+IHhjKHQsIGUpKSA6IHMgaW5zdGFuY2VvZiBKciAmJiB0eXBlb2Ygcy52YWx1ZSA9PSBcInN0cmluZ1wiID8gbmV3IEpyKHhjKHMudmFsdWUsIGUpLCBzLnBhcmFtcykgOiAoZS5iYXNlVXJsICYmIChzID0gJDIocywgZS5iYXNlVXJsKSksIGUudmVyc2lvbiA9PT0gMSA/IGVuY29kZVVSSUNvbXBvbmVudChzKSA6IHMpLCBYaSA9IChzKSA9PiB2byhzIC8gMTAwKSAqIDEwMCwgRzIgPSAocywgZSkgPT4ge1xuICBsZXQgdCA9IHM7XG4gIHJldHVybiBlLnZlcnNpb24gPj0gMiAmJiAocyBpbnN0YW5jZW9mIEpyICYmIHR5cGVvZiBzLnZhbHVlID09IFwic3RyaW5nXCIgPyB0ID0gbmV3IEpyKFtzXSkgOiB0eXBlb2YgcyA9PSBcInN0cmluZ1wiICYmICh0ID0gW3NdKSksIHhjKHQsIGUpO1xufSwgVjIgPSB7XG4gIC8qKlxuICAgKiBCaXRyYXRlIChrYnBzKSByb3VuZGVkIGludGVnZXJcbiAgICovXG4gIGJyOiB2byxcbiAgLyoqXG4gICAqIER1cmF0aW9uIChtaWxsaXNlY29uZHMpIHJvdW5kZWQgaW50ZWdlclxuICAgKi9cbiAgZDogdm8sXG4gIC8qKlxuICAgKiBCdWZmZXIgTGVuZ3RoIChtaWxsaXNlY29uZHMpIHJvdW5kZWQgbmVhcmVzdCAxMDBtc1xuICAgKi9cbiAgYmw6IFhpLFxuICAvKipcbiAgICogRGVhZGxpbmUgKG1pbGxpc2Vjb25kcykgcm91bmRlZCBuZWFyZXN0IDEwMG1zXG4gICAqL1xuICBkbDogWGksXG4gIC8qKlxuICAgKiBNZWFzdXJlZCBUaHJvdWdocHV0IChrYnBzKSByb3VuZGVkIG5lYXJlc3QgMTAwa2Jwc1xuICAgKi9cbiAgbXRwOiBYaSxcbiAgLyoqXG4gICAqIE5leHQgT2JqZWN0IFJlcXVlc3QgVVJMIGVuY29kZWRcbiAgICovXG4gIG5vcjogRzIsXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgbWF4aW11bSB0aHJvdWdocHV0IChrYnBzKSByb3VuZGVkIG5lYXJlc3QgMTAwa2Jwc1xuICAgKi9cbiAgcnRwOiBYaSxcbiAgLyoqXG4gICAqIFRvcCBCaXRyYXRlIChrYnBzKSByb3VuZGVkIGludGVnZXJcbiAgICovXG4gIHRiOiB2b1xufSwgUHAgPSBcInJlcXVlc3RcIiwgTXAgPSBcInJlc3BvbnNlXCIsIE11ID0gW1wiYWJcIiwgXCJiZ1wiLCBcImJsXCIsIFwiYnJcIiwgXCJic1wiLCBcImJzZFwiLCBcImNkblwiLCBcImNpZFwiLCBcImNzXCIsIFwiZGZcIiwgXCJlY1wiLCBcImxhYlwiLCBcImxiXCIsIFwibHRjXCIsIFwibXNkXCIsIFwibXRwXCIsIFwicGJcIiwgXCJwclwiLCBcInB0XCIsIFwic2ZcIiwgXCJzaWRcIiwgXCJzblwiLCBcInN0XCIsIFwic3RhXCIsIFwidGFiXCIsIFwidGJcIiwgXCJ0YmxcIiwgXCJ0cGJcIiwgXCJ0c1wiLCBcInZcIl0sIGoyID0gW1wiZVwiXSwgSzIgPSAvXlthLXpBLVowLTktLl0rLVthLXpBLVowLTktLl0rJC87XG5mdW5jdGlvbiBFYShzKSB7XG4gIHJldHVybiBLMi50ZXN0KHMpO1xufVxuZnVuY3Rpb24gSDIocykge1xuICByZXR1cm4gTXUuaW5jbHVkZXMocykgfHwgajIuaW5jbHVkZXMocykgfHwgRWEocyk7XG59XG5jb25zdCBPcCA9IFtcImRcIiwgXCJkbFwiLCBcIm5vclwiLCBcIm90XCIsIFwicnRwXCIsIFwic3VcIl07XG5mdW5jdGlvbiBxMihzKSB7XG4gIHJldHVybiBNdS5pbmNsdWRlcyhzKSB8fCBPcC5pbmNsdWRlcyhzKSB8fCBFYShzKTtcbn1cbmNvbnN0IFcyID0gW1wiY21zZGRcIiwgXCJjbXNkc1wiLCBcInJjXCIsIFwic21ydFwiLCBcInR0ZmJcIiwgXCJ0dGZiYlwiLCBcInR0bGJcIiwgXCJ1cmxcIl07XG5mdW5jdGlvbiB6MihzKSB7XG4gIHJldHVybiBNdS5pbmNsdWRlcyhzKSB8fCBPcC5pbmNsdWRlcyhzKSB8fCBXMi5pbmNsdWRlcyhzKSB8fCBFYShzKTtcbn1cbmNvbnN0IFkyID0gW1wiYmxcIiwgXCJiclwiLCBcImJzXCIsIFwiY2lkXCIsIFwiZFwiLCBcImRsXCIsIFwibXRwXCIsIFwibm9yXCIsIFwibnJyXCIsIFwib3RcIiwgXCJwclwiLCBcInJ0cFwiLCBcInNmXCIsIFwic2lkXCIsIFwic3RcIiwgXCJzdVwiLCBcInRiXCIsIFwidlwiXTtcbmZ1bmN0aW9uIFoyKHMpIHtcbiAgcmV0dXJuIFkyLmluY2x1ZGVzKHMpIHx8IEVhKHMpO1xufVxuY29uc3QgWDIgPSB7XG4gIFtNcF06IHoyLFxuICBbRHBdOiBIMixcbiAgW1BwXTogcTJcbn07XG5mdW5jdGlvbiBCcChzLCBlID0ge30pIHtcbiAgY29uc3QgdCA9IHt9O1xuICBpZiAocyA9PSBudWxsIHx8IHR5cGVvZiBzICE9IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSBlLnZlcnNpb24gfHwgcy52IHx8IDEsIG4gPSBlLnJlcG9ydGluZ01vZGUgfHwgUHAsIGkgPSByID09PSAxID8gWjIgOiBYMltuXTtcbiAgbGV0IG8gPSBPYmplY3Qua2V5cyhzKS5maWx0ZXIoaSk7XG4gIGNvbnN0IGEgPSBlLmZpbHRlcjtcbiAgdHlwZW9mIGEgPT0gXCJmdW5jdGlvblwiICYmIChvID0gby5maWx0ZXIoYSkpO1xuICBjb25zdCBsID0gbiA9PT0gTXAgfHwgbiA9PT0gRHA7XG4gIGwgJiYgIW8uaW5jbHVkZXMoXCJ0c1wiKSAmJiBvLnB1c2goXCJ0c1wiKSwgciA+IDEgJiYgIW8uaW5jbHVkZXMoXCJ2XCIpICYmIG8ucHVzaChcInZcIik7XG4gIGNvbnN0IGMgPSBudCh7fSwgVjIsIGUuZm9ybWF0dGVycyksIHUgPSB7XG4gICAgdmVyc2lvbjogcixcbiAgICByZXBvcnRpbmdNb2RlOiBuLFxuICAgIGJhc2VVcmw6IGUuYmFzZVVybFxuICB9O1xuICByZXR1cm4gby5zb3J0KCkuZm9yRWFjaCgoZCkgPT4ge1xuICAgIGxldCBoID0gc1tkXTtcbiAgICBjb25zdCBmID0gY1tkXTtcbiAgICBpZiAodHlwZW9mIGYgPT0gXCJmdW5jdGlvblwiICYmIChoID0gZihoLCB1KSksIGQgPT09IFwidlwiKSB7XG4gICAgICBpZiAociA9PT0gMSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaCA9IHI7XG4gICAgfVxuICAgIGQgPT0gXCJwclwiICYmIGggPT09IDEgfHwgKGwgJiYgZCA9PT0gXCJ0c1wiICYmICF1ZShoKSAmJiAoaCA9IERhdGUubm93KCkpLCBVMihoKSAmJiAoTjIoZCkgJiYgdHlwZW9mIGggPT0gXCJzdHJpbmdcIiAmJiAoaCA9IG5ldyBfcChoKSksIHRbZF0gPSBoKSk7XG4gIH0pLCB0O1xufVxuZnVuY3Rpb24gSjIocywgZSA9IHt9KSB7XG4gIGNvbnN0IHQgPSB7fTtcbiAgaWYgKCFzKVxuICAgIHJldHVybiB0O1xuICBjb25zdCByID0gQnAocywgZSksIG4gPSBGMihyLCBlID09IG51bGwgPyB2b2lkIDAgOiBlLmN1c3RvbUhlYWRlck1hcCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKGksIFtvLCBhXSkgPT4ge1xuICAgIGNvbnN0IGwgPSBrcChhLCB7XG4gICAgICB3aGl0ZXNwYWNlOiAhMVxuICAgIH0pO1xuICAgIHJldHVybiBsICYmIChpW29dID0gbCksIGk7XG4gIH0sIHQpO1xufVxuZnVuY3Rpb24gUTIocywgZSwgdCkge1xuICByZXR1cm4gbnQocywgSjIoZSwgdCkpO1xufVxuY29uc3QgZXcgPSBcIkNNQ0RcIjtcbmZ1bmN0aW9uIHR3KHMsIGUgPSB7fSkge1xuICByZXR1cm4gcyA/IGtwKEJwKHMsIGUpLCB7XG4gICAgd2hpdGVzcGFjZTogITFcbiAgfSkgOiBcIlwiO1xufVxuZnVuY3Rpb24gcncocywgZSA9IHt9KSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gXCJcIjtcbiAgY29uc3QgdCA9IHR3KHMsIGUpO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHQpO1xufVxuZnVuY3Rpb24gc3cocywgZSA9IHt9KSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gXCJcIjtcbiAgY29uc3QgdCA9IHJ3KHMsIGUpO1xuICByZXR1cm4gYCR7ZXd9PSR7dH1gO1xufVxuY29uc3QgemggPSAvQ01DRD1bXiYjXSsvO1xuZnVuY3Rpb24gbncocywgZSwgdCkge1xuICBjb25zdCByID0gc3coZSwgdCk7XG4gIGlmICghcilcbiAgICByZXR1cm4gcztcbiAgaWYgKHpoLnRlc3QocykpXG4gICAgcmV0dXJuIHMucmVwbGFjZSh6aCwgcik7XG4gIGNvbnN0IG4gPSBzLmluY2x1ZGVzKFwiP1wiKSA/IFwiJlwiIDogXCI/XCI7XG4gIHJldHVybiBgJHtzfSR7bn0ke3J9YDtcbn1cbmNsYXNzIGl3IHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IHZvaWQgMCwgdGhpcy5zaWQgPSB2b2lkIDAsIHRoaXMuY2lkID0gdm9pZCAwLCB0aGlzLnVzZUhlYWRlcnMgPSAhMSwgdGhpcy5pbmNsdWRlS2V5cyA9IHZvaWQgMCwgdGhpcy5pbml0aWFsaXplZCA9ICExLCB0aGlzLnN0YXJ2ZWQgPSAhMSwgdGhpcy5idWZmZXJpbmcgPSAhMCwgdGhpcy5hdWRpb0J1ZmZlciA9IHZvaWQgMCwgdGhpcy52aWRlb0J1ZmZlciA9IHZvaWQgMCwgdGhpcy5vbldhaXRpbmcgPSAoKSA9PiB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkICYmICh0aGlzLnN0YXJ2ZWQgPSAhMCksIHRoaXMuYnVmZmVyaW5nID0gITA7XG4gICAgfSwgdGhpcy5vblBsYXlpbmcgPSAoKSA9PiB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkIHx8ICh0aGlzLmluaXRpYWxpemVkID0gITApLCB0aGlzLmJ1ZmZlcmluZyA9ICExO1xuICAgIH0sIHRoaXMuYXBwbHlQbGF5bGlzdERhdGEgPSAobikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5hcHBseShuLCB7XG4gICAgICAgICAgb3Q6IGhyLk1BTklGRVNULFxuICAgICAgICAgIHN1OiAhdGhpcy5pbml0aWFsaXplZFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgICAgdGhpcy5obHMubG9nZ2VyLndhcm4oXCJDb3VsZCBub3QgZ2VuZXJhdGUgbWFuaWZlc3QgQ01DRCBkYXRhLlwiLCBpKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmFwcGx5RnJhZ21lbnREYXRhID0gKG4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBmcmFnOiBpLFxuICAgICAgICAgIHBhcnQ6IG9cbiAgICAgICAgfSA9IG4sIGEgPSB0aGlzLmhscy5sZXZlbHNbaS5sZXZlbF0sIGwgPSB0aGlzLmdldE9iamVjdFR5cGUoaSksIGMgPSB7XG4gICAgICAgICAgZDogKG8gfHwgaSkuZHVyYXRpb24gKiAxZTMsXG4gICAgICAgICAgb3Q6IGxcbiAgICAgICAgfTtcbiAgICAgICAgKGwgPT09IGhyLlZJREVPIHx8IGwgPT09IGhyLkFVRElPIHx8IGwgPT0gaHIuTVVYRUQpICYmIChjLmJyID0gYS5iaXRyYXRlIC8gMWUzLCBjLnRiID0gdGhpcy5nZXRUb3BCYW5kd2lkdGgobCkgLyAxZTMsIGMuYmwgPSB0aGlzLmdldEJ1ZmZlckxlbmd0aChsKSk7XG4gICAgICAgIGNvbnN0IHUgPSBvID8gdGhpcy5nZXROZXh0UGFydChvKSA6IHRoaXMuZ2V0TmV4dEZyYWcoaSk7XG4gICAgICAgIHUgIT0gbnVsbCAmJiB1LnVybCAmJiB1LnVybCAhPT0gaS51cmwgJiYgKGMubm9yID0gdS51cmwpLCB0aGlzLmFwcGx5KG4sIGMpO1xuICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICB0aGlzLmhscy5sb2dnZXIud2FybihcIkNvdWxkIG5vdCBnZW5lcmF0ZSBzZWdtZW50IENNQ0QgZGF0YS5cIiwgaSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5obHMgPSBlO1xuICAgIGNvbnN0IHQgPSB0aGlzLmNvbmZpZyA9IGUuY29uZmlnLCB7XG4gICAgICBjbWNkOiByXG4gICAgfSA9IHQ7XG4gICAgciAhPSBudWxsICYmICh0LnBMb2FkZXIgPSB0aGlzLmNyZWF0ZVBsYXlsaXN0TG9hZGVyKCksIHQuZkxvYWRlciA9IHRoaXMuY3JlYXRlRnJhZ21lbnRMb2FkZXIoKSwgdGhpcy5zaWQgPSByLnNlc3Npb25JZCB8fCBlLnNlc3Npb25JZCwgdGhpcy5jaWQgPSByLmNvbnRlbnRJZCwgdGhpcy51c2VIZWFkZXJzID0gci51c2VIZWFkZXJzID09PSAhMCwgdGhpcy5pbmNsdWRlS2V5cyA9IHIuaW5jbHVkZUtleXMsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKSk7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuaGxzO1xuICAgIGUub24oSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9uKEkuTUVESUFfREVUQUNIRUQsIHRoaXMub25NZWRpYURldGFjaGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9DUkVBVEVELCB0aGlzLm9uQnVmZmVyQ3JlYXRlZCwgdGhpcyk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZS5vZmYoSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSEVELCB0aGlzLm9uTWVkaWFEZXRhY2hlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0NSRUFURUQsIHRoaXMub25CdWZmZXJDcmVhdGVkLCB0aGlzKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLm9uTWVkaWFEZXRhY2hlZCgpLCB0aGlzLmhscyA9IHRoaXMuY29uZmlnID0gdGhpcy5hdWRpb0J1ZmZlciA9IHRoaXMudmlkZW9CdWZmZXIgPSBudWxsLCB0aGlzLm9uV2FpdGluZyA9IHRoaXMub25QbGF5aW5nID0gdGhpcy5tZWRpYSA9IG51bGw7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGVkKGUsIHQpIHtcbiAgICB0aGlzLm1lZGlhID0gdC5tZWRpYSwgdGhpcy5tZWRpYS5hZGRFdmVudExpc3RlbmVyKFwid2FpdGluZ1wiLCB0aGlzLm9uV2FpdGluZyksIHRoaXMubWVkaWEuYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlpbmdcIiwgdGhpcy5vblBsYXlpbmcpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hlZCgpIHtcbiAgICB0aGlzLm1lZGlhICYmICh0aGlzLm1lZGlhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3YWl0aW5nXCIsIHRoaXMub25XYWl0aW5nKSwgdGhpcy5tZWRpYS5yZW1vdmVFdmVudExpc3RlbmVyKFwicGxheWluZ1wiLCB0aGlzLm9uUGxheWluZyksIHRoaXMubWVkaWEgPSBudWxsKTtcbiAgfVxuICBvbkJ1ZmZlckNyZWF0ZWQoZSwgdCkge1xuICAgIHZhciByLCBuO1xuICAgIHRoaXMuYXVkaW9CdWZmZXIgPSAociA9IHQudHJhY2tzLmF1ZGlvKSA9PSBudWxsID8gdm9pZCAwIDogci5idWZmZXIsIHRoaXMudmlkZW9CdWZmZXIgPSAobiA9IHQudHJhY2tzLnZpZGVvKSA9PSBudWxsID8gdm9pZCAwIDogbi5idWZmZXI7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBiYXNlbGluZSBDTUNEIGRhdGFcbiAgICovXG4gIGNyZWF0ZURhdGEoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHY6IDEsXG4gICAgICBzZjogaDIuSExTLFxuICAgICAgc2lkOiB0aGlzLnNpZCxcbiAgICAgIGNpZDogdGhpcy5jaWQsXG4gICAgICBwcjogKGUgPSB0aGlzLm1lZGlhKSA9PSBudWxsID8gdm9pZCAwIDogZS5wbGF5YmFja1JhdGUsXG4gICAgICBtdHA6IHRoaXMuaGxzLmJhbmR3aWR0aEVzdGltYXRlIC8gMWUzXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQXBwbHkgQ01DRCBkYXRhIHRvIGEgcmVxdWVzdC5cbiAgICovXG4gIGFwcGx5KGUsIHQgPSB7fSkge1xuICAgIG50KHQsIHRoaXMuY3JlYXRlRGF0YSgpKTtcbiAgICBjb25zdCByID0gdC5vdCA9PT0gaHIuSU5JVCB8fCB0Lm90ID09PSBoci5WSURFTyB8fCB0Lm90ID09PSBoci5NVVhFRDtcbiAgICB0aGlzLnN0YXJ2ZWQgJiYgciAmJiAodC5icyA9ICEwLCB0LnN1ID0gITAsIHRoaXMuc3RhcnZlZCA9ICExKSwgdC5zdSA9PSBudWxsICYmICh0LnN1ID0gdGhpcy5idWZmZXJpbmcpO1xuICAgIGNvbnN0IHtcbiAgICAgIGluY2x1ZGVLZXlzOiBuXG4gICAgfSA9IHRoaXM7XG4gICAgbiAmJiAodCA9IE9iamVjdC5rZXlzKHQpLnJlZHVjZSgobywgYSkgPT4gKG4uaW5jbHVkZXMoYSkgJiYgKG9bYV0gPSB0W2FdKSwgbyksIHt9KSk7XG4gICAgY29uc3QgaSA9IHtcbiAgICAgIGJhc2VVcmw6IGUudXJsXG4gICAgfTtcbiAgICB0aGlzLnVzZUhlYWRlcnMgPyAoZS5oZWFkZXJzIHx8IChlLmhlYWRlcnMgPSB7fSksIFEyKGUuaGVhZGVycywgdCwgaSkpIDogZS51cmwgPSBudyhlLnVybCwgdCwgaSk7XG4gIH1cbiAgZ2V0TmV4dEZyYWcoZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSAodCA9IHRoaXMuaGxzLmxldmVsc1tlLmxldmVsXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZGV0YWlscztcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgbiA9IGUuc24gLSByLnN0YXJ0U047XG4gICAgICByZXR1cm4gci5mcmFnbWVudHNbbiArIDFdO1xuICAgIH1cbiAgfVxuICBnZXROZXh0UGFydChlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3Qge1xuICAgICAgaW5kZXg6IHIsXG4gICAgICBmcmFnbWVudDogblxuICAgIH0gPSBlLCBpID0gKHQgPSB0aGlzLmhscy5sZXZlbHNbbi5sZXZlbF0pID09IG51bGwgfHwgKHQgPSB0LmRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiB0LnBhcnRMaXN0O1xuICAgIGlmIChpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNuOiBvXG4gICAgICB9ID0gbjtcbiAgICAgIGZvciAobGV0IGEgPSBpLmxlbmd0aCAtIDE7IGEgPj0gMDsgYS0tKSB7XG4gICAgICAgIGNvbnN0IGwgPSBpW2FdO1xuICAgICAgICBpZiAobC5pbmRleCA9PT0gciAmJiBsLmZyYWdtZW50LnNuID09PSBvKVxuICAgICAgICAgIHJldHVybiBpW2EgKyAxXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBDTUNEIG9iamVjdCB0eXBlLlxuICAgKi9cbiAgZ2V0T2JqZWN0VHlwZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZTogdFxuICAgIH0gPSBlO1xuICAgIGlmICh0ID09PSBcInN1YnRpdGxlXCIpXG4gICAgICByZXR1cm4gaHIuVElNRURfVEVYVDtcbiAgICBpZiAoZS5zbiA9PT0gXCJpbml0U2VnbWVudFwiKVxuICAgICAgcmV0dXJuIGhyLklOSVQ7XG4gICAgaWYgKHQgPT09IFwiYXVkaW9cIilcbiAgICAgIHJldHVybiBoci5BVURJTztcbiAgICBpZiAodCA9PT0gXCJtYWluXCIpXG4gICAgICByZXR1cm4gdGhpcy5obHMuYXVkaW9UcmFja3MubGVuZ3RoID8gaHIuVklERU8gOiBoci5NVVhFRDtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBoaWdoZXN0IGJpdHJhdGUuXG4gICAqL1xuICBnZXRUb3BCYW5kd2lkdGgoZSkge1xuICAgIGxldCB0ID0gMCwgcjtcbiAgICBjb25zdCBuID0gdGhpcy5obHM7XG4gICAgaWYgKGUgPT09IGhyLkFVRElPKVxuICAgICAgciA9IG4uYXVkaW9UcmFja3M7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBpID0gbi5tYXhBdXRvTGV2ZWwsIG8gPSBpID4gLTEgPyBpICsgMSA6IG4ubGV2ZWxzLmxlbmd0aDtcbiAgICAgIHIgPSBuLmxldmVscy5zbGljZSgwLCBvKTtcbiAgICB9XG4gICAgcmV0dXJuIHIuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgaS5iaXRyYXRlID4gdCAmJiAodCA9IGkuYml0cmF0ZSk7XG4gICAgfSksIHQgPiAwID8gdCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBidWZmZXIgbGVuZ3RoIGZvciBhIG1lZGlhIHR5cGUgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBnZXRCdWZmZXJMZW5ndGgoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLm1lZGlhLCByID0gZSA9PT0gaHIuQVVESU8gPyB0aGlzLmF1ZGlvQnVmZmVyIDogdGhpcy52aWRlb0J1ZmZlcjtcbiAgICByZXR1cm4gIXIgfHwgIXQgPyBOYU4gOiBDZS5idWZmZXJJbmZvKHIsIHQuY3VycmVudFRpbWUsIHRoaXMuY29uZmlnLm1heEJ1ZmZlckhvbGUpLmxlbiAqIDFlMztcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgcGxheWxpc3QgbG9hZGVyXG4gICAqL1xuICBjcmVhdGVQbGF5bGlzdExvYWRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBwTG9hZGVyOiBlXG4gICAgfSA9IHRoaXMuY29uZmlnLCB0ID0gdGhpcy5hcHBseVBsYXlsaXN0RGF0YSwgciA9IGUgfHwgdGhpcy5jb25maWcubG9hZGVyO1xuICAgIHJldHVybiBjbGFzcyB7XG4gICAgICBjb25zdHJ1Y3RvcihpKSB7XG4gICAgICAgIHRoaXMubG9hZGVyID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IG5ldyByKGkpO1xuICAgICAgfVxuICAgICAgZ2V0IHN0YXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuc3RhdHM7XG4gICAgICB9XG4gICAgICBnZXQgY29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmxvYWRlci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5sb2FkZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICAgIGxvYWQoaSwgbywgYSkge1xuICAgICAgICB0KGkpLCB0aGlzLmxvYWRlci5sb2FkKGksIG8sIGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBsYXlsaXN0IGxvYWRlclxuICAgKi9cbiAgY3JlYXRlRnJhZ21lbnRMb2FkZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZkxvYWRlcjogZVxuICAgIH0gPSB0aGlzLmNvbmZpZywgdCA9IHRoaXMuYXBwbHlGcmFnbWVudERhdGEsIHIgPSBlIHx8IHRoaXMuY29uZmlnLmxvYWRlcjtcbiAgICByZXR1cm4gY2xhc3Mge1xuICAgICAgY29uc3RydWN0b3IoaSkge1xuICAgICAgICB0aGlzLmxvYWRlciA9IHZvaWQgMCwgdGhpcy5sb2FkZXIgPSBuZXcgcihpKTtcbiAgICAgIH1cbiAgICAgIGdldCBzdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLnN0YXRzO1xuICAgICAgfVxuICAgICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5jb250ZXh0O1xuICAgICAgfVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sb2FkZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMubG9hZGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgICBsb2FkKGksIG8sIGEpIHtcbiAgICAgICAgdChpKSwgdGhpcy5sb2FkZXIubG9hZChpLCBvLCBhKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5jb25zdCBvdyA9IDNlNTtcbmNsYXNzIGF3IGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJjb250ZW50LXN0ZWVyaW5nXCIsIGUubG9nZ2VyKSwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMubG9hZGVyID0gbnVsbCwgdGhpcy51cmkgPSBudWxsLCB0aGlzLnBhdGh3YXlJZCA9IFwiLlwiLCB0aGlzLl9wYXRod2F5UHJpb3JpdHkgPSBudWxsLCB0aGlzLnRpbWVUb0xvYWQgPSAzMDAsIHRoaXMucmVsb2FkVGltZXIgPSAtMSwgdGhpcy51cGRhdGVkID0gMCwgdGhpcy5zdGFydGVkID0gITEsIHRoaXMuZW5hYmxlZCA9ICEwLCB0aGlzLmxldmVscyA9IG51bGwsIHRoaXMuYXVkaW9UcmFja3MgPSBudWxsLCB0aGlzLnN1YnRpdGxlVHJhY2tzID0gbnVsbCwgdGhpcy5wZW5hbGl6ZWRQYXRod2F5cyA9IHt9LCB0aGlzLmhscyA9IGUsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9uKEkuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZSAmJiAoZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpKTtcbiAgfVxuICBwYXRod2F5cygpIHtcbiAgICByZXR1cm4gKHRoaXMubGV2ZWxzIHx8IFtdKS5yZWR1Y2UoKGUsIHQpID0+IChlLmluZGV4T2YodC5wYXRod2F5SWQpID09PSAtMSAmJiBlLnB1c2godC5wYXRod2F5SWQpLCBlKSwgW10pO1xuICB9XG4gIGdldCBwYXRod2F5UHJpb3JpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdGh3YXlQcmlvcml0eTtcbiAgfVxuICBzZXQgcGF0aHdheVByaW9yaXR5KGUpIHtcbiAgICB0aGlzLnVwZGF0ZVBhdGh3YXlQcmlvcml0eShlKTtcbiAgfVxuICBzdGFydExvYWQoKSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCA9ICEwLCB0aGlzLmNsZWFyVGltZW91dCgpLCB0aGlzLmVuYWJsZWQgJiYgdGhpcy51cmkpIHtcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMudGltZVRvTG9hZCAqIDFlMyAtIChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMudXBkYXRlZCk7XG4gICAgICAgIGlmIChlID4gMCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKHRoaXMudXJpLCBlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZFN0ZWVyaW5nTWFuaWZlc3QodGhpcy51cmkpO1xuICAgIH1cbiAgfVxuICBzdG9wTG9hZCgpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSAhMSwgdGhpcy5sb2FkZXIgJiYgKHRoaXMubG9hZGVyLmRlc3Ryb3koKSwgdGhpcy5sb2FkZXIgPSBudWxsKSwgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgfVxuICBjbGVhclRpbWVvdXQoKSB7XG4gICAgdGhpcy5yZWxvYWRUaW1lciAhPT0gLTEgJiYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVsb2FkVGltZXIpLCB0aGlzLnJlbG9hZFRpbWVyID0gLTEpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5obHMgPSBudWxsLCB0aGlzLmxldmVscyA9IHRoaXMuYXVkaW9UcmFja3MgPSB0aGlzLnN1YnRpdGxlVHJhY2tzID0gbnVsbDtcbiAgfVxuICByZW1vdmVMZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMubGV2ZWxzO1xuICAgIHQgJiYgKHRoaXMubGV2ZWxzID0gdC5maWx0ZXIoKHIpID0+IHIgIT09IGUpKTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB0aGlzLnN0b3BMb2FkKCksIHRoaXMuZW5hYmxlZCA9ICEwLCB0aGlzLnRpbWVUb0xvYWQgPSAzMDAsIHRoaXMudXBkYXRlZCA9IDAsIHRoaXMudXJpID0gbnVsbCwgdGhpcy5wYXRod2F5SWQgPSBcIi5cIiwgdGhpcy5sZXZlbHMgPSB0aGlzLmF1ZGlvVHJhY2tzID0gdGhpcy5zdWJ0aXRsZVRyYWNrcyA9IG51bGw7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGVudFN0ZWVyaW5nOiByXG4gICAgfSA9IHQ7XG4gICAgciAhPT0gbnVsbCAmJiAodGhpcy5wYXRod2F5SWQgPSByLnBhdGh3YXlJZCwgdGhpcy51cmkgPSByLnVyaSwgdGhpcy5zdGFydGVkICYmIHRoaXMuc3RhcnRMb2FkKCkpO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIHRoaXMuYXVkaW9UcmFja3MgPSB0LmF1ZGlvVHJhY2tzLCB0aGlzLnN1YnRpdGxlVHJhY2tzID0gdC5zdWJ0aXRsZVRyYWNrcztcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBlcnJvckFjdGlvbjogclxuICAgIH0gPSB0O1xuICAgIGlmICgociA9PSBudWxsID8gdm9pZCAwIDogci5hY3Rpb24pID09PSBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94ICYmIHIuZmxhZ3MgPT09IHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0KSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5sZXZlbHM7XG4gICAgICBsZXQgaSA9IHRoaXMuX3BhdGh3YXlQcmlvcml0eSwgbyA9IHRoaXMucGF0aHdheUlkO1xuICAgICAgaWYgKHQuY29udGV4dCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZ3JvdXBJZDogYSxcbiAgICAgICAgICBwYXRod2F5SWQ6IGwsXG4gICAgICAgICAgdHlwZTogY1xuICAgICAgICB9ID0gdC5jb250ZXh0O1xuICAgICAgICBhICYmIG4gPyBvID0gdGhpcy5nZXRQYXRod2F5Rm9yR3JvdXBJZChhLCBjLCBvKSA6IGwgJiYgKG8gPSBsKTtcbiAgICAgIH1cbiAgICAgIG8gaW4gdGhpcy5wZW5hbGl6ZWRQYXRod2F5cyB8fCAodGhpcy5wZW5hbGl6ZWRQYXRod2F5c1tvXSA9IHBlcmZvcm1hbmNlLm5vdygpKSwgIWkgJiYgbiAmJiAoaSA9IHRoaXMucGF0aHdheXMoKSksIGkgJiYgaS5sZW5ndGggPiAxICYmICh0aGlzLnVwZGF0ZVBhdGh3YXlQcmlvcml0eShpKSwgci5yZXNvbHZlZCA9IHRoaXMucGF0aHdheUlkICE9PSBvKSwgdC5kZXRhaWxzID09PSBKLkJVRkZFUl9BUFBFTkRfRVJST1IgJiYgIXQuZmF0YWwgPyByLnJlc29sdmVkID0gITAgOiByLnJlc29sdmVkIHx8IHRoaXMud2FybihgQ291bGQgbm90IHJlc29sdmUgJHt0LmRldGFpbHN9IChcIiR7dC5lcnJvci5tZXNzYWdlfVwiKSB3aXRoIGNvbnRlbnQtc3RlZXJpbmcgZm9yIFBhdGh3YXk6ICR7b30gbGV2ZWxzOiAke24gJiYgbi5sZW5ndGh9IHByaW9yaXRpZXM6ICR7YXQoaSl9IHBlbmFsaXplZDogJHthdCh0aGlzLnBlbmFsaXplZFBhdGh3YXlzKX1gKTtcbiAgICB9XG4gIH1cbiAgZmlsdGVyUGFyc2VkTGV2ZWxzKGUpIHtcbiAgICB0aGlzLmxldmVscyA9IGU7XG4gICAgbGV0IHQgPSB0aGlzLmdldExldmVsc0ZvclBhdGh3YXkodGhpcy5wYXRod2F5SWQpO1xuICAgIGlmICh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgciA9IGVbMF0ucGF0aHdheUlkO1xuICAgICAgdGhpcy5sb2coYE5vIGxldmVscyBmb3VuZCBpbiBQYXRod2F5ICR7dGhpcy5wYXRod2F5SWR9LiBTZXR0aW5nIGluaXRpYWwgUGF0aHdheSB0byBcIiR7cn1cImApLCB0ID0gdGhpcy5nZXRMZXZlbHNGb3JQYXRod2F5KHIpLCB0aGlzLnBhdGh3YXlJZCA9IHI7XG4gICAgfVxuICAgIHJldHVybiB0Lmxlbmd0aCAhPT0gZS5sZW5ndGggJiYgdGhpcy5sb2coYEZvdW5kICR7dC5sZW5ndGh9LyR7ZS5sZW5ndGh9IGxldmVscyBpbiBQYXRod2F5IFwiJHt0aGlzLnBhdGh3YXlJZH1cImApLCB0O1xuICB9XG4gIGdldExldmVsc0ZvclBhdGh3YXkoZSkge1xuICAgIHJldHVybiB0aGlzLmxldmVscyA9PT0gbnVsbCA/IFtdIDogdGhpcy5sZXZlbHMuZmlsdGVyKCh0KSA9PiBlID09PSB0LnBhdGh3YXlJZCk7XG4gIH1cbiAgdXBkYXRlUGF0aHdheVByaW9yaXR5KGUpIHtcbiAgICB0aGlzLl9wYXRod2F5UHJpb3JpdHkgPSBlO1xuICAgIGxldCB0O1xuICAgIGNvbnN0IHIgPSB0aGlzLnBlbmFsaXplZFBhdGh3YXlzLCBuID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgT2JqZWN0LmtleXMocikuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgbiAtIHJbaV0gPiBvdyAmJiBkZWxldGUgcltpXTtcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBlW2ldO1xuICAgICAgaWYgKG8gaW4gcilcbiAgICAgICAgY29udGludWU7XG4gICAgICBpZiAobyA9PT0gdGhpcy5wYXRod2F5SWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmhscy5uZXh0TG9hZExldmVsLCBsID0gdGhpcy5obHMubGV2ZWxzW2FdO1xuICAgICAgaWYgKHQgPSB0aGlzLmdldExldmVsc0ZvclBhdGh3YXkobyksIHQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvZyhgU2V0dGluZyBQYXRod2F5IHRvIFwiJHtvfVwiYCksIHRoaXMucGF0aHdheUlkID0gbywgcnAodCksIHRoaXMuaGxzLnRyaWdnZXIoSS5MRVZFTFNfVVBEQVRFRCwge1xuICAgICAgICAgIGxldmVsczogdFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuaGxzLmxldmVsc1thXTtcbiAgICAgICAgbCAmJiBjICYmIHRoaXMubGV2ZWxzICYmIChjLmF0dHJzW1wiU1RBQkxFLVZBUklBTlQtSURcIl0gIT09IGwuYXR0cnNbXCJTVEFCTEUtVkFSSUFOVC1JRFwiXSAmJiBjLmJpdHJhdGUgIT09IGwuYml0cmF0ZSAmJiB0aGlzLmxvZyhgVW5zdGFibGUgUGF0aHdheXMgY2hhbmdlIGZyb20gYml0cmF0ZSAke2wuYml0cmF0ZX0gdG8gJHtjLmJpdHJhdGV9YCksIHRoaXMuaGxzLm5leHRMb2FkTGV2ZWwgPSBhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldFBhdGh3YXlGb3JHcm91cElkKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5nZXRMZXZlbHNGb3JQYXRod2F5KHIpLmNvbmNhdCh0aGlzLmxldmVscyB8fCBbXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKHQgPT09IEtlLkFVRElPX1RSQUNLICYmIG5baV0uaGFzQXVkaW9Hcm91cChlKSB8fCB0ID09PSBLZS5TVUJUSVRMRV9UUkFDSyAmJiBuW2ldLmhhc1N1YnRpdGxlR3JvdXAoZSkpXG4gICAgICAgIHJldHVybiBuW2ldLnBhdGh3YXlJZDtcbiAgICByZXR1cm4gcjtcbiAgfVxuICBjbG9uZVBhdGh3YXlzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5sZXZlbHM7XG4gICAgaWYgKCF0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSB7fSwgbiA9IHt9O1xuICAgIGUuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBJRDogbyxcbiAgICAgICAgXCJCQVNFLUlEXCI6IGEsXG4gICAgICAgIFwiVVJJLVJFUExBQ0VNRU5UXCI6IGxcbiAgICAgIH0gPSBpO1xuICAgICAgaWYgKHQuc29tZSgodSkgPT4gdS5wYXRod2F5SWQgPT09IG8pKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjID0gdGhpcy5nZXRMZXZlbHNGb3JQYXRod2F5KGEpLm1hcCgodSkgPT4ge1xuICAgICAgICBjb25zdCBkID0gbmV3IGd0KHUuYXR0cnMpO1xuICAgICAgICBkW1wiUEFUSFdBWS1JRFwiXSA9IG87XG4gICAgICAgIGNvbnN0IGggPSBkLkFVRElPICYmIGAke2QuQVVESU99X2Nsb25lXyR7b31gLCBmID0gZC5TVUJUSVRMRVMgJiYgYCR7ZC5TVUJUSVRMRVN9X2Nsb25lXyR7b31gO1xuICAgICAgICBoICYmIChyW2QuQVVESU9dID0gaCwgZC5BVURJTyA9IGgpLCBmICYmIChuW2QuU1VCVElUTEVTXSA9IGYsIGQuU1VCVElUTEVTID0gZik7XG4gICAgICAgIGNvbnN0IHAgPSBGcCh1LnVyaSwgZFtcIlNUQUJMRS1WQVJJQU5ULUlEXCJdLCBcIlBFUi1WQVJJQU5ULVVSSVNcIiwgbCksIHkgPSBuZXcgbWkoe1xuICAgICAgICAgIGF0dHJzOiBkLFxuICAgICAgICAgIGF1ZGlvQ29kZWM6IHUuYXVkaW9Db2RlYyxcbiAgICAgICAgICBiaXRyYXRlOiB1LmJpdHJhdGUsXG4gICAgICAgICAgaGVpZ2h0OiB1LmhlaWdodCxcbiAgICAgICAgICBuYW1lOiB1Lm5hbWUsXG4gICAgICAgICAgdXJsOiBwLFxuICAgICAgICAgIHZpZGVvQ29kZWM6IHUudmlkZW9Db2RlYyxcbiAgICAgICAgICB3aWR0aDogdS53aWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHUuYXVkaW9Hcm91cHMpXG4gICAgICAgICAgZm9yIChsZXQgRSA9IDE7IEUgPCB1LmF1ZGlvR3JvdXBzLmxlbmd0aDsgRSsrKVxuICAgICAgICAgICAgeS5hZGRHcm91cElkKFwiYXVkaW9cIiwgYCR7dS5hdWRpb0dyb3Vwc1tFXX1fY2xvbmVfJHtvfWApO1xuICAgICAgICBpZiAodS5zdWJ0aXRsZUdyb3VwcylcbiAgICAgICAgICBmb3IgKGxldCBFID0gMTsgRSA8IHUuc3VidGl0bGVHcm91cHMubGVuZ3RoOyBFKyspXG4gICAgICAgICAgICB5LmFkZEdyb3VwSWQoXCJ0ZXh0XCIsIGAke3Uuc3VidGl0bGVHcm91cHNbRV19X2Nsb25lXyR7b31gKTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9KTtcbiAgICAgIHQucHVzaCguLi5jKSwgWWgodGhpcy5hdWRpb1RyYWNrcywgciwgbCwgbyksIFloKHRoaXMuc3VidGl0bGVUcmFja3MsIG4sIGwsIG8pO1xuICAgIH0pO1xuICB9XG4gIGxvYWRTdGVlcmluZ01hbmlmZXN0KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMuY29uZmlnLCByID0gdC5sb2FkZXI7XG4gICAgdGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuZGVzdHJveSgpLCB0aGlzLmxvYWRlciA9IG5ldyByKHQpO1xuICAgIGxldCBuO1xuICAgIHRyeSB7XG4gICAgICBuID0gbmV3IHNlbGYuVVJMKGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5lbmFibGVkID0gITEsIHRoaXMubG9nKGBGYWlsZWQgdG8gcGFyc2UgU3RlZXJpbmcgTWFuaWZlc3QgVVJJOiAke2V9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuLnByb3RvY29sICE9PSBcImRhdGE6XCIpIHtcbiAgICAgIGNvbnN0IHUgPSAodGhpcy5obHMuYmFuZHdpZHRoRXN0aW1hdGUgfHwgdC5hYnJFd21hRGVmYXVsdEVzdGltYXRlKSB8IDA7XG4gICAgICBuLnNlYXJjaFBhcmFtcy5zZXQoXCJfSExTX3BhdGh3YXlcIiwgdGhpcy5wYXRod2F5SWQpLCBuLnNlYXJjaFBhcmFtcy5zZXQoXCJfSExTX3Rocm91Z2hwdXRcIiwgXCJcIiArIHUpO1xuICAgIH1cbiAgICBjb25zdCBpID0ge1xuICAgICAgcmVzcG9uc2VUeXBlOiBcImpzb25cIixcbiAgICAgIHVybDogbi5ocmVmXG4gICAgfSwgbyA9IHQuc3RlZXJpbmdNYW5pZmVzdExvYWRQb2xpY3kuZGVmYXVsdCwgYSA9IG8uZXJyb3JSZXRyeSB8fCBvLnRpbWVvdXRSZXRyeSB8fCB7fSwgbCA9IHtcbiAgICAgIGxvYWRQb2xpY3k6IG8sXG4gICAgICB0aW1lb3V0OiBvLm1heExvYWRUaW1lTXMsXG4gICAgICBtYXhSZXRyeTogYS5tYXhOdW1SZXRyeSB8fCAwLFxuICAgICAgcmV0cnlEZWxheTogYS5yZXRyeURlbGF5TXMgfHwgMCxcbiAgICAgIG1heFJldHJ5RGVsYXk6IGEubWF4UmV0cnlEZWxheU1zIHx8IDBcbiAgICB9LCBjID0ge1xuICAgICAgb25TdWNjZXNzOiAodSwgZCwgaCwgZikgPT4ge1xuICAgICAgICB0aGlzLmxvZyhgTG9hZGVkIHN0ZWVyaW5nIG1hbmlmZXN0OiBcIiR7bn1cImApO1xuICAgICAgICBjb25zdCBwID0gdS5kYXRhO1xuICAgICAgICBpZiAoKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAuVkVSU0lPTikgIT09IDEpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgU3RlZXJpbmcgVkVSU0lPTiAke3AuVkVSU0lPTn0gbm90IHN1cHBvcnRlZCFgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVkID0gcGVyZm9ybWFuY2Uubm93KCksIHRoaXMudGltZVRvTG9hZCA9IHAuVFRMO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgXCJSRUxPQUQtVVJJXCI6IHksXG4gICAgICAgICAgXCJQQVRIV0FZLUNMT05FU1wiOiBFLFxuICAgICAgICAgIFwiUEFUSFdBWS1QUklPUklUWVwiOiBiXG4gICAgICAgIH0gPSBwO1xuICAgICAgICBpZiAoeSlcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cmkgPSBuZXcgc2VsZi5VUkwoeSwgbikuaHJlZjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9ICExLCB0aGlzLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFN0ZWVyaW5nIE1hbmlmZXN0IFJFTE9BRC1VUkk6ICR7eX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKHRoaXMudXJpIHx8IGgudXJsKSwgRSAmJiB0aGlzLmNsb25lUGF0aHdheXMoRSk7XG4gICAgICAgIGNvbnN0IFIgPSB7XG4gICAgICAgICAgc3RlZXJpbmdNYW5pZmVzdDogcCxcbiAgICAgICAgICB1cmw6IG4udG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuU1RFRVJJTkdfTUFOSUZFU1RfTE9BREVELCBSKSwgYiAmJiB0aGlzLnVwZGF0ZVBhdGh3YXlQcmlvcml0eShiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAodSwgZCwgaCwgZikgPT4ge1xuICAgICAgICBpZiAodGhpcy5sb2coYEVycm9yIGxvYWRpbmcgc3RlZXJpbmcgbWFuaWZlc3Q6ICR7dS5jb2RlfSAke3UudGV4dH0gKCR7ZC51cmx9KWApLCB0aGlzLnN0b3BMb2FkKCksIHUuY29kZSA9PT0gNDEwKSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVkID0gITEsIHRoaXMubG9nKGBTdGVlcmluZyBtYW5pZmVzdCAke2QudXJsfSBubyBsb25nZXIgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwID0gdGhpcy50aW1lVG9Mb2FkICogMWUzO1xuICAgICAgICBpZiAodS5jb2RlID09PSA0MjkpIHtcbiAgICAgICAgICBjb25zdCB5ID0gdGhpcy5sb2FkZXI7XG4gICAgICAgICAgaWYgKHR5cGVvZiAoeSA9PSBudWxsID8gdm9pZCAwIDogeS5nZXRSZXNwb25zZUhlYWRlcikgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBFID0geS5nZXRSZXNwb25zZUhlYWRlcihcIlJldHJ5LUFmdGVyXCIpO1xuICAgICAgICAgICAgRSAmJiAocCA9IHBhcnNlRmxvYXQoRSkgKiAxZTMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZyhgU3RlZXJpbmcgbWFuaWZlc3QgJHtkLnVybH0gcmF0ZSBsaW1pdGVkYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKHRoaXMudXJpIHx8IGQudXJsLCBwKTtcbiAgICAgIH0sXG4gICAgICBvblRpbWVvdXQ6ICh1LCBkLCBoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nKGBUaW1lb3V0IGxvYWRpbmcgc3RlZXJpbmcgbWFuaWZlc3QgKCR7ZC51cmx9KWApLCB0aGlzLnNjaGVkdWxlUmVmcmVzaCh0aGlzLnVyaSB8fCBkLnVybCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvZyhgUmVxdWVzdGluZyBzdGVlcmluZyBtYW5pZmVzdDogJHtufWApLCB0aGlzLmxvYWRlci5sb2FkKGksIGwsIGMpO1xuICB9XG4gIHNjaGVkdWxlUmVmcmVzaChlLCB0ID0gdGhpcy50aW1lVG9Mb2FkICogMWUzKSB7XG4gICAgdGhpcy5jbGVhclRpbWVvdXQoKSwgdGhpcy5yZWxvYWRUaW1lciA9IHNlbGYuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB2YXIgcjtcbiAgICAgIGNvbnN0IG4gPSAociA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogci5tZWRpYTtcbiAgICAgIGlmIChuICYmICFuLmVuZGVkKSB7XG4gICAgICAgIHRoaXMubG9hZFN0ZWVyaW5nTWFuaWZlc3QoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKGUsIHRoaXMudGltZVRvTG9hZCAqIDFlMyk7XG4gICAgfSwgdCk7XG4gIH1cbn1cbmZ1bmN0aW9uIFloKHMsIGUsIHQsIHIpIHtcbiAgcyAmJiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuKSA9PiB7XG4gICAgY29uc3QgaSA9IHMuZmlsdGVyKChvKSA9PiBvLmdyb3VwSWQgPT09IG4pLm1hcCgobykgPT4ge1xuICAgICAgY29uc3QgYSA9IG50KHt9LCBvKTtcbiAgICAgIHJldHVybiBhLmRldGFpbHMgPSB2b2lkIDAsIGEuYXR0cnMgPSBuZXcgZ3QoYS5hdHRycyksIGEudXJsID0gYS5hdHRycy5VUkkgPSBGcChvLnVybCwgby5hdHRyc1tcIlNUQUJMRS1SRU5ESVRJT04tSURcIl0sIFwiUEVSLVJFTkRJVElPTi1VUklTXCIsIHQpLCBhLmdyb3VwSWQgPSBhLmF0dHJzW1wiR1JPVVAtSURcIl0gPSBlW25dLCBhLmF0dHJzW1wiUEFUSFdBWS1JRFwiXSA9IHIsIGE7XG4gICAgfSk7XG4gICAgcy5wdXNoKC4uLmkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIEZwKHMsIGUsIHQsIHIpIHtcbiAgY29uc3Qge1xuICAgIEhPU1Q6IG4sXG4gICAgUEFSQU1TOiBpLFxuICAgIFt0XTogb1xuICB9ID0gcjtcbiAgbGV0IGE7XG4gIGUgJiYgKGEgPSBvID09IG51bGwgPyB2b2lkIDAgOiBvW2VdLCBhICYmIChzID0gYSkpO1xuICBjb25zdCBsID0gbmV3IHNlbGYuVVJMKHMpO1xuICByZXR1cm4gbiAmJiAhYSAmJiAobC5ob3N0ID0gbiksIGkgJiYgT2JqZWN0LmtleXMoaSkuc29ydCgpLmZvckVhY2goKGMpID0+IHtcbiAgICBjICYmIGwuc2VhcmNoUGFyYW1zLnNldChjLCBpW2NdKTtcbiAgfSksIGwuaHJlZjtcbn1cbmNsYXNzIF9uIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJlbWVcIiwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLmtleUZvcm1hdFByb21pc2UgPSBudWxsLCB0aGlzLmtleVN5c3RlbUFjY2Vzc1Byb21pc2VzID0ge30sIHRoaXMuX3JlcXVlc3RMaWNlbnNlRmFpbHVyZUNvdW50ID0gMCwgdGhpcy5tZWRpYUtleVNlc3Npb25zID0gW10sIHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlID0ge30sIHRoaXMubWVkaWFLZXlzID0gbnVsbCwgdGhpcy5zZXRNZWRpYUtleXNRdWV1ZSA9IF9uLkNETUNsZWFudXBQcm9taXNlID8gW19uLkNETUNsZWFudXBQcm9taXNlXSA6IFtdLCB0aGlzLmJhbm5lZEtleUlkcyA9IHt9LCB0aGlzLm9uTWVkaWFFbmNyeXB0ZWQgPSAodCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpbml0RGF0YVR5cGU6IHIsXG4gICAgICAgIGluaXREYXRhOiBuXG4gICAgICB9ID0gdCwgaSA9IGBcIiR7dC50eXBlfVwiIGV2ZW50OiBpbml0IGRhdGEgdHlwZTogXCIke3J9XCJgO1xuICAgICAgaWYgKHRoaXMuZGVidWcoaSksIG4gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmtleUZvcm1hdFByb21pc2UpIHtcbiAgICAgICAgICBsZXQgbyA9IE9iamVjdC5rZXlzKHRoaXMua2V5U3lzdGVtQWNjZXNzUHJvbWlzZXMpO1xuICAgICAgICAgIG8ubGVuZ3RoIHx8IChvID0gem4odGhpcy5jb25maWcpKTtcbiAgICAgICAgICBjb25zdCBhID0gby5tYXAoZmwpLmZpbHRlcigobCkgPT4gISFsKTtcbiAgICAgICAgICB0aGlzLmtleUZvcm1hdFByb21pc2UgPSB0aGlzLmdldEtleUZvcm1hdFByb21pc2UoYSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZXlGb3JtYXRQcm9taXNlLnRoZW4oKG8pID0+IHtcbiAgICAgICAgICBjb25zdCBhID0gcG8obyk7XG4gICAgICAgICAgaWYgKHIgIT09IFwic2luZlwiIHx8IGEgIT09IG10LkZBSVJQTEFZKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgSWdub3JpbmcgXCIke3QudHlwZX1cIiBldmVudCB3aXRoIGluaXQgZGF0YSB0eXBlOiBcIiR7cn1cIiBmb3Igc2VsZWN0ZWQga2V5LXN5c3RlbSAke2F9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBsO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmID0ganQobmV3IFVpbnQ4QXJyYXkobikpLCBwID0gYnUoSlNPTi5wYXJzZShmKS5zaW5mKSwgeSA9IFBnKHApO1xuICAgICAgICAgICAgaWYgKCF5KVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCInc2NobScgYm94IG1pc3Npbmcgb3Igbm90IGNiY3MvY2VuYyB3aXRoIHNjaGkgPiB0ZW5jXCIpO1xuICAgICAgICAgICAgbCA9IG5ldyBVaW50OEFycmF5KHkuc3ViYXJyYXkoOCwgMjQpKTtcbiAgICAgICAgICB9IGNhdGNoIChmKSB7XG4gICAgICAgICAgICB0aGlzLndhcm4oYCR7aX0gRmFpbGVkIHRvIHBhcnNlIHNpbmY6ICR7Zn1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYyA9IGZyKGwpLCB7XG4gICAgICAgICAgICBrZXlJZFRvS2V5U2Vzc2lvblByb21pc2U6IHUsXG4gICAgICAgICAgICBtZWRpYUtleVNlc3Npb25zOiBkXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgbGV0IGggPSB1W2NdO1xuICAgICAgICAgIGZvciAobGV0IGYgPSAwOyBmIDwgZC5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgY29uc3QgcCA9IGRbZl0sIHkgPSBwLmRlY3J5cHRkYXRhO1xuICAgICAgICAgICAgaWYgKCF5LmtleUlkKVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IEUgPSBmcih5LmtleUlkKTtcbiAgICAgICAgICAgIGlmICh4dShsLCB5LmtleUlkKSB8fCB5LnVyaS5yZXBsYWNlKC8tL2csIFwiXCIpLmluZGV4T2YoYykgIT09IC0xKSB7XG4gICAgICAgICAgICAgIGlmIChoID0gdVtFXSwgIWgpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIGlmICh5LnBzc2gpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlbGV0ZSB1W0VdLCB5LnBzc2ggPSBuZXcgVWludDhBcnJheShuKSwgeS5rZXlJZCA9IGwsIGggPSB1W2NdID0gaC50aGVuKCgpID0+IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0V2l0aFByZWZlcnJlZEtleVNlc3Npb24ocCwgciwgbiwgXCJlbmNyeXB0ZWQtZXZlbnQta2V5LW1hdGNoXCIpKSwgaC5jYXRjaCgoYikgPT4gdGhpcy5oYW5kbGVFcnJvcihiKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBoIHx8IHRoaXMuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBLZXkgSUQgJHtjfSBub3QgZW5jb3VudGVyZWQgaW4gcGxheWxpc3QuIEtleS1zeXN0ZW0gc2Vzc2lvbnMgJHtkLmxlbmd0aH0uYCkpO1xuICAgICAgICB9KS5jYXRjaCgobykgPT4gdGhpcy5oYW5kbGVFcnJvcihvKSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5vbldhaXRpbmdGb3JLZXkgPSAodCkgPT4ge1xuICAgICAgdGhpcy5sb2coYFwiJHt0LnR5cGV9XCIgZXZlbnRgKTtcbiAgICB9LCB0aGlzLmhscyA9IGUsIHRoaXMuY29uZmlnID0gZS5jb25maWcsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMub25EZXN0cm95aW5nKCksIHRoaXMub25NZWRpYURldGFjaGVkKCk7XG4gICAgY29uc3QgZSA9IHRoaXMuY29uZmlnO1xuICAgIGUucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzRnVuYyA9IG51bGwsIGUubGljZW5zZVhoclNldHVwID0gZS5saWNlbnNlUmVzcG9uc2VDYWxsYmFjayA9IHZvaWQgMCwgZS5kcm1TeXN0ZW1zID0gZS5kcm1TeXN0ZW1PcHRpb25zID0ge30sIHRoaXMuaGxzID0gdGhpcy5jb25maWcgPSB0aGlzLmtleUlkVG9LZXlTZXNzaW9uUHJvbWlzZSA9IG51bGwsIHRoaXMub25NZWRpYUVuY3J5cHRlZCA9IHRoaXMub25XYWl0aW5nRm9yS2V5ID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICB0aGlzLmhscy5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIHRoaXMuaGxzLm9uKEkuTUVESUFfREVUQUNIRUQsIHRoaXMub25NZWRpYURldGFjaGVkLCB0aGlzKSwgdGhpcy5obHMub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgdGhpcy5obHMub24oSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIHRoaXMuaGxzLm9uKEkuREVTVFJPWUlORywgdGhpcy5vbkRlc3Ryb3lpbmcsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5obHMub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuTUVESUFfREVUQUNIRUQsIHRoaXMub25NZWRpYURldGFjaGVkLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIHRoaXMuaGxzLm9mZihJLk1BTklGRVNUX0xPQURFRCwgdGhpcy5vbk1hbmlmZXN0TG9hZGVkLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuREVTVFJPWUlORywgdGhpcy5vbkRlc3Ryb3lpbmcsIHRoaXMpO1xuICB9XG4gIGdldExpY2Vuc2VTZXJ2ZXJVcmwoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRybVN5c3RlbXM6IHQsXG4gICAgICB3aWRldmluZUxpY2Vuc2VVcmw6IHJcbiAgICB9ID0gdGhpcy5jb25maWcsIG4gPSB0ID09IG51bGwgPyB2b2lkIDAgOiB0W2VdO1xuICAgIGlmIChuKVxuICAgICAgcmV0dXJuIG4ubGljZW5zZVVybDtcbiAgICBpZiAoZSA9PT0gbXQuV0lERVZJTkUgJiYgcilcbiAgICAgIHJldHVybiByO1xuICB9XG4gIGdldExpY2Vuc2VTZXJ2ZXJVcmxPclRocm93KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRMaWNlbnNlU2VydmVyVXJsKGUpO1xuICAgIGlmICh0ID09PSB2b2lkIDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxpY2Vuc2Ugc2VydmVyIFVSTCBjb25maWd1cmVkIGZvciBrZXktc3lzdGVtIFwiJHtlfVwiYCk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgZ2V0U2VydmVyQ2VydGlmaWNhdGVVcmwoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRybVN5c3RlbXM6IHRcbiAgICB9ID0gdGhpcy5jb25maWcsIHIgPSB0ID09IG51bGwgPyB2b2lkIDAgOiB0W2VdO1xuICAgIGlmIChyKVxuICAgICAgcmV0dXJuIHIuc2VydmVyQ2VydGlmaWNhdGVVcmw7XG4gICAgdGhpcy5sb2coYE5vIFNlcnZlciBDZXJ0aWZpY2F0ZSBpbiBjb25maWcuZHJtU3lzdGVtc1tcIiR7ZX1cIl1gKTtcbiAgfVxuICBhdHRlbXB0S2V5U3lzdGVtQWNjZXNzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMubGV2ZWxzLCByID0gKG8sIGEsIGwpID0+ICEhbyAmJiBsLmluZGV4T2YobykgPT09IGEsIG4gPSB0Lm1hcCgobykgPT4gby5hdWRpb0NvZGVjKS5maWx0ZXIociksIGkgPSB0Lm1hcCgobykgPT4gby52aWRlb0NvZGVjKS5maWx0ZXIocik7XG4gICAgcmV0dXJuIG4ubGVuZ3RoICsgaS5sZW5ndGggPT09IDAgJiYgaS5wdXNoKFwiYXZjMS40MmUwMWVcIiksIG5ldyBQcm9taXNlKChvLCBhKSA9PiB7XG4gICAgICBjb25zdCBsID0gKGMpID0+IHtcbiAgICAgICAgY29uc3QgdSA9IGMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5nZXRNZWRpYUtleXNQcm9taXNlKHUsIG4sIGkpLnRoZW4oKGQpID0+IG8oe1xuICAgICAgICAgIGtleVN5c3RlbTogdSxcbiAgICAgICAgICBtZWRpYUtleXM6IGRcbiAgICAgICAgfSkpLmNhdGNoKChkKSA9PiB7XG4gICAgICAgICAgYy5sZW5ndGggPyBsKGMpIDogZCBpbnN0YW5jZW9mIHlyID8gYShkKSA6IGEobmV3IHlyKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fTk9fQUNDRVNTLFxuICAgICAgICAgICAgZXJyb3I6IGQsXG4gICAgICAgICAgICBmYXRhbDogITBcbiAgICAgICAgICB9LCBkLm1lc3NhZ2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbChlKTtcbiAgICB9KTtcbiAgfVxuICByZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2Vzc0Z1bmM6IHJcbiAgICB9ID0gdGhpcy5jb25maWc7XG4gICAgaWYgKHR5cGVvZiByICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgbGV0IG4gPSBgQ29uZmlndXJlZCByZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MgaXMgbm90IGEgZnVuY3Rpb24gJHtyfWA7XG4gICAgICByZXR1cm4gWWcgPT09IG51bGwgJiYgc2VsZi5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwOlwiICYmIChuID0gYG5hdmlnYXRvci5yZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MgaXMgbm90IGF2YWlsYWJsZSBvdmVyIGluc2VjdXJlIHByb3RvY29sICR7bG9jYXRpb24ucHJvdG9jb2x9YCksIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihuKSk7XG4gICAgfVxuICAgIHJldHVybiByKGUsIHQpO1xuICB9XG4gIGdldE1lZGlhS2V5c1Byb21pc2UoZSwgdCwgcikge1xuICAgIHZhciBuO1xuICAgIGNvbnN0IGkgPSBHYihlLCB0LCByLCB0aGlzLmNvbmZpZy5kcm1TeXN0ZW1PcHRpb25zIHx8IHt9KTtcbiAgICBsZXQgbyA9IHRoaXMua2V5U3lzdGVtQWNjZXNzUHJvbWlzZXNbZV0sIGEgPSAobiA9IG8pID09IG51bGwgPyB2b2lkIDAgOiBuLmtleVN5c3RlbUFjY2VzcztcbiAgICBpZiAoIWEpIHtcbiAgICAgIHRoaXMubG9nKGBSZXF1ZXN0aW5nIGVuY3J5cHRlZCBtZWRpYSBcIiR7ZX1cIiBrZXktc3lzdGVtIGFjY2VzcyB3aXRoIGNvbmZpZzogJHthdChpKX1gKSwgYSA9IHRoaXMucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzKGUsIGkpO1xuICAgICAgY29uc3QgbCA9IG8gPSB0aGlzLmtleVN5c3RlbUFjY2Vzc1Byb21pc2VzW2VdID0ge1xuICAgICAgICBrZXlTeXN0ZW1BY2Nlc3M6IGFcbiAgICAgIH07XG4gICAgICByZXR1cm4gYS5jYXRjaCgoYykgPT4ge1xuICAgICAgICB0aGlzLmxvZyhgRmFpbGVkIHRvIG9idGFpbiBhY2Nlc3MgdG8ga2V5LXN5c3RlbSBcIiR7ZX1cIjogJHtjfWApO1xuICAgICAgfSksIGEudGhlbigoYykgPT4ge1xuICAgICAgICB0aGlzLmxvZyhgQWNjZXNzIGZvciBrZXktc3lzdGVtIFwiJHtjLmtleVN5c3RlbX1cIiBvYnRhaW5lZGApO1xuICAgICAgICBjb25zdCB1ID0gdGhpcy5mZXRjaFNlcnZlckNlcnRpZmljYXRlKGUpO1xuICAgICAgICB0aGlzLmxvZyhgQ3JlYXRlIG1lZGlhLWtleXMgZm9yIFwiJHtlfVwiYCk7XG4gICAgICAgIGNvbnN0IGQgPSBsLm1lZGlhS2V5cyA9IGMuY3JlYXRlTWVkaWFLZXlzKCkudGhlbigoaCkgPT4gKHRoaXMubG9nKGBNZWRpYS1rZXlzIGNyZWF0ZWQgZm9yIFwiJHtlfVwiYCksIGwuaGFzTWVkaWFLZXlzID0gITAsIHUudGhlbigoZikgPT4gZiA/IHRoaXMuc2V0TWVkaWFLZXlzU2VydmVyQ2VydGlmaWNhdGUoaCwgZSwgZikgOiBoKSkpO1xuICAgICAgICByZXR1cm4gZC5jYXRjaCgoaCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbWVkaWEta2V5cyBmb3IgXCIke2V9XCJ9OiAke2h9YCk7XG4gICAgICAgIH0pLCBkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhLnRoZW4oKCkgPT4gby5tZWRpYUtleXMpO1xuICB9XG4gIGNyZWF0ZU1lZGlhS2V5U2Vzc2lvbkNvbnRleHQoe1xuICAgIGRlY3J5cHRkYXRhOiBlLFxuICAgIGtleVN5c3RlbTogdCxcbiAgICBtZWRpYUtleXM6IHJcbiAgfSkge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBrZXktc3lzdGVtIHNlc3Npb24gXCIke3R9XCIga2V5SWQ6ICR7ZnIoZS5rZXlJZCB8fCBbXSl9IGtleVVyaTogJHtlLnVyaX1gKTtcbiAgICBjb25zdCBuID0gci5jcmVhdGVTZXNzaW9uKCksIGkgPSB7XG4gICAgICBkZWNyeXB0ZGF0YTogZSxcbiAgICAgIGtleVN5c3RlbTogdCxcbiAgICAgIG1lZGlhS2V5czogcixcbiAgICAgIG1lZGlhS2V5c1Nlc3Npb246IG4sXG4gICAgICBrZXlTdGF0dXM6IFwic3RhdHVzLXBlbmRpbmdcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubWVkaWFLZXlTZXNzaW9ucy5wdXNoKGkpLCBpO1xuICB9XG4gIHJlbmV3S2V5U2Vzc2lvbihlKSB7XG4gICAgY29uc3QgdCA9IGUuZGVjcnlwdGRhdGE7XG4gICAgaWYgKHQucHNzaCkge1xuICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlTWVkaWFLZXlTZXNzaW9uQ29udGV4dChlKSwgbiA9IEppKHQpLCBpID0gXCJjZW5jXCI7XG4gICAgICB0aGlzLmtleUlkVG9LZXlTZXNzaW9uUHJvbWlzZVtuXSA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0V2l0aFByZWZlcnJlZEtleVNlc3Npb24ociwgaSwgdC5wc3NoLmJ1ZmZlciwgXCJleHBpcmVkXCIpO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy53YXJuKFwiQ291bGQgbm90IHJlbmV3IGV4cGlyZWQgc2Vzc2lvbi4gTWlzc2luZyBwc3NoIGluaXREYXRhLlwiKTtcbiAgICB0aGlzLnJlbW92ZVNlc3Npb24oZSk7XG4gIH1cbiAgdXBkYXRlS2V5U2Vzc2lvbihlLCB0KSB7XG4gICAgY29uc3QgciA9IGUubWVkaWFLZXlzU2Vzc2lvbjtcbiAgICByZXR1cm4gdGhpcy5sb2coYFVwZGF0aW5nIGtleS1zZXNzaW9uIFwiJHtyLnNlc3Npb25JZH1cIiBmb3Iga2V5SWQgJHtmcihlLmRlY3J5cHRkYXRhLmtleUlkIHx8IFtdKX1cbiAgICAgIH0gKGRhdGEgbGVuZ3RoOiAke3QuYnl0ZUxlbmd0aH0pYCksIHIudXBkYXRlKHQpO1xuICB9XG4gIGdldFNlbGVjdGVkS2V5U3lzdGVtRm9ybWF0cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5rZXlTeXN0ZW1BY2Nlc3NQcm9taXNlcykubWFwKChlKSA9PiAoe1xuICAgICAga2V5U3lzdGVtOiBlLFxuICAgICAgaGFzTWVkaWFLZXlzOiB0aGlzLmtleVN5c3RlbUFjY2Vzc1Byb21pc2VzW2VdLmhhc01lZGlhS2V5c1xuICAgIH0pKS5maWx0ZXIoKHtcbiAgICAgIGhhc01lZGlhS2V5czogZVxuICAgIH0pID0+ICEhZSkubWFwKCh7XG4gICAgICBrZXlTeXN0ZW06IGVcbiAgICB9KSA9PiBmbChlKSkuZmlsdGVyKChlKSA9PiAhIWUpO1xuICB9XG4gIGdldEtleVN5c3RlbUFjY2VzcyhlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0S2V5U3lzdGVtU2VsZWN0aW9uUHJvbWlzZShlKS50aGVuKCh7XG4gICAgICBrZXlTeXN0ZW06IHQsXG4gICAgICBtZWRpYUtleXM6IHJcbiAgICB9KSA9PiB0aGlzLmF0dGVtcHRTZXRNZWRpYUtleXModCwgcikpO1xuICB9XG4gIHNlbGVjdEtleVN5c3RlbShlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCh0LCByKSA9PiB7XG4gICAgICB0aGlzLmdldEtleVN5c3RlbVNlbGVjdGlvblByb21pc2UoZSkudGhlbigoe1xuICAgICAgICBrZXlTeXN0ZW06IG5cbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3QgaSA9IGZsKG4pO1xuICAgICAgICBpID8gdChpKSA6IHIobmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBmb3JtYXQgZm9yIGtleS1zeXN0ZW0gXCIke259XCJgKSk7XG4gICAgICB9KS5jYXRjaChyKTtcbiAgICB9KTtcbiAgfVxuICBzZWxlY3RLZXlTeXN0ZW1Gb3JtYXQoZSkge1xuICAgIGNvbnN0IHQgPSBPYmplY3Qua2V5cyhlLmxldmVsa2V5cyB8fCB7fSk7XG4gICAgcmV0dXJuIHRoaXMua2V5Rm9ybWF0UHJvbWlzZSB8fCAodGhpcy5sb2coYFNlbGVjdGluZyBrZXktc3lzdGVtIGZyb20gZnJhZ21lbnQgKHNuOiAke2Uuc259ICR7ZS50eXBlfTogJHtlLmxldmVsfSkga2V5IGZvcm1hdHMgJHt0LmpvaW4oXCIsIFwiKX1gKSwgdGhpcy5rZXlGb3JtYXRQcm9taXNlID0gdGhpcy5nZXRLZXlGb3JtYXRQcm9taXNlKHQpKSwgdGhpcy5rZXlGb3JtYXRQcm9taXNlO1xuICB9XG4gIGdldEtleUZvcm1hdFByb21pc2UoZSkge1xuICAgIGNvbnN0IHQgPSB6bih0aGlzLmNvbmZpZyksIHIgPSBlLm1hcChwbykuZmlsdGVyKChuKSA9PiAhIW4gJiYgdC5pbmRleE9mKG4pICE9PSAtMSk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0S2V5U3lzdGVtKHIpO1xuICB9XG4gIGdldEtleVN0YXR1cyhlKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFLZXlTZXNzaW9uczogdFxuICAgIH0gPSB0aGlzO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgY29uc3QgbiA9IGx3KGUsIHRbcl0pO1xuICAgICAgaWYgKG4pXG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgfVxuICBsb2FkS2V5KGUpIHtcbiAgICBjb25zdCB0ID0gZS5rZXlJbmZvLmRlY3J5cHRkYXRhLCByID0gSmkodCksIG4gPSB0aGlzLmJhbm5lZEtleUlkc1tyXTtcbiAgICBpZiAobiB8fCB0aGlzLmdldEtleVN0YXR1cyh0KSA9PT0gXCJpbnRlcm5hbC1lcnJvclwiKSB7XG4gICAgICBjb25zdCBhID0gWmgobiB8fCBcImludGVybmFsLWVycm9yXCIsIHQpO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoYSwgZS5mcmFnKSwgUHJvbWlzZS5yZWplY3QoYSk7XG4gICAgfVxuICAgIGNvbnN0IGkgPSBgKGtleUlkOiAke3J9IGZvcm1hdDogXCIke3Qua2V5Rm9ybWF0fVwiIG1ldGhvZDogJHt0Lm1ldGhvZH0gdXJpOiAke3QudXJpfSlgO1xuICAgIHRoaXMubG9nKGBTdGFydGluZyBzZXNzaW9uIGZvciBrZXkgJHtpfWApO1xuICAgIGNvbnN0IG8gPSB0aGlzLmtleUlkVG9LZXlTZXNzaW9uUHJvbWlzZVtyXTtcbiAgICBpZiAoIW8pIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmdldEtleVN5c3RlbUZvcktleVByb21pc2UodCkudGhlbigoe1xuICAgICAgICBrZXlTeXN0ZW06IGwsXG4gICAgICAgIG1lZGlhS2V5czogY1xuICAgICAgfSkgPT4gKHRoaXMudGhyb3dJZkRlc3Ryb3llZCgpLCB0aGlzLmxvZyhgSGFuZGxlIGVuY3J5cHRlZCBtZWRpYSBzbjogJHtlLmZyYWcuc259ICR7ZS5mcmFnLnR5cGV9OiAke2UuZnJhZy5sZXZlbH0gdXNpbmcga2V5ICR7aX1gKSwgdGhpcy5hdHRlbXB0U2V0TWVkaWFLZXlzKGwsIGMpLnRoZW4oKCkgPT4gKHRoaXMudGhyb3dJZkRlc3Ryb3llZCgpLCB0aGlzLmNyZWF0ZU1lZGlhS2V5U2Vzc2lvbkNvbnRleHQoe1xuICAgICAgICBrZXlTeXN0ZW06IGwsXG4gICAgICAgIG1lZGlhS2V5czogYyxcbiAgICAgICAgZGVjcnlwdGRhdGE6IHRcbiAgICAgIH0pKSkpKS50aGVuKChsKSA9PiB7XG4gICAgICAgIGNvbnN0IGMgPSBcImNlbmNcIiwgdSA9IHQucHNzaCA/IHQucHNzaC5idWZmZXIgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVJlcXVlc3RXaXRoUHJlZmVycmVkS2V5U2Vzc2lvbihsLCBjLCB1LCBcInBsYXlsaXN0LWtleVwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuY2F0Y2goKGwpID0+IHRoaXMuaGFuZGxlRXJyb3IobCwgZS5mcmFnKSksIHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlW3JdID0gYSwgYTtcbiAgICB9XG4gICAgcmV0dXJuIG8uY2F0Y2goKGEpID0+IHtcbiAgICAgIGlmIChhIGluc3RhbmNlb2YgeXIpIHtcbiAgICAgICAgY29uc3QgbCA9IHR0KHt9LCBhLmRhdGEpO1xuICAgICAgICB0aGlzLmdldEtleVN0YXR1cyh0KSA9PT0gXCJpbnRlcm5hbC1lcnJvclwiICYmIChsLmRlY3J5cHRkYXRhID0gdCk7XG4gICAgICAgIGNvbnN0IGMgPSBuZXcgeXIobCwgYS5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihjLCBlLmZyYWcpO1xuICAgICAgfVxuICAgIH0pLCBvO1xuICB9XG4gIHRocm93SWZEZXN0cm95ZWQoZSA9IFwiSW52YWxpZCBzdGF0ZVwiKSB7XG4gICAgaWYgKCF0aGlzLmhscylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc3RhdGVcIik7XG4gIH1cbiAgaGFuZGxlRXJyb3IoZSwgdCkge1xuICAgIGlmICh0aGlzLmhscylcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgeXIpIHtcbiAgICAgICAgdCAmJiAoZS5kYXRhLmZyYWcgPSB0KTtcbiAgICAgICAgY29uc3QgciA9IGUuZGF0YS5kZWNyeXB0ZGF0YTtcbiAgICAgICAgdGhpcy5lcnJvcihgJHtlLm1lc3NhZ2V9JHtyID8gYCAoJHtmcihyLmtleUlkIHx8IFtdKX0pYCA6IFwiXCJ9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwgZS5kYXRhKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLmVycm9yKGUubWVzc2FnZSksIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX05PX0tFWVMsXG4gICAgICAgICAgZXJyb3I6IGUsXG4gICAgICAgICAgZmF0YWw6ICEwXG4gICAgICAgIH0pO1xuICB9XG4gIGdldEtleVN5c3RlbUZvcktleVByb21pc2UoZSkge1xuICAgIGNvbnN0IHQgPSBKaShlKSwgciA9IHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlW3RdO1xuICAgIGlmICghcikge1xuICAgICAgY29uc3QgbiA9IHBvKGUua2V5Rm9ybWF0KSwgaSA9IG4gPyBbbl0gOiB6bih0aGlzLmNvbmZpZyk7XG4gICAgICByZXR1cm4gdGhpcy5hdHRlbXB0S2V5U3lzdGVtQWNjZXNzKGkpO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICBnZXRLZXlTeXN0ZW1TZWxlY3Rpb25Qcm9taXNlKGUpIHtcbiAgICBpZiAoZS5sZW5ndGggfHwgKGUgPSB6bih0aGlzLmNvbmZpZykpLCBlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyB5cih7XG4gICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9OT19DT05GSUdVUkVEX0xJQ0VOU0UsXG4gICAgICAgIGZhdGFsOiAhMFxuICAgICAgfSwgYE1pc3Npbmcga2V5LXN5c3RlbSBsaWNlbnNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAke2F0KHtcbiAgICAgICAgZHJtU3lzdGVtczogdGhpcy5jb25maWcuZHJtU3lzdGVtc1xuICAgICAgfSl9YCk7XG4gICAgcmV0dXJuIHRoaXMuYXR0ZW1wdEtleVN5c3RlbUFjY2VzcyhlKTtcbiAgfVxuICBhdHRlbXB0U2V0TWVkaWFLZXlzKGUsIHQpIHtcbiAgICBpZiAodGhpcy5tZWRpYUtleXMgPT09IHQpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgciA9IHRoaXMuc2V0TWVkaWFLZXlzUXVldWUuc2xpY2UoKTtcbiAgICB0aGlzLmxvZyhgU2V0dGluZyBtZWRpYS1rZXlzIGZvciBcIiR7ZX1cImApO1xuICAgIGNvbnN0IG4gPSBQcm9taXNlLmFsbChyKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tZWRpYSlcbiAgICAgICAgdGhyb3cgdGhpcy5tZWRpYUtleXMgPSBudWxsLCBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gc2V0IG1lZGlhS2V5cyB3aXRob3V0IG1lZGlhIGVsZW1lbnQgYXR0YWNoZWRcIik7XG4gICAgICByZXR1cm4gdGhpcy5tZWRpYS5zZXRNZWRpYUtleXModCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMubWVkaWFLZXlzID0gdCwgdGhpcy5zZXRNZWRpYUtleXNRdWV1ZS5wdXNoKG4pLCBuLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5sb2coYE1lZGlhLWtleXMgc2V0IGZvciBcIiR7ZX1cImApLCByLnB1c2gobiksIHRoaXMuc2V0TWVkaWFLZXlzUXVldWUgPSB0aGlzLnNldE1lZGlhS2V5c1F1ZXVlLmZpbHRlcigoaSkgPT4gci5pbmRleE9mKGkpID09PSAtMSk7XG4gICAgfSk7XG4gIH1cbiAgZ2VuZXJhdGVSZXF1ZXN0V2l0aFByZWZlcnJlZEtleVNlc3Npb24oZSwgdCwgciwgbikge1xuICAgIHZhciBpO1xuICAgIGNvbnN0IG8gPSAoaSA9IHRoaXMuY29uZmlnLmRybVN5c3RlbXMpID09IG51bGwgfHwgKGkgPSBpW2Uua2V5U3lzdGVtXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuZ2VuZXJhdGVSZXF1ZXN0O1xuICAgIGlmIChvKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcCA9IG8uY2FsbCh0aGlzLmhscywgdCwgciwgZSk7XG4gICAgICAgIGlmICghcClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIGZyb20gY29uZmlndXJlZCBnZW5lcmF0ZVJlcXVlc3QgZmlsdGVyXCIpO1xuICAgICAgICB0ID0gcC5pbml0RGF0YVR5cGUsIHIgPSBwLmluaXREYXRhID8gcC5pbml0RGF0YSA6IG51bGwsIGUuZGVjcnlwdGRhdGEucHNzaCA9IHIgPyBuZXcgVWludDhBcnJheShyKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIChwKSB7XG4gICAgICAgIGlmICh0aGlzLndhcm4ocC5tZXNzYWdlKSwgdGhpcy5obHMgJiYgdGhpcy5obHMuY29uZmlnLmRlYnVnKVxuICAgICAgICAgIHRocm93IHA7XG4gICAgICB9XG4gICAgaWYgKHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gdGhpcy5sb2coYFNraXBwaW5nIGtleS1zZXNzaW9uIHJlcXVlc3QgZm9yIFwiJHtufVwiIChubyBpbml0RGF0YSlgKSwgUHJvbWlzZS5yZXNvbHZlKGUpO1xuICAgIGNvbnN0IGEgPSBKaShlLmRlY3J5cHRkYXRhKSwgbCA9IGUuZGVjcnlwdGRhdGEudXJpO1xuICAgIHRoaXMubG9nKGBHZW5lcmF0aW5nIGtleS1zZXNzaW9uIHJlcXVlc3QgZm9yIFwiJHtufVwiIGtleUlkOiAke2F9IFVSSTogJHtsfSAoaW5pdCBkYXRhIHR5cGU6ICR7dH0gbGVuZ3RoOiAke3IuYnl0ZUxlbmd0aH0pYCk7XG4gICAgY29uc3QgYyA9IG5ldyB3dSgpLCB1ID0gZS5fb25tZXNzYWdlID0gKHApID0+IHtcbiAgICAgIGNvbnN0IHkgPSBlLm1lZGlhS2V5c1Nlc3Npb247XG4gICAgICBpZiAoIXkpIHtcbiAgICAgICAgYy5lbWl0KFwiZXJyb3JcIiwgbmV3IEVycm9yKFwiaW52YWxpZCBzdGF0ZVwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVzc2FnZVR5cGU6IEUsXG4gICAgICAgIG1lc3NhZ2U6IGJcbiAgICAgIH0gPSBwO1xuICAgICAgdGhpcy5sb2coYFwiJHtFfVwiIG1lc3NhZ2UgZXZlbnQgZm9yIHNlc3Npb24gXCIke3kuc2Vzc2lvbklkfVwiIG1lc3NhZ2Ugc2l6ZTogJHtiLmJ5dGVMZW5ndGh9YCksIEUgPT09IFwibGljZW5zZS1yZXF1ZXN0XCIgfHwgRSA9PT0gXCJsaWNlbnNlLXJlbmV3YWxcIiA/IHRoaXMucmVuZXdMaWNlbnNlKGUsIGIpLmNhdGNoKChSKSA9PiB7XG4gICAgICAgIGMuZXZlbnROYW1lcygpLmxlbmd0aCA/IGMuZW1pdChcImVycm9yXCIsIFIpIDogdGhpcy5oYW5kbGVFcnJvcihSKTtcbiAgICAgIH0pIDogRSA9PT0gXCJsaWNlbnNlLXJlbGVhc2VcIiA/IGUua2V5U3lzdGVtID09PSBtdC5GQUlSUExBWSAmJiB0aGlzLnVwZGF0ZUtleVNlc3Npb24oZSwgaGMoXCJhY2tub3dsZWRnZWRcIikpLnRoZW4oKCkgPT4gdGhpcy5yZW1vdmVTZXNzaW9uKGUpKS5jYXRjaCgoUikgPT4gdGhpcy5oYW5kbGVFcnJvcihSKSkgOiB0aGlzLndhcm4oYHVuaGFuZGxlZCBtZWRpYSBrZXkgbWVzc2FnZSB0eXBlIFwiJHtFfVwiYCk7XG4gICAgfSwgZCA9IChwLCB5KSA9PiB7XG4gICAgICB5LmtleVN0YXR1cyA9IHA7XG4gICAgICBsZXQgRTtcbiAgICAgIHAuc3RhcnRzV2l0aChcInVzYWJsZVwiKSA/IGMuZW1pdChcInJlc29sdmVkXCIpIDogcCA9PT0gXCJpbnRlcm5hbC1lcnJvclwiIHx8IHAgPT09IFwib3V0cHV0LXJlc3RyaWN0ZWRcIiB8fCBwID09PSBcIm91dHB1dC1kb3duc2NhbGVkXCIgPyBFID0gWmgocCwgeS5kZWNyeXB0ZGF0YSkgOiBwID09PSBcImV4cGlyZWRcIiA/IEUgPSBuZXcgRXJyb3IoYGtleSBleHBpcmVkIChrZXlJZDogJHthfSlgKSA6IHAgPT09IFwicmVsZWFzZWRcIiA/IEUgPSBuZXcgRXJyb3IoXCJrZXkgcmVsZWFzZWRcIikgOiBwID09PSBcInN0YXR1cy1wZW5kaW5nXCIgfHwgdGhpcy53YXJuKGB1bmhhbmRsZWQga2V5IHN0YXR1cyBjaGFuZ2UgXCIke3B9XCIgKGtleUlkOiAke2F9KWApLCBFICYmIChjLmV2ZW50TmFtZXMoKS5sZW5ndGggPyBjLmVtaXQoXCJlcnJvclwiLCBFKSA6IHRoaXMuaGFuZGxlRXJyb3IoRSkpO1xuICAgIH0sIGggPSBlLl9vbmtleXN0YXR1c2VzY2hhbmdlID0gKHApID0+IHtcbiAgICAgIGlmICghZS5tZWRpYUtleXNTZXNzaW9uKSB7XG4gICAgICAgIGMuZW1pdChcImVycm9yXCIsIG5ldyBFcnJvcihcImludmFsaWQgc3RhdGVcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBFID0gdGhpcy5nZXRLZXlTdGF0dXNlcyhlKTtcbiAgICAgIGlmICghT2JqZWN0LmtleXMoRSkuc29tZSgoRikgPT4gRVtGXSAhPT0gXCJzdGF0dXMtcGVuZGluZ1wiKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKEVbYV0gPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHRoaXMubG9nKGBFeHBpcmVkIGtleSAke2F0KEUpfSBpbiBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cImApLCB0aGlzLnJlbmV3S2V5U2Vzc2lvbihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IFIgPSBFW2FdO1xuICAgICAgaWYgKFIpXG4gICAgICAgIGQoUiwgZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIEE7XG4gICAgICAgIGUua2V5U3RhdHVzVGltZW91dHMgfHwgKGUua2V5U3RhdHVzVGltZW91dHMgPSB7fSksIChBID0gZS5rZXlTdGF0dXNUaW1lb3V0cylbYV0gfHwgKEFbYV0gPSBzZWxmLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghZS5tZWRpYUtleXNTZXNzaW9uIHx8ICF0aGlzLm1lZGlhS2V5cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjb25zdCBNID0gdGhpcy5nZXRLZXlTdGF0dXMoZS5kZWNyeXB0ZGF0YSk7XG4gICAgICAgICAgaWYgKE0gJiYgTSAhPT0gXCJzdGF0dXMtcGVuZGluZ1wiKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKGBObyBzdGF0dXMgZm9yIGtleUlkICR7YX0gaW4ga2V5LXNlc3Npb24gXCIke2UubWVkaWFLZXlzU2Vzc2lvbi5zZXNzaW9uSWR9XCIuIFVzaW5nIHNlc3Npb24ga2V5LXN0YXR1cyAke019IGZyb20gb3RoZXIgc2Vzc2lvbi5gKSwgZChNLCBlKTtcbiAgICAgICAgICB0aGlzLmxvZyhga2V5IHN0YXR1cyBmb3IgJHthfSBpbiBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cIiB0aW1lZCBvdXQgYWZ0ZXIgMG1zYCksIFIgPSBcImludGVybmFsLWVycm9yXCIsIGQoUiwgZSk7XG4gICAgICAgIH0sIDApKSwgdGhpcy5sb2coYE5vIHN0YXR1cyBmb3Iga2V5SWQgJHthfSAoJHthdChFKX0pLmApO1xuICAgICAgfVxuICAgIH07XG4gICAgY3IoZS5tZWRpYUtleXNTZXNzaW9uLCBcIm1lc3NhZ2VcIiwgdSksIGNyKGUubWVkaWFLZXlzU2Vzc2lvbiwgXCJrZXlzdGF0dXNlc2NoYW5nZVwiLCBoKTtcbiAgICBjb25zdCBmID0gbmV3IFByb21pc2UoKHAsIHkpID0+IHtcbiAgICAgIGMub24oXCJlcnJvclwiLCB5KSwgYy5vbihcInJlc29sdmVkXCIsIHApO1xuICAgIH0pO1xuICAgIHJldHVybiBlLm1lZGlhS2V5c1Nlc3Npb24uZ2VuZXJhdGVSZXF1ZXN0KHQsIHIpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5sb2coYFJlcXVlc3QgZ2VuZXJhdGVkIGZvciBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cIiBrZXlJZDogJHthfSBVUkk6ICR7bH1gKTtcbiAgICB9KS5jYXRjaCgocCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IHlyKHtcbiAgICAgICAgdHlwZTogdmUuS0VZX1NZU1RFTV9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX05PX1NFU1NJT04sXG4gICAgICAgIGVycm9yOiBwLFxuICAgICAgICBkZWNyeXB0ZGF0YTogZS5kZWNyeXB0ZGF0YSxcbiAgICAgICAgZmF0YWw6ICExXG4gICAgICB9LCBgRXJyb3IgZ2VuZXJhdGluZyBrZXktc2Vzc2lvbiByZXF1ZXN0OiAke3B9YCk7XG4gICAgfSkudGhlbigoKSA9PiBmKS5jYXRjaCgocCkgPT4gKGMucmVtb3ZlQWxsTGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlU2Vzc2lvbihlKS50aGVuKCgpID0+IHtcbiAgICAgIHRocm93IHA7XG4gICAgfSkpKS50aGVuKCgpID0+IChjLnJlbW92ZUFsbExpc3RlbmVycygpLCBlKSk7XG4gIH1cbiAgZ2V0S2V5U3RhdHVzZXMoZSkge1xuICAgIGNvbnN0IHQgPSB7fTtcbiAgICByZXR1cm4gZS5tZWRpYUtleXNTZXNzaW9uLmtleVN0YXR1c2VzLmZvckVhY2goKHIsIG4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbiA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiByID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3QgYSA9IG47XG4gICAgICAgIG4gPSByLCByID0gYTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSBcImJ1ZmZlclwiIGluIG4gPyBuZXcgVWludDhBcnJheShuLmJ1ZmZlciwgbi5ieXRlT2Zmc2V0LCBuLmJ5dGVMZW5ndGgpIDogbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBlLmtleVN5c3RlbSA9PT0gbXQuUExBWVJFQURZICYmIGkubGVuZ3RoID09PSAxNiAmJiB6ZyhpKTtcbiAgICAgIGNvbnN0IG8gPSBmcihpKTtcbiAgICAgIHIgPT09IFwiaW50ZXJuYWwtZXJyb3JcIiAmJiAodGhpcy5iYW5uZWRLZXlJZHNbb10gPSByKSwgdGhpcy5sb2coYGtleSBzdGF0dXMgY2hhbmdlIFwiJHtyfVwiIGZvciBrZXlTdGF0dXNlcyBrZXlJZDogJHtvfSBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cImApLCB0W29dID0gcjtcbiAgICB9KSwgdDtcbiAgfVxuICBmZXRjaFNlcnZlckNlcnRpZmljYXRlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jb25maWcsIHIgPSB0LmxvYWRlciwgbiA9IG5ldyByKHQpLCBpID0gdGhpcy5nZXRTZXJ2ZXJDZXJ0aWZpY2F0ZVVybChlKTtcbiAgICByZXR1cm4gaSA/ICh0aGlzLmxvZyhgRmV0Y2hpbmcgc2VydmVyIGNlcnRpZmljYXRlIGZvciBcIiR7ZX1cImApLCBuZXcgUHJvbWlzZSgobywgYSkgPT4ge1xuICAgICAgY29uc3QgbCA9IHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIHVybDogaVxuICAgICAgfSwgYyA9IHQuY2VydExvYWRQb2xpY3kuZGVmYXVsdCwgdSA9IHtcbiAgICAgICAgbG9hZFBvbGljeTogYyxcbiAgICAgICAgdGltZW91dDogYy5tYXhMb2FkVGltZU1zLFxuICAgICAgICBtYXhSZXRyeTogMCxcbiAgICAgICAgcmV0cnlEZWxheTogMCxcbiAgICAgICAgbWF4UmV0cnlEZWxheTogMFxuICAgICAgfSwgZCA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAoaCwgZiwgcCwgeSkgPT4ge1xuICAgICAgICAgIG8oaC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKGgsIGYsIHAsIHkpID0+IHtcbiAgICAgICAgICBhKG5ldyB5cih7XG4gICAgICAgICAgICB0eXBlOiB2ZS5LRVlfU1lTVEVNX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX1NFUlZFUl9DRVJUSUZJQ0FURV9SRVFVRVNUX0ZBSUxFRCxcbiAgICAgICAgICAgIGZhdGFsOiAhMCxcbiAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBwLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR0KHtcbiAgICAgICAgICAgICAgdXJsOiBsLnVybCxcbiAgICAgICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgICAgICB9LCBoKVxuICAgICAgICAgIH0sIGBcIiR7ZX1cIiBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGZhaWxlZCAoJHtpfSkuIFN0YXR1czogJHtoLmNvZGV9ICgke2gudGV4dH0pYCkpO1xuICAgICAgICB9LFxuICAgICAgICBvblRpbWVvdXQ6IChoLCBmLCBwKSA9PiB7XG4gICAgICAgICAgYShuZXcgeXIoe1xuICAgICAgICAgICAgdHlwZTogdmUuS0VZX1NZU1RFTV9FUlJPUixcbiAgICAgICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9TRVJWRVJfQ0VSVElGSUNBVEVfUkVRVUVTVF9GQUlMRUQsXG4gICAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogcCxcbiAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgIHVybDogbC51cmwsXG4gICAgICAgICAgICAgIGRhdGE6IHZvaWQgMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGBcIiR7ZX1cIiBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRpbWVkIG91dCAoJHtpfSlgKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQWJvcnQ6IChoLCBmLCBwKSA9PiB7XG4gICAgICAgICAgYShuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG4ubG9hZChsLCB1LCBkKTtcbiAgICB9KSkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICBzZXRNZWRpYUtleXNTZXJ2ZXJDZXJ0aWZpY2F0ZShlLCB0LCByKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChuLCBpKSA9PiB7XG4gICAgICBlLnNldFNlcnZlckNlcnRpZmljYXRlKHIpLnRoZW4oKG8pID0+IHtcbiAgICAgICAgdGhpcy5sb2coYHNldFNlcnZlckNlcnRpZmljYXRlICR7byA/IFwic3VjY2Vzc1wiIDogXCJub3Qgc3VwcG9ydGVkIGJ5IENETVwifSAoJHtyLmJ5dGVMZW5ndGh9KSBvbiBcIiR7dH1cImApLCBuKGUpO1xuICAgICAgfSkuY2F0Y2goKG8pID0+IHtcbiAgICAgICAgaShuZXcgeXIoe1xuICAgICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX1NFUlZFUl9DRVJUSUZJQ0FURV9VUERBVEVfRkFJTEVELFxuICAgICAgICAgIGVycm9yOiBvLFxuICAgICAgICAgIGZhdGFsOiAhMFxuICAgICAgICB9LCBvLm1lc3NhZ2UpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJlbmV3TGljZW5zZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdExpY2Vuc2UoZSwgbmV3IFVpbnQ4QXJyYXkodCkpLnRoZW4oKHIpID0+IHRoaXMudXBkYXRlS2V5U2Vzc2lvbihlLCBuZXcgVWludDhBcnJheShyKSkuY2F0Y2goKG4pID0+IHtcbiAgICAgIHRocm93IG5ldyB5cih7XG4gICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9TRVNTSU9OX1VQREFURV9GQUlMRUQsXG4gICAgICAgIGRlY3J5cHRkYXRhOiBlLmRlY3J5cHRkYXRhLFxuICAgICAgICBlcnJvcjogbixcbiAgICAgICAgZmF0YWw6ICExXG4gICAgICB9LCBuLm1lc3NhZ2UpO1xuICAgIH0pKTtcbiAgfVxuICB1bnBhY2tQbGF5UmVhZHlLZXlNZXNzYWdlKGUsIHQpIHtcbiAgICBjb25zdCByID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkodC5idWZmZXIpKTtcbiAgICBpZiAoIXIuaW5jbHVkZXMoXCJQbGF5UmVhZHlLZXlNZXNzYWdlXCIpKVxuICAgICAgcmV0dXJuIGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQveG1sOyBjaGFyc2V0PXV0Zi04XCIpLCB0O1xuICAgIGNvbnN0IG4gPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHIsIFwiYXBwbGljYXRpb24veG1sXCIpLCBpID0gbi5xdWVyeVNlbGVjdG9yQWxsKFwiSHR0cEhlYWRlclwiKTtcbiAgICBpZiAoaS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgdTtcbiAgICAgIGZvciAobGV0IGQgPSAwLCBoID0gaS5sZW5ndGg7IGQgPCBoOyBkKyspIHtcbiAgICAgICAgdmFyIG8sIGE7XG4gICAgICAgIHUgPSBpW2RdO1xuICAgICAgICBjb25zdCBmID0gKG8gPSB1LnF1ZXJ5U2VsZWN0b3IoXCJuYW1lXCIpKSA9PSBudWxsID8gdm9pZCAwIDogby50ZXh0Q29udGVudCwgcCA9IChhID0gdS5xdWVyeVNlbGVjdG9yKFwidmFsdWVcIikpID09IG51bGwgPyB2b2lkIDAgOiBhLnRleHRDb250ZW50O1xuICAgICAgICBmICYmIHAgJiYgZS5zZXRSZXF1ZXN0SGVhZGVyKGYsIHApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsID0gbi5xdWVyeVNlbGVjdG9yKFwiQ2hhbGxlbmdlXCIpLCBjID0gbCA9PSBudWxsID8gdm9pZCAwIDogbC50ZXh0Q29udGVudDtcbiAgICBpZiAoIWMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCA8Q2hhbGxlbmdlPiBpbiBrZXkgbWVzc2FnZVwiKTtcbiAgICByZXR1cm4gaGMoYXRvYihjKSk7XG4gIH1cbiAgc2V0dXBMaWNlbnNlWEhSKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gdGhpcy5jb25maWcubGljZW5zZVhoclNldHVwO1xuICAgIHJldHVybiBpID8gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIXIuZGVjcnlwdGRhdGEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSByZW1vdmVkXCIpO1xuICAgICAgcmV0dXJuIGkuY2FsbCh0aGlzLmhscywgZSwgdCwgciwgbik7XG4gICAgfSkuY2F0Y2goKG8pID0+IHtcbiAgICAgIGlmICghci5kZWNyeXB0ZGF0YSlcbiAgICAgICAgdGhyb3cgbztcbiAgICAgIHJldHVybiBlLm9wZW4oXCJQT1NUXCIsIHQsICEwKSwgaS5jYWxsKHRoaXMuaGxzLCBlLCB0LCByLCBuKTtcbiAgICB9KS50aGVuKChvKSA9PiAoZS5yZWFkeVN0YXRlIHx8IGUub3BlbihcIlBPU1RcIiwgdCwgITApLCB7XG4gICAgICB4aHI6IGUsXG4gICAgICBsaWNlbnNlQ2hhbGxlbmdlOiBvIHx8IG5cbiAgICB9KSkgOiAoZS5vcGVuKFwiUE9TVFwiLCB0LCAhMCksIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICB4aHI6IGUsXG4gICAgICBsaWNlbnNlQ2hhbGxlbmdlOiBuXG4gICAgfSkpO1xuICB9XG4gIHJlcXVlc3RMaWNlbnNlKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5jb25maWcua2V5TG9hZFBvbGljeS5kZWZhdWx0O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgobiwgaSkgPT4ge1xuICAgICAgY29uc3QgbyA9IHRoaXMuZ2V0TGljZW5zZVNlcnZlclVybE9yVGhyb3coZS5rZXlTeXN0ZW0pO1xuICAgICAgdGhpcy5sb2coYFNlbmRpbmcgbGljZW5zZSByZXF1ZXN0IHRvIFVSTDogJHtvfWApO1xuICAgICAgY29uc3QgYSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgYS5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCIsIGEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaGxzIHx8ICFlLm1lZGlhS2V5c1Nlc3Npb24pXG4gICAgICAgICAgcmV0dXJuIGkobmV3IEVycm9yKFwiaW52YWxpZCBzdGF0ZVwiKSk7XG4gICAgICAgIGlmIChhLnJlYWR5U3RhdGUgPT09IDQpXG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RMaWNlbnNlRmFpbHVyZUNvdW50ID0gMDtcbiAgICAgICAgICAgIGxldCBsID0gYS5yZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMubG9nKGBMaWNlbnNlIHJlY2VpdmVkICR7bCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbC5ieXRlTGVuZ3RoIDogbH1gKTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbmZpZy5saWNlbnNlUmVzcG9uc2VDYWxsYmFjaztcbiAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGwgPSBjLmNhbGwodGhpcy5obHMsIGEsIG8sIGUpO1xuICAgICAgICAgICAgICB9IGNhdGNoICh1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcih1KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgbihsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbCA9IHIuZXJyb3JSZXRyeSwgYyA9IGwgPyBsLm1heE51bVJldHJ5IDogMDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0TGljZW5zZUZhaWx1cmVDb3VudCsrLCB0aGlzLl9yZXF1ZXN0TGljZW5zZUZhaWx1cmVDb3VudCA+IGMgfHwgYS5zdGF0dXMgPj0gNDAwICYmIGEuc3RhdHVzIDwgNTAwKVxuICAgICAgICAgICAgICBpKG5ldyB5cih7XG4gICAgICAgICAgICAgICAgdHlwZTogdmUuS0VZX1NZU1RFTV9FUlJPUixcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fTElDRU5TRV9SRVFVRVNUX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBkZWNyeXB0ZGF0YTogZS5kZWNyeXB0ZGF0YSxcbiAgICAgICAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IGEsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgIHVybDogbyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgIGNvZGU6IGEuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgdGV4dDogYS5zdGF0dXNUZXh0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBgTGljZW5zZSBSZXF1ZXN0IFhIUiBmYWlsZWQgKCR7b30pLiBTdGF0dXM6ICR7YS5zdGF0dXN9ICgke2Euc3RhdHVzVGV4dH0pYCkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHUgPSBjIC0gdGhpcy5fcmVxdWVzdExpY2Vuc2VGYWlsdXJlQ291bnQgKyAxO1xuICAgICAgICAgICAgICB0aGlzLndhcm4oYFJldHJ5aW5nIGxpY2Vuc2UgcmVxdWVzdCwgJHt1fSBhdHRlbXB0cyBsZWZ0YCksIHRoaXMucmVxdWVzdExpY2Vuc2UoZSwgdCkudGhlbihuLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9LCBlLmxpY2Vuc2VYaHIgJiYgZS5saWNlbnNlWGhyLnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUgJiYgZS5saWNlbnNlWGhyLmFib3J0KCksIGUubGljZW5zZVhociA9IGEsIHRoaXMuc2V0dXBMaWNlbnNlWEhSKGEsIG8sIGUsIHQpLnRoZW4oKHtcbiAgICAgICAgeGhyOiBsLFxuICAgICAgICBsaWNlbnNlQ2hhbGxlbmdlOiBjXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGUua2V5U3lzdGVtID09IG10LlBMQVlSRUFEWSAmJiAoYyA9IHRoaXMudW5wYWNrUGxheVJlYWR5S2V5TWVzc2FnZShsLCBjKSksIGwuc2VuZChjKTtcbiAgICAgIH0pLmNhdGNoKGkpO1xuICAgIH0pO1xuICB9XG4gIG9uRGVzdHJveWluZygpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5fY2xlYXIoKTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIGlmICghdGhpcy5jb25maWcuZW1lRW5hYmxlZClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdC5tZWRpYTtcbiAgICB0aGlzLm1lZGlhID0gciwgY3IociwgXCJlbmNyeXB0ZWRcIiwgdGhpcy5vbk1lZGlhRW5jcnlwdGVkKSwgY3IociwgXCJ3YWl0aW5nZm9ya2V5XCIsIHRoaXMub25XYWl0aW5nRm9yS2V5KTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoZWQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWE7XG4gICAgZSAmJiAocHIoZSwgXCJlbmNyeXB0ZWRcIiwgdGhpcy5vbk1lZGlhRW5jcnlwdGVkKSwgcHIoZSwgXCJ3YWl0aW5nZm9ya2V5XCIsIHRoaXMub25XYWl0aW5nRm9yS2V5KSwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubWVkaWFLZXlzID0gbnVsbCk7XG4gIH1cbiAgX2NsZWFyKCkge1xuICAgIHZhciBlO1xuICAgIGlmICh0aGlzLl9yZXF1ZXN0TGljZW5zZUZhaWx1cmVDb3VudCA9IDAsIHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlID0ge30sIHRoaXMuYmFubmVkS2V5SWRzID0ge30sICF0aGlzLm1lZGlhS2V5cyAmJiAhdGhpcy5tZWRpYUtleVNlc3Npb25zLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5tZWRpYSwgciA9IHRoaXMubWVkaWFLZXlTZXNzaW9ucy5zbGljZSgpO1xuICAgIHRoaXMubWVkaWFLZXlTZXNzaW9ucyA9IFtdLCB0aGlzLm1lZGlhS2V5cyA9IG51bGwsIHlpLmNsZWFyS2V5VXJpVG9LZXlJZE1hcCgpO1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aDtcbiAgICBfbi5DRE1DbGVhbnVwUHJvbWlzZSA9IFByb21pc2UuYWxsKHIubWFwKChpKSA9PiB0aGlzLnJlbW92ZVNlc3Npb24oaSkpLmNvbmNhdCgodCA9PSBudWxsIHx8IChlID0gdC5zZXRNZWRpYUtleXMobnVsbCkpID09IG51bGwgPyB2b2lkIDAgOiBlLmNhdGNoKChpKSA9PiB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IGNsZWFyIG1lZGlhIGtleXM6ICR7aX1gKSwgdGhpcy5obHMgJiYgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fREVTVFJPWV9NRURJQV9LRVlTX0VSUk9SLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYENvdWxkIG5vdCBjbGVhciBtZWRpYSBrZXlzOiAke2l9YClcbiAgICAgIH0pO1xuICAgIH0pKSB8fCBQcm9taXNlLnJlc29sdmUoKSkpLmNhdGNoKChpKSA9PiB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IGNsb3NlIHNlc3Npb25zIGFuZCBjbGVhciBtZWRpYSBrZXlzOiAke2l9YCksIHRoaXMuaGxzICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5PVEhFUl9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX0RFU1RST1lfQ0xPU0VfU0VTU0lPTl9FUlJPUixcbiAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBDb3VsZCBub3QgY2xvc2Ugc2Vzc2lvbnMgYW5kIGNsZWFyIG1lZGlhIGtleXM6ICR7aX1gKVxuICAgICAgfSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICBuICYmIHRoaXMubG9nKFwiZmluaXNoZWQgY2xvc2luZyBrZXkgc2Vzc2lvbnMgYW5kIGNsZWFyaW5nIG1lZGlhIGtleXNcIik7XG4gICAgfSk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5rZXlGb3JtYXRQcm9taXNlID0gbnVsbCwgdGhpcy5iYW5uZWRLZXlJZHMgPSB7fTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGVkKGUsIHtcbiAgICBzZXNzaW9uS2V5czogdFxuICB9KSB7XG4gICAgaWYgKCEoIXQgfHwgIXRoaXMuY29uZmlnLmVtZUVuYWJsZWQpICYmICF0aGlzLmtleUZvcm1hdFByb21pc2UpIHtcbiAgICAgIGNvbnN0IHIgPSB0LnJlZHVjZSgobiwgaSkgPT4gKG4uaW5kZXhPZihpLmtleUZvcm1hdCkgPT09IC0xICYmIG4ucHVzaChpLmtleUZvcm1hdCksIG4pLCBbXSk7XG4gICAgICB0aGlzLmxvZyhgU2VsZWN0aW5nIGtleS1zeXN0ZW0gZnJvbSBzZXNzaW9uLWtleXMgJHtyLmpvaW4oXCIsIFwiKX1gKSwgdGhpcy5rZXlGb3JtYXRQcm9taXNlID0gdGhpcy5nZXRLZXlGb3JtYXRQcm9taXNlKHIpO1xuICAgIH1cbiAgfVxuICByZW1vdmVTZXNzaW9uKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYUtleXNTZXNzaW9uOiB0LFxuICAgICAgbGljZW5zZVhocjogcixcbiAgICAgIGRlY3J5cHRkYXRhOiBuXG4gICAgfSA9IGU7XG4gICAgaWYgKHQpIHtcbiAgICAgIHRoaXMubG9nKGBSZW1vdmUgbGljZW5zZXMgYW5kIGtleXMgYW5kIGNsb3NlIHNlc3Npb24gXCIke3Quc2Vzc2lvbklkfVwiIGtleUlkOiAke2ZyKChuID09IG51bGwgPyB2b2lkIDAgOiBuLmtleUlkKSB8fCBbXSl9YCksIGUuX29ubWVzc2FnZSAmJiAodC5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlLl9vbm1lc3NhZ2UpLCBlLl9vbm1lc3NhZ2UgPSB2b2lkIDApLCBlLl9vbmtleXN0YXR1c2VzY2hhbmdlICYmICh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlzdGF0dXNlc2NoYW5nZVwiLCBlLl9vbmtleXN0YXR1c2VzY2hhbmdlKSwgZS5fb25rZXlzdGF0dXNlc2NoYW5nZSA9IHZvaWQgMCksIHIgJiYgci5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FICYmIHIuYWJvcnQoKSwgZS5tZWRpYUtleXNTZXNzaW9uID0gZS5kZWNyeXB0ZGF0YSA9IGUubGljZW5zZVhociA9IHZvaWQgMDtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLm1lZGlhS2V5U2Vzc2lvbnMuaW5kZXhPZihlKTtcbiAgICAgIGkgPiAtMSAmJiB0aGlzLm1lZGlhS2V5U2Vzc2lvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBrZXlTdGF0dXNUaW1lb3V0czogb1xuICAgICAgfSA9IGU7XG4gICAgICBvICYmIE9iamVjdC5rZXlzKG8pLmZvckVhY2goKGMpID0+IHNlbGYuY2xlYXJUaW1lb3V0KG9bY10pKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJtU3lzdGVtT3B0aW9uczogYVxuICAgICAgfSA9IHRoaXMuY29uZmlnO1xuICAgICAgcmV0dXJuIChqYihhKSA/IG5ldyBQcm9taXNlKChjLCB1KSA9PiB7XG4gICAgICAgIHNlbGYuc2V0VGltZW91dCgoKSA9PiB1KG5ldyBFcnJvcihcIk1lZGlhS2V5U2Vzc2lvbi5yZW1vdmUoKSB0aW1lb3V0XCIpKSwgOGUzKSwgdC5yZW1vdmUoKS50aGVuKGMpLmNhdGNoKHUpO1xuICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKGMpID0+IHtcbiAgICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCByZW1vdmUgc2Vzc2lvbjogJHtjfWApLCB0aGlzLmhscyAmJiB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5PVEhFUl9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fREVTVFJPWV9SRU1PVkVfU0VTU0lPTl9FUlJPUixcbiAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihgQ291bGQgbm90IHJlbW92ZSBzZXNzaW9uOiAke2N9YClcbiAgICAgICAgfSk7XG4gICAgICB9KS50aGVuKCgpID0+IHQuY2xvc2UoKSkuY2F0Y2goKGMpID0+IHtcbiAgICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCBjbG9zZSBzZXNzaW9uOiAke2N9YCksIHRoaXMuaGxzICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9ERVNUUk9ZX0NMT1NFX1NFU1NJT05fRVJST1IsXG4gICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYENvdWxkIG5vdCBjbG9zZSBzZXNzaW9uOiAke2N9YClcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59XG5fbi5DRE1DbGVhbnVwUHJvbWlzZSA9IHZvaWQgMDtcbmZ1bmN0aW9uIEppKHMpIHtcbiAgaWYgKCFzKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCByZWFkIGtleUlkIG9mIHVuZGVmaW5lZCBkZWNyeXB0ZGF0YVwiKTtcbiAgaWYgKHMua2V5SWQgPT09IG51bGwpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwia2V5SWQgaXMgbnVsbFwiKTtcbiAgcmV0dXJuIGZyKHMua2V5SWQpO1xufVxuZnVuY3Rpb24gbHcocywgZSkge1xuICBpZiAocy5rZXlJZCAmJiBlLm1lZGlhS2V5c1Nlc3Npb24ua2V5U3RhdHVzZXMuaGFzKHMua2V5SWQpKVxuICAgIHJldHVybiBlLm1lZGlhS2V5c1Nlc3Npb24ua2V5U3RhdHVzZXMuZ2V0KHMua2V5SWQpO1xuICBpZiAocy5tYXRjaGVzKGUuZGVjcnlwdGRhdGEpKVxuICAgIHJldHVybiBlLmtleVN0YXR1cztcbn1cbmNsYXNzIHlyIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCksIHRoaXMuZGF0YSA9IHZvaWQgMCwgZS5lcnJvciB8fCAoZS5lcnJvciA9IG5ldyBFcnJvcih0KSksIHRoaXMuZGF0YSA9IGUsIGUuZXJyID0gZS5lcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gWmgocywgZSkge1xuICBjb25zdCB0ID0gcyA9PT0gXCJvdXRwdXQtcmVzdHJpY3RlZFwiLCByID0gdCA/IEouS0VZX1NZU1RFTV9TVEFUVVNfT1VUUFVUX1JFU1RSSUNURUQgOiBKLktFWV9TWVNURU1fU1RBVFVTX0lOVEVSTkFMX0VSUk9SO1xuICByZXR1cm4gbmV3IHlyKHtcbiAgICB0eXBlOiB2ZS5LRVlfU1lTVEVNX0VSUk9SLFxuICAgIGRldGFpbHM6IHIsXG4gICAgZmF0YWw6ICExLFxuICAgIGRlY3J5cHRkYXRhOiBlXG4gIH0sIHQgPyBcIkhEQ1AgbGV2ZWwgb3V0cHV0IHJlc3RyaWN0ZWRcIiA6IGBrZXkgc3RhdHVzIGNoYW5nZWQgdG8gXCIke3N9XCJgKTtcbn1cbmNsYXNzIGN3IHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmlzVmlkZW9QbGF5YmFja1F1YWxpdHlBdmFpbGFibGUgPSAhMSwgdGhpcy50aW1lciA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubGFzdFRpbWUgPSB2b2lkIDAsIHRoaXMubGFzdERyb3BwZWRGcmFtZXMgPSAwLCB0aGlzLmxhc3REZWNvZGVkRnJhbWVzID0gMCwgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmhscyA9IGUsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICBzZXRTdHJlYW1Db250cm9sbGVyKGUpIHtcbiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBlO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaGxzLm9uKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCB0aGlzLmhscy5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaGxzLm9mZihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy50aW1lciAmJiBjbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5pc1ZpZGVvUGxheWJhY2tRdWFsaXR5QXZhaWxhYmxlID0gITEsIHRoaXMubWVkaWEgPSBudWxsO1xuICB9XG4gIG9uTWVkaWFBdHRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscy5jb25maWc7XG4gICAgaWYgKHIuY2FwTGV2ZWxPbkZQU0Ryb3ApIHtcbiAgICAgIGNvbnN0IG4gPSB0Lm1lZGlhIGluc3RhbmNlb2Ygc2VsZi5IVE1MVmlkZW9FbGVtZW50ID8gdC5tZWRpYSA6IG51bGw7XG4gICAgICB0aGlzLm1lZGlhID0gbiwgbiAmJiB0eXBlb2Ygbi5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSA9PSBcImZ1bmN0aW9uXCIgJiYgKHRoaXMuaXNWaWRlb1BsYXliYWNrUXVhbGl0eUF2YWlsYWJsZSA9ICEwKSwgc2VsZi5jbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLmNoZWNrRlBTSW50ZXJ2YWwuYmluZCh0aGlzKSwgci5mcHNEcm9wcGVkTW9uaXRvcmluZ1BlcmlvZCk7XG4gICAgfVxuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoKSB7XG4gICAgdGhpcy5tZWRpYSA9IG51bGw7XG4gIH1cbiAgY2hlY2tGUFMoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBpZiAodCkge1xuICAgICAgaWYgKHRoaXMubGFzdFRpbWUpIHtcbiAgICAgICAgY29uc3QgaSA9IG4gLSB0aGlzLmxhc3RUaW1lLCBvID0gciAtIHRoaXMubGFzdERyb3BwZWRGcmFtZXMsIGEgPSB0IC0gdGhpcy5sYXN0RGVjb2RlZEZyYW1lcywgbCA9IDFlMyAqIG8gLyBpLCBjID0gdGhpcy5obHM7XG4gICAgICAgIGlmIChjLnRyaWdnZXIoSS5GUFNfRFJPUCwge1xuICAgICAgICAgIGN1cnJlbnREcm9wcGVkOiBvLFxuICAgICAgICAgIGN1cnJlbnREZWNvZGVkOiBhLFxuICAgICAgICAgIHRvdGFsRHJvcHBlZEZyYW1lczogclxuICAgICAgICB9KSwgbCA+IDAgJiYgbyA+IGMuY29uZmlnLmZwc0Ryb3BwZWRNb25pdG9yaW5nVGhyZXNob2xkICogYSkge1xuICAgICAgICAgIGxldCB1ID0gYy5jdXJyZW50TGV2ZWw7XG4gICAgICAgICAgYy5sb2dnZXIud2FybihcImRyb3AgRlBTIHJhdGlvIGdyZWF0ZXIgdGhhbiBtYXggYWxsb3dlZCB2YWx1ZSBmb3IgY3VycmVudExldmVsOiBcIiArIHUpLCB1ID4gMCAmJiAoYy5hdXRvTGV2ZWxDYXBwaW5nID09PSAtMSB8fCBjLmF1dG9MZXZlbENhcHBpbmcgPj0gdSkgJiYgKHUgPSB1IC0gMSwgYy50cmlnZ2VyKEkuRlBTX0RST1BfTEVWRUxfQ0FQUElORywge1xuICAgICAgICAgICAgbGV2ZWw6IHUsXG4gICAgICAgICAgICBkcm9wcGVkTGV2ZWw6IGMuY3VycmVudExldmVsXG4gICAgICAgICAgfSksIGMuYXV0b0xldmVsQ2FwcGluZyA9IHUsIHRoaXMuc3RyZWFtQ29udHJvbGxlci5uZXh0TGV2ZWxTd2l0Y2goKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFRpbWUgPSBuLCB0aGlzLmxhc3REcm9wcGVkRnJhbWVzID0gciwgdGhpcy5sYXN0RGVjb2RlZEZyYW1lcyA9IHQ7XG4gICAgfVxuICB9XG4gIGNoZWNrRlBTSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWE7XG4gICAgaWYgKGUpXG4gICAgICBpZiAodGhpcy5pc1ZpZGVvUGxheWJhY2tRdWFsaXR5QXZhaWxhYmxlKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCk7XG4gICAgICAgIHRoaXMuY2hlY2tGUFMoZSwgdC50b3RhbFZpZGVvRnJhbWVzLCB0LmRyb3BwZWRWaWRlb0ZyYW1lcyk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGhpcy5jaGVja0ZQUyhlLCBlLndlYmtpdERlY29kZWRGcmFtZUNvdW50LCBlLndlYmtpdERyb3BwZWRGcmFtZUNvdW50KTtcbiAgfVxufVxuZnVuY3Rpb24gTnAocywgZSkge1xuICBsZXQgdDtcbiAgdHJ5IHtcbiAgICB0ID0gbmV3IEV2ZW50KFwiYWRkdHJhY2tcIik7XG4gIH0gY2F0Y2gge1xuICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpLCB0LmluaXRFdmVudChcImFkZHRyYWNrXCIsICExLCAhMSk7XG4gIH1cbiAgdC50cmFjayA9IHMsIGUuZGlzcGF0Y2hFdmVudCh0KTtcbn1cbmZ1bmN0aW9uIFVwKHMsIGUpIHtcbiAgY29uc3QgdCA9IHMubW9kZTtcbiAgaWYgKHQgPT09IFwiZGlzYWJsZWRcIiAmJiAocy5tb2RlID0gXCJoaWRkZW5cIiksIHMuY3VlcyAmJiAhcy5jdWVzLmdldEN1ZUJ5SWQoZS5pZCkpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzLmFkZEN1ZShlKSwgIXMuY3Vlcy5nZXRDdWVCeUlkKGUuaWQpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZEN1ZSBpcyBmYWlsZWQgZm9yOiAke2V9YCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgcnQuZGVidWcoYFt0ZXh0dHJhY2stdXRpbHNdOiAke3J9YCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuID0gbmV3IHNlbGYuVGV4dFRyYWNrQ3VlKGUuc3RhcnRUaW1lLCBlLmVuZFRpbWUsIGUudGV4dCk7XG4gICAgICAgIG4uaWQgPSBlLmlkLCBzLmFkZEN1ZShuKTtcbiAgICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgcnQuZGVidWcoYFt0ZXh0dHJhY2stdXRpbHNdOiBMZWdhY3kgVGV4dFRyYWNrQ3VlIGZhbGxiYWNrIGZhaWxlZDogJHtufWApO1xuICAgICAgfVxuICAgIH1cbiAgdCA9PT0gXCJkaXNhYmxlZFwiICYmIChzLm1vZGUgPSB0KTtcbn1cbmZ1bmN0aW9uIFNuKHMsIGUpIHtcbiAgY29uc3QgdCA9IHMubW9kZTtcbiAgaWYgKHQgPT09IFwiZGlzYWJsZWRcIiAmJiAocy5tb2RlID0gXCJoaWRkZW5cIiksIHMuY3VlcylcbiAgICBmb3IgKGxldCByID0gcy5jdWVzLmxlbmd0aDsgci0tOyApXG4gICAgICBlICYmIHMuY3Vlc1tyXS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZW50ZXJcIiwgZSksIHMucmVtb3ZlQ3VlKHMuY3Vlc1tyXSk7XG4gIHQgPT09IFwiZGlzYWJsZWRcIiAmJiAocy5tb2RlID0gdCk7XG59XG5mdW5jdGlvbiBTYyhzLCBlLCB0LCByKSB7XG4gIGNvbnN0IG4gPSBzLm1vZGU7XG4gIGlmIChuID09PSBcImRpc2FibGVkXCIgJiYgKHMubW9kZSA9IFwiaGlkZGVuXCIpLCBzLmN1ZXMgJiYgcy5jdWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBpID0gZHcocy5jdWVzLCBlLCB0KTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IGkubGVuZ3RoOyBvKyspXG4gICAgICAoIXIgfHwgcihpW29dKSkgJiYgcy5yZW1vdmVDdWUoaVtvXSk7XG4gIH1cbiAgbiA9PT0gXCJkaXNhYmxlZFwiICYmIChzLm1vZGUgPSBuKTtcbn1cbmZ1bmN0aW9uIHV3KHMsIGUpIHtcbiAgaWYgKGUgPD0gc1swXS5zdGFydFRpbWUpXG4gICAgcmV0dXJuIDA7XG4gIGNvbnN0IHQgPSBzLmxlbmd0aCAtIDE7XG4gIGlmIChlID4gc1t0XS5lbmRUaW1lKVxuICAgIHJldHVybiAtMTtcbiAgbGV0IHIgPSAwLCBuID0gdCwgaTtcbiAgZm9yICg7IHIgPD0gbjsgKVxuICAgIGlmIChpID0gTWF0aC5mbG9vcigobiArIHIpIC8gMiksIGUgPCBzW2ldLnN0YXJ0VGltZSlcbiAgICAgIG4gPSBpIC0gMTtcbiAgICBlbHNlIGlmIChlID4gc1tpXS5zdGFydFRpbWUgJiYgciA8IHQpXG4gICAgICByID0gaSArIDE7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGk7XG4gIHJldHVybiBzW3JdLnN0YXJ0VGltZSAtIGUgPCBlIC0gc1tuXS5zdGFydFRpbWUgPyByIDogbjtcbn1cbmZ1bmN0aW9uIGR3KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IFtdLCBuID0gdXcocywgZSk7XG4gIGlmIChuID4gLTEpXG4gICAgZm9yIChsZXQgaSA9IG4sIG8gPSBzLmxlbmd0aDsgaSA8IG87IGkrKykge1xuICAgICAgY29uc3QgYSA9IHNbaV07XG4gICAgICBpZiAoYS5zdGFydFRpbWUgPj0gZSAmJiBhLmVuZFRpbWUgPD0gdClcbiAgICAgICAgci5wdXNoKGEpO1xuICAgICAgZWxzZSBpZiAoYS5zdGFydFRpbWUgPiB0KVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gRW8ocykge1xuICBjb25zdCBlID0gW107XG4gIGZvciAobGV0IHQgPSAwOyB0IDwgcy5sZW5ndGg7IHQrKykge1xuICAgIGNvbnN0IHIgPSBzW3RdO1xuICAgIChyLmtpbmQgPT09IFwic3VidGl0bGVzXCIgfHwgci5raW5kID09PSBcImNhcHRpb25zXCIpICYmIHIubGFiZWwgJiYgZS5wdXNoKHNbdF0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuY2xhc3MgaHcgZXh0ZW5kcyBrdSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBzdXBlcihlLCBcInN1YnRpdGxlLXRyYWNrLWNvbnRyb2xsZXJcIiksIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLnRyYWNrcyA9IFtdLCB0aGlzLmdyb3VwSWRzID0gbnVsbCwgdGhpcy50cmFja3NJbkdyb3VwID0gW10sIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGwsIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITAsIHRoaXMucXVldWVkRGVmYXVsdFRyYWNrID0gLTEsIHRoaXMudXNlVGV4dFRyYWNrUG9sbGluZyA9ICExLCB0aGlzLnN1YnRpdGxlUG9sbGluZ0ludGVydmFsID0gLTEsIHRoaXMuX3N1YnRpdGxlRGlzcGxheSA9ICEwLCB0aGlzLmFzeW5jUG9sbFRyYWNrQ2hhbmdlID0gKCkgPT4gdGhpcy5wb2xsVHJhY2tDaGFuZ2UoMCksIHRoaXMub25UZXh0VHJhY2tzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZVRleHRUcmFja1BvbGxpbmcgfHwgc2VsZi5jbGVhckludGVydmFsKHRoaXMuc3VidGl0bGVQb2xsaW5nSW50ZXJ2YWwpLCAhdGhpcy5tZWRpYSB8fCAhdGhpcy5obHMuY29uZmlnLnJlbmRlclRleHRUcmFja3NOYXRpdmVseSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHQgPSBudWxsO1xuICAgICAgY29uc3QgciA9IEVvKHRoaXMubWVkaWEudGV4dFRyYWNrcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChyW2ldLm1vZGUgPT09IFwiaGlkZGVuXCIpXG4gICAgICAgICAgdCA9IHJbaV07XG4gICAgICAgIGVsc2UgaWYgKHJbaV0ubW9kZSA9PT0gXCJzaG93aW5nXCIpIHtcbiAgICAgICAgICB0ID0gcltpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY29uc3QgbiA9IHRoaXMuZmluZFRyYWNrRm9yVGV4dFRyYWNrKHQpO1xuICAgICAgdGhpcy5zdWJ0aXRsZVRyYWNrICE9PSBuICYmIHRoaXMuc2V0U3VidGl0bGVUcmFjayhuKTtcbiAgICB9LCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy50cmFja3MubGVuZ3RoID0gMCwgdGhpcy50cmFja3NJbkdyb3VwLmxlbmd0aCA9IDAsIHRoaXMuY3VycmVudFRyYWNrID0gbnVsbCwgdGhpcy5vblRleHRUcmFja3NDaGFuZ2VkID0gdGhpcy5hc3luY1BvbGxUcmFja0NoYW5nZSA9IG51bGwsIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuICBnZXQgc3VidGl0bGVEaXNwbGF5KCkge1xuICAgIHJldHVybiB0aGlzLl9zdWJ0aXRsZURpc3BsYXk7XG4gIH1cbiAgc2V0IHN1YnRpdGxlRGlzcGxheShlKSB7XG4gICAgdGhpcy5fc3VidGl0bGVEaXNwbGF5ID0gZSwgdGhpcy50cmFja0lkID4gLTEgJiYgdGhpcy50b2dnbGVUcmFja01vZGVzKCk7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfU1dJVENISU5HLCB0aGlzLm9uTGV2ZWxTd2l0Y2hpbmcsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tfTE9BREVELCB0aGlzLm9uU3VidGl0bGVUcmFja0xvYWRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1NXSVRDSElORywgdGhpcy5vbkxldmVsU3dpdGNoaW5nLCB0aGlzKSwgZS5vZmYoSS5TVUJUSVRMRV9UUkFDS19MT0FERUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICAvLyBMaXN0ZW4gZm9yIHN1YnRpdGxlIHRyYWNrIGNoYW5nZSwgdGhlbiBleHRyYWN0IHRoZSBjdXJyZW50IHRyYWNrIElELlxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCB0aGlzLm1lZGlhICYmICh0aGlzLnF1ZXVlZERlZmF1bHRUcmFjayA+IC0xICYmICh0aGlzLnN1YnRpdGxlVHJhY2sgPSB0aGlzLnF1ZXVlZERlZmF1bHRUcmFjaywgdGhpcy5xdWV1ZWREZWZhdWx0VHJhY2sgPSAtMSksIHRoaXMudXNlVGV4dFRyYWNrUG9sbGluZyA9ICEodGhpcy5tZWRpYS50ZXh0VHJhY2tzICYmIFwib25jaGFuZ2VcIiBpbiB0aGlzLm1lZGlhLnRleHRUcmFja3MpLCB0aGlzLnVzZVRleHRUcmFja1BvbGxpbmcgPyB0aGlzLnBvbGxUcmFja0NoYW5nZSg1MDApIDogdGhpcy5tZWRpYS50ZXh0VHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5hc3luY1BvbGxUcmFja0NoYW5nZSkpO1xuICB9XG4gIHBvbGxUcmFja0NoYW5nZShlKSB7XG4gICAgc2VsZi5jbGVhckludGVydmFsKHRoaXMuc3VidGl0bGVQb2xsaW5nSW50ZXJ2YWwpLCB0aGlzLnN1YnRpdGxlUG9sbGluZ0ludGVydmFsID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLm9uVGV4dFRyYWNrc0NoYW5nZWQsIGUpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhO1xuICAgIGlmICghcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gISF0LnRyYW5zZmVyTWVkaWE7XG4gICAgaWYgKHNlbGYuY2xlYXJJbnRlcnZhbCh0aGlzLnN1YnRpdGxlUG9sbGluZ0ludGVydmFsKSwgdGhpcy51c2VUZXh0VHJhY2tQb2xsaW5nIHx8IHIudGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMuYXN5bmNQb2xsVHJhY2tDaGFuZ2UpLCB0aGlzLnRyYWNrSWQgPiAtMSAmJiAodGhpcy5xdWV1ZWREZWZhdWx0VHJhY2sgPSB0aGlzLnRyYWNrSWQpLCB0aGlzLnN1YnRpdGxlVHJhY2sgPSAtMSwgdGhpcy5tZWRpYSA9IG51bGwsIG4pXG4gICAgICByZXR1cm47XG4gICAgRW8oci50ZXh0VHJhY2tzKS5mb3JFYWNoKChvKSA9PiB7XG4gICAgICBTbihvKTtcbiAgICB9KTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB0aGlzLnRyYWNrcyA9IFtdLCB0aGlzLmdyb3VwSWRzID0gbnVsbCwgdGhpcy50cmFja3NJbkdyb3VwID0gW10sIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGwsIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITA7XG4gIH1cbiAgLy8gRmlyZWQgd2hlbmV2ZXIgYSBuZXcgbWFuaWZlc3QgaXMgbG9hZGVkLlxuICBvbk1hbmlmZXN0UGFyc2VkKGUsIHQpIHtcbiAgICB0aGlzLnRyYWNrcyA9IHQuc3VidGl0bGVUcmFja3M7XG4gIH1cbiAgb25TdWJ0aXRsZVRyYWNrTG9hZGVkKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpZDogcixcbiAgICAgIGdyb3VwSWQ6IG4sXG4gICAgICBkZXRhaWxzOiBpXG4gICAgfSA9IHQsIG8gPSB0aGlzLnRyYWNrc0luR3JvdXBbcl07XG4gICAgaWYgKCFvIHx8IG8uZ3JvdXBJZCAhPT0gbikge1xuICAgICAgdGhpcy53YXJuKGBTdWJ0aXRsZSB0cmFjayB3aXRoIGlkOiR7cn0gYW5kIGdyb3VwOiR7bn0gbm90IGZvdW5kIGluIGFjdGl2ZSBncm91cCAke28gPT0gbnVsbCA/IHZvaWQgMCA6IG8uZ3JvdXBJZH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYSA9IG8uZGV0YWlscztcbiAgICBvLmRldGFpbHMgPSB0LmRldGFpbHMsIHRoaXMubG9nKGBTdWJ0aXRsZSB0cmFjayAke3J9IFwiJHtvLm5hbWV9XCIgbGFuZzoke28ubGFuZ30gZ3JvdXA6JHtufSBsb2FkZWQgWyR7aS5zdGFydFNOfS0ke2kuZW5kU059XWApLCByID09PSB0aGlzLnRyYWNrSWQgJiYgdGhpcy5wbGF5bGlzdExvYWRlZChyLCB0LCBhKTtcbiAgfVxuICBvbkxldmVsTG9hZGluZyhlLCB0KSB7XG4gICAgdGhpcy5zd2l0Y2hMZXZlbCh0LmxldmVsKTtcbiAgfVxuICBvbkxldmVsU3dpdGNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLnN3aXRjaExldmVsKHQubGV2ZWwpO1xuICB9XG4gIHN3aXRjaExldmVsKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMubGV2ZWxzW2VdO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdC5zdWJ0aXRsZUdyb3VwcyB8fCBudWxsLCBuID0gdGhpcy5ncm91cElkcztcbiAgICBsZXQgaSA9IHRoaXMuY3VycmVudFRyYWNrO1xuICAgIGlmICghciB8fCAobiA9PSBudWxsID8gdm9pZCAwIDogbi5sZW5ndGgpICE9PSAociA9PSBudWxsID8gdm9pZCAwIDogci5sZW5ndGgpIHx8IHIgIT0gbnVsbCAmJiByLnNvbWUoKG8pID0+IChuID09IG51bGwgPyB2b2lkIDAgOiBuLmluZGV4T2YobykpID09PSAtMSkpIHtcbiAgICAgIHRoaXMuZ3JvdXBJZHMgPSByLCB0aGlzLnRyYWNrSWQgPSAtMSwgdGhpcy5jdXJyZW50VHJhY2sgPSBudWxsO1xuICAgICAgY29uc3QgbyA9IHRoaXMudHJhY2tzLmZpbHRlcigodSkgPT4gIXIgfHwgci5pbmRleE9mKHUuZ3JvdXBJZCkgIT09IC0xKTtcbiAgICAgIGlmIChvLmxlbmd0aClcbiAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgJiYgIW8uc29tZSgodSkgPT4gdS5kZWZhdWx0KSAmJiAodGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMSksIG8uZm9yRWFjaCgodSwgZCkgPT4ge1xuICAgICAgICAgIHUuaWQgPSBkO1xuICAgICAgICB9KTtcbiAgICAgIGVsc2UgaWYgKCFpICYmICF0aGlzLnRyYWNrc0luR3JvdXAubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnRyYWNrc0luR3JvdXAgPSBvO1xuICAgICAgY29uc3QgYSA9IHRoaXMuaGxzLmNvbmZpZy5zdWJ0aXRsZVByZWZlcmVuY2U7XG4gICAgICBpZiAoIWkgJiYgYSkge1xuICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRUcmFjayA9ICExO1xuICAgICAgICBjb25zdCB1ID0gV3IoYSwgbyk7XG4gICAgICAgIGlmICh1ID4gLTEpXG4gICAgICAgICAgaSA9IG9bdV07XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGQgPSBXcihhLCB0aGlzLnRyYWNrcyk7XG4gICAgICAgICAgaSA9IHRoaXMudHJhY2tzW2RdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgbCA9IHRoaXMuZmluZFRyYWNrSWQoaSk7XG4gICAgICBsID09PSAtMSAmJiBpICYmIChsID0gdGhpcy5maW5kVHJhY2tJZChudWxsKSk7XG4gICAgICBjb25zdCBjID0ge1xuICAgICAgICBzdWJ0aXRsZVRyYWNrczogb1xuICAgICAgfTtcbiAgICAgIHRoaXMubG9nKGBVcGRhdGluZyBzdWJ0aXRsZSB0cmFja3MsICR7by5sZW5ndGh9IHRyYWNrKHMpIGZvdW5kIGluIFwiJHtyID09IG51bGwgPyB2b2lkIDAgOiByLmpvaW4oXCIsXCIpfVwiIGdyb3VwLWlkYCksIHRoaXMuaGxzLnRyaWdnZXIoSS5TVUJUSVRMRV9UUkFDS1NfVVBEQVRFRCwgYyksIGwgIT09IC0xICYmIHRoaXMudHJhY2tJZCA9PT0gLTEgJiYgdGhpcy5zZXRTdWJ0aXRsZVRyYWNrKGwpO1xuICAgIH1cbiAgfVxuICBmaW5kVHJhY2tJZChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMudHJhY2tzSW5Hcm91cCwgciA9IHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgICAgY29uc3QgaSA9IHRbbl07XG4gICAgICBpZiAoIShyICYmICFpLmRlZmF1bHQgfHwgIXIgJiYgIWUpICYmICghZSB8fCBxcyhpLCBlKSkpXG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAoZSkge1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0W25dO1xuICAgICAgICBpZiAoU2koZS5hdHRycywgaS5hdHRycywgW1wiTEFOR1VBR0VcIiwgXCJBU1NPQy1MQU5HVUFHRVwiLCBcIkNIQVJBQ1RFUklTVElDU1wiXSkpXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHRbbl07XG4gICAgICAgIGlmIChTaShlLmF0dHJzLCBpLmF0dHJzLCBbXCJMQU5HVUFHRVwiXSkpXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBmaW5kVHJhY2tGb3JUZXh0VHJhY2soZSkge1xuICAgIGlmIChlKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy50cmFja3NJbkdyb3VwO1xuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0W3JdO1xuICAgICAgICBpZiAoeWMobiwgZSkpXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICB0LmZhdGFsIHx8ICF0LmNvbnRleHQgfHwgdC5jb250ZXh0LnR5cGUgPT09IEtlLlNVQlRJVExFX1RSQUNLICYmIHQuY29udGV4dC5pZCA9PT0gdGhpcy50cmFja0lkICYmICghdGhpcy5ncm91cElkcyB8fCB0aGlzLmdyb3VwSWRzLmluZGV4T2YodC5jb250ZXh0Lmdyb3VwSWQpICE9PSAtMSkgJiYgdGhpcy5jaGVja1JldHJ5KHQpO1xuICB9XG4gIGdldCBhbGxTdWJ0aXRsZVRyYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3M7XG4gIH1cbiAgLyoqIGdldCBhbHRlcm5hdGUgc3VidGl0bGUgdHJhY2tzIGxpc3QgZnJvbSBwbGF5bGlzdCAqKi9cbiAgZ2V0IHN1YnRpdGxlVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrc0luR3JvdXA7XG4gIH1cbiAgLyoqIGdldC9zZXQgaW5kZXggb2YgdGhlIHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrIChiYXNlZCBvbiBpbmRleCBpbiBzdWJ0aXRsZSB0cmFjayBsaXN0cykgKiovXG4gIGdldCBzdWJ0aXRsZVRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrSWQ7XG4gIH1cbiAgc2V0IHN1YnRpdGxlVHJhY2soZSkge1xuICAgIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITEsIHRoaXMuc2V0U3VidGl0bGVUcmFjayhlKTtcbiAgfVxuICBzZXRTdWJ0aXRsZU9wdGlvbihlKSB7XG4gICAgaWYgKHRoaXMuaGxzLmNvbmZpZy5zdWJ0aXRsZVByZWZlcmVuY2UgPSBlLCBlKSB7XG4gICAgICBpZiAoZS5pZCA9PT0gLTEpXG4gICAgICAgIHJldHVybiB0aGlzLnNldFN1YnRpdGxlVHJhY2soLTEpLCBudWxsO1xuICAgICAgY29uc3QgdCA9IHRoaXMuYWxsU3VidGl0bGVUcmFja3M7XG4gICAgICBpZiAodGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMSwgdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRyYWNrO1xuICAgICAgICBpZiAociAmJiBxcyhlLCByKSlcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgY29uc3QgbiA9IFdyKGUsIHRoaXMudHJhY2tzSW5Hcm91cCk7XG4gICAgICAgIGlmIChuID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy50cmFja3NJbkdyb3VwW25dO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNldFN1YnRpdGxlVHJhY2sobiksIGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBpID0gV3IoZSwgdCk7XG4gICAgICAgICAgICBpZiAoaSA+IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gdFtpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbG9hZFBsYXlsaXN0KGUpIHtcbiAgICBzdXBlci5sb2FkUGxheWxpc3QoKSwgdGhpcy5zaG91bGRMb2FkUGxheWxpc3QodGhpcy5jdXJyZW50VHJhY2spICYmIHRoaXMuc2NoZWR1bGVMb2FkaW5nKHRoaXMuY3VycmVudFRyYWNrLCBlKTtcbiAgfVxuICBsb2FkaW5nUGxheWxpc3QoZSwgdCkge1xuICAgIHN1cGVyLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICBjb25zdCByID0gZS5pZCwgbiA9IGUuZ3JvdXBJZCwgaSA9IHRoaXMuZ2V0VXJsV2l0aERpcmVjdGl2ZXMoZS51cmwsIHQpLCBvID0gZS5kZXRhaWxzLCBhID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5hZ2U7XG4gICAgdGhpcy5sb2coYExvYWRpbmcgc3VidGl0bGUgJHtyfSBcIiR7ZS5uYW1lfVwiIGxhbmc6JHtlLmxhbmd9IGdyb3VwOiR7bn0keyh0ID09IG51bGwgPyB2b2lkIDAgOiB0Lm1zbikgIT09IHZvaWQgMCA/IFwiIGF0IHNuIFwiICsgdC5tc24gKyBcIiBwYXJ0IFwiICsgdC5wYXJ0IDogXCJcIn0ke2EgJiYgby5saXZlID8gXCIgYWdlIFwiICsgYS50b0ZpeGVkKDEpICsgKG8udHlwZSAmJiBcIiBcIiArIG8udHlwZSB8fCBcIlwiKSA6IFwiXCJ9ICR7aX1gKSwgdGhpcy5obHMudHJpZ2dlcihJLlNVQlRJVExFX1RSQUNLX0xPQURJTkcsIHtcbiAgICAgIHVybDogaSxcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogdCB8fCBudWxsLFxuICAgICAgdHJhY2s6IGVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRGlzYWJsZXMgdGhlIG9sZCBzdWJ0aXRsZVRyYWNrIGFuZCBzZXRzIGN1cnJlbnQgbW9kZSBvbiB0aGUgbmV4dCBzdWJ0aXRsZVRyYWNrLlxuICAgKiBUaGlzIG9wZXJhdGVzIG9uIHRoZSBET00gdGV4dFRyYWNrcy5cbiAgICogQSB2YWx1ZSBvZiAtMSB3aWxsIGRpc2FibGUgYWxsIHN1YnRpdGxlIHRyYWNrcy5cbiAgICovXG4gIHRvZ2dsZVRyYWNrTW9kZXMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGVcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IEVvKGUudGV4dFRyYWNrcyksIHIgPSB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICBsZXQgbjtcbiAgICBpZiAociAmJiAobiA9IHQuZmlsdGVyKChpKSA9PiB5YyhyLCBpKSlbMF0sIG4gfHwgdGhpcy53YXJuKGBVbmFibGUgdG8gZmluZCBzdWJ0aXRsZSBUZXh0VHJhY2sgd2l0aCBuYW1lIFwiJHtyLm5hbWV9XCIgYW5kIGxhbmd1YWdlIFwiJHtyLmxhbmd9XCJgKSksIFtdLnNsaWNlLmNhbGwodCkuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgaS5tb2RlICE9PSBcImRpc2FibGVkXCIgJiYgaSAhPT0gbiAmJiAoaS5tb2RlID0gXCJkaXNhYmxlZFwiKTtcbiAgICB9KSwgbikge1xuICAgICAgY29uc3QgaSA9IHRoaXMuc3VidGl0bGVEaXNwbGF5ID8gXCJzaG93aW5nXCIgOiBcImhpZGRlblwiO1xuICAgICAgbi5tb2RlICE9PSBpICYmIChuLm1vZGUgPSBpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoZSBzdWJ0aXRsZSBpbmRleCBhbmQgcGVyaW9kaWNhbGx5IHJlbG9hZGluZyBpZiBsaXZlLlxuICAgKiBEaXNwYXRjaGVzIHRoZSBTVUJUSVRMRV9UUkFDS19TV0lUQ0ggZXZlbnQsIHdoaWNoIGluc3RydWN0cyB0aGUgc3VidGl0bGUtc3RyZWFtLWNvbnRyb2xsZXIgdG8gbG9hZCB0aGUgc2VsZWN0ZWQgdHJhY2suXG4gICAqL1xuICBzZXRTdWJ0aXRsZVRyYWNrKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy50cmFja3NJbkdyb3VwO1xuICAgIGlmICghdGhpcy5tZWRpYSkge1xuICAgICAgdGhpcy5xdWV1ZWREZWZhdWx0VHJhY2sgPSBlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZSA8IC0xIHx8IGUgPj0gdC5sZW5ndGggfHwgIXVlKGUpKSB7XG4gICAgICB0aGlzLndhcm4oYEludmFsaWQgc3VidGl0bGUgdHJhY2sgaWQ6ICR7ZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMTtcbiAgICBjb25zdCByID0gdGhpcy5jdXJyZW50VHJhY2ssIG4gPSB0W2VdIHx8IG51bGw7XG4gICAgaWYgKHRoaXMudHJhY2tJZCA9IGUsIHRoaXMuY3VycmVudFRyYWNrID0gbiwgdGhpcy50b2dnbGVUcmFja01vZGVzKCksICFuKSB7XG4gICAgICB0aGlzLmhscy50cmlnZ2VyKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB7XG4gICAgICAgIGlkOiBlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9ICEhbi5kZXRhaWxzICYmICFuLmRldGFpbHMubGl2ZTtcbiAgICBpZiAoZSA9PT0gdGhpcy50cmFja0lkICYmIG4gPT09IHIgJiYgaSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmxvZyhgU3dpdGNoaW5nIHRvIHN1YnRpdGxlLXRyYWNrICR7ZX1gICsgKG4gPyBgIFwiJHtuLm5hbWV9XCIgbGFuZzoke24ubGFuZ30gZ3JvdXA6JHtuLmdyb3VwSWR9YCA6IFwiXCIpKTtcbiAgICBjb25zdCB7XG4gICAgICBpZDogbyxcbiAgICAgIGdyb3VwSWQ6IGEgPSBcIlwiLFxuICAgICAgbmFtZTogbCxcbiAgICAgIHR5cGU6IGMsXG4gICAgICB1cmw6IHVcbiAgICB9ID0gbjtcbiAgICB0aGlzLmhscy50cmlnZ2VyKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB7XG4gICAgICBpZDogbyxcbiAgICAgIGdyb3VwSWQ6IGEsXG4gICAgICBuYW1lOiBsLFxuICAgICAgdHlwZTogYyxcbiAgICAgIHVybDogdVxuICAgIH0pO1xuICAgIGNvbnN0IGQgPSB0aGlzLnN3aXRjaFBhcmFtcyhuLnVybCwgciA9PSBudWxsID8gdm9pZCAwIDogci5kZXRhaWxzLCBuLmRldGFpbHMpO1xuICAgIHRoaXMubG9hZFBsYXlsaXN0KGQpO1xuICB9XG59XG5mdW5jdGlvbiBmdygpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfSBjYXRjaCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGUgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKCkpLCB0ID0gZS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIFVSTC5yZXZva2VPYmplY3RVUkwoZSksIHQuc2xpY2UodC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxldCB0ID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICByZXR1cm4gXCJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHhcIi5yZXBsYWNlKC9beHldL2csIChuKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSAodCArIE1hdGgucmFuZG9tKCkgKiAxNikgJSAxNiB8IDA7XG4gICAgICAgIHJldHVybiB0ID0gTWF0aC5mbG9vcih0IC8gMTYpLCAobiA9PSBcInhcIiA/IGkgOiBpICYgMyB8IDgpLnRvU3RyaW5nKDE2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gWG4ocykge1xuICBsZXQgZSA9IDUzODEsIHQgPSBzLmxlbmd0aDtcbiAgZm9yICg7IHQ7IClcbiAgICBlID0gZSAqIDMzIF4gcy5jaGFyQ29kZUF0KC0tdCk7XG4gIHJldHVybiAoZSA+Pj4gMCkudG9TdHJpbmcoKTtcbn1cbmNvbnN0IFJuID0gMC4wMjU7XG5sZXQgaWEgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHNbcy5Qb2ludCA9IDBdID0gXCJQb2ludFwiLCBzW3MuUmFuZ2UgPSAxXSA9IFwiUmFuZ2VcIiwgcztcbn0pKHt9KTtcbmZ1bmN0aW9uIGd3KHMsIGUsIHQpIHtcbiAgcmV0dXJuIGAke3MuaWRlbnRpZmllcn0tJHt0ICsgMX0tJHtYbihlKX1gO1xufVxuY2xhc3MgcHcge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5iYXNlID0gdm9pZCAwLCB0aGlzLl9kdXJhdGlvbiA9IG51bGwsIHRoaXMuX3RpbWVsaW5lU3RhcnQgPSBudWxsLCB0aGlzLmFwcGVuZEluUGxhY2VEaXNhYmxlZCA9IHZvaWQgMCwgdGhpcy5hcHBlbmRJblBsYWNlU3RhcnRlZCA9IHZvaWQgMCwgdGhpcy5kYXRlUmFuZ2UgPSB2b2lkIDAsIHRoaXMuaGFzUGxheWVkID0gITEsIHRoaXMuY3VtdWxhdGl2ZUR1cmF0aW9uID0gMCwgdGhpcy5yZXN1bWVPZmZzZXQgPSBOYU4sIHRoaXMucGxheW91dExpbWl0ID0gTmFOLCB0aGlzLnJlc3RyaWN0aW9ucyA9IHtcbiAgICAgIHNraXA6ICExLFxuICAgICAganVtcDogITFcbiAgICB9LCB0aGlzLnNuYXBPcHRpb25zID0ge1xuICAgICAgb3V0OiAhMSxcbiAgICAgIGluOiAhMVxuICAgIH0sIHRoaXMuYXNzZXRMaXN0ID0gW10sIHRoaXMuYXNzZXRMaXN0TG9hZGVyID0gdm9pZCAwLCB0aGlzLmFzc2V0TGlzdFJlc3BvbnNlID0gbnVsbCwgdGhpcy5yZXN1bWVBbmNob3IgPSB2b2lkIDAsIHRoaXMuZXJyb3IgPSB2b2lkIDAsIHRoaXMucmVzZXRPblJlc3VtZSA9IHZvaWQgMCwgdGhpcy5iYXNlID0gdCwgdGhpcy5kYXRlUmFuZ2UgPSBlLCB0aGlzLnNldERhdGVSYW5nZShlKTtcbiAgfVxuICBzZXREYXRlUmFuZ2UoZSkge1xuICAgIHRoaXMuZGF0ZVJhbmdlID0gZSwgdGhpcy5yZXN1bWVPZmZzZXQgPSBlLmF0dHIub3B0aW9uYWxGbG9hdChcIlgtUkVTVU1FLU9GRlNFVFwiLCB0aGlzLnJlc3VtZU9mZnNldCksIHRoaXMucGxheW91dExpbWl0ID0gZS5hdHRyLm9wdGlvbmFsRmxvYXQoXCJYLVBMQVlPVVQtTElNSVRcIiwgdGhpcy5wbGF5b3V0TGltaXQpLCB0aGlzLnJlc3RyaWN0aW9ucyA9IGUuYXR0ci5lbnVtZXJhdGVkU3RyaW5nTGlzdChcIlgtUkVTVFJJQ1RcIiwgdGhpcy5yZXN0cmljdGlvbnMpLCB0aGlzLnNuYXBPcHRpb25zID0gZS5hdHRyLmVudW1lcmF0ZWRTdHJpbmdMaXN0KFwiWC1TTkFQXCIsIHRoaXMuc25hcE9wdGlvbnMpO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMuYXBwZW5kSW5QbGFjZVN0YXJ0ZWQgPSAhMSwgKGUgPSB0aGlzLmFzc2V0TGlzdExvYWRlcikgPT0gbnVsbCB8fCBlLmRlc3Ryb3koKSwgdGhpcy5hc3NldExpc3RMb2FkZXIgPSB2b2lkIDAsIHRoaXMuc3VwcGxlbWVudHNQcmltYXJ5IHx8ICh0aGlzLmFzc2V0TGlzdFJlc3BvbnNlID0gbnVsbCwgdGhpcy5hc3NldExpc3QgPSBbXSwgdGhpcy5fZHVyYXRpb24gPSBudWxsKTtcbiAgfVxuICBpc0Fzc2V0UGFzdFBsYXlvdXRMaW1pdChlKSB7XG4gICAgdmFyIHQ7XG4gICAgaWYgKGUgPiAwICYmIGUgPj0gdGhpcy5hc3NldExpc3QubGVuZ3RoKVxuICAgICAgcmV0dXJuICEwO1xuICAgIGNvbnN0IHIgPSB0aGlzLnBsYXlvdXRMaW1pdDtcbiAgICByZXR1cm4gZSA8PSAwIHx8IGlzTmFOKHIpID8gITEgOiByID09PSAwID8gITAgOiAoKCh0ID0gdGhpcy5hc3NldExpc3RbZV0pID09IG51bGwgPyB2b2lkIDAgOiB0LnN0YXJ0T2Zmc2V0KSB8fCAwKSA+IHI7XG4gIH1cbiAgZmluZEFzc2V0SW5kZXgoZSkge1xuICAgIHJldHVybiB0aGlzLmFzc2V0TGlzdC5pbmRleE9mKGUpO1xuICB9XG4gIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5pZDtcbiAgfVxuICBnZXQgc3RhcnREYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5zdGFydERhdGU7XG4gIH1cbiAgZ2V0IHN0YXJ0VGltZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5kYXRlUmFuZ2Uuc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLnNuYXBPcHRpb25zLm91dCkge1xuICAgICAgY29uc3QgdCA9IHRoaXMuZGF0ZVJhbmdlLnRhZ0FuY2hvcjtcbiAgICAgIGlmICh0KVxuICAgICAgICByZXR1cm4gYmwoZSwgdCk7XG4gICAgfVxuICAgIHJldHVybiBlO1xuICB9XG4gIGdldCBzdGFydE9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdWUucHJlID8gMCA6IHRoaXMuc3RhcnRUaW1lO1xuICB9XG4gIGdldCBzdGFydElzQWxpZ25lZCgpIHtcbiAgICBpZiAodGhpcy5zdGFydFRpbWUgPT09IDAgfHwgdGhpcy5zbmFwT3B0aW9ucy5vdXQpXG4gICAgICByZXR1cm4gITA7XG4gICAgY29uc3QgZSA9IHRoaXMuZGF0ZVJhbmdlLnRhZ0FuY2hvcjtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgdCA9IHRoaXMuZGF0ZVJhbmdlLnN0YXJ0VGltZSwgciA9IGJsKHQsIGUpO1xuICAgICAgcmV0dXJuIHQgLSByIDwgMC4xO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgZ2V0IHJlc3VtcHRpb25PZmZzZXQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucmVzdW1lT2Zmc2V0LCB0ID0gdWUoZSkgPyBlIDogdGhpcy5kdXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcy5jdW11bGF0aXZlRHVyYXRpb24gKyB0O1xuICB9XG4gIGdldCByZXN1bWVUaW1lKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5yZXN1bXB0aW9uT2Zmc2V0O1xuICAgIGlmICh0aGlzLnNuYXBPcHRpb25zLmluKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5yZXN1bWVBbmNob3I7XG4gICAgICBpZiAodClcbiAgICAgICAgcmV0dXJuIGJsKGUsIHQpO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgYXBwZW5kSW5QbGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRJblBsYWNlU3RhcnRlZCA/ICEwIDogdGhpcy5hcHBlbmRJblBsYWNlRGlzYWJsZWQgPyAhMSA6ICEhKCF0aGlzLmN1ZS5vbmNlICYmICF0aGlzLmN1ZS5wcmUgJiYgLy8gcHJlcm9sbCBzdGFydHMgYXQgc3RhcnRQb3NpdGlvbiBiZWZvcmUgc3RhcnRQb3NpdGlvbiBpcyBrbm93biAobGl2ZSlcbiAgICB0aGlzLnN0YXJ0SXNBbGlnbmVkICYmIChpc05hTih0aGlzLnBsYXlvdXRMaW1pdCkgJiYgaXNOYU4odGhpcy5yZXN1bWVPZmZzZXQpIHx8IHRoaXMucmVzdW1lT2Zmc2V0ICYmIHRoaXMuZHVyYXRpb24gJiYgTWF0aC5hYnModGhpcy5yZXN1bWVPZmZzZXQgLSB0aGlzLmR1cmF0aW9uKSA8IFJuKSk7XG4gIH1cbiAgc2V0IGFwcGVuZEluUGxhY2UoZSkge1xuICAgIGlmICh0aGlzLmFwcGVuZEluUGxhY2VTdGFydGVkKSB7XG4gICAgICB0aGlzLnJlc2V0T25SZXN1bWUgPSAhZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hcHBlbmRJblBsYWNlRGlzYWJsZWQgPSAhZTtcbiAgfVxuICAvLyBFeHRlbmRlZCB0aW1lbGluZSBzdGFydCB0aW1lXG4gIGdldCB0aW1lbGluZVN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lbGluZVN0YXJ0ICE9PSBudWxsID8gdGhpcy5fdGltZWxpbmVTdGFydCA6IHRoaXMuc3RhcnRUaW1lO1xuICB9XG4gIHNldCB0aW1lbGluZVN0YXJ0KGUpIHtcbiAgICB0aGlzLl90aW1lbGluZVN0YXJ0ID0gZTtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucGxheW91dExpbWl0O1xuICAgIGxldCB0O1xuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbiAhPT0gbnVsbCA/IHQgPSB0aGlzLl9kdXJhdGlvbiA6IHRoaXMuZGF0ZVJhbmdlLmR1cmF0aW9uID8gdCA9IHRoaXMuZGF0ZVJhbmdlLmR1cmF0aW9uIDogdCA9IHRoaXMuZGF0ZVJhbmdlLnBsYW5uZWREdXJhdGlvbiB8fCAwLCAhaXNOYU4oZSkgJiYgZSA8IHQgJiYgKHQgPSBlKSwgdDtcbiAgfVxuICBzZXQgZHVyYXRpb24oZSkge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZTtcbiAgfVxuICBnZXQgY3VlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5jdWU7XG4gIH1cbiAgZ2V0IHRpbWVsaW5lT2NjdXBhbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1USU1FTElORS1PQ0NVUElFU1wiXSA9PT0gXCJSQU5HRVwiID8gaWEuUmFuZ2UgOiBpYS5Qb2ludDtcbiAgfVxuICBnZXQgc3VwcGxlbWVudHNQcmltYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1USU1FTElORS1TVFlMRVwiXSA9PT0gXCJQUklNQVJZXCI7XG4gIH1cbiAgZ2V0IGNvbnRlbnRNYXlWYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1DT05URU5ULU1BWS1WQVJZXCJdICE9PSBcIk5PXCI7XG4gIH1cbiAgZ2V0IGFzc2V0VXJsKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1BU1NFVC1VUklcIl07XG4gIH1cbiAgZ2V0IGFzc2V0TGlzdFVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlUmFuZ2UuYXR0cltcIlgtQVNTRVQtTElTVFwiXTtcbiAgfVxuICBnZXQgYmFzZVVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlLnVybDtcbiAgfVxuICBnZXQgYXNzZXRMaXN0TG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmFzc2V0TGlzdC5sZW5ndGggPiAwIHx8IHRoaXMuYXNzZXRMaXN0UmVzcG9uc2UgIT09IG51bGw7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIG13KHRoaXMpO1xuICB9XG59XG5mdW5jdGlvbiBibChzLCBlKSB7XG4gIHJldHVybiBzIC0gZS5zdGFydCA8IGUuZHVyYXRpb24gLyAyICYmICEoTWF0aC5hYnMocyAtIChlLnN0YXJ0ICsgZS5kdXJhdGlvbikpIDwgUm4pID8gZS5zdGFydCA6IGUuc3RhcnQgKyBlLmR1cmF0aW9uO1xufVxuZnVuY3Rpb24gJHAocywgZSwgdCkge1xuICBjb25zdCByID0gbmV3IHNlbGYuVVJMKHMsIHQpO1xuICByZXR1cm4gci5wcm90b2NvbCAhPT0gXCJkYXRhOlwiICYmIHIuc2VhcmNoUGFyYW1zLnNldChcIl9ITFNfcHJpbWFyeV9pZFwiLCBlKSwgcjtcbn1cbmZ1bmN0aW9uIFRsKHMsIGUpIHtcbiAgZm9yICg7ICh0ID0gcy5hc3NldExpc3RbKytlXSkgIT0gbnVsbCAmJiB0LmVycm9yOyApXG4gICAgdmFyIHQ7XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24gbXcocykge1xuICByZXR1cm4gYFtcIiR7cy5pZGVudGlmaWVyfVwiICR7cy5jdWUucHJlID8gXCI8cHJlPlwiIDogcy5jdWUucG9zdCA/IFwiPHBvc3Q+XCIgOiBcIlwifSR7cy50aW1lbGluZVN0YXJ0LnRvRml4ZWQoMil9LSR7cy5yZXN1bWVUaW1lLnRvRml4ZWQoMil9XWA7XG59XG5mdW5jdGlvbiB2bihzKSB7XG4gIGNvbnN0IGUgPSBzLnRpbWVsaW5lU3RhcnQsIHQgPSBzLmR1cmF0aW9uIHx8IDA7XG4gIHJldHVybiBgW1wiJHtzLmlkZW50aWZpZXJ9XCIgJHtlLnRvRml4ZWQoMil9LSR7KGUgKyB0KS50b0ZpeGVkKDIpfV1gO1xufVxuY2xhc3MgeXcge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuaW50ZXJzdGl0aWFsID0gdm9pZCAwLCB0aGlzLmFzc2V0SXRlbSA9IHZvaWQgMCwgdGhpcy50cmFja3MgPSBudWxsLCB0aGlzLmhhc0RldGFpbHMgPSAhMSwgdGhpcy5tZWRpYUF0dGFjaGVkID0gbnVsbCwgdGhpcy5fY3VycmVudFRpbWUgPSB2b2lkIDAsIHRoaXMuX2J1ZmZlcmVkRW9zVGltZSA9IHZvaWQgMCwgdGhpcy5jaGVja1BsYXlvdXQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlYWNoZWRQbGF5b3V0KHRoaXMuY3VycmVudFRpbWUpICYmIHRoaXMuaGxzICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5QTEFZT1VUX0xJTUlUX1JFQUNIRUQsIHt9KTtcbiAgICB9O1xuICAgIGNvbnN0IGkgPSB0aGlzLmhscyA9IG5ldyBlKHQpO1xuICAgIHRoaXMuaW50ZXJzdGl0aWFsID0gciwgdGhpcy5hc3NldEl0ZW0gPSBuO1xuICAgIGNvbnN0IG8gPSAoKSA9PiB7XG4gICAgICB0aGlzLmhhc0RldGFpbHMgPSAhMDtcbiAgICB9O1xuICAgIGkub25jZShJLkxFVkVMX0xPQURFRCwgbyksIGkub25jZShJLkFVRElPX1RSQUNLX0xPQURFRCwgbyksIGkub25jZShJLlNVQlRJVExFX1RSQUNLX0xPQURFRCwgbyksIGkub24oSS5NRURJQV9BVFRBQ0hJTkcsIChhLCB7XG4gICAgICBtZWRpYTogbFxuICAgIH0pID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSwgdGhpcy5tZWRpYUF0dGFjaGVkID0gbCwgdGhpcy5pbnRlcnN0aXRpYWwucGxheW91dExpbWl0ICYmIChsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIHRoaXMuY2hlY2tQbGF5b3V0KSwgdGhpcy5hcHBlbmRJblBsYWNlICYmIGkub24oSS5CVUZGRVJfQVBQRU5ERUQsICgpID0+IHtcbiAgICAgICAgY29uc3QgdSA9IHRoaXMuYnVmZmVyZWRFbmQ7XG4gICAgICAgIHRoaXMucmVhY2hlZFBsYXlvdXQodSkgJiYgKHRoaXMuX2J1ZmZlcmVkRW9zVGltZSA9IHUsIGkudHJpZ2dlcihJLkJVRkZFUkVEX1RPX0VORCwgdm9pZCAwKSk7XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0IGFwcGVuZEluUGxhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJzdGl0aWFsLmFwcGVuZEluUGxhY2U7XG4gIH1cbiAgbG9hZFNvdXJjZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgaWYgKGUpXG4gICAgICBpZiAoZS51cmwpXG4gICAgICAgIGUubGV2ZWxzLmxlbmd0aCAmJiAhZS5zdGFydGVkICYmIGUuc3RhcnRMb2FkKC0xLCAhMCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLmFzc2V0SXRlbS51cmk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdCA9ICRwKHQsIGUuY29uZmlnLnByaW1hcnlTZXNzaW9uSWQgfHwgXCJcIikuaHJlZjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgIH1cbiAgICAgICAgZS5sb2FkU291cmNlKHQpO1xuICAgICAgfVxuICB9XG4gIGJ1ZmZlcmVkSW5QbGFjZVRvRW5kKGUpIHtcbiAgICB2YXIgdDtcbiAgICBpZiAoIXRoaXMuYXBwZW5kSW5QbGFjZSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBpZiAoKHQgPSB0aGlzLmhscykgIT0gbnVsbCAmJiB0LmJ1ZmZlcmVkVG9FbmQpXG4gICAgICByZXR1cm4gITA7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IHIgPSBNYXRoLm1pbih0aGlzLl9idWZmZXJlZEVvc1RpbWUgfHwgMSAvIDAsIHRoaXMuZHVyYXRpb24pLCBuID0gdGhpcy50aW1lbGluZU9mZnNldCwgaSA9IENlLmJ1ZmZlckluZm8oZSwgbiwgMCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXNzZXRUaW1lKGkuZW5kKSA+PSByIC0gMC4wMjtcbiAgfVxuICByZWFjaGVkUGxheW91dChlKSB7XG4gICAgY29uc3QgciA9IHRoaXMuaW50ZXJzdGl0aWFsLnBsYXlvdXRMaW1pdDtcbiAgICByZXR1cm4gdGhpcy5zdGFydE9mZnNldCArIGUgPj0gcjtcbiAgfVxuICBnZXQgZGVzdHJveWVkKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAhKChlID0gdGhpcy5obHMpICE9IG51bGwgJiYgZS51c2VyQ29uZmlnKTtcbiAgfVxuICBnZXQgYXNzZXRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hc3NldEl0ZW0uaWRlbnRpZmllcjtcbiAgfVxuICBnZXQgaW50ZXJzdGl0aWFsSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXRJdGVtLnBhcmVudElkZW50aWZpZXI7XG4gIH1cbiAgZ2V0IG1lZGlhKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoKGUgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWVkaWEpIHx8IG51bGw7XG4gIH1cbiAgZ2V0IGJ1ZmZlcmVkRW5kKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLm1lZGlhIHx8IHRoaXMubWVkaWFBdHRhY2hlZDtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gdGhpcy5fYnVmZmVyZWRFb3NUaW1lID8gdGhpcy5fYnVmZmVyZWRFb3NUaW1lIDogdGhpcy5jdXJyZW50VGltZTtcbiAgICBjb25zdCB0ID0gQ2UuYnVmZmVySW5mbyhlLCBlLmN1cnJlbnRUaW1lLCAxZS0zKTtcbiAgICByZXR1cm4gdGhpcy5nZXRBc3NldFRpbWUodC5lbmQpO1xuICB9XG4gIGdldCBjdXJyZW50VGltZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5tZWRpYSB8fCB0aGlzLm1lZGlhQXR0YWNoZWQ7XG4gICAgcmV0dXJuIGUgPyB0aGlzLmdldEFzc2V0VGltZShlLmN1cnJlbnRUaW1lKSA6IHRoaXMuX2N1cnJlbnRUaW1lIHx8IDA7XG4gIH1cbiAgZ2V0IGR1cmF0aW9uKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmFzc2V0SXRlbS5kdXJhdGlvbjtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gMDtcbiAgICBjb25zdCB0ID0gdGhpcy5pbnRlcnN0aXRpYWwucGxheW91dExpbWl0O1xuICAgIGlmICh0KSB7XG4gICAgICBjb25zdCByID0gdCAtIHRoaXMuc3RhcnRPZmZzZXQ7XG4gICAgICBpZiAociA+IDAgJiYgciA8IGUpXG4gICAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgcmVtYWluaW5nKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmR1cmF0aW9uO1xuICAgIHJldHVybiBlID8gTWF0aC5tYXgoMCwgZSAtIHRoaXMuY3VycmVudFRpbWUpIDogMDtcbiAgfVxuICBnZXQgc3RhcnRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXRJdGVtLnN0YXJ0T2Zmc2V0O1xuICB9XG4gIGdldCB0aW1lbGluZU9mZnNldCgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gKChlID0gdGhpcy5obHMpID09IG51bGwgPyB2b2lkIDAgOiBlLmNvbmZpZy50aW1lbGluZU9mZnNldCkgfHwgMDtcbiAgfVxuICBzZXQgdGltZWxpbmVPZmZzZXQoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnRpbWVsaW5lT2Zmc2V0O1xuICAgIGlmIChlICE9PSB0KSB7XG4gICAgICBjb25zdCByID0gZSAtIHQ7XG4gICAgICBpZiAoTWF0aC5hYnMocikgPiAxIC8gOWU0ICYmIHRoaXMuaGxzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RldGFpbHMpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCB0aW1lbGluZU9mZnNldCBhZnRlciBwbGF5bGlzdHMgYXJlIGxvYWRlZFwiKTtcbiAgICAgICAgdGhpcy5obHMuY29uZmlnLnRpbWVsaW5lT2Zmc2V0ID0gZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0QXNzZXRUaW1lKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy50aW1lbGluZU9mZnNldCwgciA9IHRoaXMuZHVyYXRpb247XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KDAsIGUgLSB0KSwgcik7XG4gIH1cbiAgcmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWFBdHRhY2hlZDtcbiAgICBlICYmICh0aGlzLl9jdXJyZW50VGltZSA9IGUuY3VycmVudFRpbWUsIHRoaXMuYnVmZmVyU25hcFNob3QoKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwidGltZXVwZGF0ZVwiLCB0aGlzLmNoZWNrUGxheW91dCkpO1xuICB9XG4gIGJ1ZmZlclNuYXBTaG90KCkge1xuICAgIGlmICh0aGlzLm1lZGlhQXR0YWNoZWQpIHtcbiAgICAgIHZhciBlO1xuICAgICAgKGUgPSB0aGlzLmhscykgIT0gbnVsbCAmJiBlLmJ1ZmZlcmVkVG9FbmQgJiYgKHRoaXMuX2J1ZmZlcmVkRW9zVGltZSA9IHRoaXMuYnVmZmVyZWRFbmQpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSwgdGhpcy5obHMgJiYgdGhpcy5obHMuZGVzdHJveSgpLCB0aGlzLmhscyA9IG51bGwsIHRoaXMudHJhY2tzID0gdGhpcy5tZWRpYUF0dGFjaGVkID0gdGhpcy5jaGVja1BsYXlvdXQgPSBudWxsO1xuICB9XG4gIGF0dGFjaE1lZGlhKGUpIHtcbiAgICB2YXIgdDtcbiAgICB0aGlzLmxvYWRTb3VyY2UoKSwgKHQgPSB0aGlzLmhscykgPT0gbnVsbCB8fCB0LmF0dGFjaE1lZGlhKGUpO1xuICB9XG4gIGRldGFjaE1lZGlhKCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMucmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSwgdGhpcy5tZWRpYUF0dGFjaGVkID0gbnVsbCwgKGUgPSB0aGlzLmhscykgPT0gbnVsbCB8fCBlLmRldGFjaE1lZGlhKCk7XG4gIH1cbiAgcmVzdW1lQnVmZmVyaW5nKCkge1xuICAgIHZhciBlO1xuICAgIChlID0gdGhpcy5obHMpID09IG51bGwgfHwgZS5yZXN1bWVCdWZmZXJpbmcoKTtcbiAgfVxuICBwYXVzZUJ1ZmZlcmluZygpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMuaGxzKSA9PSBudWxsIHx8IGUucGF1c2VCdWZmZXJpbmcoKTtcbiAgfVxuICB0cmFuc2Zlck1lZGlhKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlclNuYXBTaG90KCksICgoZSA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogZS50cmFuc2Zlck1lZGlhKCkpIHx8IG51bGw7XG4gIH1cbiAgcmVzZXREZXRhaWxzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscztcbiAgICBpZiAoZSAmJiB0aGlzLmhhc0RldGFpbHMpIHtcbiAgICAgIGUuc3RvcExvYWQoKTtcbiAgICAgIGNvbnN0IHQgPSAocikgPT4gZGVsZXRlIHIuZGV0YWlscztcbiAgICAgIGUubGV2ZWxzLmZvckVhY2godCksIGUuYWxsQXVkaW9UcmFja3MuZm9yRWFjaCh0KSwgZS5hbGxTdWJ0aXRsZVRyYWNrcy5mb3JFYWNoKHQpLCB0aGlzLmhhc0RldGFpbHMgPSAhMTtcbiAgICB9XG4gIH1cbiAgb24oZSwgdCwgcikge1xuICAgIHZhciBuO1xuICAgIChuID0gdGhpcy5obHMpID09IG51bGwgfHwgbi5vbihlLCB0KTtcbiAgfVxuICBvbmNlKGUsIHQsIHIpIHtcbiAgICB2YXIgbjtcbiAgICAobiA9IHRoaXMuaGxzKSA9PSBudWxsIHx8IG4ub25jZShlLCB0KTtcbiAgfVxuICBvZmYoZSwgdCwgcikge1xuICAgIHZhciBuO1xuICAgIChuID0gdGhpcy5obHMpID09IG51bGwgfHwgbi5vZmYoZSwgdCk7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIGBIbHNBc3NldFBsYXllcjogJHt2bih0aGlzLmFzc2V0SXRlbSl9ICR7KGUgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IGUuc2Vzc2lvbklkfSAke3RoaXMuYXBwZW5kSW5QbGFjZSA/IFwiYXBwZW5kLWluLXBsYWNlXCIgOiBcIlwifWA7XG4gIH1cbn1cbmNvbnN0IFhoID0gMC4wMzM7XG5jbGFzcyB2dyBleHRlbmRzIExyIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHN1cGVyKFwiaW50ZXJzdGl0aWFscy1zY2hlZFwiLCB0KSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gdm9pZCAwLCB0aGlzLmV2ZW50TWFwID0ge30sIHRoaXMuZXZlbnRzID0gbnVsbCwgdGhpcy5pdGVtcyA9IG51bGwsIHRoaXMuZHVyYXRpb25zID0ge1xuICAgICAgcHJpbWFyeTogMCxcbiAgICAgIHBsYXlvdXQ6IDAsXG4gICAgICBpbnRlZ3JhdGVkOiAwXG4gICAgfSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVzZXQoKSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLmV2ZW50TWFwID0ge30sIHRoaXMuc2V0RHVyYXRpb25zKDAsIDAsIDApLCB0aGlzLmV2ZW50cyAmJiB0aGlzLmV2ZW50cy5mb3JFYWNoKChlKSA9PiBlLnJlc2V0KCkpLCB0aGlzLmV2ZW50cyA9IHRoaXMuaXRlbXMgPSBudWxsO1xuICB9XG4gIHJlc2V0RXJyb3JzSW5SYW5nZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzID8gdGhpcy5ldmVudHMucmVkdWNlKChyLCBuKSA9PiBlIDw9IG4uc3RhcnRPZmZzZXQgJiYgdCA+IG4uc3RhcnRPZmZzZXQgPyAoZGVsZXRlIG4uZXJyb3IsIHIgKyAxKSA6IHIsIDApIDogMDtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuaXRlbXM7XG4gICAgcmV0dXJuIGUgPyBlW2UubGVuZ3RoIC0gMV0uZW5kIDogMDtcbiAgfVxuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy5sZW5ndGggOiAwO1xuICB9XG4gIGdldEV2ZW50KGUpIHtcbiAgICByZXR1cm4gZSAmJiB0aGlzLmV2ZW50TWFwW2VdIHx8IG51bGw7XG4gIH1cbiAgaGFzRXZlbnQoZSkge1xuICAgIHJldHVybiBlIGluIHRoaXMuZXZlbnRNYXA7XG4gIH1cbiAgZmluZEl0ZW1JbmRleChlLCB0KSB7XG4gICAgaWYgKGUuZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy5maW5kRXZlbnRJbmRleChlLmV2ZW50LmlkZW50aWZpZXIpO1xuICAgIGxldCByID0gLTE7XG4gICAgZS5uZXh0RXZlbnQgPyByID0gdGhpcy5maW5kRXZlbnRJbmRleChlLm5leHRFdmVudC5pZGVudGlmaWVyKSAtIDEgOiBlLnByZXZpb3VzRXZlbnQgJiYgKHIgPSB0aGlzLmZpbmRFdmVudEluZGV4KGUucHJldmlvdXNFdmVudC5pZGVudGlmaWVyKSArIDEpO1xuICAgIGNvbnN0IG4gPSB0aGlzLml0ZW1zO1xuICAgIGlmIChuKVxuICAgICAgZm9yIChuW3JdIHx8ICh0ID09PSB2b2lkIDAgJiYgKHQgPSBlLnN0YXJ0KSwgciA9IHRoaXMuZmluZEl0ZW1JbmRleEF0VGltZSh0KSk7IHIgPj0gMCAmJiAoaSA9IG5bcl0pICE9IG51bGwgJiYgaS5ldmVudDsgKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICByLS07XG4gICAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgZmluZEl0ZW1JbmRleEF0VGltZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaXRlbXM7XG4gICAgaWYgKHIpXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHIubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgbGV0IGkgPSByW25dO1xuICAgICAgICBpZiAodCAmJiB0ICE9PSBcInByaW1hcnlcIiAmJiAoaSA9IGlbdF0pLCBlID09PSBpLnN0YXJ0IHx8IGUgPiBpLnN0YXJ0ICYmIGUgPCBpLmVuZClcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgZmluZEp1bXBSZXN0cmljdGVkSW5kZXgoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLml0ZW1zO1xuICAgIGlmIChyKVxuICAgICAgZm9yIChsZXQgbiA9IGU7IG4gPD0gdCAmJiByW25dOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHJbbl0uZXZlbnQ7XG4gICAgICAgIGlmIChpICE9IG51bGwgJiYgaS5yZXN0cmljdGlvbnMuanVtcCAmJiAhaS5hcHBlbmRJblBsYWNlKVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBmaW5kRXZlbnRJbmRleChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaXRlbXM7XG4gICAgaWYgKHQpXG4gICAgICBmb3IgKGxldCBuID0gdC5sZW5ndGg7IG4tLTsgKSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICBpZiAoKChyID0gdFtuXS5ldmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuaWRlbnRpZmllcikgPT09IGUpXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGZpbmRBc3NldEluZGV4KGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5hc3NldExpc3QsIG4gPSByLmxlbmd0aDtcbiAgICBpZiAobiA+IDEpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBvID0gcltpXTtcbiAgICAgICAgaWYgKCFvLmVycm9yKSB7XG4gICAgICAgICAgY29uc3QgYSA9IG8udGltZWxpbmVTdGFydDtcbiAgICAgICAgICBpZiAodCA9PT0gYSB8fCB0ID4gYSAmJiAodCA8IGEgKyAoby5kdXJhdGlvbiB8fCAwKSB8fCBpID09PSBuIC0gMSkpXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBhc3NldElkQXRFbmQoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3QgdCA9IChlID0gdGhpcy5pdGVtcykgPT0gbnVsbCB8fCAoZSA9IGVbdGhpcy5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuZXZlbnQ7XG4gICAgaWYgKHQpIHtcbiAgICAgIGNvbnN0IHIgPSB0LmFzc2V0TGlzdCwgbiA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChuKVxuICAgICAgICByZXR1cm4gbi5pZGVudGlmaWVyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwYXJzZUludGVyc3RpdGlhbERhdGVSYW5nZXMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLm1haW4uZGV0YWlscywge1xuICAgICAgZGF0ZVJhbmdlczogblxuICAgIH0gPSByLCBpID0gdGhpcy5ldmVudHMsIG8gPSB0aGlzLnBhcnNlRGF0ZVJhbmdlcyhuLCB7XG4gICAgICB1cmw6IHIudXJsXG4gICAgfSwgdCksIGEgPSBPYmplY3Qua2V5cyhuKSwgbCA9IGkgPyBpLmZpbHRlcigoYykgPT4gIWEuaW5jbHVkZXMoYy5pZGVudGlmaWVyKSkgOiBbXTtcbiAgICBvLmxlbmd0aCAmJiBvLnNvcnQoKGMsIHUpID0+IHtcbiAgICAgIGNvbnN0IGQgPSBjLmN1ZS5wcmUsIGggPSBjLmN1ZS5wb3N0LCBmID0gdS5jdWUucHJlLCBwID0gdS5jdWUucG9zdDtcbiAgICAgIGlmIChkICYmICFmKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAoZiAmJiAhZCB8fCBoICYmICFwKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmIChwICYmICFoKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAoIWQgJiYgIWYgJiYgIWggJiYgIXApIHtcbiAgICAgICAgY29uc3QgeSA9IGMuc3RhcnRUaW1lLCBFID0gdS5zdGFydFRpbWU7XG4gICAgICAgIGlmICh5ICE9PSBFKVxuICAgICAgICAgIHJldHVybiB5IC0gRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjLmRhdGVSYW5nZS50YWdPcmRlciAtIHUuZGF0ZVJhbmdlLnRhZ09yZGVyO1xuICAgIH0pLCB0aGlzLmV2ZW50cyA9IG8sIGwuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudChjKTtcbiAgICB9KSwgdGhpcy51cGRhdGVTY2hlZHVsZShlLCBsKTtcbiAgfVxuICB1cGRhdGVTY2hlZHVsZShlLCB0ID0gW10sIHIgPSAhMSkge1xuICAgIGNvbnN0IG4gPSB0aGlzLmV2ZW50cyB8fCBbXTtcbiAgICBpZiAobi5sZW5ndGggfHwgdC5sZW5ndGggfHwgdGhpcy5sZW5ndGggPCAyKSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5pdGVtcywgbyA9IHRoaXMucGFyc2VTY2hlZHVsZShuLCBlKTtcbiAgICAgIChyIHx8IHQubGVuZ3RoIHx8IChpID09IG51bGwgPyB2b2lkIDAgOiBpLmxlbmd0aCkgIT09IG8ubGVuZ3RoIHx8IG8uc29tZSgobCwgYykgPT4gTWF0aC5hYnMobC5wbGF5b3V0LnN0YXJ0IC0gaVtjXS5wbGF5b3V0LnN0YXJ0KSA+IDVlLTMgfHwgTWF0aC5hYnMobC5wbGF5b3V0LmVuZCAtIGlbY10ucGxheW91dC5lbmQpID4gNWUtMykpICYmICh0aGlzLml0ZW1zID0gbywgdGhpcy5vblNjaGVkdWxlVXBkYXRlKHQsIGkpKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VEYXRlUmFuZ2VzKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gW10sIGkgPSBPYmplY3Qua2V5cyhlKTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IGkubGVuZ3RoOyBvKyspIHtcbiAgICAgIGNvbnN0IGEgPSBpW29dLCBsID0gZVthXTtcbiAgICAgIGlmIChsLmlzSW50ZXJzdGl0aWFsKSB7XG4gICAgICAgIGxldCBjID0gdGhpcy5ldmVudE1hcFthXTtcbiAgICAgICAgYyA/IGMuc2V0RGF0ZVJhbmdlKGwpIDogKGMgPSBuZXcgcHcobCwgdCksIHRoaXMuZXZlbnRNYXBbYV0gPSBjLCByID09PSAhMSAmJiAoYy5hcHBlbmRJblBsYWNlID0gcikpLCBuLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIHBhcnNlU2NoZWR1bGUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBbXSwgbiA9IHQubWFpbi5kZXRhaWxzLCBpID0gbi5saXZlID8gMSAvIDAgOiBuLmVkZ2U7XG4gICAgbGV0IG8gPSAwO1xuICAgIGlmIChlID0gZS5maWx0ZXIoKGwpID0+ICFsLmVycm9yICYmICEobC5jdWUub25jZSAmJiBsLmhhc1BsYXllZCkpLCBlLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZXNvbHZlT2Zmc2V0cyhlLCB0KTtcbiAgICAgIGxldCBsID0gMCwgYyA9IDA7XG4gICAgICBpZiAoZS5mb3JFYWNoKCh1LCBkKSA9PiB7XG4gICAgICAgIGNvbnN0IGggPSB1LmN1ZS5wcmUsIGYgPSB1LmN1ZS5wb3N0LCBwID0gZVtkIC0gMV0gfHwgbnVsbCwgeSA9IHUuYXBwZW5kSW5QbGFjZSwgRSA9IGYgPyBpIDogdS5zdGFydE9mZnNldCwgYiA9IHUuZHVyYXRpb24sIFIgPSB1LnRpbWVsaW5lT2NjdXBhbmN5ID09PSBpYS5SYW5nZSA/IGIgOiAwLCBBID0gdS5yZXN1bXB0aW9uT2Zmc2V0LCBGID0gKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAuc3RhcnRUaW1lKSA9PT0gRSwgTSA9IEUgKyB1LmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICAgICAgbGV0IEggPSB5ID8gTSArIGIgOiBFICsgQTtcbiAgICAgICAgaWYgKGggfHwgIWYgJiYgRSA8PSAwKSB7XG4gICAgICAgICAgY29uc3QgaiA9IGM7XG4gICAgICAgICAgYyArPSBSLCB1LnRpbWVsaW5lU3RhcnQgPSBNO1xuICAgICAgICAgIGNvbnN0IEMgPSBvO1xuICAgICAgICAgIG8gKz0gYiwgci5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiB1LFxuICAgICAgICAgICAgc3RhcnQ6IE0sXG4gICAgICAgICAgICBlbmQ6IEgsXG4gICAgICAgICAgICBwbGF5b3V0OiB7XG4gICAgICAgICAgICAgIHN0YXJ0OiBDLFxuICAgICAgICAgICAgICBlbmQ6IG9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlZ3JhdGVkOiB7XG4gICAgICAgICAgICAgIHN0YXJ0OiBqLFxuICAgICAgICAgICAgICBlbmQ6IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChFIDw9IGkpIHtcbiAgICAgICAgICBpZiAoIUYpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBFIC0gbDtcbiAgICAgICAgICAgIGlmIChrID4gWGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgJCA9IGwsIFcgPSBjO1xuICAgICAgICAgICAgICBjICs9IGs7XG4gICAgICAgICAgICAgIGNvbnN0IF8gPSBvO1xuICAgICAgICAgICAgICBvICs9IGs7XG4gICAgICAgICAgICAgIGNvbnN0IGcgPSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNFdmVudDogZVtkIC0gMV0gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBuZXh0RXZlbnQ6IHUsXG4gICAgICAgICAgICAgICAgc3RhcnQ6ICQsXG4gICAgICAgICAgICAgICAgZW5kOiAkICsgayxcbiAgICAgICAgICAgICAgICBwbGF5b3V0OiB7XG4gICAgICAgICAgICAgICAgICBzdGFydDogXyxcbiAgICAgICAgICAgICAgICAgIGVuZDogb1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW50ZWdyYXRlZDoge1xuICAgICAgICAgICAgICAgICAgc3RhcnQ6IFcsXG4gICAgICAgICAgICAgICAgICBlbmQ6IGNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHIucHVzaChnKTtcbiAgICAgICAgICAgIH0gZWxzZSBrID4gMCAmJiBwICYmIChwLmN1bXVsYXRpdmVEdXJhdGlvbiArPSBrLCByW3IubGVuZ3RoIC0gMV0uZW5kID0gRSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGYgJiYgKEggPSBNKSwgdS50aW1lbGluZVN0YXJ0ID0gTTtcbiAgICAgICAgICBjb25zdCBqID0gYztcbiAgICAgICAgICBjICs9IFI7XG4gICAgICAgICAgY29uc3QgQyA9IG87XG4gICAgICAgICAgbyArPSBiLCByLnB1c2goe1xuICAgICAgICAgICAgZXZlbnQ6IHUsXG4gICAgICAgICAgICBzdGFydDogTSxcbiAgICAgICAgICAgIGVuZDogSCxcbiAgICAgICAgICAgIHBsYXlvdXQ6IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IEMsXG4gICAgICAgICAgICAgIGVuZDogb1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGludGVncmF0ZWQ6IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IGosXG4gICAgICAgICAgICAgIGVuZDogY1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IEsgPSB1LnJlc3VtZVRpbWU7XG4gICAgICAgIGYgfHwgSyA+IGkgPyBsID0gaSA6IGwgPSBLO1xuICAgICAgfSksIGwgPCBpKSB7XG4gICAgICAgIHZhciBhO1xuICAgICAgICBjb25zdCB1ID0gbCwgZCA9IGMsIGggPSBpIC0gbDtcbiAgICAgICAgYyArPSBoO1xuICAgICAgICBjb25zdCBmID0gbztcbiAgICAgICAgbyArPSBoLCByLnB1c2goe1xuICAgICAgICAgIHByZXZpb3VzRXZlbnQ6ICgoYSA9IHJbci5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGEuZXZlbnQpIHx8IG51bGwsXG4gICAgICAgICAgbmV4dEV2ZW50OiBudWxsLFxuICAgICAgICAgIHN0YXJ0OiBsLFxuICAgICAgICAgIGVuZDogdSArIGgsXG4gICAgICAgICAgcGxheW91dDoge1xuICAgICAgICAgICAgc3RhcnQ6IGYsXG4gICAgICAgICAgICBlbmQ6IG9cbiAgICAgICAgICB9LFxuICAgICAgICAgIGludGVncmF0ZWQ6IHtcbiAgICAgICAgICAgIHN0YXJ0OiBkLFxuICAgICAgICAgICAgZW5kOiBjXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RHVyYXRpb25zKGksIG8sIGMpO1xuICAgIH0gZWxzZVxuICAgICAgci5wdXNoKHtcbiAgICAgICAgcHJldmlvdXNFdmVudDogbnVsbCxcbiAgICAgICAgbmV4dEV2ZW50OiBudWxsLFxuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiBpLFxuICAgICAgICBwbGF5b3V0OiB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBpXG4gICAgICAgIH0sXG4gICAgICAgIGludGVncmF0ZWQ6IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IGlcbiAgICAgICAgfVxuICAgICAgfSksIHRoaXMuc2V0RHVyYXRpb25zKGksIGksIGkpO1xuICAgIHJldHVybiByO1xuICB9XG4gIHNldER1cmF0aW9ucyhlLCB0LCByKSB7XG4gICAgdGhpcy5kdXJhdGlvbnMgPSB7XG4gICAgICBwcmltYXJ5OiBlLFxuICAgICAgcGxheW91dDogdCxcbiAgICAgIGludGVncmF0ZWQ6IHJcbiAgICB9O1xuICB9XG4gIHJlc29sdmVPZmZzZXRzKGUsIHQpIHtcbiAgICBjb25zdCByID0gdC5tYWluLmRldGFpbHMsIG4gPSByLmxpdmUgPyAxIC8gMCA6IHIuZWRnZTtcbiAgICBsZXQgaSA9IDAsIG8gPSAtMTtcbiAgICBlLmZvckVhY2goKGEsIGwpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBhLmN1ZS5wcmUsIHUgPSBhLmN1ZS5wb3N0LCBkID0gYyA/IDAgOiB1ID8gbiA6IGEuc3RhcnRUaW1lO1xuICAgICAgdGhpcy51cGRhdGVBc3NldER1cmF0aW9ucyhhKSwgbyA9PT0gZCA/IGEuY3VtdWxhdGl2ZUR1cmF0aW9uID0gaSA6IChpID0gMCwgbyA9IGQpLCAhdSAmJiBhLnNuYXBPcHRpb25zLmluICYmIChhLnJlc3VtZUFuY2hvciA9IEpzKG51bGwsIHIuZnJhZ21lbnRzLCBhLnN0YXJ0T2Zmc2V0ICsgYS5yZXN1bXB0aW9uT2Zmc2V0LCAwLCAwKSB8fCB2b2lkIDApLCBhLmFwcGVuZEluUGxhY2UgJiYgIWEuYXBwZW5kSW5QbGFjZVN0YXJ0ZWQgJiYgKHRoaXMucHJpbWFyeUNhblJlc3VtZUluUGxhY2VBdChhLCB0KSB8fCAoYS5hcHBlbmRJblBsYWNlID0gITEpKSwgIWEuYXBwZW5kSW5QbGFjZSAmJiBsICsgMSA8IGUubGVuZ3RoICYmIGVbbCArIDFdLnN0YXJ0VGltZSAtIGVbbF0ucmVzdW1lVGltZSA8IFhoICYmIChlW2wgKyAxXS5hcHBlbmRJblBsYWNlID0gITEsIGVbbCArIDFdLmFwcGVuZEluUGxhY2UgJiYgdGhpcy53YXJuKGBDb3VsZCBub3QgY2hhbmdlIGFwcGVuZCBzdHJhdGVneSBmb3IgYWJ1dHRpbmcgZXZlbnQgJHthfWApKTtcbiAgICAgIGNvbnN0IGYgPSB1ZShhLnJlc3VtZU9mZnNldCkgPyBhLnJlc3VtZU9mZnNldCA6IGEuZHVyYXRpb247XG4gICAgICBpICs9IGY7XG4gICAgfSk7XG4gIH1cbiAgcHJpbWFyeUNhblJlc3VtZUluUGxhY2VBdChlLCB0KSB7XG4gICAgY29uc3QgciA9IGUucmVzdW1lVGltZSwgbiA9IGUuc3RhcnRUaW1lICsgZS5yZXN1bXB0aW9uT2Zmc2V0O1xuICAgIHJldHVybiBNYXRoLmFicyhyIC0gbikgPiBSbiA/ICh0aGlzLmxvZyhgXCIke2UuaWRlbnRpZmllcn1cIiByZXN1bXB0aW9uICR7cn0gbm90IGFsaWduZWQgd2l0aCBlc3RpbWF0ZWQgdGltZWxpbmUgZW5kICR7bn1gKSwgITEpIDogIU9iamVjdC5rZXlzKHQpLnNvbWUoKG8pID0+IHtcbiAgICAgIGNvbnN0IGEgPSB0W29dLmRldGFpbHMsIGwgPSBhLmVkZ2U7XG4gICAgICBpZiAociA+PSBsKVxuICAgICAgICByZXR1cm4gdGhpcy5sb2coYFwiJHtlLmlkZW50aWZpZXJ9XCIgcmVzdW1wdGlvbiAke3J9IHBhc3QgJHtvfSBwbGF5bGlzdCBlbmQgJHtsfWApLCAhMTtcbiAgICAgIGNvbnN0IGMgPSBKcyhudWxsLCBhLmZyYWdtZW50cywgcik7XG4gICAgICBpZiAoIWMpXG4gICAgICAgIHJldHVybiB0aGlzLmxvZyhgXCIke2UuaWRlbnRpZmllcn1cIiByZXN1bXB0aW9uICR7cn0gZG9lcyBub3QgYWxpZ24gd2l0aCBhbnkgZnJhZ21lbnRzIGluICR7b30gcGxheWxpc3QgKCR7YS5mcmFnU3RhcnR9LSR7YS5mcmFnbWVudEVuZH0pYCksICEwO1xuICAgICAgY29uc3QgdSA9IG8gPT09IFwiYXVkaW9cIiA/IDAuMTc1IDogMDtcbiAgICAgIHJldHVybiBNYXRoLmFicyhjLnN0YXJ0IC0gcikgPCBSbiArIHUgfHwgTWF0aC5hYnMoYy5lbmQgLSByKSA8IFJuICsgdSA/ICExIDogKHRoaXMubG9nKGBcIiR7ZS5pZGVudGlmaWVyfVwiIHJlc3VtcHRpb24gJHtyfSBub3QgYWxpZ25lZCB3aXRoICR7b30gZnJhZ21lbnQgYm91bmRzICgke2Muc3RhcnR9LSR7Yy5lbmR9IHNuOiAke2Muc259IGNjOiAke2MuY2N9KWApLCAhMCk7XG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQXNzZXREdXJhdGlvbnMoZSkge1xuICAgIGlmICghZS5hc3NldExpc3RMb2FkZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IGUudGltZWxpbmVTdGFydDtcbiAgICBsZXQgciA9IDAsIG4gPSAhMSwgaSA9ICExO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgZS5hc3NldExpc3QubGVuZ3RoOyBvKyspIHtcbiAgICAgIGNvbnN0IGEgPSBlLmFzc2V0TGlzdFtvXSwgbCA9IHQgKyByO1xuICAgICAgYS5zdGFydE9mZnNldCA9IHIsIGEudGltZWxpbmVTdGFydCA9IGwsIG4gfHwgKG4gPSBhLmR1cmF0aW9uID09PSBudWxsKSwgaSB8fCAoaSA9ICEhYS5lcnJvcik7XG4gICAgICBjb25zdCBjID0gYS5lcnJvciA/IDAgOiBhLmR1cmF0aW9uIHx8IDA7XG4gICAgICByICs9IGM7XG4gICAgfVxuICAgIG4gJiYgIWkgPyBlLmR1cmF0aW9uID0gTWF0aC5tYXgociwgZS5kdXJhdGlvbikgOiBlLmR1cmF0aW9uID0gcjtcbiAgfVxuICByZW1vdmVFdmVudChlKSB7XG4gICAgZS5yZXNldCgpLCBkZWxldGUgdGhpcy5ldmVudE1hcFtlLmlkZW50aWZpZXJdO1xuICB9XG59XG5mdW5jdGlvbiBrcihzKSB7XG4gIHJldHVybiBgWyR7cy5ldmVudCA/ICdcIicgKyBzLmV2ZW50LmlkZW50aWZpZXIgKyAnXCInIDogXCJwcmltYXJ5XCJ9OiAke3Muc3RhcnQudG9GaXhlZCgyKX0tJHtzLmVuZC50b0ZpeGVkKDIpfV1gO1xufVxuY2xhc3MgRXcge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuaGxzID0gZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuaGxzID0gbnVsbDtcbiAgfVxuICBsb2FkQXNzZXRMaXN0KGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5hc3NldExpc3RVcmw7XG4gICAgbGV0IG47XG4gICAgdHJ5IHtcbiAgICAgIG4gPSAkcChyLCB0aGlzLmhscy5zZXNzaW9uSWQsIGUuYmFzZVVybCk7XG4gICAgfSBjYXRjaCAoaCkge1xuICAgICAgY29uc3QgZiA9IHRoaXMuYXNzaWduQXNzZXRMaXN0RXJyb3IoZSwgSi5BU1NFVF9MSVNUX0xPQURfRVJST1IsIGgsIHIpO1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCBmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdCAmJiBuLnByb3RvY29sICE9PSBcImRhdGE6XCIgJiYgbi5zZWFyY2hQYXJhbXMuc2V0KFwiX0hMU19zdGFydF9vZmZzZXRcIiwgXCJcIiArIHQpO1xuICAgIGNvbnN0IGkgPSB0aGlzLmhscy5jb25maWcsIG8gPSBpLmxvYWRlciwgYSA9IG5ldyBvKGkpLCBsID0ge1xuICAgICAgcmVzcG9uc2VUeXBlOiBcImpzb25cIixcbiAgICAgIHVybDogbi5ocmVmXG4gICAgfSwgYyA9IGkuaW50ZXJzdGl0aWFsQXNzZXRMaXN0TG9hZFBvbGljeS5kZWZhdWx0LCB1ID0ge1xuICAgICAgbG9hZFBvbGljeTogYyxcbiAgICAgIHRpbWVvdXQ6IGMubWF4TG9hZFRpbWVNcyxcbiAgICAgIG1heFJldHJ5OiAwLFxuICAgICAgcmV0cnlEZWxheTogMCxcbiAgICAgIG1heFJldHJ5RGVsYXk6IDBcbiAgICB9LCBkID0ge1xuICAgICAgb25TdWNjZXNzOiAoaCwgZiwgcCwgeSkgPT4ge1xuICAgICAgICBjb25zdCBFID0gaC5kYXRhLCBiID0gRSA9PSBudWxsID8gdm9pZCAwIDogRS5BU1NFVFM7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSkge1xuICAgICAgICAgIGNvbnN0IFIgPSB0aGlzLmFzc2lnbkFzc2V0TGlzdEVycm9yKGUsIEouQVNTRVRfTElTVF9QQVJTSU5HX0VSUk9SLCBuZXcgRXJyb3IoXCJJbnZhbGlkIGludGVyc3RpdGlhbCBhc3NldCBsaXN0XCIpLCBwLnVybCwgZiwgeSk7XG4gICAgICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCBSKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZS5hc3NldExpc3RSZXNwb25zZSA9IEUsIHRoaXMuaGxzLnRyaWdnZXIoSS5BU1NFVF9MSVNUX0xPQURFRCwge1xuICAgICAgICAgIGV2ZW50OiBlLFxuICAgICAgICAgIGFzc2V0TGlzdFJlc3BvbnNlOiBFLFxuICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiB5XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChoLCBmLCBwLCB5KSA9PiB7XG4gICAgICAgIGNvbnN0IEUgPSB0aGlzLmFzc2lnbkFzc2V0TGlzdEVycm9yKGUsIEouQVNTRVRfTElTVF9MT0FEX0VSUk9SLCBuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgWC1BU1NFVC1MSVNUOiBIVFRQIHN0YXR1cyAke2guY29kZX0gJHtoLnRleHR9ICgke2YudXJsfSlgKSwgZi51cmwsIHksIHApO1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIEUpO1xuICAgICAgfSxcbiAgICAgIG9uVGltZW91dDogKGgsIGYsIHApID0+IHtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuYXNzaWduQXNzZXRMaXN0RXJyb3IoZSwgSi5BU1NFVF9MSVNUX0xPQURfVElNRU9VVCwgbmV3IEVycm9yKGBUaW1lb3V0IGxvYWRpbmcgWC1BU1NFVC1MSVNUICgke2YudXJsfSlgKSwgZi51cmwsIGgsIHApO1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHkpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGEubG9hZChsLCB1LCBkKSwgdGhpcy5obHMudHJpZ2dlcihJLkFTU0VUX0xJU1RfTE9BRElORywge1xuICAgICAgZXZlbnQ6IGVcbiAgICB9KSwgYTtcbiAgfVxuICBhc3NpZ25Bc3NldExpc3RFcnJvcihlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgcmV0dXJuIGUuZXJyb3IgPSByLCB7XG4gICAgICB0eXBlOiB2ZS5ORVRXT1JLX0VSUk9SLFxuICAgICAgZGV0YWlsczogdCxcbiAgICAgIGZhdGFsOiAhMSxcbiAgICAgIGludGVyc3RpdGlhbDogZSxcbiAgICAgIHVybDogbixcbiAgICAgIGVycm9yOiByLFxuICAgICAgbmV0d29ya0RldGFpbHM6IG8sXG4gICAgICBzdGF0czogaVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIEpoKHMpIHtcbiAgcyA9PSBudWxsIHx8IHMucGxheSgpLmNhdGNoKCgpID0+IHtcbiAgfSk7XG59XG5mdW5jdGlvbiBRaShzLCBlKSB7XG4gIHJldHVybiBgWyR7c31dIEFkdmFuY2luZyB0aW1lbGluZSBwb3NpdGlvbiB0byAke2V9YDtcbn1cbmNsYXNzIHh3IGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIoXCJpbnRlcnN0aXRpYWxzXCIsIGUubG9nZ2VyKSwgdGhpcy5IbHNQbGF5ZXJDbGFzcyA9IHZvaWQgMCwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuYXNzZXRMaXN0TG9hZGVyID0gdm9pZCAwLCB0aGlzLm1lZGlhU2VsZWN0aW9uID0gbnVsbCwgdGhpcy5hbHRTZWxlY3Rpb24gPSBudWxsLCB0aGlzLm1lZGlhID0gbnVsbCwgdGhpcy5kZXRhY2hlZERhdGEgPSBudWxsLCB0aGlzLnJlcXVpcmVkVHJhY2tzID0gbnVsbCwgdGhpcy5tYW5hZ2VyID0gbnVsbCwgdGhpcy5wbGF5ZXJRdWV1ZSA9IFtdLCB0aGlzLmJ1ZmZlcmVkUG9zID0gLTEsIHRoaXMudGltZWxpbmVQb3MgPSAtMSwgdGhpcy5zY2hlZHVsZSA9IHZvaWQgMCwgdGhpcy5wbGF5aW5nSXRlbSA9IG51bGwsIHRoaXMuYnVmZmVyaW5nSXRlbSA9IG51bGwsIHRoaXMud2FpdGluZ0l0ZW0gPSBudWxsLCB0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMucGxheWluZ0Fzc2V0ID0gbnVsbCwgdGhpcy5lbmRlZEFzc2V0ID0gbnVsbCwgdGhpcy5idWZmZXJpbmdBc3NldCA9IG51bGwsIHRoaXMuc2hvdWxkUGxheSA9ICExLCB0aGlzLm9uUGxheSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdWxkUGxheSA9ICEwO1xuICAgIH0sIHRoaXMub25QYXVzZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdWxkUGxheSA9ICExO1xuICAgIH0sIHRoaXMub25TZWVraW5nID0gKCkgPT4ge1xuICAgICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRpbWU7XG4gICAgICBpZiAociA9PT0gdm9pZCAwIHx8IHRoaXMucGxheWJhY2tEaXNhYmxlZCB8fCAhdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbiA9IHIgLSB0aGlzLnRpbWVsaW5lUG9zO1xuICAgICAgaWYgKE1hdGguYWJzKG4pIDwgMSAvIDcwNTZlNSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbyA9IG4gPD0gLTAuMDE7XG4gICAgICB0aGlzLnRpbWVsaW5lUG9zID0gciwgdGhpcy5idWZmZXJlZFBvcyA9IHI7XG4gICAgICBjb25zdCBhID0gdGhpcy5wbGF5aW5nSXRlbTtcbiAgICAgIGlmICghYSkge1xuICAgICAgICB0aGlzLmNoZWNrQnVmZmVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChvICYmIHRoaXMuc2NoZWR1bGUucmVzZXRFcnJvcnNJblJhbmdlKHIsIHIgLSBuKSAmJiB0aGlzLnVwZGF0ZVNjaGVkdWxlKCEwKSwgdGhpcy5jaGVja0J1ZmZlcigpLCBvICYmIHIgPCBhLnN0YXJ0IHx8IHIgPj0gYS5lbmQpIHtcbiAgICAgICAgdmFyIGw7XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLmZpbmRJdGVtSW5kZXgoYSk7XG4gICAgICAgIGxldCBwID0gdGhpcy5zY2hlZHVsZS5maW5kSXRlbUluZGV4QXRUaW1lKHIpO1xuICAgICAgICBpZiAocCA9PT0gLTEgJiYgKHAgPSBmICsgKG8gPyAtMSA6IDEpLCB0aGlzLmxvZyhgc2Vla2VkICR7byA/IFwiYmFjayBcIiA6IFwiXCJ9dG8gcG9zaXRpb24gbm90IGNvdmVyZWQgYnkgc2NoZWR1bGUgJHtyfSAocmVzb2x2aW5nIGZyb20gJHtmfSB0byAke3B9KWApKSwgIXRoaXMuaXNJbnRlcnN0aXRpYWwoYSkgJiYgKGwgPSB0aGlzLm1lZGlhKSAhPSBudWxsICYmIGwucGF1c2VkICYmICh0aGlzLnNob3VsZFBsYXkgPSAhMSksICFvICYmIHAgPiBmKSB7XG4gICAgICAgICAgY29uc3QgeSA9IHRoaXMuc2NoZWR1bGUuZmluZEp1bXBSZXN0cmljdGVkSW5kZXgoZiArIDEsIHApO1xuICAgICAgICAgIGlmICh5ID4gZikge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKHkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24ocCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGMgPSB0aGlzLnBsYXlpbmdBc3NldDtcbiAgICAgIGlmICghYykge1xuICAgICAgICBpZiAodGhpcy5wbGF5aW5nTGFzdEl0ZW0gJiYgdGhpcy5pc0ludGVyc3RpdGlhbChhKSkge1xuICAgICAgICAgIGNvbnN0IGYgPSBhLmV2ZW50LmFzc2V0TGlzdFswXTtcbiAgICAgICAgICBmICYmICh0aGlzLmVuZGVkSXRlbSA9IHRoaXMucGxheWluZ0l0ZW0sIHRoaXMucGxheWluZ0l0ZW0gPSBudWxsLCB0aGlzLnNldFNjaGVkdWxlVG9Bc3NldEF0VGltZShyLCBmKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdSA9IGMudGltZWxpbmVTdGFydCwgZCA9IGMuZHVyYXRpb24gfHwgMDtcbiAgICAgIGlmIChvICYmIHIgPCB1IHx8IHIgPj0gdSArIGQpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIChoID0gYS5ldmVudCkgIT0gbnVsbCAmJiBoLmFwcGVuZEluUGxhY2UgJiYgKHRoaXMuY2xlYXJJbnRlcnN0aXRpYWwoYS5ldmVudCwgYSksIHRoaXMuZmx1c2hGcm9udEJ1ZmZlcihyKSksIHRoaXMuc2V0U2NoZWR1bGVUb0Fzc2V0QXRUaW1lKHIsIGMpO1xuICAgICAgfVxuICAgIH0sIHRoaXMub25UaW1ldXBkYXRlID0gKCkgPT4ge1xuICAgICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRpbWU7XG4gICAgICBpZiAociA9PT0gdm9pZCAwIHx8IHRoaXMucGxheWJhY2tEaXNhYmxlZClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKHIgPiB0aGlzLnRpbWVsaW5lUG9zKVxuICAgICAgICB0aGlzLnRpbWVsaW5lUG9zID0gciwgciA+IHRoaXMuYnVmZmVyZWRQb3MgJiYgdGhpcy5jaGVja0J1ZmZlcigpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBuID0gdGhpcy5wbGF5aW5nSXRlbTtcbiAgICAgIGlmICghbiB8fCB0aGlzLnBsYXlpbmdMYXN0SXRlbSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKHIgPj0gbi5lbmQpIHtcbiAgICAgICAgdGhpcy50aW1lbGluZVBvcyA9IG4uZW5kO1xuICAgICAgICBjb25zdCBhID0gdGhpcy5maW5kSXRlbUluZGV4KG4pO1xuICAgICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24oYSArIDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgaSA9IHRoaXMucGxheWluZ0Fzc2V0O1xuICAgICAgaWYgKCFpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvID0gaS50aW1lbGluZVN0YXJ0ICsgKGkuZHVyYXRpb24gfHwgMCk7XG4gICAgICByID49IG8gJiYgdGhpcy5zZXRTY2hlZHVsZVRvQXNzZXRBdFRpbWUociwgaSk7XG4gICAgfSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gKHIsIG4pID0+IHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLnNjaGVkdWxlO1xuICAgICAgaWYgKCFpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvID0gdGhpcy5wbGF5aW5nSXRlbSwgYSA9IGkuZXZlbnRzIHx8IFtdLCBsID0gaS5pdGVtcyB8fCBbXSwgYyA9IGkuZHVyYXRpb25zLCB1ID0gci5tYXAoKHkpID0+IHkuaWRlbnRpZmllciksIGQgPSAhIShhLmxlbmd0aCB8fCB1Lmxlbmd0aCk7XG4gICAgICAoZCB8fCBuKSAmJiB0aGlzLmxvZyhgSU5URVJTVElUSUFMU19VUERBVEVEICgke2EubGVuZ3RofSk6ICR7YX1cblNjaGVkdWxlOiAke2wubWFwKCh5KSA9PiBrcih5KSl9IHBvczogJHt0aGlzLnRpbWVsaW5lUG9zfWApLCB1Lmxlbmd0aCAmJiB0aGlzLmxvZyhgUmVtb3ZlZCBldmVudHMgJHt1fWApO1xuICAgICAgbGV0IGggPSBudWxsLCBmID0gbnVsbDtcbiAgICAgIG8gJiYgKGggPSB0aGlzLnVwZGF0ZUl0ZW0obywgdGhpcy50aW1lbGluZVBvcyksIHRoaXMuaXRlbXNNYXRjaChvLCBoKSA/IHRoaXMucGxheWluZ0l0ZW0gPSBoIDogdGhpcy53YWl0aW5nSXRlbSA9IHRoaXMuZW5kZWRJdGVtID0gbnVsbCksIHRoaXMud2FpdGluZ0l0ZW0gPSB0aGlzLnVwZGF0ZUl0ZW0odGhpcy53YWl0aW5nSXRlbSksIHRoaXMuZW5kZWRJdGVtID0gdGhpcy51cGRhdGVJdGVtKHRoaXMuZW5kZWRJdGVtKTtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLmJ1ZmZlcmluZ0l0ZW07XG4gICAgICBpZiAocCAmJiAoZiA9IHRoaXMudXBkYXRlSXRlbShwLCB0aGlzLmJ1ZmZlcmVkUG9zKSwgdGhpcy5pdGVtc01hdGNoKHAsIGYpID8gdGhpcy5idWZmZXJpbmdJdGVtID0gZiA6IHAuZXZlbnQgJiYgKHRoaXMuYnVmZmVyaW5nSXRlbSA9IHRoaXMucGxheWluZ0l0ZW0sIHRoaXMuY2xlYXJJbnRlcnN0aXRpYWwocC5ldmVudCwgbnVsbCkpKSwgci5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICAgIHkuYXNzZXRMaXN0LmZvckVhY2goKEUpID0+IHtcbiAgICAgICAgICB0aGlzLmNsZWFyQXNzZXRQbGF5ZXIoRS5pZGVudGlmaWVyLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSwgdGhpcy5wbGF5ZXJRdWV1ZS5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICAgIGlmICh5LmludGVyc3RpdGlhbC5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgRSA9IHkuYXNzZXRJdGVtLnRpbWVsaW5lU3RhcnQsIGIgPSB5LnRpbWVsaW5lT2Zmc2V0IC0gRTtcbiAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHkudGltZWxpbmVPZmZzZXQgPSBFO1xuICAgICAgICAgICAgfSBjYXRjaCAoUikge1xuICAgICAgICAgICAgICBNYXRoLmFicyhiKSA+IFJuICYmIHRoaXMud2FybihgJHtSfSAoXCIke3kuYXNzZXRJZH1cIiAke3kudGltZWxpbmVPZmZzZXR9LT4ke0V9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwgZCB8fCBuKSB7XG4gICAgICAgIGlmICh0aGlzLmhscy50cmlnZ2VyKEkuSU5URVJTVElUSUFMU19VUERBVEVELCB7XG4gICAgICAgICAgZXZlbnRzOiBhLnNsaWNlKDApLFxuICAgICAgICAgIHNjaGVkdWxlOiBsLnNsaWNlKDApLFxuICAgICAgICAgIGR1cmF0aW9uczogYyxcbiAgICAgICAgICByZW1vdmVkSWRzOiB1XG4gICAgICAgIH0pLCB0aGlzLmlzSW50ZXJzdGl0aWFsKG8pICYmIHUuaW5jbHVkZXMoby5ldmVudC5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMud2FybihgSW50ZXJzdGl0aWFsIFwiJHtvLmV2ZW50LmlkZW50aWZpZXJ9XCIgcmVtb3ZlZCB3aGlsZSBwbGF5aW5nYCksIHRoaXMucHJpbWFyeUZhbGxiYWNrKG8uZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvICYmIHRoaXMudHJpbUluUGxhY2UoaCwgbyksIHAgJiYgZiAhPT0gaCAmJiB0aGlzLnRyaW1JblBsYWNlKGYsIHApLCB0aGlzLmNoZWNrQnVmZmVyKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLkhsc1BsYXllckNsYXNzID0gdCwgdGhpcy5hc3NldExpc3RMb2FkZXIgPSBuZXcgRXcoZSksIHRoaXMuc2NoZWR1bGUgPSBuZXcgdncodGhpcy5vblNjaGVkdWxlVXBkYXRlLCBlLmxvZ2dlciksIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZSAmJiAoZS5vbihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfU1dJVENISU5HLCB0aGlzLm9uQXVkaW9UcmFja1N3aXRjaGluZywgdGhpcyksIGUub24oSS5BVURJT19UUkFDS19VUERBVEVELCB0aGlzLm9uQXVkaW9UcmFja1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB0aGlzLm9uU3VidGl0bGVUcmFja1N3aXRjaCwgdGhpcyksIGUub24oSS5TVUJUSVRMRV9UUkFDS19VUERBVEVELCB0aGlzLm9uU3VidGl0bGVUcmFja1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRVZFTlRfQ1VFX0VOVEVSLCB0aGlzLm9uSW50ZXJzdGl0aWFsQ3VlRW50ZXIsIHRoaXMpLCBlLm9uKEkuQVNTRVRfTElTVF9MT0FERUQsIHRoaXMub25Bc3NldExpc3RMb2FkZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0FQUEVOREVELCB0aGlzLm9uQnVmZmVyQXBwZW5kZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0ZMVVNIRUQsIHRoaXMub25CdWZmZXJGbHVzaGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUkVEX1RPX0VORCwgdGhpcy5vbkJ1ZmZlcmVkVG9FbmQsIHRoaXMpLCBlLm9uKEkuTUVESUFfRU5ERUQsIHRoaXMub25NZWRpYUVuZGVkLCB0aGlzKSwgZS5vbihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpLCBlLm9uKEkuREVTVFJPWUlORywgdGhpcy5vbkRlc3Ryb3lpbmcsIHRoaXMpKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscztcbiAgICBlICYmIChlLm9mZihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5MRVZFTF9VUERBVEVELCB0aGlzLm9uTGV2ZWxVcGRhdGVkLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19TV0lUQ0hJTkcsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoaW5nLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19VUERBVEVELCB0aGlzLm9uQXVkaW9UcmFja1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLX1NXSVRDSCwgdGhpcy5vblN1YnRpdGxlVHJhY2tTd2l0Y2gsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrVXBkYXRlZCwgdGhpcyksIGUub2ZmKEkuRVZFTlRfQ1VFX0VOVEVSLCB0aGlzLm9uSW50ZXJzdGl0aWFsQ3VlRW50ZXIsIHRoaXMpLCBlLm9mZihJLkFTU0VUX0xJU1RfTE9BREVELCB0aGlzLm9uQXNzZXRMaXN0TG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQ09ERUNTLCB0aGlzLm9uQnVmZmVyQ29kZWNzLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNIRUQsIHRoaXMub25CdWZmZXJGbHVzaGVkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJFRF9UT19FTkQsIHRoaXMub25CdWZmZXJlZFRvRW5kLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9FTkRFRCwgdGhpcy5vbk1lZGlhRW5kZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpLCBlLm9mZihJLkRFU1RST1lJTkcsIHRoaXMub25EZXN0cm95aW5nLCB0aGlzKSk7XG4gIH1cbiAgc3RhcnRMb2FkKCkge1xuICAgIHRoaXMucmVzdW1lQnVmZmVyaW5nKCk7XG4gIH1cbiAgc3RvcExvYWQoKSB7XG4gICAgdGhpcy5wYXVzZUJ1ZmZlcmluZygpO1xuICB9XG4gIHJlc3VtZUJ1ZmZlcmluZygpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMuZ2V0QnVmZmVyaW5nUGxheWVyKCkpID09IG51bGwgfHwgZS5yZXN1bWVCdWZmZXJpbmcoKTtcbiAgfVxuICBwYXVzZUJ1ZmZlcmluZygpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMuZ2V0QnVmZmVyaW5nUGxheWVyKCkpID09IG51bGwgfHwgZS5wYXVzZUJ1ZmZlcmluZygpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5hc3NldExpc3RMb2FkZXIgJiYgdGhpcy5hc3NldExpc3RMb2FkZXIuZGVzdHJveSgpLCB0aGlzLmVtcHR5UGxheWVyUXVldWUoKSwgdGhpcy5jbGVhclNjaGVkdWxlU3RhdGUoKSwgdGhpcy5zY2hlZHVsZSAmJiB0aGlzLnNjaGVkdWxlLmRlc3Ryb3koKSwgdGhpcy5tZWRpYSA9IHRoaXMuZGV0YWNoZWREYXRhID0gdGhpcy5tZWRpYVNlbGVjdGlvbiA9IHRoaXMucmVxdWlyZWRUcmFja3MgPSB0aGlzLmFsdFNlbGVjdGlvbiA9IHRoaXMuc2NoZWR1bGUgPSB0aGlzLm1hbmFnZXIgPSBudWxsLCB0aGlzLmhscyA9IHRoaXMuSGxzUGxheWVyQ2xhc3MgPSB0aGlzLmxvZyA9IG51bGwsIHRoaXMuYXNzZXRMaXN0TG9hZGVyID0gbnVsbCwgdGhpcy5vblBsYXkgPSB0aGlzLm9uUGF1c2UgPSB0aGlzLm9uU2Vla2luZyA9IHRoaXMub25UaW1ldXBkYXRlID0gbnVsbCwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbiAgfVxuICBvbkRlc3Ryb3lpbmcoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucHJpbWFyeU1lZGlhIHx8IHRoaXMubWVkaWE7XG4gICAgZSAmJiB0aGlzLnJlbW92ZU1lZGlhTGlzdGVuZXJzKGUpO1xuICB9XG4gIHJlbW92ZU1lZGlhTGlzdGVuZXJzKGUpIHtcbiAgICBwcihlLCBcInBsYXlcIiwgdGhpcy5vblBsYXkpLCBwcihlLCBcInBhdXNlXCIsIHRoaXMub25QYXVzZSksIHByKGUsIFwic2Vla2luZ1wiLCB0aGlzLm9uU2Vla2luZyksIHByKGUsIFwidGltZXVwZGF0ZVwiLCB0aGlzLm9uVGltZXVwZGF0ZSk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMubWVkaWEgPSB0Lm1lZGlhO1xuICAgIGNyKHIsIFwic2Vla2luZ1wiLCB0aGlzLm9uU2Vla2luZyksIGNyKHIsIFwidGltZXVwZGF0ZVwiLCB0aGlzLm9uVGltZXVwZGF0ZSksIGNyKHIsIFwicGxheVwiLCB0aGlzLm9uUGxheSksIGNyKHIsIFwicGF1c2VcIiwgdGhpcy5vblBhdXNlKTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmVmZmVjdGl2ZVBsYXlpbmdJdGVtLCBuID0gdGhpcy5kZXRhY2hlZERhdGE7XG4gICAgaWYgKHRoaXMuZGV0YWNoZWREYXRhID0gbnVsbCwgciA9PT0gbnVsbClcbiAgICAgIHRoaXMuY2hlY2tTdGFydCgpO1xuICAgIGVsc2UgaWYgKCFuKSB7XG4gICAgICB0aGlzLmNsZWFyU2NoZWR1bGVTdGF0ZSgpO1xuICAgICAgY29uc3QgaSA9IHRoaXMuZmluZEl0ZW1JbmRleChyKTtcbiAgICAgIHRoaXMuc2V0U2NoZWR1bGVQb3NpdGlvbihpKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJTY2hlZHVsZVN0YXRlKCkge1xuICAgIHRoaXMubG9nKFwiY2xlYXIgc2NoZWR1bGUgc3RhdGVcIiksIHRoaXMucGxheWluZ0l0ZW0gPSB0aGlzLmJ1ZmZlcmluZ0l0ZW0gPSB0aGlzLndhaXRpbmdJdGVtID0gdGhpcy5lbmRlZEl0ZW0gPSB0aGlzLnBsYXlpbmdBc3NldCA9IHRoaXMuZW5kZWRBc3NldCA9IHRoaXMuYnVmZmVyaW5nQXNzZXQgPSBudWxsO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAhIXQudHJhbnNmZXJNZWRpYSwgbiA9IHRoaXMubWVkaWE7XG4gICAgaWYgKHRoaXMubWVkaWEgPSBudWxsLCAhciAmJiAobiAmJiB0aGlzLnJlbW92ZU1lZGlhTGlzdGVuZXJzKG4pLCB0aGlzLmRldGFjaGVkRGF0YSkpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmdldEJ1ZmZlcmluZ1BsYXllcigpO1xuICAgICAgaSAmJiAodGhpcy5sb2coYFJlbW92aW5nIHNjaGVkdWxlIHN0YXRlIGZvciBkZXRhY2hlZERhdGEgYW5kICR7aX1gKSwgdGhpcy5wbGF5aW5nQXNzZXQgPSB0aGlzLmVuZGVkQXNzZXQgPSB0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID0gdGhpcy5idWZmZXJpbmdJdGVtID0gdGhpcy53YWl0aW5nSXRlbSA9IHRoaXMuZGV0YWNoZWREYXRhID0gbnVsbCwgaS5kZXRhY2hNZWRpYSgpKSwgdGhpcy5zaG91bGRQbGF5ID0gITE7XG4gICAgfVxuICB9XG4gIGdldCBpbnRlcnN0aXRpYWxzTWFuYWdlcigpIHtcbiAgICBpZiAoIXRoaXMuaGxzKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubWFuYWdlcilcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXI7XG4gICAgY29uc3QgZSA9IHRoaXMsIHQgPSAoKSA9PiBlLmJ1ZmZlcmluZ0l0ZW0gfHwgZS53YWl0aW5nSXRlbSwgciA9IChkKSA9PiBkICYmIGUuZ2V0QXNzZXRQbGF5ZXIoZC5pZGVudGlmaWVyKSwgbiA9IChkLCBoLCBmLCBwLCB5KSA9PiB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICBsZXQgRSA9IGRbaF0uc3RhcnQ7XG4gICAgICAgIGNvbnN0IGIgPSBkLmV2ZW50O1xuICAgICAgICBpZiAoYikge1xuICAgICAgICAgIGlmIChoID09PSBcInBsYXlvdXRcIiB8fCBiLnRpbWVsaW5lT2NjdXBhbmN5ICE9PSBpYS5Qb2ludCkge1xuICAgICAgICAgICAgY29uc3QgUiA9IHIoZik7XG4gICAgICAgICAgICAoUiA9PSBudWxsID8gdm9pZCAwIDogUi5pbnRlcnN0aXRpYWwpID09PSBiICYmIChFICs9IFIuYXNzZXRJdGVtLnN0YXJ0T2Zmc2V0ICsgUlt5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IFIgPSBwID09PSBcImJ1ZmZlcmVkUG9zXCIgPyBvKCkgOiBlW3BdO1xuICAgICAgICAgIEUgKz0gUiAtIGQuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEU7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9LCBpID0gKGQsIGgpID0+IHtcbiAgICAgIHZhciBmO1xuICAgICAgaWYgKGQgIT09IDAgJiYgaCAhPT0gXCJwcmltYXJ5XCIgJiYgKGYgPSBlLnNjaGVkdWxlKSAhPSBudWxsICYmIGYubGVuZ3RoKSB7XG4gICAgICAgIHZhciBwO1xuICAgICAgICBjb25zdCB5ID0gZS5zY2hlZHVsZS5maW5kSXRlbUluZGV4QXRUaW1lKGQpLCBFID0gKHAgPSBlLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogcFt5XTtcbiAgICAgICAgaWYgKEUpIHtcbiAgICAgICAgICBjb25zdCBiID0gRVtoXS5zdGFydCAtIEUuc3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIGQgKyBiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZDtcbiAgICB9LCBvID0gKCkgPT4ge1xuICAgICAgY29uc3QgZCA9IGUuYnVmZmVyZWRQb3M7XG4gICAgICByZXR1cm4gZCA9PT0gTnVtYmVyLk1BWF9WQUxVRSA/IGEoXCJwcmltYXJ5XCIpIDogTWF0aC5tYXgoZCwgMCk7XG4gICAgfSwgYSA9IChkKSA9PiB7XG4gICAgICB2YXIgaCwgZjtcbiAgICAgIHJldHVybiAoaCA9IGUucHJpbWFyeURldGFpbHMpICE9IG51bGwgJiYgaC5saXZlID8gZS5wcmltYXJ5RGV0YWlscy5lZGdlIDogKChmID0gZS5zY2hlZHVsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGYuZHVyYXRpb25zW2RdKSB8fCAwO1xuICAgIH0sIGwgPSAoZCwgaCkgPT4ge1xuICAgICAgdmFyIGYsIHA7XG4gICAgICBjb25zdCB5ID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgIGlmICh5ICE9IG51bGwgJiYgKGYgPSB5LmV2ZW50KSAhPSBudWxsICYmIGYucmVzdHJpY3Rpb25zLnNraXAgfHwgIWUuc2NoZWR1bGUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGUubG9nKGBzZWVrIHRvICR7ZH0gXCIke2h9XCJgKTtcbiAgICAgIGNvbnN0IEUgPSBlLmVmZmVjdGl2ZVBsYXlpbmdJdGVtLCBiID0gZS5zY2hlZHVsZS5maW5kSXRlbUluZGV4QXRUaW1lKGQsIGgpLCBSID0gKHAgPSBlLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogcFtiXSwgQSA9IGUuZ2V0QnVmZmVyaW5nUGxheWVyKCksIEYgPSBBID09IG51bGwgPyB2b2lkIDAgOiBBLmludGVyc3RpdGlhbCwgTSA9IEYgPT0gbnVsbCA/IHZvaWQgMCA6IEYuYXBwZW5kSW5QbGFjZSwgSCA9IEUgJiYgZS5pdGVtc01hdGNoKEUsIFIpO1xuICAgICAgaWYgKEUgJiYgKE0gfHwgSCkpIHtcbiAgICAgICAgY29uc3QgSyA9IHIoZS5wbGF5aW5nQXNzZXQpLCBqID0gKEsgPT0gbnVsbCA/IHZvaWQgMCA6IEsubWVkaWEpIHx8IGUucHJpbWFyeU1lZGlhO1xuICAgICAgICBpZiAoaikge1xuICAgICAgICAgIGNvbnN0IEMgPSBoID09PSBcInByaW1hcnlcIiA/IGouY3VycmVudFRpbWUgOiBuKEUsIGgsIGUucGxheWluZ0Fzc2V0LCBcInRpbWVsaW5lUG9zXCIsIFwiY3VycmVudFRpbWVcIiksIGsgPSBkIC0gQywgJCA9IChNID8gQyA6IGouY3VycmVudFRpbWUpICsgaztcbiAgICAgICAgICBpZiAoJCA+PSAwICYmICghSyB8fCBNIHx8ICQgPD0gSy5kdXJhdGlvbikpIHtcbiAgICAgICAgICAgIGouY3VycmVudFRpbWUgPSAkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFIpIHtcbiAgICAgICAgbGV0IEsgPSBkO1xuICAgICAgICBpZiAoaCAhPT0gXCJwcmltYXJ5XCIpIHtcbiAgICAgICAgICBjb25zdCBDID0gUltoXS5zdGFydCwgayA9IGQgLSBDO1xuICAgICAgICAgIEsgPSBSLnN0YXJ0ICsgaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqID0gIWUuaXNJbnRlcnN0aXRpYWwoUik7XG4gICAgICAgIGlmICgoIWUuaXNJbnRlcnN0aXRpYWwoRSkgfHwgRS5ldmVudC5hcHBlbmRJblBsYWNlKSAmJiAoaiB8fCBSLmV2ZW50LmFwcGVuZEluUGxhY2UpKSB7XG4gICAgICAgICAgY29uc3QgQyA9IGUubWVkaWEgfHwgKE0gPyBBID09IG51bGwgPyB2b2lkIDAgOiBBLm1lZGlhIDogbnVsbCk7XG4gICAgICAgICAgQyAmJiAoQy5jdXJyZW50VGltZSA9IEspO1xuICAgICAgICB9IGVsc2UgaWYgKEUpIHtcbiAgICAgICAgICBjb25zdCBDID0gZS5maW5kSXRlbUluZGV4KEUpO1xuICAgICAgICAgIGlmIChiID4gQykge1xuICAgICAgICAgICAgY29uc3QgJCA9IGUuc2NoZWR1bGUuZmluZEp1bXBSZXN0cmljdGVkSW5kZXgoQyArIDEsIGIpO1xuICAgICAgICAgICAgaWYgKCQgPiBDKSB7XG4gICAgICAgICAgICAgIGUuc2V0U2NoZWR1bGVQb3NpdGlvbigkKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgICAgaWYgKGopXG4gICAgICAgICAgICBlLnRpbWVsaW5lUG9zID0gSywgZS5jaGVja0J1ZmZlcigpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgJCA9IFIuZXZlbnQuYXNzZXRMaXN0LCBXID0gZCAtIChSW2hdIHx8IFIpLnN0YXJ0O1xuICAgICAgICAgICAgZm9yIChsZXQgXyA9ICQubGVuZ3RoOyBfLS07ICkge1xuICAgICAgICAgICAgICBjb25zdCBnID0gJFtfXTtcbiAgICAgICAgICAgICAgaWYgKGcuZHVyYXRpb24gJiYgVyA+PSBnLnN0YXJ0T2Zmc2V0ICYmIFcgPCBnLnN0YXJ0T2Zmc2V0ICsgZy5kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGsgPSBfO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGUuc2V0U2NoZWR1bGVQb3NpdGlvbihiLCBrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgIGlmIChlLmlzSW50ZXJzdGl0aWFsKGQpKVxuICAgICAgICByZXR1cm4gZDtcbiAgICAgIGNvbnN0IGggPSB0KCk7XG4gICAgICByZXR1cm4gZS5pc0ludGVyc3RpdGlhbChoKSA/IGggOiBudWxsO1xuICAgIH0sIHUgPSB7XG4gICAgICBnZXQgYnVmZmVyZWRFbmQoKSB7XG4gICAgICAgIGNvbnN0IGQgPSB0KCksIGggPSBlLmJ1ZmZlcmluZ0l0ZW07XG4gICAgICAgIGlmIChoICYmIGggPT09IGQpIHtcbiAgICAgICAgICB2YXIgZjtcbiAgICAgICAgICByZXR1cm4gbihoLCBcInBsYXlvdXRcIiwgZS5idWZmZXJpbmdBc3NldCwgXCJidWZmZXJlZFBvc1wiLCBcImJ1ZmZlcmVkRW5kXCIpIC0gaC5wbGF5b3V0LnN0YXJ0IHx8ICgoZiA9IGUuYnVmZmVyaW5nQXNzZXQpID09IG51bGwgPyB2b2lkIDAgOiBmLnN0YXJ0T2Zmc2V0KSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICAgIGdldCBjdXJyZW50VGltZSgpIHtcbiAgICAgICAgY29uc3QgZCA9IGMoKSwgaCA9IGUuZWZmZWN0aXZlUGxheWluZ0l0ZW07XG4gICAgICAgIHJldHVybiBoICYmIGggPT09IGQgPyBuKGgsIFwicGxheW91dFwiLCBlLmVmZmVjdGl2ZVBsYXlpbmdBc3NldCwgXCJ0aW1lbGluZVBvc1wiLCBcImN1cnJlbnRUaW1lXCIpIC0gaC5wbGF5b3V0LnN0YXJ0IDogMDtcbiAgICAgIH0sXG4gICAgICBzZXQgY3VycmVudFRpbWUoZCkge1xuICAgICAgICBjb25zdCBoID0gYygpLCBmID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgICAgZiAmJiBmID09PSBoICYmIGwoZCArIGYucGxheW91dC5zdGFydCwgXCJwbGF5b3V0XCIpO1xuICAgICAgfSxcbiAgICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZCA9IGMoKTtcbiAgICAgICAgcmV0dXJuIGQgPyBkLnBsYXlvdXQuZW5kIC0gZC5wbGF5b3V0LnN0YXJ0IDogMDtcbiAgICAgIH0sXG4gICAgICBnZXQgYXNzZXRQbGF5ZXJzKCkge1xuICAgICAgICB2YXIgZDtcbiAgICAgICAgY29uc3QgaCA9IChkID0gYygpKSA9PSBudWxsID8gdm9pZCAwIDogZC5ldmVudC5hc3NldExpc3Q7XG4gICAgICAgIHJldHVybiBoID8gaC5tYXAoKGYpID0+IGUuZ2V0QXNzZXRQbGF5ZXIoZi5pZGVudGlmaWVyKSkgOiBbXTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGxheWluZ0luZGV4KCkge1xuICAgICAgICB2YXIgZDtcbiAgICAgICAgY29uc3QgaCA9IChkID0gYygpKSA9PSBudWxsID8gdm9pZCAwIDogZC5ldmVudDtcbiAgICAgICAgcmV0dXJuIGggJiYgZS5lZmZlY3RpdmVQbGF5aW5nQXNzZXQgPyBoLmZpbmRBc3NldEluZGV4KGUuZWZmZWN0aXZlUGxheWluZ0Fzc2V0KSA6IC0xO1xuICAgICAgfSxcbiAgICAgIGdldCBzY2hlZHVsZUl0ZW0oKSB7XG4gICAgICAgIHJldHVybiBjKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyID0ge1xuICAgICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgICAgdmFyIGQ7XG4gICAgICAgIHJldHVybiAoKGQgPSBlLnNjaGVkdWxlKSA9PSBudWxsIHx8IChkID0gZC5ldmVudHMpID09IG51bGwgPyB2b2lkIDAgOiBkLnNsaWNlKDApKSB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBnZXQgc2NoZWR1bGUoKSB7XG4gICAgICAgIHZhciBkO1xuICAgICAgICByZXR1cm4gKChkID0gZS5zY2hlZHVsZSkgPT0gbnVsbCB8fCAoZCA9IGQuaXRlbXMpID09IG51bGwgPyB2b2lkIDAgOiBkLnNsaWNlKDApKSB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBnZXQgaW50ZXJzdGl0aWFsUGxheWVyKCkge1xuICAgICAgICByZXR1cm4gYygpID8gdSA6IG51bGw7XG4gICAgICB9LFxuICAgICAgZ2V0IHBsYXllclF1ZXVlKCkge1xuICAgICAgICByZXR1cm4gZS5wbGF5ZXJRdWV1ZS5zbGljZSgwKTtcbiAgICAgIH0sXG4gICAgICBnZXQgYnVmZmVyaW5nQXNzZXQoKSB7XG4gICAgICAgIHJldHVybiBlLmJ1ZmZlcmluZ0Fzc2V0O1xuICAgICAgfSxcbiAgICAgIGdldCBidWZmZXJpbmdJdGVtKCkge1xuICAgICAgICByZXR1cm4gdCgpO1xuICAgICAgfSxcbiAgICAgIGdldCBidWZmZXJpbmdJbmRleCgpIHtcbiAgICAgICAgY29uc3QgZCA9IHQoKTtcbiAgICAgICAgcmV0dXJuIGUuZmluZEl0ZW1JbmRleChkKTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGxheWluZ0Fzc2V0KCkge1xuICAgICAgICByZXR1cm4gZS5lZmZlY3RpdmVQbGF5aW5nQXNzZXQ7XG4gICAgICB9LFxuICAgICAgZ2V0IHBsYXlpbmdJdGVtKCkge1xuICAgICAgICByZXR1cm4gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGxheWluZ0luZGV4KCkge1xuICAgICAgICBjb25zdCBkID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgICAgcmV0dXJuIGUuZmluZEl0ZW1JbmRleChkKTtcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5OiB7XG4gICAgICAgIGdldCBidWZmZXJlZEVuZCgpIHtcbiAgICAgICAgICByZXR1cm4gbygpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGUudGltZWxpbmVQb3M7XG4gICAgICAgICAgcmV0dXJuIGQgPiAwID8gZCA6IDA7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjdXJyZW50VGltZShkKSB7XG4gICAgICAgICAgbChkLCBcInByaW1hcnlcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYShcInByaW1hcnlcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBzZWVrYWJsZVN0YXJ0KCkge1xuICAgICAgICAgIHZhciBkO1xuICAgICAgICAgIHJldHVybiAoKGQgPSBlLnByaW1hcnlEZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogZC5mcmFnbWVudFN0YXJ0KSB8fCAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW50ZWdyYXRlZDoge1xuICAgICAgICBnZXQgYnVmZmVyZWRFbmQoKSB7XG4gICAgICAgICAgcmV0dXJuIG4odCgpLCBcImludGVncmF0ZWRcIiwgZS5idWZmZXJpbmdBc3NldCwgXCJidWZmZXJlZFBvc1wiLCBcImJ1ZmZlcmVkRW5kXCIpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgICAgcmV0dXJuIG4oZS5lZmZlY3RpdmVQbGF5aW5nSXRlbSwgXCJpbnRlZ3JhdGVkXCIsIGUuZWZmZWN0aXZlUGxheWluZ0Fzc2V0LCBcInRpbWVsaW5lUG9zXCIsIFwiY3VycmVudFRpbWVcIik7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjdXJyZW50VGltZShkKSB7XG4gICAgICAgICAgbChkLCBcImludGVncmF0ZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYShcImludGVncmF0ZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBzZWVrYWJsZVN0YXJ0KCkge1xuICAgICAgICAgIHZhciBkO1xuICAgICAgICAgIHJldHVybiBpKCgoZCA9IGUucHJpbWFyeURldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBkLmZyYWdtZW50U3RhcnQpIHx8IDAsIFwiaW50ZWdyYXRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNraXA6ICgpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IGUuZWZmZWN0aXZlUGxheWluZ0l0ZW0sIGggPSBkID09IG51bGwgPyB2b2lkIDAgOiBkLmV2ZW50O1xuICAgICAgICBpZiAoaCAmJiAhaC5yZXN0cmljdGlvbnMuc2tpcCkge1xuICAgICAgICAgIGNvbnN0IGYgPSBlLmZpbmRJdGVtSW5kZXgoZCk7XG4gICAgICAgICAgaWYgKGguYXBwZW5kSW5QbGFjZSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IGQucGxheW91dC5zdGFydCArIGQuZXZlbnQuZHVyYXRpb247XG4gICAgICAgICAgICBsKHAgKyAxZS0zLCBcInBsYXlvdXRcIik7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBlLmFkdmFuY2VBZnRlckFzc2V0RW5kZWQoaCwgZiwgMSAvIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICAvLyBTY2hlZHVsZSBnZXR0ZXJzXG4gIGdldCBlZmZlY3RpdmVQbGF5aW5nSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy53YWl0aW5nSXRlbSB8fCB0aGlzLnBsYXlpbmdJdGVtIHx8IHRoaXMuZW5kZWRJdGVtO1xuICB9XG4gIGdldCBlZmZlY3RpdmVQbGF5aW5nQXNzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWluZ0Fzc2V0IHx8IHRoaXMuZW5kZWRBc3NldDtcbiAgfVxuICBnZXQgcGxheWluZ0xhc3RJdGVtKCkge1xuICAgIHZhciBlO1xuICAgIGNvbnN0IHQgPSB0aGlzLnBsYXlpbmdJdGVtLCByID0gKGUgPSB0aGlzLnNjaGVkdWxlKSA9PSBudWxsID8gdm9pZCAwIDogZS5pdGVtcztcbiAgICByZXR1cm4gIXRoaXMucGxheWJhY2tTdGFydGVkIHx8ICF0IHx8ICFyID8gITEgOiB0aGlzLmZpbmRJdGVtSW5kZXgodCkgPT09IHIubGVuZ3RoIC0gMTtcbiAgfVxuICBnZXQgcGxheWJhY2tTdGFydGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVmZmVjdGl2ZVBsYXlpbmdJdGVtICE9PSBudWxsO1xuICB9XG4gIC8vIE1lZGlhIGdldHRlcnMgYW5kIGV2ZW50IGNhbGxiYWNrc1xuICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgdmFyIGUsIHQ7XG4gICAgaWYgKHRoaXMubWVkaWFTZWxlY3Rpb24gPT09IG51bGwpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMud2FpdGluZ0l0ZW0gfHwgdGhpcy5wbGF5aW5nSXRlbTtcbiAgICBpZiAodGhpcy5pc0ludGVyc3RpdGlhbChyKSAmJiAhci5ldmVudC5hcHBlbmRJblBsYWNlKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBuID0gdGhpcy5tZWRpYTtcbiAgICAhbiAmJiAoZSA9IHRoaXMuYnVmZmVyaW5nSXRlbSkgIT0gbnVsbCAmJiAoZSA9IGUuZXZlbnQpICE9IG51bGwgJiYgZS5hcHBlbmRJblBsYWNlICYmIChuID0gdGhpcy5wcmltYXJ5TWVkaWEpO1xuICAgIGNvbnN0IGkgPSAodCA9IG4pID09IG51bGwgPyB2b2lkIDAgOiB0LmN1cnJlbnRUaW1lO1xuICAgIGlmICghKGkgPT09IHZvaWQgMCB8fCAhdWUoaSkpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgZ2V0IHByaW1hcnlNZWRpYSgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gdGhpcy5tZWRpYSB8fCAoKGUgPSB0aGlzLmRldGFjaGVkRGF0YSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWVkaWEpIHx8IG51bGw7XG4gIH1cbiAgaXNJbnRlcnN0aXRpYWwoZSkge1xuICAgIHJldHVybiAhIShlICE9IG51bGwgJiYgZS5ldmVudCk7XG4gIH1cbiAgcmV0cmVpdmVNZWRpYVNvdXJjZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZSk7XG4gICAgciAmJiB0aGlzLnRyYW5zZmVyTWVkaWFGcm9tUGxheWVyKHIsIHQpO1xuICB9XG4gIHRyYW5zZmVyTWVkaWFGcm9tUGxheWVyKGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5pbnRlcnN0aXRpYWwuYXBwZW5kSW5QbGFjZSwgbiA9IGUubWVkaWE7XG4gICAgaWYgKHIgJiYgbiA9PT0gdGhpcy5wcmltYXJ5TWVkaWEpIHtcbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID0gbnVsbCwgKCF0IHx8IHRoaXMuaXNJbnRlcnN0aXRpYWwodCkgJiYgIXQuZXZlbnQuYXBwZW5kSW5QbGFjZSkgJiYgdCAmJiBuKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoZWREYXRhID0ge1xuICAgICAgICAgIG1lZGlhOiBuXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSBlLnRyYW5zZmVyTWVkaWEoKTtcbiAgICAgIHRoaXMubG9nKGB0cmFuc2ZlciBNZWRpYVNvdXJjZSBmcm9tICR7ZX0gJHthdChpKX1gKSwgdGhpcy5kZXRhY2hlZERhdGEgPSBpO1xuICAgIH0gZWxzZSB0ICYmIG4gJiYgKHRoaXMuc2hvdWxkUGxheSB8fCAodGhpcy5zaG91bGRQbGF5ID0gIW4ucGF1c2VkKSk7XG4gIH1cbiAgdHJhbnNmZXJNZWRpYVRvKGUsIHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICBpZiAoZS5tZWRpYSA9PT0gdClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgaSA9IG51bGw7XG4gICAgY29uc3QgbyA9IHRoaXMuaGxzLCBhID0gZSAhPT0gbywgbCA9IGEgJiYgZS5pbnRlcnN0aXRpYWwuYXBwZW5kSW5QbGFjZSwgYyA9IChyID0gdGhpcy5kZXRhY2hlZERhdGEpID09IG51bGwgPyB2b2lkIDAgOiByLm1lZGlhU291cmNlO1xuICAgIGxldCB1O1xuICAgIGlmIChvLm1lZGlhKVxuICAgICAgbCAmJiAoaSA9IG8udHJhbnNmZXJNZWRpYSgpLCB0aGlzLmRldGFjaGVkRGF0YSA9IGkpLCB1ID0gXCJQcmltYXJ5XCI7XG4gICAgZWxzZSBpZiAoYykge1xuICAgICAgY29uc3QgcCA9IHRoaXMuZ2V0QnVmZmVyaW5nUGxheWVyKCk7XG4gICAgICBwID8gKGkgPSBwLnRyYW5zZmVyTWVkaWEoKSwgdSA9IGAke3B9YCkgOiB1ID0gXCJkZXRhY2hlZCBNZWRpYVNvdXJjZVwiO1xuICAgIH0gZWxzZVxuICAgICAgdSA9IFwiZGV0YWNoZWQgbWVkaWFcIjtcbiAgICBpZiAoIWkpIHtcbiAgICAgIGlmIChjKVxuICAgICAgICBpID0gdGhpcy5kZXRhY2hlZERhdGEsIHRoaXMubG9nKGB1c2luZyBkZXRhY2hlZERhdGE6IE1lZGlhU291cmNlICR7YXQoaSl9YCk7XG4gICAgICBlbHNlIGlmICghdGhpcy5kZXRhY2hlZERhdGEgfHwgby5tZWRpYSA9PT0gdCkge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wbGF5ZXJRdWV1ZTtcbiAgICAgICAgcC5sZW5ndGggPiAxICYmIHAuZm9yRWFjaCgoeSkgPT4ge1xuICAgICAgICAgIGlmIChhICYmIHkuaW50ZXJzdGl0aWFsLmFwcGVuZEluUGxhY2UgIT09IGwpIHtcbiAgICAgICAgICAgIGNvbnN0IEUgPSB5LmludGVyc3RpdGlhbDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnRlcnN0aXRpYWwoeS5pbnRlcnN0aXRpYWwsIG51bGwpLCBFLmFwcGVuZEluUGxhY2UgPSAhMSwgRS5hcHBlbmRJblBsYWNlICYmIHRoaXMud2FybihgQ291bGQgbm90IGNoYW5nZSBhcHBlbmQgc3RyYXRlZ3kgZm9yIHF1ZXVlZCBhc3NldHMgJHtFfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHRoaXMuaGxzLmRldGFjaE1lZGlhKCksIHRoaXMuZGV0YWNoZWREYXRhID0ge1xuICAgICAgICAgIG1lZGlhOiB0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGQgPSBpICYmIFwibWVkaWFTb3VyY2VcIiBpbiBpICYmICgobiA9IGkubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiBuLnJlYWR5U3RhdGUpICE9PSBcImNsb3NlZFwiLCBoID0gZCAmJiBpID8gaSA6IHQ7XG4gICAgdGhpcy5sb2coYCR7ZCA/IFwidHJhbnNmZXJpbmcgTWVkaWFTb3VyY2VcIiA6IFwiYXR0YWNoaW5nIG1lZGlhXCJ9IHRvICR7YSA/IGUgOiBcIlByaW1hcnlcIn0gZnJvbSAke3V9IChtZWRpYS5jdXJyZW50VGltZTogJHt0LmN1cnJlbnRUaW1lfSlgKTtcbiAgICBjb25zdCBmID0gdGhpcy5zY2hlZHVsZTtcbiAgICBpZiAoaCA9PT0gaSAmJiBmKSB7XG4gICAgICBjb25zdCBwID0gYSAmJiBlLmFzc2V0SWQgPT09IGYuYXNzZXRJZEF0RW5kO1xuICAgICAgaC5vdmVycmlkZXMgPSB7XG4gICAgICAgIGR1cmF0aW9uOiBmLmR1cmF0aW9uLFxuICAgICAgICBlbmRPZlN0cmVhbTogIWEgfHwgcCxcbiAgICAgICAgY3VlUmVtb3ZhbDogIWFcbiAgICAgIH07XG4gICAgfVxuICAgIGUuYXR0YWNoTWVkaWEoaCk7XG4gIH1cbiAgb25JbnRlcnN0aXRpYWxDdWVFbnRlcigpIHtcbiAgICB0aGlzLm9uVGltZXVwZGF0ZSgpO1xuICB9XG4gIC8vIFNjaGVkdWxpbmcgbWV0aG9kc1xuICBjaGVja1N0YXJ0KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnNjaGVkdWxlLCB0ID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS5ldmVudHM7XG4gICAgaWYgKCF0IHx8IHRoaXMucGxheWJhY2tEaXNhYmxlZCB8fCAhdGhpcy5tZWRpYSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlcmVkUG9zID09PSAtMSAmJiAodGhpcy5idWZmZXJlZFBvcyA9IDApO1xuICAgIGNvbnN0IHIgPSB0aGlzLnRpbWVsaW5lUG9zLCBuID0gdGhpcy5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICBpZiAociA9PT0gLTEpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmhscy5zdGFydFBvc2l0aW9uO1xuICAgICAgaWYgKHRoaXMubG9nKFFpKFwiY2hlY2tTdGFydFwiLCBpKSksIHRoaXMudGltZWxpbmVQb3MgPSBpLCB0Lmxlbmd0aCAmJiB0WzBdLmN1ZS5wcmUpIHtcbiAgICAgICAgY29uc3QgbyA9IGUuZmluZEV2ZW50SW5kZXgodFswXS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKG8pO1xuICAgICAgfSBlbHNlIGlmIChpID49IDAgfHwgIXRoaXMucHJpbWFyeUxpdmUpIHtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMudGltZWxpbmVQb3MgPSBpID4gMCA/IGkgOiAwLCBhID0gZS5maW5kSXRlbUluZGV4QXRUaW1lKG8pO1xuICAgICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24oYSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuICYmICF0aGlzLnBsYXlpbmdJdGVtKSB7XG4gICAgICBjb25zdCBpID0gZS5maW5kSXRlbUluZGV4KG4pO1xuICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKGkpO1xuICAgIH1cbiAgfVxuICBhZHZhbmNlQXNzZXRCdWZmZXJpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLmV2ZW50LCBuID0gci5maW5kQXNzZXRJbmRleCh0KSwgaSA9IFRsKHIsIG4pO1xuICAgIGlmICghci5pc0Fzc2V0UGFzdFBsYXlvdXRMaW1pdChpKSlcbiAgICAgIHRoaXMuYnVmZmVyZWRUb0V2ZW50KGUsIGkpO1xuICAgIGVsc2UgaWYgKHRoaXMuc2NoZWR1bGUpIHtcbiAgICAgIHZhciBvO1xuICAgICAgY29uc3QgYSA9IChvID0gdGhpcy5zY2hlZHVsZS5pdGVtcykgPT0gbnVsbCA/IHZvaWQgMCA6IG9bdGhpcy5maW5kSXRlbUluZGV4KGUpICsgMV07XG4gICAgICBhICYmIHRoaXMuYnVmZmVyZWRUb0l0ZW0oYSk7XG4gICAgfVxuICB9XG4gIGFkdmFuY2VBZnRlckFzc2V0RW5kZWQoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBUbChlLCByKTtcbiAgICBpZiAoZS5pc0Fzc2V0UGFzdFBsYXlvdXRMaW1pdChuKSkge1xuICAgICAgaWYgKHRoaXMuc2NoZWR1bGUpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuc2NoZWR1bGUuaXRlbXM7XG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgY29uc3QgbyA9IHQgKyAxLCBhID0gaS5sZW5ndGg7XG4gICAgICAgICAgaWYgKG8gPj0gYSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKC0xKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbCA9IGUucmVzdW1lVGltZTtcbiAgICAgICAgICB0aGlzLnRpbWVsaW5lUG9zIDwgbCAmJiAodGhpcy5sb2coUWkoXCJhZHZhbmNlQWZ0ZXJBc3NldEVuZGVkXCIsIGwpKSwgdGhpcy50aW1lbGluZVBvcyA9IGwsIGUuYXBwZW5kSW5QbGFjZSAmJiB0aGlzLmFkdmFuY2VJblBsYWNlKGwpLCB0aGlzLmNoZWNrQnVmZmVyKHRoaXMuYnVmZmVyZWRQb3MgPCBsKSksIHRoaXMuc2V0U2NoZWR1bGVQb3NpdGlvbihvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZS5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgIGNvbnN0IGkgPSBlLmFzc2V0TGlzdFtuXTtcbiAgICAgICAgaSAmJiB0aGlzLmFkdmFuY2VJblBsYWNlKGkudGltZWxpbmVTdGFydCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24odCwgbik7XG4gICAgfVxuICB9XG4gIHNldFNjaGVkdWxlVG9Bc3NldEF0VGltZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuc2NoZWR1bGU7XG4gICAgaWYgKCFyKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0LnBhcmVudElkZW50aWZpZXIsIGkgPSByLmdldEV2ZW50KG4pO1xuICAgIGlmIChpKSB7XG4gICAgICBjb25zdCBvID0gci5maW5kRXZlbnRJbmRleChuKSwgYSA9IHIuZmluZEFzc2V0SW5kZXgoaSwgZSk7XG4gICAgICB0aGlzLmFkdmFuY2VBZnRlckFzc2V0RW5kZWQoaSwgbywgYSAtIDEpO1xuICAgIH1cbiAgfVxuICBzZXRTY2hlZHVsZVBvc2l0aW9uKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gKHIgPSB0aGlzLnNjaGVkdWxlKSA9PSBudWxsID8gdm9pZCAwIDogci5pdGVtcztcbiAgICBpZiAoIW4gfHwgdGhpcy5wbGF5YmFja0Rpc2FibGVkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSBlID49IDAgPyBuW2VdIDogbnVsbDtcbiAgICB0aGlzLmxvZyhgc2V0U2NoZWR1bGVQb3NpdGlvbiAke2V9LCAke3R9ICgke2kgJiYga3IoaSl9KSBwb3M6ICR7dGhpcy50aW1lbGluZVBvc31gKTtcbiAgICBjb25zdCBvID0gdGhpcy53YWl0aW5nSXRlbSB8fCB0aGlzLnBsYXlpbmdJdGVtLCBhID0gdGhpcy5wbGF5aW5nTGFzdEl0ZW07XG4gICAgaWYgKHRoaXMuaXNJbnRlcnN0aXRpYWwobykpIHtcbiAgICAgIGNvbnN0IHUgPSBvLmV2ZW50LCBkID0gdGhpcy5wbGF5aW5nQXNzZXQsIGggPSBkID09IG51bGwgPyB2b2lkIDAgOiBkLmlkZW50aWZpZXIsIGYgPSBoID8gdGhpcy5nZXRBc3NldFBsYXllcihoKSA6IG51bGw7XG4gICAgICBpZiAoZiAmJiBoICYmICghdGhpcy5ldmVudEl0ZW1zTWF0Y2gobywgaSkgfHwgdCAhPT0gdm9pZCAwICYmIGggIT09IHUuYXNzZXRMaXN0W3RdLmlkZW50aWZpZXIpKSB7XG4gICAgICAgIHZhciBsO1xuICAgICAgICBjb25zdCBwID0gdS5maW5kQXNzZXRJbmRleChkKTtcbiAgICAgICAgaWYgKHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfQVNTRVRfRU5ERUQgJHtwICsgMX0vJHt1LmFzc2V0TGlzdC5sZW5ndGh9ICR7dm4oZCl9YCksIHRoaXMuZW5kZWRBc3NldCA9IGQsIHRoaXMucGxheWluZ0Fzc2V0ID0gbnVsbCwgdGhpcy5obHMudHJpZ2dlcihJLklOVEVSU1RJVElBTF9BU1NFVF9FTkRFRCwge1xuICAgICAgICAgIGFzc2V0OiBkLFxuICAgICAgICAgIGFzc2V0TGlzdEluZGV4OiBwLFxuICAgICAgICAgIGV2ZW50OiB1LFxuICAgICAgICAgIHNjaGVkdWxlOiBuLnNsaWNlKDApLFxuICAgICAgICAgIHNjaGVkdWxlSW5kZXg6IGUsXG4gICAgICAgICAgcGxheWVyOiBmXG4gICAgICAgIH0pLCBvICE9PSB0aGlzLnBsYXlpbmdJdGVtKSB7XG4gICAgICAgICAgdGhpcy5pdGVtc01hdGNoKG8sIHRoaXMucGxheWluZ0l0ZW0pICYmIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICAgICAgIXRoaXMucGxheWluZ0Fzc2V0ICYmIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh1LCB0aGlzLmZpbmRJdGVtSW5kZXgodGhpcy5wbGF5aW5nSXRlbSksIHApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldHJlaXZlTWVkaWFTb3VyY2UoaCwgaSksIGYubWVkaWEgJiYgISgobCA9IHRoaXMuZGV0YWNoZWREYXRhKSAhPSBudWxsICYmIGwubWVkaWFTb3VyY2UpICYmIGYuZGV0YWNoTWVkaWEoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5ldmVudEl0ZW1zTWF0Y2gobywgaSkgJiYgKHRoaXMuZW5kZWRJdGVtID0gbywgdGhpcy5wbGF5aW5nSXRlbSA9IG51bGwsIHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfRU5ERUQgJHt1fSAke2tyKG8pfWApLCB1Lmhhc1BsYXllZCA9ICEwLCB0aGlzLmhscy50cmlnZ2VyKEkuSU5URVJTVElUSUFMX0VOREVELCB7XG4gICAgICAgIGV2ZW50OiB1LFxuICAgICAgICBzY2hlZHVsZTogbi5zbGljZSgwKSxcbiAgICAgICAgc2NoZWR1bGVJbmRleDogZVxuICAgICAgfSksIHUuY3VlLm9uY2UpKSB7XG4gICAgICAgIHZhciBjO1xuICAgICAgICB0aGlzLnVwZGF0ZVNjaGVkdWxlKCk7XG4gICAgICAgIGNvbnN0IHAgPSAoYyA9IHRoaXMuc2NoZWR1bGUpID09IG51bGwgPyB2b2lkIDAgOiBjLml0ZW1zO1xuICAgICAgICBpZiAoaSAmJiBwKSB7XG4gICAgICAgICAgY29uc3QgeSA9IHRoaXMuZmluZEl0ZW1JbmRleChpKTtcbiAgICAgICAgICB0aGlzLmFkdmFuY2VTY2hlZHVsZSh5LCBwLCB0LCBvLCBhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWR2YW5jZVNjaGVkdWxlKGUsIG4sIHQsIG8sIGEpO1xuICB9XG4gIGFkdmFuY2VTY2hlZHVsZShlLCB0LCByLCBuLCBpKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuc2NoZWR1bGU7XG4gICAgaWYgKCFvKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSB0W2VdIHx8IG51bGwsIGwgPSB0aGlzLnByaW1hcnlNZWRpYSwgYyA9IHRoaXMucGxheWVyUXVldWU7XG4gICAgaWYgKGMubGVuZ3RoICYmIGMuZm9yRWFjaCgodSkgPT4ge1xuICAgICAgY29uc3QgZCA9IHUuaW50ZXJzdGl0aWFsLCBoID0gby5maW5kRXZlbnRJbmRleChkLmlkZW50aWZpZXIpO1xuICAgICAgKGggPCBlIHx8IGggPiBlICsgMSkgJiYgdGhpcy5jbGVhckludGVyc3RpdGlhbChkLCBhKTtcbiAgICB9KSwgdGhpcy5pc0ludGVyc3RpdGlhbChhKSkge1xuICAgICAgdGhpcy50aW1lbGluZVBvcyA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMudGltZWxpbmVQb3MsIGEuc3RhcnQpLCBhLmVuZCk7XG4gICAgICBjb25zdCB1ID0gYS5ldmVudDtcbiAgICAgIGlmIChyID09PSB2b2lkIDApIHtcbiAgICAgICAgciA9IG8uZmluZEFzc2V0SW5kZXgodSwgdGhpcy50aW1lbGluZVBvcyk7XG4gICAgICAgIGNvbnN0IHAgPSBUbCh1LCByIC0gMSk7XG4gICAgICAgIGlmICh1LmlzQXNzZXRQYXN0UGxheW91dExpbWl0KHApIHx8IHUuYXBwZW5kSW5QbGFjZSAmJiB0aGlzLnRpbWVsaW5lUG9zID09PSBhLmVuZCkge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh1LCBlLCByKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgciA9IHA7XG4gICAgICB9XG4gICAgICBjb25zdCBkID0gdGhpcy53YWl0aW5nSXRlbTtcbiAgICAgIHRoaXMuYXNzZXRzQnVmZmVyZWQoYSwgbCkgfHwgdGhpcy5zZXRCdWZmZXJpbmdJdGVtKGEpO1xuICAgICAgbGV0IGggPSB0aGlzLnByZWxvYWRBc3NldHModSwgcik7XG4gICAgICBpZiAodGhpcy5ldmVudEl0ZW1zTWF0Y2goYSwgZCB8fCBuKSB8fCAodGhpcy53YWl0aW5nSXRlbSA9IGEsIHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfU1RBUlRFRCAke2tyKGEpfSAke3UuYXBwZW5kSW5QbGFjZSA/IFwiYXBwZW5kIGluIHBsYWNlXCIgOiBcIlwifWApLCB0aGlzLmhscy50cmlnZ2VyKEkuSU5URVJTVElUSUFMX1NUQVJURUQsIHtcbiAgICAgICAgZXZlbnQ6IHUsXG4gICAgICAgIHNjaGVkdWxlOiB0LnNsaWNlKDApLFxuICAgICAgICBzY2hlZHVsZUluZGV4OiBlXG4gICAgICB9KSksICF1LmFzc2V0TGlzdExvYWRlZCkge1xuICAgICAgICB0aGlzLmxvZyhgV2FpdGluZyBmb3IgQVNTRVQtTElTVCB0byBjb21wbGV0ZSBsb2FkaW5nICR7dX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHUuYXNzZXRMaXN0TG9hZGVyICYmICh1LmFzc2V0TGlzdExvYWRlci5kZXN0cm95KCksIHUuYXNzZXRMaXN0TG9hZGVyID0gdm9pZCAwKSwgIWwpIHtcbiAgICAgICAgdGhpcy5sb2coYFdhaXRpbmcgZm9yIGF0dGFjaE1lZGlhIHRvIHN0YXJ0IEludGVyc3RpdGlhbCAke3V9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMud2FpdGluZ0l0ZW0gPSB0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMucGxheWluZ0l0ZW0gPSBhO1xuICAgICAgY29uc3QgZiA9IHUuYXNzZXRMaXN0W3JdO1xuICAgICAgaWYgKCFmKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh1LCBlLCByIHx8IDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaCB8fCAoaCA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZi5pZGVudGlmaWVyKSksIGggPT09IG51bGwgfHwgaC5kZXN0cm95ZWQpIHtcbiAgICAgICAgY29uc3QgcCA9IHUuYXNzZXRMaXN0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy53YXJuKGBhc3NldCAke3IgKyAxfS8ke3B9IHBsYXllciBkZXN0cm95ZWQgJHt1fWApLCBoID0gdGhpcy5jcmVhdGVBc3NldFBsYXllcih1LCBmLCByKSwgaC5sb2FkU291cmNlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZXZlbnRJdGVtc01hdGNoKGEsIHRoaXMuYnVmZmVyaW5nSXRlbSkgJiYgdS5hcHBlbmRJblBsYWNlICYmIHRoaXMuaXNBc3NldEJ1ZmZlcmVkKGYpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnN0YXJ0QXNzZXRQbGF5ZXIoaCwgciwgdCwgZSwgbCksIHRoaXMuc2hvdWxkUGxheSAmJiBKaChoLm1lZGlhKTtcbiAgICB9IGVsc2UgYSA/ICh0aGlzLnJlc3VtZVByaW1hcnkoYSwgZSwgbiksIHRoaXMuc2hvdWxkUGxheSAmJiBKaCh0aGlzLmhscy5tZWRpYSkpIDogaSAmJiB0aGlzLmlzSW50ZXJzdGl0aWFsKG4pICYmICh0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMucGxheWluZ0l0ZW0gPSBuLCBuLmV2ZW50LmFwcGVuZEluUGxhY2UgfHwgdGhpcy5hdHRhY2hQcmltYXJ5KG8uZHVyYXRpb25zLnByaW1hcnksIG51bGwpKTtcbiAgfVxuICBnZXQgcGxheWJhY2tEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5obHMuY29uZmlnLmVuYWJsZUludGVyc3RpdGlhbFBsYXliYWNrID09PSAhMTtcbiAgfVxuICBnZXQgcHJpbWFyeURldGFpbHMoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIChlID0gdGhpcy5tZWRpYVNlbGVjdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWFpbi5kZXRhaWxzO1xuICB9XG4gIGdldCBwcmltYXJ5TGl2ZSgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gISEoKGUgPSB0aGlzLnByaW1hcnlEZXRhaWxzKSAhPSBudWxsICYmIGUubGl2ZSk7XG4gIH1cbiAgcmVzdW1lUHJpbWFyeShlLCB0LCByKSB7XG4gICAgdmFyIG4sIGk7XG4gICAgaWYgKHRoaXMucGxheWluZ0l0ZW0gPSBlLCB0aGlzLnBsYXlpbmdBc3NldCA9IHRoaXMuZW5kZWRBc3NldCA9IG51bGwsIHRoaXMud2FpdGluZ0l0ZW0gPSB0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMuYnVmZmVyZWRUb0l0ZW0oZSksIHRoaXMubG9nKGByZXN1bWluZyAke2tyKGUpfWApLCAhKChuID0gdGhpcy5kZXRhY2hlZERhdGEpICE9IG51bGwgJiYgbi5tZWRpYVNvdXJjZSkpIHtcbiAgICAgIGxldCBhID0gdGhpcy50aW1lbGluZVBvcztcbiAgICAgIChhIDwgZS5zdGFydCB8fCBhID49IGUuZW5kKSAmJiAoYSA9IHRoaXMuZ2V0UHJpbWFyeVJlc3VtcHRpb24oZSwgdCksIHRoaXMubG9nKFFpKFwicmVzdW1lUHJpbWFyeVwiLCBhKSksIHRoaXMudGltZWxpbmVQb3MgPSBhKSwgdGhpcy5hdHRhY2hQcmltYXJ5KGEsIGUpO1xuICAgIH1cbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IChpID0gdGhpcy5zY2hlZHVsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuaXRlbXM7XG4gICAgbyAmJiAodGhpcy5sb2coYElOVEVSU1RJVElBTFNfUFJJTUFSWV9SRVNVTUVEICR7a3IoZSl9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxTX1BSSU1BUllfUkVTVU1FRCwge1xuICAgICAgc2NoZWR1bGU6IG8uc2xpY2UoMCksXG4gICAgICBzY2hlZHVsZUluZGV4OiB0XG4gICAgfSksIHRoaXMuY2hlY2tCdWZmZXIoKSk7XG4gIH1cbiAgZ2V0UHJpbWFyeVJlc3VtcHRpb24oZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLnN0YXJ0O1xuICAgIGlmICh0aGlzLnByaW1hcnlMaXZlKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5wcmltYXJ5RGV0YWlscztcbiAgICAgIGlmICh0ID09PSAwKVxuICAgICAgICByZXR1cm4gdGhpcy5obHMuc3RhcnRQb3NpdGlvbjtcbiAgICAgIGlmIChuICYmIChyIDwgbi5mcmFnbWVudFN0YXJ0IHx8IHIgPiBuLmVkZ2UpKVxuICAgICAgICByZXR1cm4gdGhpcy5obHMubGl2ZVN5bmNQb3NpdGlvbiB8fCAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgaXNBc3NldEJ1ZmZlcmVkKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRBc3NldFBsYXllcihlLmlkZW50aWZpZXIpO1xuICAgIHJldHVybiB0ICE9IG51bGwgJiYgdC5obHMgPyB0Lmhscy5idWZmZXJlZFRvRW5kIDogQ2UuYnVmZmVySW5mbyh0aGlzLnByaW1hcnlNZWRpYSwgdGhpcy50aW1lbGluZVBvcywgMCkuZW5kICsgMSA+PSBlLnRpbWVsaW5lU3RhcnQgKyAoZS5kdXJhdGlvbiB8fCAwKTtcbiAgfVxuICBhdHRhY2hQcmltYXJ5KGUsIHQsIHIpIHtcbiAgICB0ID8gdGhpcy5zZXRCdWZmZXJpbmdJdGVtKHQpIDogdGhpcy5idWZmZXJpbmdJdGVtID0gdGhpcy5wbGF5aW5nSXRlbSwgdGhpcy5idWZmZXJpbmdBc3NldCA9IG51bGw7XG4gICAgY29uc3QgbiA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgIGlmICghbilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gdGhpcy5obHM7XG4gICAgaS5tZWRpYSA/IHRoaXMuY2hlY2tCdWZmZXIoKSA6ICh0aGlzLnRyYW5zZmVyTWVkaWFUbyhpLCBuKSwgciAmJiB0aGlzLnN0YXJ0TG9hZGluZ1ByaW1hcnlBdChlLCByKSksIHIgfHwgKHRoaXMubG9nKFFpKFwiYXR0YWNoUHJpbWFyeVwiLCBlKSksIHRoaXMudGltZWxpbmVQb3MgPSBlLCB0aGlzLnN0YXJ0TG9hZGluZ1ByaW1hcnlBdChlLCByKSk7XG4gIH1cbiAgc3RhcnRMb2FkaW5nUHJpbWFyeUF0KGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gdGhpcy5obHM7XG4gICAgIW4ubG9hZGluZ0VuYWJsZWQgfHwgIW4ubWVkaWEgfHwgTWF0aC5hYnMoKCgociA9IG4ubWFpbkZvcndhcmRCdWZmZXJJbmZvKSA9PSBudWxsID8gdm9pZCAwIDogci5zdGFydCkgfHwgbi5tZWRpYS5jdXJyZW50VGltZSkgLSBlKSA+IDAuNSA/IG4uc3RhcnRMb2FkKGUsIHQpIDogbi5idWZmZXJpbmdFbmFibGVkIHx8IG4ucmVzdW1lQnVmZmVyaW5nKCk7XG4gIH1cbiAgLy8gSExTLmpzIGV2ZW50IGNhbGxiYWNrc1xuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB2YXIgZTtcbiAgICB0aGlzLnN0b3BMb2FkKCksIChlID0gdGhpcy5zY2hlZHVsZSkgPT0gbnVsbCB8fCBlLnJlc2V0KCksIHRoaXMuZW1wdHlQbGF5ZXJRdWV1ZSgpLCB0aGlzLmNsZWFyU2NoZWR1bGVTdGF0ZSgpLCB0aGlzLnNob3VsZFBsYXkgPSAhMSwgdGhpcy5idWZmZXJlZFBvcyA9IHRoaXMudGltZWxpbmVQb3MgPSAtMSwgdGhpcy5tZWRpYVNlbGVjdGlvbiA9IHRoaXMuYWx0U2VsZWN0aW9uID0gdGhpcy5tYW5hZ2VyID0gdGhpcy5yZXF1aXJlZFRyYWNrcyA9IG51bGwsIHRoaXMuaGxzLm9mZihJLkJVRkZFUl9DT0RFQ1MsIHRoaXMub25CdWZmZXJDb2RlY3MsIHRoaXMpLCB0aGlzLmhscy5vbihJLkJVRkZFUl9DT0RFQ1MsIHRoaXMub25CdWZmZXJDb2RlY3MsIHRoaXMpO1xuICB9XG4gIG9uTGV2ZWxVcGRhdGVkKGUsIHQpIHtcbiAgICBpZiAodC5sZXZlbCA9PT0gLTEgfHwgIXRoaXMuc2NoZWR1bGUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmxldmVsc1t0LmxldmVsXTtcbiAgICBpZiAoIXIuZGV0YWlscylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gdHQodHQoe30sIHRoaXMubWVkaWFTZWxlY3Rpb24gfHwgdGhpcy5hbHRTZWxlY3Rpb24pLCB7fSwge1xuICAgICAgbWFpbjogclxuICAgIH0pO1xuICAgIHRoaXMubWVkaWFTZWxlY3Rpb24gPSBuLCB0aGlzLnNjaGVkdWxlLnBhcnNlSW50ZXJzdGl0aWFsRGF0ZVJhbmdlcyhuLCB0aGlzLmhscy5jb25maWcuaW50ZXJzdGl0aWFsQXBwZW5kSW5QbGFjZSksICF0aGlzLmVmZmVjdGl2ZVBsYXlpbmdJdGVtICYmIHRoaXMuc2NoZWR1bGUuaXRlbXMgJiYgdGhpcy5jaGVja1N0YXJ0KCk7XG4gIH1cbiAgb25BdWRpb1RyYWNrVXBkYXRlZChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmF1ZGlvVHJhY2tzW3QuaWRdLCBuID0gdGhpcy5tZWRpYVNlbGVjdGlvbjtcbiAgICBpZiAoIW4pIHtcbiAgICAgIHRoaXMuYWx0U2VsZWN0aW9uID0gdHQodHQoe30sIHRoaXMuYWx0U2VsZWN0aW9uKSwge30sIHtcbiAgICAgICAgYXVkaW86IHJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpID0gdHQodHQoe30sIG4pLCB7fSwge1xuICAgICAgYXVkaW86IHJcbiAgICB9KTtcbiAgICB0aGlzLm1lZGlhU2VsZWN0aW9uID0gaTtcbiAgfVxuICBvblN1YnRpdGxlVHJhY2tVcGRhdGVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5obHMuc3VidGl0bGVUcmFja3NbdC5pZF0sIG4gPSB0aGlzLm1lZGlhU2VsZWN0aW9uO1xuICAgIGlmICghbikge1xuICAgICAgdGhpcy5hbHRTZWxlY3Rpb24gPSB0dCh0dCh7fSwgdGhpcy5hbHRTZWxlY3Rpb24pLCB7fSwge1xuICAgICAgICBzdWJ0aXRsZXM6IHJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpID0gdHQodHQoe30sIG4pLCB7fSwge1xuICAgICAgc3VidGl0bGVzOiByXG4gICAgfSk7XG4gICAgdGhpcy5tZWRpYVNlbGVjdGlvbiA9IGk7XG4gIH1cbiAgb25BdWRpb1RyYWNrU3dpdGNoaW5nKGUsIHQpIHtcbiAgICBjb25zdCByID0gY2godCk7XG4gICAgdGhpcy5wbGF5ZXJRdWV1ZS5mb3JFYWNoKCh7XG4gICAgICBobHM6IG5cbiAgICB9KSA9PiBuICYmIChuLnNldEF1ZGlvT3B0aW9uKHQpIHx8IG4uc2V0QXVkaW9PcHRpb24ocikpKTtcbiAgfVxuICBvblN1YnRpdGxlVHJhY2tTd2l0Y2goZSwgdCkge1xuICAgIGNvbnN0IHIgPSBjaCh0KTtcbiAgICB0aGlzLnBsYXllclF1ZXVlLmZvckVhY2goKHtcbiAgICAgIGhsczogblxuICAgIH0pID0+IG4gJiYgKG4uc2V0U3VidGl0bGVPcHRpb24odCkgfHwgdC5pZCAhPT0gLTEgJiYgbi5zZXRTdWJ0aXRsZU9wdGlvbihyKSkpO1xuICB9XG4gIG9uQnVmZmVyQ29kZWNzKGUsIHQpIHtcbiAgICBjb25zdCByID0gdC50cmFja3M7XG4gICAgciAmJiAodGhpcy5yZXF1aXJlZFRyYWNrcyA9IHIpO1xuICB9XG4gIG9uQnVmZmVyQXBwZW5kZWQoZSwgdCkge1xuICAgIHRoaXMuY2hlY2tCdWZmZXIoKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnBsYXlpbmdJdGVtO1xuICAgIGlmIChyICYmICF0aGlzLml0ZW1zTWF0Y2gociwgdGhpcy5idWZmZXJpbmdJdGVtKSAmJiAhdGhpcy5pc0ludGVyc3RpdGlhbChyKSkge1xuICAgICAgY29uc3QgbiA9IHRoaXMudGltZWxpbmVQb3M7XG4gICAgICB0aGlzLmJ1ZmZlcmVkUG9zID0gbiwgdGhpcy5jaGVja0J1ZmZlcigpO1xuICAgIH1cbiAgfVxuICBvbkJ1ZmZlcmVkVG9FbmQoZSkge1xuICAgIGlmICghdGhpcy5zY2hlZHVsZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5zY2hlZHVsZS5ldmVudHM7XG4gICAgaWYgKHRoaXMuYnVmZmVyZWRQb3MgPCBOdW1iZXIuTUFYX1ZBTFVFICYmIHQpIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gdFtuXTtcbiAgICAgICAgaWYgKGkuY3VlLnBvc3QpIHtcbiAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChpLmlkZW50aWZpZXIpLCBhID0gKHIgPSB0aGlzLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogcltvXTtcbiAgICAgICAgICB0aGlzLmlzSW50ZXJzdGl0aWFsKGEpICYmIHRoaXMuZXZlbnRJdGVtc01hdGNoKGEsIHRoaXMuYnVmZmVyaW5nSXRlbSkgJiYgdGhpcy5idWZmZXJlZFRvSXRlbShhLCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5idWZmZXJlZFBvcyA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgfVxuICB9XG4gIG9uTWVkaWFFbmRlZChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMucGxheWluZ0l0ZW07XG4gICAgaWYgKCF0aGlzLnBsYXlpbmdMYXN0SXRlbSAmJiB0KSB7XG4gICAgICBjb25zdCByID0gdGhpcy5maW5kSXRlbUluZGV4KHQpO1xuICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKHIgKyAxKTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuc2hvdWxkUGxheSA9ICExO1xuICB9XG4gIHVwZGF0ZUl0ZW0oZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IG4gPSAociA9IHRoaXMuc2NoZWR1bGUpID09IG51bGwgPyB2b2lkIDAgOiByLml0ZW1zO1xuICAgIGlmIChlICYmIG4pIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmZpbmRJdGVtSW5kZXgoZSwgdCk7XG4gICAgICByZXR1cm4gbltpXSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cmltSW5QbGFjZShlLCB0KSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcnN0aXRpYWwoZSkgJiYgZS5ldmVudC5hcHBlbmRJblBsYWNlICYmIHQuZW5kIC0gZS5lbmQgPiAwLjI1KSB7XG4gICAgICBlLmV2ZW50LmFzc2V0TGlzdC5mb3JFYWNoKChpLCBvKSA9PiB7XG4gICAgICAgIGUuZXZlbnQuaXNBc3NldFBhc3RQbGF5b3V0TGltaXQobykgJiYgdGhpcy5jbGVhckFzc2V0UGxheWVyKGkuaWRlbnRpZmllciwgbnVsbCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHIgPSBlLmVuZCArIDAuMjUsIG4gPSBDZS5idWZmZXJJbmZvKHRoaXMucHJpbWFyeU1lZGlhLCByLCAwKTtcbiAgICAgIChuLmVuZCA+IHIgfHwgKG4ubmV4dFN0YXJ0IHx8IDApID4gcikgJiYgKHRoaXMubG9nKGB0cmltIGJ1ZmZlcmVkIGludGVyc3RpdGlhbCAke2tyKGUpfSAod2FzICR7a3IodCl9KWApLCB0aGlzLmF0dGFjaFByaW1hcnkociwgbnVsbCwgITApLCB0aGlzLmZsdXNoRnJvbnRCdWZmZXIocikpO1xuICAgIH1cbiAgfVxuICBpdGVtc01hdGNoKGUsIHQpIHtcbiAgICByZXR1cm4gISF0ICYmIChlID09PSB0IHx8IGUuZXZlbnQgJiYgdC5ldmVudCAmJiB0aGlzLmV2ZW50SXRlbXNNYXRjaChlLCB0KSB8fCAhZS5ldmVudCAmJiAhdC5ldmVudCAmJiB0aGlzLmZpbmRJdGVtSW5kZXgoZSkgPT09IHRoaXMuZmluZEl0ZW1JbmRleCh0KSk7XG4gIH1cbiAgZXZlbnRJdGVtc01hdGNoKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICByZXR1cm4gISF0ICYmIChlID09PSB0IHx8IGUuZXZlbnQuaWRlbnRpZmllciA9PT0gKChyID0gdC5ldmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuaWRlbnRpZmllcikpO1xuICB9XG4gIGZpbmRJdGVtSW5kZXgoZSwgdCkge1xuICAgIHJldHVybiBlICYmIHRoaXMuc2NoZWR1bGUgPyB0aGlzLnNjaGVkdWxlLmZpbmRJdGVtSW5kZXgoZSwgdCkgOiAtMTtcbiAgfVxuICB1cGRhdGVTY2hlZHVsZShlID0gITEpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCByID0gdGhpcy5tZWRpYVNlbGVjdGlvbjtcbiAgICByICYmICgodCA9IHRoaXMuc2NoZWR1bGUpID09IG51bGwgfHwgdC51cGRhdGVTY2hlZHVsZShyLCBbXSwgZSkpO1xuICB9XG4gIC8vIFNjaGVkdWxlIGJ1ZmZlciBjb250cm9sXG4gIGNoZWNrQnVmZmVyKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCByID0gKHQgPSB0aGlzLnNjaGVkdWxlKSA9PSBudWxsID8gdm9pZCAwIDogdC5pdGVtcztcbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IENlLmJ1ZmZlckluZm8odGhpcy5wcmltYXJ5TWVkaWEsIHRoaXMudGltZWxpbmVQb3MsIDApO1xuICAgIGUgJiYgKHRoaXMuYnVmZmVyZWRQb3MgPSB0aGlzLnRpbWVsaW5lUG9zKSwgZSB8fCAoZSA9IG4ubGVuIDwgMSksIHRoaXMudXBkYXRlQnVmZmVyZWRQb3Mobi5lbmQsIHIsIGUpO1xuICB9XG4gIHVwZGF0ZUJ1ZmZlcmVkUG9zKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5zY2hlZHVsZSwgaSA9IHRoaXMuYnVmZmVyaW5nSXRlbTtcbiAgICBpZiAodGhpcy5idWZmZXJlZFBvcyA+IGUgfHwgIW4pXG4gICAgICByZXR1cm47XG4gICAgaWYgKHQubGVuZ3RoID09PSAxICYmIHRoaXMuaXRlbXNNYXRjaCh0WzBdLCBpKSkge1xuICAgICAgdGhpcy5idWZmZXJlZFBvcyA9IGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG8gPSB0aGlzLnBsYXlpbmdJdGVtLCBhID0gdGhpcy5maW5kSXRlbUluZGV4KG8pO1xuICAgIGxldCBsID0gbi5maW5kSXRlbUluZGV4QXRUaW1lKGUpO1xuICAgIGlmICh0aGlzLmJ1ZmZlcmVkUG9zIDwgZSkge1xuICAgICAgdmFyIGM7XG4gICAgICBjb25zdCB1ID0gdGhpcy5maW5kSXRlbUluZGV4KGkpLCBkID0gTWF0aC5taW4odSArIDEsIHQubGVuZ3RoIC0gMSksIGggPSB0W2RdO1xuICAgICAgaWYgKChsID09PSAtMSAmJiBpICYmIGUgPj0gaS5lbmQgfHwgKGMgPSBoLmV2ZW50KSAhPSBudWxsICYmIGMuYXBwZW5kSW5QbGFjZSAmJiBlICsgMC4wMSA+PSBoLnN0YXJ0KSAmJiAobCA9IGQpLCB0aGlzLmlzSW50ZXJzdGl0aWFsKGkpKSB7XG4gICAgICAgIGNvbnN0IGYgPSBpLmV2ZW50O1xuICAgICAgICBpZiAoZCAtIGEgPiAxICYmIGYuYXBwZW5kSW5QbGFjZSA9PT0gITEgfHwgZi5hc3NldExpc3QubGVuZ3RoID09PSAwICYmIGYuYXNzZXRMaXN0TG9hZGVyKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmVkUG9zID0gZSwgbCA+IHUgJiYgbCA+IGEpXG4gICAgICAgIHRoaXMuYnVmZmVyZWRUb0l0ZW0oaCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZiA9IHRoaXMucHJpbWFyeURldGFpbHM7XG4gICAgICAgIHRoaXMucHJpbWFyeUxpdmUgJiYgZiAmJiBlID4gZi5lZGdlIC0gZi50YXJnZXRkdXJhdGlvbiAmJiBoLnN0YXJ0IDwgZi5lZGdlICsgdGhpcy5obHMuY29uZmlnLmludGVyc3RpdGlhbExpdmVMb29rQWhlYWQgJiYgdGhpcy5pc0ludGVyc3RpdGlhbChoKSAmJiB0aGlzLnByZWxvYWRBc3NldHMoaC5ldmVudCwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHIgJiYgbyAmJiAhdGhpcy5pdGVtc01hdGNoKG8sIGkpICYmIChsID09PSBhID8gdGhpcy5idWZmZXJlZFRvSXRlbShvKSA6IGwgPT09IGEgKyAxICYmIHRoaXMuYnVmZmVyZWRUb0l0ZW0odFtsXSkpO1xuICB9XG4gIGFzc2V0c0J1ZmZlcmVkKGUsIHQpIHtcbiAgICByZXR1cm4gZS5ldmVudC5hc3NldExpc3QubGVuZ3RoID09PSAwID8gITEgOiAhZS5ldmVudC5hc3NldExpc3Quc29tZSgobikgPT4ge1xuICAgICAgY29uc3QgaSA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIobi5pZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiAhKGkgIT0gbnVsbCAmJiBpLmJ1ZmZlcmVkSW5QbGFjZVRvRW5kKHQpKTtcbiAgICB9KTtcbiAgfVxuICBzZXRCdWZmZXJpbmdJdGVtKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5idWZmZXJpbmdJdGVtLCByID0gdGhpcy5zY2hlZHVsZTtcbiAgICBpZiAoIXRoaXMuaXRlbXNNYXRjaChlLCB0KSAmJiByKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGl0ZW1zOiBuLFxuICAgICAgICBldmVudHM6IGlcbiAgICAgIH0gPSByO1xuICAgICAgaWYgKCFuIHx8ICFpKVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmlzSW50ZXJzdGl0aWFsKGUpLCBhID0gdGhpcy5nZXRCdWZmZXJpbmdQbGF5ZXIoKTtcbiAgICAgIHRoaXMuYnVmZmVyaW5nSXRlbSA9IGUsIHRoaXMuYnVmZmVyZWRQb3MgPSBNYXRoLm1heChlLnN0YXJ0LCBNYXRoLm1pbihlLmVuZCwgdGhpcy50aW1lbGluZVBvcykpO1xuICAgICAgY29uc3QgbCA9IGEgPyBhLnJlbWFpbmluZyA6IHQgPyB0LmVuZCAtIHRoaXMudGltZWxpbmVQb3MgOiAwO1xuICAgICAgaWYgKHRoaXMubG9nKGBJTlRFUlNUSVRJQUxTX0JVRkZFUkVEX1RPX0JPVU5EQVJZICR7a3IoZSl9YCArICh0ID8gYCAoJHtsLnRvRml4ZWQoMil9IHJlbWFpbmluZylgIDogXCJcIikpLCAhdGhpcy5wbGF5YmFja0Rpc2FibGVkKVxuICAgICAgICBpZiAobykge1xuICAgICAgICAgIGNvbnN0IGMgPSByLmZpbmRBc3NldEluZGV4KGUuZXZlbnQsIHRoaXMuYnVmZmVyZWRQb3MpO1xuICAgICAgICAgIGUuZXZlbnQuYXNzZXRMaXN0LmZvckVhY2goKHUsIGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmdldEFzc2V0UGxheWVyKHUuaWRlbnRpZmllcik7XG4gICAgICAgICAgICBoICYmIChkID09PSBjICYmIGgubG9hZFNvdXJjZSgpLCBoLnJlc3VtZUJ1ZmZlcmluZygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdGhpcy5obHMucmVzdW1lQnVmZmVyaW5nKCksIHRoaXMucGxheWVyUXVldWUuZm9yRWFjaCgoYykgPT4gYy5wYXVzZUJ1ZmZlcmluZygpKTtcbiAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxTX0JVRkZFUkVEX1RPX0JPVU5EQVJZLCB7XG4gICAgICAgIGV2ZW50czogaS5zbGljZSgwKSxcbiAgICAgICAgc2NoZWR1bGU6IG4uc2xpY2UoMCksXG4gICAgICAgIGJ1ZmZlcmluZ0luZGV4OiB0aGlzLmZpbmRJdGVtSW5kZXgoZSksXG4gICAgICAgIHBsYXlpbmdJbmRleDogdGhpcy5maW5kSXRlbUluZGV4KHRoaXMucGxheWluZ0l0ZW0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgdGhpcy5idWZmZXJpbmdJdGVtICE9PSBlICYmICh0aGlzLmJ1ZmZlcmluZ0l0ZW0gPSBlKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBidWZmZXJlZFRvSXRlbShlLCB0ID0gMCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnNldEJ1ZmZlcmluZ0l0ZW0oZSk7XG4gICAgaWYgKCF0aGlzLnBsYXliYWNrRGlzYWJsZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzSW50ZXJzdGl0aWFsKGUpKVxuICAgICAgICB0aGlzLmJ1ZmZlcmVkVG9FdmVudChlLCB0KTtcbiAgICAgIGVsc2UgaWYgKHIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5idWZmZXJpbmdBc3NldCA9IG51bGw7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRldGFjaGVkRGF0YTtcbiAgICAgICAgbiA/IG4ubWVkaWFTb3VyY2UgPyB0aGlzLmF0dGFjaFByaW1hcnkoZS5zdGFydCwgZSwgITApIDogdGhpcy5wcmVsb2FkUHJpbWFyeShlKSA6IHRoaXMucHJlbG9hZFByaW1hcnkoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByZWxvYWRQcmltYXJ5KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5maW5kSXRlbUluZGV4KGUpLCByID0gdGhpcy5nZXRQcmltYXJ5UmVzdW1wdGlvbihlLCB0KTtcbiAgICB0aGlzLnN0YXJ0TG9hZGluZ1ByaW1hcnlBdChyKTtcbiAgfVxuICBidWZmZXJlZFRvRXZlbnQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLmV2ZW50LCBuID0gci5hc3NldExpc3QubGVuZ3RoID09PSAwICYmICFyLmFzc2V0TGlzdExvYWRlciwgaSA9IHIuY3VlLm9uY2U7XG4gICAgaWYgKG4gfHwgIWkpIHtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLnByZWxvYWRBc3NldHMociwgdCk7XG4gICAgICBpZiAobyAhPSBudWxsICYmIG8uaW50ZXJzdGl0aWFsLmFwcGVuZEluUGxhY2UpIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgICAgICBhICYmIHRoaXMuYnVmZmVyQXNzZXRQbGF5ZXIobywgYSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByZWxvYWRBc3NldHMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLmFzc2V0VXJsLCBuID0gZS5hc3NldExpc3QubGVuZ3RoLCBpID0gbiA9PT0gMCAmJiAhZS5hc3NldExpc3RMb2FkZXIsIG8gPSBlLmN1ZS5vbmNlO1xuICAgIGlmIChpKSB7XG4gICAgICBjb25zdCBsID0gZS50aW1lbGluZVN0YXJ0O1xuICAgICAgaWYgKGUuYXBwZW5kSW5QbGFjZSkge1xuICAgICAgICB2YXIgYTtcbiAgICAgICAgY29uc3QgaCA9IHRoaXMucGxheWluZ0l0ZW07XG4gICAgICAgICF0aGlzLmlzSW50ZXJzdGl0aWFsKGgpICYmIChoID09IG51bGwgfHwgKGEgPSBoLm5leHRFdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IGEuaWRlbnRpZmllcikgPT09IGUuaWRlbnRpZmllciAmJiB0aGlzLmZsdXNoRnJvbnRCdWZmZXIobCArIDAuMjUpO1xuICAgICAgfVxuICAgICAgbGV0IGMsIHUgPSAwO1xuICAgICAgaWYgKCF0aGlzLnBsYXlpbmdJdGVtICYmIHRoaXMucHJpbWFyeUxpdmUgJiYgKHUgPSB0aGlzLmhscy5zdGFydFBvc2l0aW9uLCB1ID09PSAtMSAmJiAodSA9IHRoaXMuaGxzLmxpdmVTeW5jUG9zaXRpb24gfHwgMCkpLCB1ICYmICEoZS5jdWUucHJlIHx8IGUuY3VlLnBvc3QpKSB7XG4gICAgICAgIGNvbnN0IGggPSB1IC0gbDtcbiAgICAgICAgaCA+IDAgJiYgKGMgPSBNYXRoLnJvdW5kKGggKiAxZTMpIC8gMWUzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvZyhgTG9hZCBpbnRlcnN0aXRpYWwgYXNzZXQgJHt0ICsgMX0vJHtyID8gMSA6IG59ICR7ZX0ke2MgPyBgIGxpdmUtc3RhcnQ6ICR7dX0gc3RhcnQtb2Zmc2V0OiAke2N9YCA6IFwiXCJ9YCksIHIpXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFzc2V0KGUsIDAsIDAsIGwsIGUuZHVyYXRpb24sIHIpO1xuICAgICAgY29uc3QgZCA9IHRoaXMuYXNzZXRMaXN0TG9hZGVyLmxvYWRBc3NldExpc3QoZSwgYyk7XG4gICAgICBkICYmIChlLmFzc2V0TGlzdExvYWRlciA9IGQpO1xuICAgIH0gZWxzZSBpZiAoIW8gJiYgbikge1xuICAgICAgZm9yIChsZXQgYyA9IHQ7IGMgPCBuOyBjKyspIHtcbiAgICAgICAgY29uc3QgdSA9IGUuYXNzZXRMaXN0W2NdLCBkID0gdGhpcy5nZXRBc3NldFBsYXllclF1ZXVlSW5kZXgodS5pZGVudGlmaWVyKTtcbiAgICAgICAgKGQgPT09IC0xIHx8IHRoaXMucGxheWVyUXVldWVbZF0uZGVzdHJveWVkKSAmJiAhdS5lcnJvciAmJiB0aGlzLmNyZWF0ZUFzc2V0UGxheWVyKGUsIHUsIGMpO1xuICAgICAgfVxuICAgICAgY29uc3QgbCA9IGUuYXNzZXRMaXN0W3RdO1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIobC5pZGVudGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIGMgJiYgYy5sb2FkU291cmNlKCksIGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZsdXNoRnJvbnRCdWZmZXIoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnJlcXVpcmVkVHJhY2tzO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmxvZyhgUmVtb3ZpbmcgZnJvbnQgYnVmZmVyIHN0YXJ0aW5nIGF0ICR7ZX1gKSwgT2JqZWN0LmtleXModCkuZm9yRWFjaCgobikgPT4ge1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywge1xuICAgICAgICBzdGFydE9mZnNldDogZSxcbiAgICAgICAgZW5kT2Zmc2V0OiAxIC8gMCxcbiAgICAgICAgdHlwZTogblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLy8gSW50ZXJzdGl0aWFsIEFzc2V0IFBsYXllciBjb250cm9sXG4gIGdldEFzc2V0UGxheWVyUXVldWVJbmRleChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMucGxheWVyUXVldWU7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKVxuICAgICAgaWYgKGUgPT09IHRbcl0uYXNzZXRJZClcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGdldEFzc2V0UGxheWVyKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRBc3NldFBsYXllclF1ZXVlSW5kZXgoZSk7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyUXVldWVbdF0gfHwgbnVsbDtcbiAgfVxuICBnZXRCdWZmZXJpbmdQbGF5ZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGxheWVyUXVldWU6IGUsXG4gICAgICBwcmltYXJ5TWVkaWE6IHRcbiAgICB9ID0gdGhpcztcbiAgICBpZiAodCkge1xuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKVxuICAgICAgICBpZiAoZVtyXS5tZWRpYSA9PT0gdClcbiAgICAgICAgICByZXR1cm4gZVtyXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY3JlYXRlQXNzZXQoZSwgdCwgciwgbiwgaSwgbykge1xuICAgIGNvbnN0IGEgPSB7XG4gICAgICBwYXJlbnRJZGVudGlmaWVyOiBlLmlkZW50aWZpZXIsXG4gICAgICBpZGVudGlmaWVyOiBndyhlLCBvLCB0KSxcbiAgICAgIGR1cmF0aW9uOiBpLFxuICAgICAgc3RhcnRPZmZzZXQ6IHIsXG4gICAgICB0aW1lbGluZVN0YXJ0OiBuLFxuICAgICAgdXJpOiBvXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVBc3NldFBsYXllcihlLCBhLCB0KTtcbiAgfVxuICBjcmVhdGVBc3NldFBsYXllcihlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IHRoaXMuaGxzLCBpID0gbi51c2VyQ29uZmlnO1xuICAgIGxldCBvID0gaS52aWRlb1ByZWZlcmVuY2U7XG4gICAgY29uc3QgYSA9IG4ubG9hZExldmVsT2JqIHx8IG4ubGV2ZWxzW24uY3VycmVudExldmVsXTtcbiAgICAobyB8fCBhKSAmJiAobyA9IG50KHt9LCBvKSwgYS52aWRlb0NvZGVjICYmIChvLnZpZGVvQ29kZWMgPSBhLnZpZGVvQ29kZWMpLCBhLnZpZGVvUmFuZ2UgJiYgKG8uYWxsb3dlZFZpZGVvUmFuZ2VzID0gW2EudmlkZW9SYW5nZV0pKTtcbiAgICBjb25zdCBsID0gbi5hdWRpb1RyYWNrc1tuLmF1ZGlvVHJhY2tdLCBjID0gbi5zdWJ0aXRsZVRyYWNrc1tuLnN1YnRpdGxlVHJhY2tdO1xuICAgIGxldCB1ID0gMDtcbiAgICBpZiAodGhpcy5wcmltYXJ5TGl2ZSB8fCBlLmFwcGVuZEluUGxhY2UpIHtcbiAgICAgIGNvbnN0IEYgPSB0aGlzLnRpbWVsaW5lUG9zIC0gdC50aW1lbGluZVN0YXJ0O1xuICAgICAgaWYgKEYgPiAxKSB7XG4gICAgICAgIGNvbnN0IE0gPSB0LmR1cmF0aW9uO1xuICAgICAgICBNICYmIEYgPCBNICYmICh1ID0gRik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGQgPSB0LmlkZW50aWZpZXIsIGggPSB0dCh0dCh7fSwgaSksIHt9LCB7XG4gICAgICBtYXhNYXhCdWZmZXJMZW5ndGg6IE1hdGgubWluKDE4MCwgbi5jb25maWcubWF4TWF4QnVmZmVyTGVuZ3RoKSxcbiAgICAgIGF1dG9TdGFydExvYWQ6ICEwLFxuICAgICAgc3RhcnRGcmFnUHJlZmV0Y2g6ICEwLFxuICAgICAgcHJpbWFyeVNlc3Npb25JZDogbi5zZXNzaW9uSWQsXG4gICAgICBhc3NldFBsYXllcklkOiBkLFxuICAgICAgYWJyRXdtYURlZmF1bHRFc3RpbWF0ZTogbi5iYW5kd2lkdGhFc3RpbWF0ZSxcbiAgICAgIGludGVyc3RpdGlhbHNDb250cm9sbGVyOiB2b2lkIDAsXG4gICAgICBzdGFydFBvc2l0aW9uOiB1LFxuICAgICAgbGl2ZUR1cmF0aW9uSW5maW5pdHk6ICExLFxuICAgICAgdGVzdEJhbmR3aWR0aDogITEsXG4gICAgICB2aWRlb1ByZWZlcmVuY2U6IG8sXG4gICAgICBhdWRpb1ByZWZlcmVuY2U6IGwgfHwgaS5hdWRpb1ByZWZlcmVuY2UsXG4gICAgICBzdWJ0aXRsZVByZWZlcmVuY2U6IGMgfHwgaS5zdWJ0aXRsZVByZWZlcmVuY2VcbiAgICB9KTtcbiAgICBlLmFwcGVuZEluUGxhY2UgJiYgKGUuYXBwZW5kSW5QbGFjZVN0YXJ0ZWQgPSAhMCwgdC50aW1lbGluZVN0YXJ0ICYmIChoLnRpbWVsaW5lT2Zmc2V0ID0gdC50aW1lbGluZVN0YXJ0KSk7XG4gICAgY29uc3QgZiA9IGguY21jZDtcbiAgICBmICE9IG51bGwgJiYgZi5zZXNzaW9uSWQgJiYgZi5jb250ZW50SWQgJiYgKGguY21jZCA9IG50KHt9LCBmLCB7XG4gICAgICBjb250ZW50SWQ6IFhuKHQudXJpKVxuICAgIH0pKSwgdGhpcy5nZXRBc3NldFBsYXllcihkKSAmJiB0aGlzLndhcm4oYER1cGxpY2F0ZSBkYXRlIHJhbmdlIGlkZW50aWZpZXIgJHtlfSBhbmQgYXNzZXQgJHtkfWApO1xuICAgIGNvbnN0IHAgPSBuZXcgeXcodGhpcy5IbHNQbGF5ZXJDbGFzcywgaCwgZSwgdCk7XG4gICAgdGhpcy5wbGF5ZXJRdWV1ZS5wdXNoKHApLCBlLmFzc2V0TGlzdFtyXSA9IHQ7XG4gICAgbGV0IHkgPSAhMDtcbiAgICBjb25zdCBFID0gKEYpID0+IHtcbiAgICAgIGlmIChGLmxpdmUpIHtcbiAgICAgICAgdmFyIE07XG4gICAgICAgIGNvbnN0IGogPSBuZXcgRXJyb3IoYEludGVyc3RpdGlhbHMgTVVTVCBiZSBWT0QgYXNzZXRzICR7ZX1gKSwgQyA9IHtcbiAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgdHlwZTogdmUuT1RIRVJfRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5JTlRFUlNUSVRJQUxfQVNTRVRfSVRFTV9FUlJPUixcbiAgICAgICAgICBlcnJvcjogalxuICAgICAgICB9LCBrID0gKChNID0gdGhpcy5zY2hlZHVsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IE0uZmluZEV2ZW50SW5kZXgoZS5pZGVudGlmaWVyKSkgfHwgLTE7XG4gICAgICAgIHRoaXMuaGFuZGxlQXNzZXRJdGVtRXJyb3IoQywgZSwgaywgciwgai5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgSCA9IEYuZWRnZSAtIEYuZnJhZ21lbnRTdGFydCwgSyA9IHQuZHVyYXRpb247XG4gICAgICAoeSB8fCBLID09PSBudWxsIHx8IEggPiBLKSAmJiAoeSA9ICExLCB0aGlzLmxvZyhgSW50ZXJzdGl0aWFsIGFzc2V0IFwiJHtkfVwiIGR1cmF0aW9uIGNoYW5nZSAke0t9ID4gJHtIfWApLCB0LmR1cmF0aW9uID0gSCwgdGhpcy51cGRhdGVTY2hlZHVsZSgpKTtcbiAgICB9O1xuICAgIHAub24oSS5MRVZFTF9VUERBVEVELCAoRiwge1xuICAgICAgZGV0YWlsczogTVxuICAgIH0pID0+IEUoTSkpLCBwLm9uKEkuTEVWRUxfUFRTX1VQREFURUQsIChGLCB7XG4gICAgICBkZXRhaWxzOiBNXG4gICAgfSkgPT4gRShNKSksIHAub24oSS5FVkVOVF9DVUVfRU5URVIsICgpID0+IHRoaXMub25JbnRlcnN0aXRpYWxDdWVFbnRlcigpKTtcbiAgICBjb25zdCBiID0gKEYsIE0pID0+IHtcbiAgICAgIGNvbnN0IEggPSB0aGlzLmdldEFzc2V0UGxheWVyKGQpO1xuICAgICAgaWYgKEggJiYgTS50cmFja3MpIHtcbiAgICAgICAgSC5vZmYoSS5CVUZGRVJfQ09ERUNTLCBiKSwgSC50cmFja3MgPSBNLnRyYWNrcztcbiAgICAgICAgY29uc3QgSyA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgICAgICB0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID09PSBILmFzc2V0SXRlbSAmJiBLICYmICFILm1lZGlhICYmIHRoaXMuYnVmZmVyQXNzZXRQbGF5ZXIoSCwgSyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBwLm9uKEkuQlVGRkVSX0NPREVDUywgYik7XG4gICAgY29uc3QgUiA9ICgpID0+IHtcbiAgICAgIHZhciBGO1xuICAgICAgY29uc3QgTSA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZCk7XG4gICAgICBpZiAodGhpcy5sb2coYGJ1ZmZlcmVkIHRvIGVuZCBvZiBhc3NldCAke019YCksICFNIHx8ICF0aGlzLnNjaGVkdWxlKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBIID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpLCBLID0gKEYgPSB0aGlzLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogRltIXTtcbiAgICAgIHRoaXMuaXNJbnRlcnN0aXRpYWwoSykgJiYgdGhpcy5hZHZhbmNlQXNzZXRCdWZmZXJpbmcoSywgdCk7XG4gICAgfTtcbiAgICBwLm9uKEkuQlVGRkVSRURfVE9fRU5ELCBSKTtcbiAgICBjb25zdCBBID0gKEYpID0+ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5nZXRBc3NldFBsYXllcihkKSB8fCAhdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5zaG91bGRQbGF5ID0gITA7XG4gICAgICBjb25zdCBIID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5hZHZhbmNlQWZ0ZXJBc3NldEVuZGVkKGUsIEgsIEYpO1xuICAgIH07XG4gICAgcmV0dXJuIHAub25jZShJLk1FRElBX0VOREVELCBBKHIpKSwgcC5vbmNlKEkuUExBWU9VVF9MSU1JVF9SRUFDSEVELCBBKDEgLyAwKSksIHAub24oSS5FUlJPUiwgKEYsIE0pID0+IHtcbiAgICAgIGlmICghdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgSCA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZCk7XG4gICAgICBpZiAoTS5kZXRhaWxzID09PSBKLkJVRkZFUl9TVEFMTEVEX0VSUk9SKSB7XG4gICAgICAgIGlmIChIICE9IG51bGwgJiYgSC5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVJblBsYWNlU3RhbGwoZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25UaW1ldXBkYXRlKCksIHRoaXMuY2hlY2tCdWZmZXIoITApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZUFzc2V0SXRlbUVycm9yKE0sIGUsIHRoaXMuc2NoZWR1bGUuZmluZEV2ZW50SW5kZXgoZS5pZGVudGlmaWVyKSwgciwgYEFzc2V0IHBsYXllciBlcnJvciAke00uZXJyb3J9ICR7ZX1gKTtcbiAgICB9KSwgcC5vbihJLkRFU1RST1lJTkcsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5nZXRBc3NldFBsYXllcihkKSB8fCAhdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgTSA9IG5ldyBFcnJvcihgQXNzZXQgcGxheWVyIGRlc3Ryb3llZCB1bmV4cGVjdGVkbHkgJHtkfWApLCBIID0ge1xuICAgICAgICBmYXRhbDogITAsXG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLklOVEVSU1RJVElBTF9BU1NFVF9JVEVNX0VSUk9SLFxuICAgICAgICBlcnJvcjogTVxuICAgICAgfTtcbiAgICAgIHRoaXMuaGFuZGxlQXNzZXRJdGVtRXJyb3IoSCwgZSwgdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpLCByLCBNLm1lc3NhZ2UpO1xuICAgIH0pLCB0aGlzLmxvZyhgSU5URVJTVElUSUFMX0FTU0VUX1BMQVlFUl9DUkVBVEVEICR7dm4odCl9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxfQVNTRVRfUExBWUVSX0NSRUFURUQsIHtcbiAgICAgIGFzc2V0OiB0LFxuICAgICAgYXNzZXRMaXN0SW5kZXg6IHIsXG4gICAgICBldmVudDogZSxcbiAgICAgIHBsYXllcjogcFxuICAgIH0pLCBwO1xuICB9XG4gIGNsZWFySW50ZXJzdGl0aWFsKGUsIHQpIHtcbiAgICBlLmFzc2V0TGlzdC5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0aGlzLmNsZWFyQXNzZXRQbGF5ZXIoci5pZGVudGlmaWVyLCB0KTtcbiAgICB9KSwgZS5yZXNldCgpO1xuICB9XG4gIHJlc2V0QXNzZXRQbGF5ZXIoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmdldEFzc2V0UGxheWVyUXVldWVJbmRleChlKTtcbiAgICBpZiAodCAhPT0gLTEpIHtcbiAgICAgIHRoaXMubG9nKGByZXNldCBhc3NldCBwbGF5ZXIgXCIke2V9XCIgYWZ0ZXIgZXJyb3JgKTtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnBsYXllclF1ZXVlW3RdO1xuICAgICAgdGhpcy50cmFuc2Zlck1lZGlhRnJvbVBsYXllcihyLCBudWxsKSwgci5yZXNldERldGFpbHMoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJBc3NldFBsYXllcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXJRdWV1ZUluZGV4KGUpO1xuICAgIGlmIChyICE9PSAtMSkge1xuICAgICAgY29uc3QgbiA9IHRoaXMucGxheWVyUXVldWVbcl07XG4gICAgICB0aGlzLmxvZyhgY2xlYXIgJHtufSB0b1NlZ21lbnQ6ICR7dCAmJiBrcih0KX1gKSwgdGhpcy50cmFuc2Zlck1lZGlhRnJvbVBsYXllcihuLCB0KSwgdGhpcy5wbGF5ZXJRdWV1ZS5zcGxpY2UociwgMSksIG4uZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuICBlbXB0eVBsYXllclF1ZXVlKCkge1xuICAgIGxldCBlO1xuICAgIGZvciAoOyBlID0gdGhpcy5wbGF5ZXJRdWV1ZS5wb3AoKTsgKVxuICAgICAgZS5kZXN0cm95KCk7XG4gICAgdGhpcy5wbGF5ZXJRdWV1ZSA9IFtdO1xuICB9XG4gIHN0YXJ0QXNzZXRQbGF5ZXIoZSwgdCwgciwgbiwgaSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVyc3RpdGlhbDogbyxcbiAgICAgIGFzc2V0SXRlbTogYSxcbiAgICAgIGFzc2V0SWQ6IGxcbiAgICB9ID0gZSwgYyA9IG8uYXNzZXRMaXN0Lmxlbmd0aCwgdSA9IHRoaXMucGxheWluZ0Fzc2V0O1xuICAgIHRoaXMuZW5kZWRBc3NldCA9IG51bGwsIHRoaXMucGxheWluZ0Fzc2V0ID0gYSwgKCF1IHx8IHUuaWRlbnRpZmllciAhPT0gbCkgJiYgKHUgJiYgKHRoaXMuY2xlYXJBc3NldFBsYXllcih1LmlkZW50aWZpZXIsIHJbbl0pLCBkZWxldGUgdS5lcnJvciksIHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfQVNTRVRfU1RBUlRFRCAke3QgKyAxfS8ke2N9ICR7dm4oYSl9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxfQVNTRVRfU1RBUlRFRCwge1xuICAgICAgYXNzZXQ6IGEsXG4gICAgICBhc3NldExpc3RJbmRleDogdCxcbiAgICAgIGV2ZW50OiBvLFxuICAgICAgc2NoZWR1bGU6IHIuc2xpY2UoMCksXG4gICAgICBzY2hlZHVsZUluZGV4OiBuLFxuICAgICAgcGxheWVyOiBlXG4gICAgfSkpLCB0aGlzLmJ1ZmZlckFzc2V0UGxheWVyKGUsIGkpO1xuICB9XG4gIGJ1ZmZlckFzc2V0UGxheWVyKGUsIHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJzdGl0aWFsOiBpLFxuICAgICAgYXNzZXRJdGVtOiBvXG4gICAgfSA9IGUsIGEgPSB0aGlzLnNjaGVkdWxlLmZpbmRFdmVudEluZGV4KGkuaWRlbnRpZmllciksIGwgPSAociA9IHRoaXMuc2NoZWR1bGUuaXRlbXMpID09IG51bGwgPyB2b2lkIDAgOiByW2FdO1xuICAgIGlmICghbClcbiAgICAgIHJldHVybjtcbiAgICBlLmxvYWRTb3VyY2UoKSwgdGhpcy5zZXRCdWZmZXJpbmdJdGVtKGwpLCB0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID0gbztcbiAgICBjb25zdCBjID0gdGhpcy5nZXRCdWZmZXJpbmdQbGF5ZXIoKTtcbiAgICBpZiAoYyA9PT0gZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB1ID0gaS5hcHBlbmRJblBsYWNlO1xuICAgIGlmICh1ICYmIChjID09IG51bGwgPyB2b2lkIDAgOiBjLmludGVyc3RpdGlhbC5hcHBlbmRJblBsYWNlKSA9PT0gITEpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZCA9IChjID09IG51bGwgPyB2b2lkIDAgOiBjLnRyYWNrcykgfHwgKChuID0gdGhpcy5kZXRhY2hlZERhdGEpID09IG51bGwgPyB2b2lkIDAgOiBuLnRyYWNrcykgfHwgdGhpcy5yZXF1aXJlZFRyYWNrcztcbiAgICBpZiAodSAmJiBvICE9PSB0aGlzLnBsYXlpbmdBc3NldCkge1xuICAgICAgaWYgKCFlLnRyYWNrcykge1xuICAgICAgICB0aGlzLmxvZyhgV2FpdGluZyBmb3IgdHJhY2sgaW5mbyBiZWZvcmUgYnVmZmVyaW5nICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGQgJiYgIUFnKGQsIGUudHJhY2tzKSkge1xuICAgICAgICBjb25zdCBoID0gbmV3IEVycm9yKGBBc3NldCAke3ZuKG8pfSBTb3VyY2VCdWZmZXIgdHJhY2tzICgnJHtPYmplY3Qua2V5cyhlLnRyYWNrcyl9JykgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJpbWFyeSBjb250ZW50IHRyYWNrcyAoJyR7T2JqZWN0LmtleXMoZCl9JylgKSwgZiA9IHtcbiAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgdHlwZTogdmUuT1RIRVJfRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5JTlRFUlNUSVRJQUxfQVNTRVRfSVRFTV9FUlJPUixcbiAgICAgICAgICBlcnJvcjogaFxuICAgICAgICB9LCBwID0gaS5maW5kQXNzZXRJbmRleChvKTtcbiAgICAgICAgdGhpcy5oYW5kbGVBc3NldEl0ZW1FcnJvcihmLCBpLCBhLCBwLCBoLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudHJhbnNmZXJNZWRpYVRvKGUsIHQpO1xuICB9XG4gIGhhbmRsZUluUGxhY2VTdGFsbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuc2NoZWR1bGUsIHIgPSB0aGlzLnByaW1hcnlNZWRpYTtcbiAgICBpZiAoIXQgfHwgIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IHIuY3VycmVudFRpbWUsIGkgPSB0LmZpbmRBc3NldEluZGV4KGUsIG4pLCBvID0gZS5hc3NldExpc3RbaV07XG4gICAgaWYgKG8pIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmdldEFzc2V0UGxheWVyKG8uaWRlbnRpZmllcik7XG4gICAgICBpZiAoYSkge1xuICAgICAgICBjb25zdCBsID0gYS5jdXJyZW50VGltZSB8fCBuIC0gby50aW1lbGluZVN0YXJ0LCBjID0gYS5kdXJhdGlvbiAtIGw7XG4gICAgICAgIGlmICh0aGlzLndhcm4oYFN0YWxsZWQgYXQgJHtsfSBvZiAke2wgKyBjfSBpbiAke2F9ICR7ZX0gKG1lZGlhLmN1cnJlbnRUaW1lOiAke259KWApLCBsICYmIChjIC8gci5wbGF5YmFja1JhdGUgPCAwLjUgfHwgYS5idWZmZXJlZEluUGxhY2VUb0VuZChyKSkgJiYgYS5obHMpIHtcbiAgICAgICAgICBjb25zdCB1ID0gdC5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZChlLCB1LCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhZHZhbmNlSW5QbGFjZShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgIHQgJiYgdC5jdXJyZW50VGltZSA8IGUgJiYgKHQuY3VycmVudFRpbWUgPSBlKTtcbiAgfVxuICBoYW5kbGVBc3NldEl0ZW1FcnJvcihlLCB0LCByLCBuLCBpKSB7XG4gICAgaWYgKGUuZGV0YWlscyA9PT0gSi5CVUZGRVJfU1RBTExFRF9FUlJPUilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvID0gdC5hc3NldExpc3Rbbl0gfHwgbnVsbDtcbiAgICBpZiAodGhpcy53YXJuKGBJTlRFUlNUSVRJQUxfQVNTRVRfRVJST1IgJHtvICYmIHZuKG8pfSAke2UuZXJyb3J9YCksICF0aGlzLnNjaGVkdWxlKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSAobyA9PSBudWxsID8gdm9pZCAwIDogby5pZGVudGlmaWVyKSB8fCBcIlwiLCBsID0gdGhpcy5nZXRBc3NldFBsYXllclF1ZXVlSW5kZXgoYSksIGMgPSB0aGlzLnBsYXllclF1ZXVlW2xdIHx8IG51bGwsIHUgPSB0aGlzLnNjaGVkdWxlLml0ZW1zLCBkID0gbnQoe30sIGUsIHtcbiAgICAgIGZhdGFsOiAhMSxcbiAgICAgIGVycm9yQWN0aW9uOiBBbighMCksXG4gICAgICBhc3NldDogbyxcbiAgICAgIGFzc2V0TGlzdEluZGV4OiBuLFxuICAgICAgZXZlbnQ6IHQsXG4gICAgICBzY2hlZHVsZTogdSxcbiAgICAgIHNjaGVkdWxlSW5kZXg6IHIsXG4gICAgICBwbGF5ZXI6IGNcbiAgICB9KTtcbiAgICBpZiAodGhpcy5obHMudHJpZ2dlcihJLklOVEVSU1RJVElBTF9BU1NFVF9FUlJPUiwgZCksICFlLmZhdGFsKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGggPSB0aGlzLnBsYXlpbmdBc3NldCwgZiA9IHRoaXMuYnVmZmVyaW5nQXNzZXQsIHAgPSBuZXcgRXJyb3IoaSk7XG4gICAgaWYgKG8gJiYgKHRoaXMuY2xlYXJBc3NldFBsYXllcihhLCBudWxsKSwgby5lcnJvciA9IHApLCAhdC5hc3NldExpc3Quc29tZSgoeSkgPT4gIXkuZXJyb3IpKVxuICAgICAgdC5lcnJvciA9IHA7XG4gICAgZWxzZVxuICAgICAgZm9yIChsZXQgeSA9IG47IHkgPCB0LmFzc2V0TGlzdC5sZW5ndGg7IHkrKylcbiAgICAgICAgdGhpcy5yZXNldEFzc2V0UGxheWVyKHQuYXNzZXRMaXN0W3ldLmlkZW50aWZpZXIpO1xuICAgIHRoaXMudXBkYXRlU2NoZWR1bGUoITApLCB0LmVycm9yID8gdGhpcy5wcmltYXJ5RmFsbGJhY2sodCkgOiBoICYmIGguaWRlbnRpZmllciA9PT0gYSA/IHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh0LCByLCBuKSA6IGYgJiYgZi5pZGVudGlmaWVyID09PSBhICYmIHRoaXMuaXNJbnRlcnN0aXRpYWwodGhpcy5idWZmZXJpbmdJdGVtKSAmJiB0aGlzLmFkdmFuY2VBc3NldEJ1ZmZlcmluZyh0aGlzLmJ1ZmZlcmluZ0l0ZW0sIGYpO1xuICB9XG4gIHByaW1hcnlGYWxsYmFjayhlKSB7XG4gICAgY29uc3QgdCA9IGUudGltZWxpbmVTdGFydCwgciA9IHRoaXMuZWZmZWN0aXZlUGxheWluZ0l0ZW07XG4gICAgaWYgKHIpIHtcbiAgICAgIHRoaXMubG9nKGBGYWxsYmFjayB0byBwcmltYXJ5IGZyb20gZXZlbnQgXCIke2UuaWRlbnRpZmllcn1cIiBzdGFydDogJHt0fSBwb3M6ICR7dGhpcy50aW1lbGluZVBvc30gcGxheWluZzogJHtrcihyKX0gZXJyb3I6ICR7ZS5lcnJvcn1gKTtcbiAgICAgIGxldCBuID0gdGhpcy50aW1lbGluZVBvcztcbiAgICAgIG4gPT09IC0xICYmIChuID0gdGhpcy5obHMuc3RhcnRQb3NpdGlvbik7XG4gICAgICBjb25zdCBpID0gdGhpcy51cGRhdGVJdGVtKHIsIG4pO1xuICAgICAgaWYgKHRoaXMuaXRlbXNNYXRjaChyLCBpKSAmJiB0aGlzLmNsZWFySW50ZXJzdGl0aWFsKGUsIG51bGwpLCBlLmFwcGVuZEluUGxhY2UgJiYgKHRoaXMuYXR0YWNoUHJpbWFyeSh0LCBudWxsKSwgdGhpcy5mbHVzaEZyb250QnVmZmVyKHQpKSwgIXRoaXMuc2NoZWR1bGUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLnNjaGVkdWxlLmZpbmRJdGVtSW5kZXhBdFRpbWUobik7XG4gICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24obyk7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmNoZWNrU3RhcnQoKTtcbiAgfVxuICAvLyBBc3NldCBMaXN0IGxvYWRpbmdcbiAgb25Bc3NldExpc3RMb2FkZWQoZSwgdCkge1xuICAgIHZhciByLCBuO1xuICAgIGNvbnN0IGkgPSB0LmV2ZW50LCBvID0gaS5pZGVudGlmaWVyLCBhID0gdC5hc3NldExpc3RSZXNwb25zZS5BU1NFVFM7XG4gICAgaWYgKCEoKHIgPSB0aGlzLnNjaGVkdWxlKSAhPSBudWxsICYmIHIuaGFzRXZlbnQobykpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGwgPSBpLnRpbWVsaW5lU3RhcnQsIGMgPSBpLmR1cmF0aW9uO1xuICAgIGxldCB1ID0gMDtcbiAgICBhLmZvckVhY2goKHksIEUpID0+IHtcbiAgICAgIGNvbnN0IGIgPSBwYXJzZUZsb2F0KHkuRFVSQVRJT04pO1xuICAgICAgdGhpcy5jcmVhdGVBc3NldChpLCBFLCB1LCBsICsgdSwgYiwgeS5VUkkpLCB1ICs9IGI7XG4gICAgfSksIGkuZHVyYXRpb24gPSB1LCB0aGlzLmxvZyhgTG9hZGVkIGFzc2V0LWxpc3Qgd2l0aCBkdXJhdGlvbjogJHt1fSAod2FzOiAke2N9KSAke2l9YCk7XG4gICAgY29uc3QgZCA9IHRoaXMud2FpdGluZ0l0ZW0sIGggPSAoZCA9PSBudWxsID8gdm9pZCAwIDogZC5ldmVudC5pZGVudGlmaWVyKSA9PT0gbztcbiAgICB0aGlzLnVwZGF0ZVNjaGVkdWxlKCk7XG4gICAgY29uc3QgZiA9IChuID0gdGhpcy5idWZmZXJpbmdJdGVtKSA9PSBudWxsID8gdm9pZCAwIDogbi5ldmVudDtcbiAgICBpZiAoaCkge1xuICAgICAgdmFyIHA7XG4gICAgICBjb25zdCB5ID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChvKSwgRSA9IChwID0gdGhpcy5zY2hlZHVsZS5pdGVtcykgPT0gbnVsbCA/IHZvaWQgMCA6IHBbeV07XG4gICAgICBpZiAoRSkge1xuICAgICAgICBpZiAoIXRoaXMucGxheWluZ0l0ZW0gJiYgdGhpcy50aW1lbGluZVBvcyA+IEUuZW5kICYmIHRoaXMuc2NoZWR1bGUuZmluZEl0ZW1JbmRleEF0VGltZSh0aGlzLnRpbWVsaW5lUG9zKSAhPT0geSkge1xuICAgICAgICAgIGkuZXJyb3IgPSBuZXcgRXJyb3IoYEludGVyc3RpdGlhbCBubyBsb25nZXIgd2l0aGluIHBsYXliYWNrIHJhbmdlICR7dGhpcy50aW1lbGluZVBvc30gJHtpfWApLCB0aGlzLnVwZGF0ZVNjaGVkdWxlKCEwKSwgdGhpcy5wcmltYXJ5RmFsbGJhY2soaSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyaW5nSXRlbShFKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U2NoZWR1bGVQb3NpdGlvbih5KTtcbiAgICB9IGVsc2UgaWYgKChmID09IG51bGwgPyB2b2lkIDAgOiBmLmlkZW50aWZpZXIpID09PSBvKSB7XG4gICAgICBjb25zdCB5ID0gaS5hc3NldExpc3RbMF07XG4gICAgICBpZiAoeSkge1xuICAgICAgICBjb25zdCBFID0gdGhpcy5nZXRBc3NldFBsYXllcih5LmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoZi5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgICAgICAgIEUgJiYgYiAmJiB0aGlzLmJ1ZmZlckFzc2V0UGxheWVyKEUsIGIpO1xuICAgICAgICB9IGVsc2UgRSAmJiBFLmxvYWRTb3VyY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgaWYgKHRoaXMuc2NoZWR1bGUpXG4gICAgICBzd2l0Y2ggKHQuZGV0YWlscykge1xuICAgICAgICBjYXNlIEouQVNTRVRfTElTVF9QQVJTSU5HX0VSUk9SOlxuICAgICAgICBjYXNlIEouQVNTRVRfTElTVF9MT0FEX0VSUk9SOlxuICAgICAgICBjYXNlIEouQVNTRVRfTElTVF9MT0FEX1RJTUVPVVQ6IHtcbiAgICAgICAgICBjb25zdCByID0gdC5pbnRlcnN0aXRpYWw7XG4gICAgICAgICAgciAmJiAodGhpcy51cGRhdGVTY2hlZHVsZSghMCksIHRoaXMucHJpbWFyeUZhbGxiYWNrKHIpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEouQlVGRkVSX1NUQUxMRURfRVJST1I6IHtcbiAgICAgICAgICBjb25zdCByID0gdGhpcy5lbmRlZEl0ZW0gfHwgdGhpcy53YWl0aW5nSXRlbSB8fCB0aGlzLnBsYXlpbmdJdGVtO1xuICAgICAgICAgIGlmICh0aGlzLmlzSW50ZXJzdGl0aWFsKHIpICYmIHIuZXZlbnQuYXBwZW5kSW5QbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJblBsYWNlU3RhbGwoci5ldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9nKGBQcmltYXJ5IHBsYXllciBzdGFsbCBAJHt0aGlzLnRpbWVsaW5lUG9zfSBidWZmZXJlZFBvczogJHt0aGlzLmJ1ZmZlcmVkUG9zfWApLCB0aGlzLm9uVGltZXVwZGF0ZSgpLCB0aGlzLmNoZWNrQnVmZmVyKCEwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG5jb25zdCBRaCA9IDUwMDtcbmNsYXNzIFN3IGV4dGVuZHMgVHUge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgc3VwZXIoZSwgdCwgciwgXCJzdWJ0aXRsZS1zdHJlYW0tY29udHJvbGxlclwiLCBwZS5TVUJUSVRMRSksIHRoaXMuY3VycmVudFRyYWNrSWQgPSAtMSwgdGhpcy50cmFja3NCdWZmZXJlZCA9IFtdLCB0aGlzLm1haW5EZXRhaWxzID0gbnVsbCwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIG9uSGFuZGxlckRlc3Ryb3lpbmcoKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHN1cGVyLm9uSGFuZGxlckRlc3Ryb3lpbmcoKSwgdGhpcy5tYWluRGV0YWlscyA9IG51bGw7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgc3VwZXIucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9uKEkuTEVWRUxfTE9BREVELCB0aGlzLm9uTGV2ZWxMb2FkZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tTX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB0aGlzLm9uU3VidGl0bGVUcmFja1N3aXRjaCwgdGhpcyksIGUub24oSS5TVUJUSVRMRV9UUkFDS19MT0FERUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGVkLCB0aGlzKSwgZS5vbihJLlNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VELCB0aGlzLm9uU3VidGl0bGVGcmFnUHJvY2Vzc2VkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHN1cGVyLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9mZihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5TVUJUSVRMRV9UUkFDS1NfVVBEQVRFRCwgdGhpcy5vblN1YnRpdGxlVHJhY2tzVXBkYXRlZCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB0aGlzLm9uU3VidGl0bGVUcmFja1N3aXRjaCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfVFJBQ0tfTE9BREVELCB0aGlzLm9uU3VidGl0bGVUcmFja0xvYWRlZCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfRlJBR19QUk9DRVNTRUQsIHRoaXMub25TdWJ0aXRsZUZyYWdQcm9jZXNzZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKTtcbiAgfVxuICBzdGFydExvYWQoZSwgdCkge1xuICAgIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5zdGF0ZSA9IG5lLklETEUsIHRoaXMuc2V0SW50ZXJ2YWwoUWgpLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUgKyB0aGlzLnRpbWVsaW5lT2Zmc2V0LCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0ID8gLTEgOiBlLCB0aGlzLnRpY2soKTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICBzdXBlci5vbk1hbmlmZXN0TG9hZGluZygpLCB0aGlzLm1haW5EZXRhaWxzID0gbnVsbDtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLnRyYWNrc0J1ZmZlcmVkID0gW10sIHN1cGVyLm9uTWVkaWFEZXRhY2hpbmcoZSwgdCk7XG4gIH1cbiAgb25MZXZlbExvYWRlZChlLCB0KSB7XG4gICAgdGhpcy5tYWluRGV0YWlscyA9IHQuZGV0YWlscztcbiAgfVxuICBvblN1YnRpdGxlRnJhZ1Byb2Nlc3NlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHN1Y2Nlc3M6IG5cbiAgICB9ID0gdDtcbiAgICBpZiAodGhpcy5mcmFnQ29udGV4dENoYW5nZWQocikgfHwgKFZ0KHIpICYmICh0aGlzLmZyYWdQcmV2aW91cyA9IHIpLCB0aGlzLnN0YXRlID0gbmUuSURMRSksICFuKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSB0aGlzLnRyYWNrc0J1ZmZlcmVkW3RoaXMuY3VycmVudFRyYWNrSWRdO1xuICAgIGlmICghaSlcbiAgICAgIHJldHVybjtcbiAgICBsZXQgbztcbiAgICBjb25zdCBhID0gci5zdGFydDtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGkubGVuZ3RoOyBjKyspXG4gICAgICBpZiAoYSA+PSBpW2NdLnN0YXJ0ICYmIGEgPD0gaVtjXS5lbmQpIHtcbiAgICAgICAgbyA9IGlbY107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNvbnN0IGwgPSByLnN0YXJ0ICsgci5kdXJhdGlvbjtcbiAgICBvID8gby5lbmQgPSBsIDogKG8gPSB7XG4gICAgICBzdGFydDogYSxcbiAgICAgIGVuZDogbFxuICAgIH0sIGkucHVzaChvKSksIHRoaXMuZnJhZ21lbnRUcmFja2VyLmZyYWdCdWZmZXJlZChyKSwgdGhpcy5mcmFnQnVmZmVyZWRDb21wbGV0ZShyLCBudWxsKSwgdGhpcy5tZWRpYSAmJiB0aGlzLnRpY2soKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoaW5nKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFydE9mZnNldDogcixcbiAgICAgIGVuZE9mZnNldDogblxuICAgIH0gPSB0O1xuICAgIGlmIChyID09PSAwICYmIG4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgY29uc3QgaSA9IG4gLSAxO1xuICAgICAgaWYgKGkgPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdC5lbmRPZmZzZXRTdWJ0aXRsZXMgPSBNYXRoLm1heCgwLCBpKSwgdGhpcy50cmFja3NCdWZmZXJlZC5mb3JFYWNoKChvKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgby5sZW5ndGg7ICkge1xuICAgICAgICAgIGlmIChvW2FdLmVuZCA8PSBpKSB7XG4gICAgICAgICAgICBvLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9bYV0uc3RhcnQgPCBpKVxuICAgICAgICAgICAgb1thXS5zdGFydCA9IGk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgYSsrO1xuICAgICAgICB9XG4gICAgICB9KSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnRzSW5SYW5nZShyLCBpLCBwZS5TVUJUSVRMRSk7XG4gICAgfVxuICB9XG4gIC8vIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBwcm9jZWVkIHRvIG5leHQgZnJhZywgaWYgd2Ugd2VyZSBwcm9jZXNzaW5nIG9uZS5cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHQuZnJhZztcbiAgICAociA9PSBudWxsID8gdm9pZCAwIDogci50eXBlKSA9PT0gcGUuU1VCVElUTEUgJiYgKHQuZGV0YWlscyA9PT0gSi5GUkFHX0dBUCAmJiB0aGlzLmZyYWdtZW50VHJhY2tlci5mcmFnQnVmZmVyZWQociwgITApLCB0aGlzLmZyYWdDdXJyZW50ICYmIHRoaXMuZnJhZ0N1cnJlbnQuYWJvcnRSZXF1ZXN0cygpLCB0aGlzLnN0YXRlICE9PSBuZS5TVE9QUEVEICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSkpO1xuICB9XG4gIC8vIEdvdCBhbGwgbmV3IHN1YnRpdGxlIGxldmVscy5cbiAgb25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQoZSwge1xuICAgIHN1YnRpdGxlVHJhY2tzOiB0XG4gIH0pIHtcbiAgICBpZiAodGhpcy5sZXZlbHMgJiYgQXAodGhpcy5sZXZlbHMsIHQpKSB7XG4gICAgICB0aGlzLmxldmVscyA9IHQubWFwKChyKSA9PiBuZXcgbWkocikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrc0J1ZmZlcmVkID0gW10sIHRoaXMubGV2ZWxzID0gdC5tYXAoKHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSBuZXcgbWkocik7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3NCdWZmZXJlZFtuLmlkXSA9IFtdLCBuO1xuICAgIH0pLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudHNJblJhbmdlKDAsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgcGUuU1VCVElUTEUpLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMubWVkaWFCdWZmZXIgPSBudWxsO1xuICB9XG4gIG9uU3VidGl0bGVUcmFja1N3aXRjaChlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgaWYgKHRoaXMuY3VycmVudFRyYWNrSWQgPSB0LmlkLCAhKChyID0gdGhpcy5sZXZlbHMpICE9IG51bGwgJiYgci5sZW5ndGgpIHx8IHRoaXMuY3VycmVudFRyYWNrSWQgPT09IC0xKSB7XG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHRoaXMubGV2ZWxzW3RoaXMuY3VycmVudFRyYWNrSWRdO1xuICAgIG4gIT0gbnVsbCAmJiBuLmRldGFpbHMgPyB0aGlzLm1lZGlhQnVmZmVyID0gdGhpcy5tZWRpYUJ1ZmZlclRpbWVSYW5nZXMgOiB0aGlzLm1lZGlhQnVmZmVyID0gbnVsbCwgbiAmJiB0aGlzLnN0YXRlICE9PSBuZS5TVE9QUEVEICYmIHRoaXMuc2V0SW50ZXJ2YWwoUWgpO1xuICB9XG4gIC8vIEdvdCBhIG5ldyBzZXQgb2Ygc3VidGl0bGUgZnJhZ21lbnRzLlxuICBvblN1YnRpdGxlVHJhY2tMb2FkZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRUcmFja0lkOiBuLFxuICAgICAgbGV2ZWxzOiBpXG4gICAgfSA9IHRoaXMsIHtcbiAgICAgIGRldGFpbHM6IG8sXG4gICAgICBpZDogYVxuICAgIH0gPSB0O1xuICAgIGlmICghaSkge1xuICAgICAgdGhpcy53YXJuKGBTdWJ0aXRsZSB0cmFja3Mgd2VyZSByZXNldCB3aGlsZSBsb2FkaW5nIGxldmVsICR7YX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbCA9IGlbYV07XG4gICAgaWYgKGEgPj0gaS5sZW5ndGggfHwgIWwpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5sb2coYFN1YnRpdGxlIHRyYWNrICR7YX0gbG9hZGVkIFske28uc3RhcnRTTn0sJHtvLmVuZFNOfV0ke28ubGFzdFBhcnRTbiA/IGBbcGFydC0ke28ubGFzdFBhcnRTbn0tJHtvLmxhc3RQYXJ0SW5kZXh9XWAgOiBcIlwifSxkdXJhdGlvbjoke28udG90YWxkdXJhdGlvbn1gKSwgdGhpcy5tZWRpYUJ1ZmZlciA9IHRoaXMubWVkaWFCdWZmZXJUaW1lUmFuZ2VzO1xuICAgIGxldCBjID0gMDtcbiAgICBpZiAoby5saXZlIHx8IChyID0gbC5kZXRhaWxzKSAhPSBudWxsICYmIHIubGl2ZSkge1xuICAgICAgaWYgKG8uZGVsdGFVcGRhdGVGYWlsZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLm1haW5EZXRhaWxzO1xuICAgICAgaWYgKCFkKSB7XG4gICAgICAgIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGggPSBkLmZyYWdtZW50c1swXTtcbiAgICAgIGlmICghbC5kZXRhaWxzKVxuICAgICAgICBvLmhhc1Byb2dyYW1EYXRlVGltZSAmJiBkLmhhc1Byb2dyYW1EYXRlVGltZSA/IChzYShvLCBkKSwgYyA9IG8uZnJhZ21lbnRTdGFydCkgOiBoICYmIChjID0gaC5zdGFydCwgZ2MobywgYykpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciB1O1xuICAgICAgICBjID0gdGhpcy5hbGlnblBsYXlsaXN0cyhvLCBsLmRldGFpbHMsICh1ID0gdGhpcy5sZXZlbExhc3RMb2FkZWQpID09IG51bGwgPyB2b2lkIDAgOiB1LmRldGFpbHMpLCBjID09PSAwICYmIGggJiYgKGMgPSBoLnN0YXJ0LCBnYyhvLCBjKSk7XG4gICAgICB9XG4gICAgICBkICYmICF0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiB0aGlzLnNldFN0YXJ0UG9zaXRpb24oZCwgYyk7XG4gICAgfVxuICAgIGwuZGV0YWlscyA9IG8sIHRoaXMubGV2ZWxMYXN0TG9hZGVkID0gbCwgYSA9PT0gbiAmJiAodGhpcy5obHMudHJpZ2dlcihJLlNVQlRJVExFX1RSQUNLX1VQREFURUQsIHtcbiAgICAgIGRldGFpbHM6IG8sXG4gICAgICBpZDogYSxcbiAgICAgIGdyb3VwSWQ6IHQuZ3JvdXBJZFxuICAgIH0pLCB0aGlzLnRpY2soKSwgby5saXZlICYmICF0aGlzLmZyYWdDdXJyZW50ICYmIHRoaXMubWVkaWEgJiYgdGhpcy5zdGF0ZSA9PT0gbmUuSURMRSAmJiAoSnMobnVsbCwgby5mcmFnbWVudHMsIHRoaXMubWVkaWEuY3VycmVudFRpbWUsIDApIHx8ICh0aGlzLndhcm4oXCJTdWJ0aXRsZSBwbGF5bGlzdCBub3QgYWxpZ25lZCB3aXRoIHBsYXliYWNrXCIpLCBsLmRldGFpbHMgPSB2b2lkIDApKSk7XG4gIH1cbiAgX2hhbmRsZUZyYWdtZW50TG9hZENvbXBsZXRlKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiB0LFxuICAgICAgcGF5bG9hZDogclxuICAgIH0gPSBlLCBuID0gdC5kZWNyeXB0ZGF0YSwgaSA9IHRoaXMuaGxzO1xuICAgIGlmICghdGhpcy5mcmFnQ29udGV4dENoYW5nZWQodCkgJiYgciAmJiByLmJ5dGVMZW5ndGggPiAwICYmIG4gIT0gbnVsbCAmJiBuLmtleSAmJiBuLml2ICYmIEluKG4ubWV0aG9kKSkge1xuICAgICAgY29uc3QgbyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgdGhpcy5kZWNyeXB0ZXIuZGVjcnlwdChuZXcgVWludDhBcnJheShyKSwgbi5rZXkuYnVmZmVyLCBuLml2LmJ1ZmZlciwgU3Uobi5tZXRob2QpKS5jYXRjaCgoYSkgPT4ge1xuICAgICAgICB0aHJvdyBpLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgIGRldGFpbHM6IEouRlJBR19ERUNSWVBUX0VSUk9SLFxuICAgICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgICBlcnJvcjogYSxcbiAgICAgICAgICByZWFzb246IGEubWVzc2FnZSxcbiAgICAgICAgICBmcmFnOiB0XG4gICAgICAgIH0pLCBhO1xuICAgICAgfSkudGhlbigoYSkgPT4ge1xuICAgICAgICBjb25zdCBsID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIGkudHJpZ2dlcihJLkZSQUdfREVDUllQVEVELCB7XG4gICAgICAgICAgZnJhZzogdCxcbiAgICAgICAgICBwYXlsb2FkOiBhLFxuICAgICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgICB0c3RhcnQ6IG8sXG4gICAgICAgICAgICB0ZGVjcnlwdDogbFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoYSkgPT4ge1xuICAgICAgICB0aGlzLndhcm4oYCR7YS5uYW1lfTogJHthLm1lc3NhZ2V9YCksIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGRvVGljaygpIHtcbiAgICBpZiAoIXRoaXMubWVkaWEpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gbmUuSURMRSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjdXJyZW50VHJhY2tJZDogZSxcbiAgICAgICAgbGV2ZWxzOiB0XG4gICAgICB9ID0gdGhpcywgciA9IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHRbZV07XG4gICAgICBpZiAoIXIgfHwgIXQubGVuZ3RoIHx8ICFyLmRldGFpbHMgfHwgdGhpcy53YWl0Rm9yTGl2ZShyKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb25maWc6IG5cbiAgICAgIH0gPSB0aGlzLCBpID0gdGhpcy5nZXRMb2FkUG9zaXRpb24oKSwgbyA9IENlLmJ1ZmZlcmVkSW5mbyh0aGlzLnRyYWNrc0J1ZmZlcmVkW3RoaXMuY3VycmVudFRyYWNrSWRdIHx8IFtdLCBpLCBuLm1heEJ1ZmZlckhvbGUpLCB7XG4gICAgICAgIGVuZDogYSxcbiAgICAgICAgbGVuOiBsXG4gICAgICB9ID0gbywgYyA9IHIuZGV0YWlscywgdSA9IHRoaXMuaGxzLm1heEJ1ZmZlckxlbmd0aCArIGMubGV2ZWxUYXJnZXREdXJhdGlvbjtcbiAgICAgIGlmIChsID4gdSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgZCA9IGMuZnJhZ21lbnRzLCBoID0gZC5sZW5ndGgsIGYgPSBjLmVkZ2U7XG4gICAgICBsZXQgcCA9IG51bGw7XG4gICAgICBjb25zdCB5ID0gdGhpcy5mcmFnUHJldmlvdXM7XG4gICAgICBpZiAoYSA8IGYpIHtcbiAgICAgICAgY29uc3QgUiA9IG4ubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSwgQSA9IGEgPiBmIC0gUiA/IDAgOiBSO1xuICAgICAgICBwID0gSnMoeSwgZCwgTWF0aC5tYXgoZFswXS5zdGFydCwgYSksIEEpLCAhcCAmJiB5ICYmIHkuc3RhcnQgPCBkWzBdLnN0YXJ0ICYmIChwID0gZFswXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcCA9IGRbaCAtIDFdO1xuICAgICAgaWYgKHAgPSB0aGlzLmZpbHRlclJlcGxhY2VkUHJpbWFyeShwLCByLmRldGFpbHMpLCAhcClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgRSA9IHAuc24gLSBjLnN0YXJ0U04sIGIgPSBkW0UgLSAxXTtcbiAgICAgIGlmIChiICYmIGIuY2MgPT09IHAuY2MgJiYgdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoYikgPT09IEh0Lk5PVF9MT0FERUQgJiYgKHAgPSBiKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUocCkgPT09IEh0Lk5PVF9MT0FERUQpIHtcbiAgICAgICAgY29uc3QgUiA9IHRoaXMubWFwVG9Jbml0RnJhZ1doZW5SZXF1aXJlZChwKTtcbiAgICAgICAgUiAmJiB0aGlzLmxvYWRGcmFnbWVudChSLCByLCBhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9hZEZyYWdtZW50KGUsIHQsIHIpIHtcbiAgICBWdChlKSA/IHN1cGVyLmxvYWRGcmFnbWVudChlLCB0LCByKSA6IHRoaXMuX2xvYWRJbml0U2VnbWVudChlLCB0KTtcbiAgfVxuICBnZXQgbWVkaWFCdWZmZXJUaW1lUmFuZ2VzKCkge1xuICAgIHJldHVybiBuZXcgYncodGhpcy50cmFja3NCdWZmZXJlZFt0aGlzLmN1cnJlbnRUcmFja0lkXSB8fCBbXSk7XG4gIH1cbn1cbmNsYXNzIGJ3IHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuYnVmZmVyZWQgPSB2b2lkIDA7XG4gICAgY29uc3QgdCA9IChyLCBuLCBpKSA9PiB7XG4gICAgICBpZiAobiA9IG4gPj4+IDAsIG4gPiBpIC0gMSlcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgRmFpbGVkIHRvIGV4ZWN1dGUgJyR7cn0nIG9uICdUaW1lUmFuZ2VzJzogVGhlIGluZGV4IHByb3ZpZGVkICgke259KSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYm91bmQgKCR7aX0pYCk7XG4gICAgICByZXR1cm4gZVtuXVtyXTtcbiAgICB9O1xuICAgIHRoaXMuYnVmZmVyZWQgPSB7XG4gICAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gZS5sZW5ndGg7XG4gICAgICB9LFxuICAgICAgZW5kKHIpIHtcbiAgICAgICAgcmV0dXJuIHQoXCJlbmRcIiwgciwgZS5sZW5ndGgpO1xuICAgICAgfSxcbiAgICAgIHN0YXJ0KHIpIHtcbiAgICAgICAgcmV0dXJuIHQoXCJzdGFydFwiLCByLCBlLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuY29uc3QgVHcgPSB7XG4gIDQyOiAyMjUsXG4gIC8vIGxvd2VyY2FzZSBhLCBhY3V0ZSBhY2NlbnRcbiAgOTI6IDIzMyxcbiAgLy8gbG93ZXJjYXNlIGUsIGFjdXRlIGFjY2VudFxuICA5NDogMjM3LFxuICAvLyBsb3dlcmNhc2UgaSwgYWN1dGUgYWNjZW50XG4gIDk1OiAyNDMsXG4gIC8vIGxvd2VyY2FzZSBvLCBhY3V0ZSBhY2NlbnRcbiAgOTY6IDI1MCxcbiAgLy8gbG93ZXJjYXNlIHUsIGFjdXRlIGFjY2VudFxuICAxMjM6IDIzMSxcbiAgLy8gbG93ZXJjYXNlIGMgd2l0aCBjZWRpbGxhXG4gIDEyNDogMjQ3LFxuICAvLyBkaXZpc2lvbiBzeW1ib2xcbiAgMTI1OiAyMDksXG4gIC8vIHVwcGVyY2FzZSBOIHRpbGRlXG4gIDEyNjogMjQxLFxuICAvLyBsb3dlcmNhc2UgbiB0aWxkZVxuICAxMjc6IDk2MDgsXG4gIC8vIEZ1bGwgYmxvY2tcbiAgLy8gVEhJUyBCTE9DSyBJTkNMVURFUyBUSEUgMTYgRVhURU5ERUQgKFRXTy1CWVRFKSBMSU5FIDIxIENIQVJBQ1RFUlNcbiAgLy8gVEhBVCBDT01FIEZST00gSEkgQllURT0weDExIEFORCBMT1cgQkVUV0VFTiAweDMwIEFORCAweDNGXG4gIC8vIFRISVMgTUVBTlMgVEhBVCBcXHg1MCBNVVNUIEJFIEFEREVEIFRPIFRIRSBWQUxVRVNcbiAgMTI4OiAxNzQsXG4gIC8vIFJlZ2lzdGVyZWQgc3ltYm9sIChSKVxuICAxMjk6IDE3NixcbiAgLy8gZGVncmVlIHNpZ25cbiAgMTMwOiAxODksXG4gIC8vIDEvMiBzeW1ib2xcbiAgMTMxOiAxOTEsXG4gIC8vIEludmVydGVkIChvcGVuKSBxdWVzdGlvbiBtYXJrXG4gIDEzMjogODQ4MixcbiAgLy8gVHJhZGVtYXJrIHN5bWJvbCAoVE0pXG4gIDEzMzogMTYyLFxuICAvLyBDZW50cyBzeW1ib2xcbiAgMTM0OiAxNjMsXG4gIC8vIFBvdW5kcyBzdGVybGluZ1xuICAxMzU6IDk4MzQsXG4gIC8vIE11c2ljIDgndGggbm90ZVxuICAxMzY6IDIyNCxcbiAgLy8gbG93ZXJjYXNlIGEsIGdyYXZlIGFjY2VudFxuICAxMzc6IDMyLFxuICAvLyB0cmFuc3BhcmVudCBzcGFjZSAocmVndWxhcilcbiAgMTM4OiAyMzIsXG4gIC8vIGxvd2VyY2FzZSBlLCBncmF2ZSBhY2NlbnRcbiAgMTM5OiAyMjYsXG4gIC8vIGxvd2VyY2FzZSBhLCBjaXJjdW1mbGV4IGFjY2VudFxuICAxNDA6IDIzNCxcbiAgLy8gbG93ZXJjYXNlIGUsIGNpcmN1bWZsZXggYWNjZW50XG4gIDE0MTogMjM4LFxuICAvLyBsb3dlcmNhc2UgaSwgY2lyY3VtZmxleCBhY2NlbnRcbiAgMTQyOiAyNDQsXG4gIC8vIGxvd2VyY2FzZSBvLCBjaXJjdW1mbGV4IGFjY2VudFxuICAxNDM6IDI1MSxcbiAgLy8gbG93ZXJjYXNlIHUsIGNpcmN1bWZsZXggYWNjZW50XG4gIC8vIFRISVMgQkxPQ0sgSU5DTFVERVMgVEhFIDMyIEVYVEVOREVEIChUV08tQllURSkgTElORSAyMSBDSEFSQUNURVJTXG4gIC8vIFRIQVQgQ09NRSBGUk9NIEhJIEJZVEU9MHgxMiBBTkQgTE9XIEJFVFdFRU4gMHgyMCBBTkQgMHgzRlxuICAxNDQ6IDE5MyxcbiAgLy8gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlXG4gIDE0NTogMjAxLFxuICAvLyBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGVcbiAgMTQ2OiAyMTEsXG4gIC8vIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZVxuICAxNDc6IDIxOCxcbiAgLy8gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlXG4gIDE0ODogMjIwLFxuICAvLyBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhcmVzaXNcbiAgMTQ5OiAyNTIsXG4gIC8vIGxvd2VyY2FzZSBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpc1xuICAxNTA6IDgyMTYsXG4gIC8vIG9wZW5pbmcgc2luZ2xlIHF1b3RlXG4gIDE1MTogMTYxLFxuICAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrXG4gIDE1MjogNDIsXG4gIC8vIGFzdGVyaXNrXG4gIDE1MzogODIxNyxcbiAgLy8gY2xvc2luZyBzaW5nbGUgcXVvdGVcbiAgMTU0OiA5NDczLFxuICAvLyBib3ggZHJhd2luZ3MgaGVhdnkgaG9yaXpvbnRhbFxuICAxNTU6IDE2OSxcbiAgLy8gY29weXJpZ2h0IHNpZ25cbiAgMTU2OiA4NDgwLFxuICAvLyBTZXJ2aWNlIG1hcmtcbiAgMTU3OiA4MjI2LFxuICAvLyAocm91bmQpIGJ1bGxldFxuICAxNTg6IDgyMjAsXG4gIC8vIExlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrXG4gIDE1OTogODIyMSxcbiAgLy8gUmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrXG4gIDE2MDogMTkyLFxuICAvLyB1cHBlcmNhc2UgQSwgZ3JhdmUgYWNjZW50XG4gIDE2MTogMTk0LFxuICAvLyB1cHBlcmNhc2UgQSwgY2lyY3VtZmxleFxuICAxNjI6IDE5OSxcbiAgLy8gdXBwZXJjYXNlIEMgd2l0aCBjZWRpbGxhXG4gIDE2MzogMjAwLFxuICAvLyB1cHBlcmNhc2UgRSwgZ3JhdmUgYWNjZW50XG4gIDE2NDogMjAyLFxuICAvLyB1cHBlcmNhc2UgRSwgY2lyY3VtZmxleFxuICAxNjU6IDIwMyxcbiAgLy8gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYXJlc2lzXG4gIDE2NjogMjM1LFxuICAvLyBsb3dlcmNhc2UgbGV0dGVyIGUgd2l0aCBkaWFyZXNpc1xuICAxNjc6IDIwNixcbiAgLy8gdXBwZXJjYXNlIEksIGNpcmN1bWZsZXhcbiAgMTY4OiAyMDcsXG4gIC8vIHVwcGVyY2FzZSBJLCB3aXRoIGRpYXJlc2lzXG4gIDE2OTogMjM5LFxuICAvLyBsb3dlcmNhc2UgaSwgd2l0aCBkaWFyZXNpc1xuICAxNzA6IDIxMixcbiAgLy8gdXBwZXJjYXNlIE8sIGNpcmN1bWZsZXhcbiAgMTcxOiAyMTcsXG4gIC8vIHVwcGVyY2FzZSBVLCBncmF2ZSBhY2NlbnRcbiAgMTcyOiAyNDksXG4gIC8vIGxvd2VyY2FzZSB1LCBncmF2ZSBhY2NlbnRcbiAgMTczOiAyMTksXG4gIC8vIHVwcGVyY2FzZSBVLCBjaXJjdW1mbGV4XG4gIDE3NDogMTcxLFxuICAvLyBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFya1xuICAxNzU6IDE4NyxcbiAgLy8gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrXG4gIC8vIFRISVMgQkxPQ0sgSU5DTFVERVMgVEhFIDMyIEVYVEVOREVEIChUV08tQllURSkgTElORSAyMSBDSEFSQUNURVJTXG4gIC8vIFRIQVQgQ09NRSBGUk9NIEhJIEJZVEU9MHgxMyBBTkQgTE9XIEJFVFdFRU4gMHgyMCBBTkQgMHgzRlxuICAxNzY6IDE5NSxcbiAgLy8gVXBwZXJjYXNlIEEsIHRpbGRlXG4gIDE3NzogMjI3LFxuICAvLyBMb3dlcmNhc2UgYSwgdGlsZGVcbiAgMTc4OiAyMDUsXG4gIC8vIFVwcGVyY2FzZSBJLCBhY3V0ZSBhY2NlbnRcbiAgMTc5OiAyMDQsXG4gIC8vIFVwcGVyY2FzZSBJLCBncmF2ZSBhY2NlbnRcbiAgMTgwOiAyMzYsXG4gIC8vIExvd2VyY2FzZSBpLCBncmF2ZSBhY2NlbnRcbiAgMTgxOiAyMTAsXG4gIC8vIFVwcGVyY2FzZSBPLCBncmF2ZSBhY2NlbnRcbiAgMTgyOiAyNDIsXG4gIC8vIExvd2VyY2FzZSBvLCBncmF2ZSBhY2NlbnRcbiAgMTgzOiAyMTMsXG4gIC8vIFVwcGVyY2FzZSBPLCB0aWxkZVxuICAxODQ6IDI0NSxcbiAgLy8gTG93ZXJjYXNlIG8sIHRpbGRlXG4gIDE4NTogMTIzLFxuICAvLyBPcGVuIGN1cmx5IGJyYWNlXG4gIDE4NjogMTI1LFxuICAvLyBDbG9zaW5nIGN1cmx5IGJyYWNlXG4gIDE4NzogOTIsXG4gIC8vIEJhY2tzbGFzaFxuICAxODg6IDk0LFxuICAvLyBDYXJldFxuICAxODk6IDk1LFxuICAvLyBVbmRlcnNjb3JlXG4gIDE5MDogMTI0LFxuICAvLyBQaXBlICh2ZXJ0aWNhbCBsaW5lKVxuICAxOTE6IDg3NjQsXG4gIC8vIFRpbGRlIG9wZXJhdG9yXG4gIDE5MjogMTk2LFxuICAvLyBVcHBlcmNhc2UgQSwgdW1sYXV0XG4gIDE5MzogMjI4LFxuICAvLyBMb3dlcmNhc2UgQSwgdW1sYXV0XG4gIDE5NDogMjE0LFxuICAvLyBVcHBlcmNhc2UgTywgdW1sYXV0XG4gIDE5NTogMjQ2LFxuICAvLyBMb3dlcmNhc2UgbywgdW1sYXV0XG4gIDE5NjogMjIzLFxuICAvLyBFc3N6ZXR0IChzaGFycCBTKVxuICAxOTc6IDE2NSxcbiAgLy8gWWVuIHN5bWJvbFxuICAxOTg6IDE2NCxcbiAgLy8gR2VuZXJpYyBjdXJyZW5jeSBzaWduXG4gIDE5OTogOTQ3NSxcbiAgLy8gQm94IGRyYXdpbmdzIGhlYXZ5IHZlcnRpY2FsXG4gIDIwMDogMTk3LFxuICAvLyBVcHBlcmNhc2UgQSwgcmluZ1xuICAyMDE6IDIyOSxcbiAgLy8gTG93ZXJjYXNlIEEsIHJpbmdcbiAgMjAyOiAyMTYsXG4gIC8vIFVwcGVyY2FzZSBPLCBzdHJva2VcbiAgMjAzOiAyNDgsXG4gIC8vIExvd2VyY2FzZSBvLCBzdHJva1xuICAyMDQ6IDk0ODcsXG4gIC8vIEJveCBkcmF3aW5ncyBoZWF2eSBkb3duIGFuZCByaWdodFxuICAyMDU6IDk0OTEsXG4gIC8vIEJveCBkcmF3aW5ncyBoZWF2eSBkb3duIGFuZCBsZWZ0XG4gIDIwNjogOTQ5NSxcbiAgLy8gQm94IGRyYXdpbmdzIGhlYXZ5IHVwIGFuZCByaWdodFxuICAyMDc6IDk0OTlcbiAgLy8gQm94IGRyYXdpbmdzIGhlYXZ5IHVwIGFuZCBsZWZ0XG59LCBHcCA9IChzKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKFR3W3NdIHx8IHMpLCBEciA9IDE1LCBpcyA9IDEwMCwgd3cgPSB7XG4gIDE3OiAxLFxuICAxODogMyxcbiAgMjE6IDUsXG4gIDIyOiA3LFxuICAyMzogOSxcbiAgMTY6IDExLFxuICAxOTogMTIsXG4gIDIwOiAxNFxufSwgQXcgPSB7XG4gIDE3OiAyLFxuICAxODogNCxcbiAgMjE6IDYsXG4gIDIyOiA4LFxuICAyMzogMTAsXG4gIDE5OiAxMyxcbiAgMjA6IDE1XG59LCBJdyA9IHtcbiAgMjU6IDEsXG4gIDI2OiAzLFxuICAyOTogNSxcbiAgMzA6IDcsXG4gIDMxOiA5LFxuICAyNDogMTEsXG4gIDI3OiAxMixcbiAgMjg6IDE0XG59LCBfdyA9IHtcbiAgMjU6IDIsXG4gIDI2OiA0LFxuICAyOTogNixcbiAgMzA6IDgsXG4gIDMxOiAxMCxcbiAgMjc6IDEzLFxuICAyODogMTVcbn0sIFJ3ID0gW1wid2hpdGVcIiwgXCJncmVlblwiLCBcImJsdWVcIiwgXCJjeWFuXCIsIFwicmVkXCIsIFwieWVsbG93XCIsIFwibWFnZW50YVwiLCBcImJsYWNrXCIsIFwidHJhbnNwYXJlbnRcIl07XG5jbGFzcyBMdyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudGltZSA9IG51bGwsIHRoaXMudmVyYm9zZUxldmVsID0gMDtcbiAgfVxuICBsb2coZSwgdCkge1xuICAgIGlmICh0aGlzLnZlcmJvc2VMZXZlbCA+PSBlKSB7XG4gICAgICBjb25zdCByID0gdHlwZW9mIHQgPT0gXCJmdW5jdGlvblwiID8gdCgpIDogdDtcbiAgICAgIHJ0LmxvZyhgJHt0aGlzLnRpbWV9IFske2V9XSAke3J9YCk7XG4gICAgfVxuICB9XG59XG5jb25zdCBOcyA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IFtdO1xuICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspXG4gICAgdC5wdXNoKGVbcl0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHQ7XG59O1xuY2xhc3MgVnAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZvcmVncm91bmQgPSBcIndoaXRlXCIsIHRoaXMudW5kZXJsaW5lID0gITEsIHRoaXMuaXRhbGljcyA9ICExLCB0aGlzLmJhY2tncm91bmQgPSBcImJsYWNrXCIsIHRoaXMuZmxhc2ggPSAhMTtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLmZvcmVncm91bmQgPSBcIndoaXRlXCIsIHRoaXMudW5kZXJsaW5lID0gITEsIHRoaXMuaXRhbGljcyA9ICExLCB0aGlzLmJhY2tncm91bmQgPSBcImJsYWNrXCIsIHRoaXMuZmxhc2ggPSAhMTtcbiAgfVxuICBzZXRTdHlsZXMoZSkge1xuICAgIGNvbnN0IHQgPSBbXCJmb3JlZ3JvdW5kXCIsIFwidW5kZXJsaW5lXCIsIFwiaXRhbGljc1wiLCBcImJhY2tncm91bmRcIiwgXCJmbGFzaFwiXTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgIGNvbnN0IG4gPSB0W3JdO1xuICAgICAgZS5oYXNPd25Qcm9wZXJ0eShuKSAmJiAodGhpc1tuXSA9IGVbbl0pO1xuICAgIH1cbiAgfVxuICBpc0RlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWdyb3VuZCA9PT0gXCJ3aGl0ZVwiICYmICF0aGlzLnVuZGVybGluZSAmJiAhdGhpcy5pdGFsaWNzICYmIHRoaXMuYmFja2dyb3VuZCA9PT0gXCJibGFja1wiICYmICF0aGlzLmZsYXNoO1xuICB9XG4gIGVxdWFscyhlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWdyb3VuZCA9PT0gZS5mb3JlZ3JvdW5kICYmIHRoaXMudW5kZXJsaW5lID09PSBlLnVuZGVybGluZSAmJiB0aGlzLml0YWxpY3MgPT09IGUuaXRhbGljcyAmJiB0aGlzLmJhY2tncm91bmQgPT09IGUuYmFja2dyb3VuZCAmJiB0aGlzLmZsYXNoID09PSBlLmZsYXNoO1xuICB9XG4gIGNvcHkoZSkge1xuICAgIHRoaXMuZm9yZWdyb3VuZCA9IGUuZm9yZWdyb3VuZCwgdGhpcy51bmRlcmxpbmUgPSBlLnVuZGVybGluZSwgdGhpcy5pdGFsaWNzID0gZS5pdGFsaWNzLCB0aGlzLmJhY2tncm91bmQgPSBlLmJhY2tncm91bmQsIHRoaXMuZmxhc2ggPSBlLmZsYXNoO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBcImNvbG9yPVwiICsgdGhpcy5mb3JlZ3JvdW5kICsgXCIsIHVuZGVybGluZT1cIiArIHRoaXMudW5kZXJsaW5lICsgXCIsIGl0YWxpY3M9XCIgKyB0aGlzLml0YWxpY3MgKyBcIiwgYmFja2dyb3VuZD1cIiArIHRoaXMuYmFja2dyb3VuZCArIFwiLCBmbGFzaD1cIiArIHRoaXMuZmxhc2g7XG4gIH1cbn1cbmNsYXNzIEN3IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy51Y2hhciA9IFwiIFwiLCB0aGlzLnBlblN0YXRlID0gbmV3IFZwKCk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy51Y2hhciA9IFwiIFwiLCB0aGlzLnBlblN0YXRlLnJlc2V0KCk7XG4gIH1cbiAgc2V0Q2hhcihlLCB0KSB7XG4gICAgdGhpcy51Y2hhciA9IGUsIHRoaXMucGVuU3RhdGUuY29weSh0KTtcbiAgfVxuICBzZXRQZW5TdGF0ZShlKSB7XG4gICAgdGhpcy5wZW5TdGF0ZS5jb3B5KGUpO1xuICB9XG4gIGVxdWFscyhlKSB7XG4gICAgcmV0dXJuIHRoaXMudWNoYXIgPT09IGUudWNoYXIgJiYgdGhpcy5wZW5TdGF0ZS5lcXVhbHMoZS5wZW5TdGF0ZSk7XG4gIH1cbiAgY29weShlKSB7XG4gICAgdGhpcy51Y2hhciA9IGUudWNoYXIsIHRoaXMucGVuU3RhdGUuY29weShlLnBlblN0YXRlKTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnVjaGFyID09PSBcIiBcIiAmJiB0aGlzLnBlblN0YXRlLmlzRGVmYXVsdCgpO1xuICB9XG59XG5jbGFzcyBrdyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmNoYXJzID0gW10sIHRoaXMucG9zID0gMCwgdGhpcy5jdXJyUGVuU3RhdGUgPSBuZXcgVnAoKSwgdGhpcy5jdWVTdGFydFRpbWUgPSBudWxsLCB0aGlzLmxvZ2dlciA9IHZvaWQgMDtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGlzOyB0KyspXG4gICAgICB0aGlzLmNoYXJzLnB1c2gobmV3IEN3KCkpO1xuICAgIHRoaXMubG9nZ2VyID0gZTtcbiAgfVxuICBlcXVhbHMoZSkge1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaXM7IHQrKylcbiAgICAgIGlmICghdGhpcy5jaGFyc1t0XS5lcXVhbHMoZS5jaGFyc1t0XSkpXG4gICAgICAgIHJldHVybiAhMTtcbiAgICByZXR1cm4gITA7XG4gIH1cbiAgY29weShlKSB7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCBpczsgdCsrKVxuICAgICAgdGhpcy5jaGFyc1t0XS5jb3B5KGUuY2hhcnNbdF0pO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgbGV0IGUgPSAhMDtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGlzOyB0KyspXG4gICAgICBpZiAoIXRoaXMuY2hhcnNbdF0uaXNFbXB0eSgpKSB7XG4gICAgICAgIGUgPSAhMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgLyoqXG4gICAqICBTZXQgdGhlIGN1cnNvciB0byBhIHZhbGlkIGNvbHVtbi5cbiAgICovXG4gIHNldEN1cnNvcihlKSB7XG4gICAgdGhpcy5wb3MgIT09IGUgJiYgKHRoaXMucG9zID0gZSksIHRoaXMucG9zIDwgMCA/ICh0aGlzLmxvZ2dlci5sb2coMywgXCJOZWdhdGl2ZSBjdXJzb3IgcG9zaXRpb24gXCIgKyB0aGlzLnBvcyksIHRoaXMucG9zID0gMCkgOiB0aGlzLnBvcyA+IGlzICYmICh0aGlzLmxvZ2dlci5sb2coMywgXCJUb28gbGFyZ2UgY3Vyc29yIHBvc2l0aW9uIFwiICsgdGhpcy5wb3MpLCB0aGlzLnBvcyA9IGlzKTtcbiAgfVxuICAvKipcbiAgICogTW92ZSB0aGUgY3Vyc29yIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24uXG4gICAqL1xuICBtb3ZlQ3Vyc29yKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5wb3MgKyBlO1xuICAgIGlmIChlID4gMSlcbiAgICAgIGZvciAobGV0IHIgPSB0aGlzLnBvcyArIDE7IHIgPCB0ICsgMTsgcisrKVxuICAgICAgICB0aGlzLmNoYXJzW3JdLnNldFBlblN0YXRlKHRoaXMuY3VyclBlblN0YXRlKTtcbiAgICB0aGlzLnNldEN1cnNvcih0KTtcbiAgfVxuICAvKipcbiAgICogQmFja3NwYWNlLCBtb3ZlIG9uZSBzdGVwIGJhY2sgYW5kIGNsZWFyIGNoYXJhY3Rlci5cbiAgICovXG4gIGJhY2tTcGFjZSgpIHtcbiAgICB0aGlzLm1vdmVDdXJzb3IoLTEpLCB0aGlzLmNoYXJzW3RoaXMucG9zXS5zZXRDaGFyKFwiIFwiLCB0aGlzLmN1cnJQZW5TdGF0ZSk7XG4gIH1cbiAgaW5zZXJ0Q2hhcihlKSB7XG4gICAgZSA+PSAxNDQgJiYgdGhpcy5iYWNrU3BhY2UoKTtcbiAgICBjb25zdCB0ID0gR3AoZSk7XG4gICAgaWYgKHRoaXMucG9zID49IGlzKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coMCwgKCkgPT4gXCJDYW5ub3QgaW5zZXJ0IFwiICsgZS50b1N0cmluZygxNikgKyBcIiAoXCIgKyB0ICsgXCIpIGF0IHBvc2l0aW9uIFwiICsgdGhpcy5wb3MgKyBcIi4gU2tpcHBpbmcgaXQhXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNoYXJzW3RoaXMucG9zXS5zZXRDaGFyKHQsIHRoaXMuY3VyclBlblN0YXRlKSwgdGhpcy5tb3ZlQ3Vyc29yKDEpO1xuICB9XG4gIGNsZWFyRnJvbVBvcyhlKSB7XG4gICAgbGV0IHQ7XG4gICAgZm9yICh0ID0gZTsgdCA8IGlzOyB0KyspXG4gICAgICB0aGlzLmNoYXJzW3RdLnJlc2V0KCk7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5jbGVhckZyb21Qb3MoMCksIHRoaXMucG9zID0gMCwgdGhpcy5jdXJyUGVuU3RhdGUucmVzZXQoKTtcbiAgfVxuICBjbGVhclRvRW5kT2ZSb3coKSB7XG4gICAgdGhpcy5jbGVhckZyb21Qb3ModGhpcy5wb3MpO1xuICB9XG4gIGdldFRleHRTdHJpbmcoKSB7XG4gICAgY29uc3QgZSA9IFtdO1xuICAgIGxldCB0ID0gITA7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBpczsgcisrKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5jaGFyc1tyXS51Y2hhcjtcbiAgICAgIG4gIT09IFwiIFwiICYmICh0ID0gITEpLCBlLnB1c2gobik7XG4gICAgfVxuICAgIHJldHVybiB0ID8gXCJcIiA6IGUuam9pbihcIlwiKTtcbiAgfVxuICBzZXRQZW5TdHlsZXMoZSkge1xuICAgIHRoaXMuY3VyclBlblN0YXRlLnNldFN0eWxlcyhlKSwgdGhpcy5jaGFyc1t0aGlzLnBvc10uc2V0UGVuU3RhdGUodGhpcy5jdXJyUGVuU3RhdGUpO1xuICB9XG59XG5jbGFzcyB3bCB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLnJvd3MgPSBbXSwgdGhpcy5jdXJyUm93ID0gRHIgLSAxLCB0aGlzLm5yUm9sbFVwUm93cyA9IG51bGwsIHRoaXMubGFzdE91dHB1dFNjcmVlbiA9IG51bGwsIHRoaXMubG9nZ2VyID0gdm9pZCAwO1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgRHI7IHQrKylcbiAgICAgIHRoaXMucm93cy5wdXNoKG5ldyBrdyhlKSk7XG4gICAgdGhpcy5sb2dnZXIgPSBlO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIGZvciAobGV0IGUgPSAwOyBlIDwgRHI7IGUrKylcbiAgICAgIHRoaXMucm93c1tlXS5jbGVhcigpO1xuICAgIHRoaXMuY3VyclJvdyA9IERyIC0gMTtcbiAgfVxuICBlcXVhbHMoZSkge1xuICAgIGxldCB0ID0gITA7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBEcjsgcisrKVxuICAgICAgaWYgKCF0aGlzLnJvd3Nbcl0uZXF1YWxzKGUucm93c1tyXSkpIHtcbiAgICAgICAgdCA9ICExO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfVxuICBjb3B5KGUpIHtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IERyOyB0KyspXG4gICAgICB0aGlzLnJvd3NbdF0uY29weShlLnJvd3NbdF0pO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgbGV0IGUgPSAhMDtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IERyOyB0KyspXG4gICAgICBpZiAoIXRoaXMucm93c1t0XS5pc0VtcHR5KCkpIHtcbiAgICAgICAgZSA9ICExO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBiYWNrU3BhY2UoKSB7XG4gICAgdGhpcy5yb3dzW3RoaXMuY3VyclJvd10uYmFja1NwYWNlKCk7XG4gIH1cbiAgY2xlYXJUb0VuZE9mUm93KCkge1xuICAgIHRoaXMucm93c1t0aGlzLmN1cnJSb3ddLmNsZWFyVG9FbmRPZlJvdygpO1xuICB9XG4gIC8qKlxuICAgKiBJbnNlcnQgYSBjaGFyYWN0ZXIgKHdpdGhvdXQgc3R5bGluZykgaW4gdGhlIGN1cnJlbnQgcm93LlxuICAgKi9cbiAgaW5zZXJ0Q2hhcihlKSB7XG4gICAgdGhpcy5yb3dzW3RoaXMuY3VyclJvd10uaW5zZXJ0Q2hhcihlKTtcbiAgfVxuICBzZXRQZW4oZSkge1xuICAgIHRoaXMucm93c1t0aGlzLmN1cnJSb3ddLnNldFBlblN0eWxlcyhlKTtcbiAgfVxuICBtb3ZlQ3Vyc29yKGUpIHtcbiAgICB0aGlzLnJvd3NbdGhpcy5jdXJyUm93XS5tb3ZlQ3Vyc29yKGUpO1xuICB9XG4gIHNldEN1cnNvcihlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwic2V0Q3Vyc29yOiBcIiArIGUpLCB0aGlzLnJvd3NbdGhpcy5jdXJyUm93XS5zZXRDdXJzb3IoZSk7XG4gIH1cbiAgc2V0UEFDKGUpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgKCkgPT4gXCJwYWNEYXRhID0gXCIgKyBhdChlKSk7XG4gICAgbGV0IHQgPSBlLnJvdyAtIDE7XG4gICAgaWYgKHRoaXMubnJSb2xsVXBSb3dzICYmIHQgPCB0aGlzLm5yUm9sbFVwUm93cyAtIDEgJiYgKHQgPSB0aGlzLm5yUm9sbFVwUm93cyAtIDEpLCB0aGlzLm5yUm9sbFVwUm93cyAmJiB0aGlzLmN1cnJSb3cgIT09IHQpIHtcbiAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgRHI7IGErKylcbiAgICAgICAgdGhpcy5yb3dzW2FdLmNsZWFyKCk7XG4gICAgICBjb25zdCBpID0gdGhpcy5jdXJyUm93ICsgMSAtIHRoaXMubnJSb2xsVXBSb3dzLCBvID0gdGhpcy5sYXN0T3V0cHV0U2NyZWVuO1xuICAgICAgaWYgKG8pIHtcbiAgICAgICAgY29uc3QgYSA9IG8ucm93c1tpXS5jdWVTdGFydFRpbWUsIGwgPSB0aGlzLmxvZ2dlci50aW1lO1xuICAgICAgICBpZiAoYSAhPT0gbnVsbCAmJiBsICE9PSBudWxsICYmIGEgPCBsKVxuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgdGhpcy5uclJvbGxVcFJvd3M7IGMrKylcbiAgICAgICAgICAgIHRoaXMucm93c1t0IC0gdGhpcy5uclJvbGxVcFJvd3MgKyBjICsgMV0uY29weShvLnJvd3NbaSArIGNdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jdXJyUm93ID0gdDtcbiAgICBjb25zdCByID0gdGhpcy5yb3dzW3RoaXMuY3VyclJvd107XG4gICAgaWYgKGUuaW5kZW50ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpID0gZS5pbmRlbnQsIG8gPSBNYXRoLm1heChpIC0gMSwgMCk7XG4gICAgICByLnNldEN1cnNvcihlLmluZGVudCksIGUuY29sb3IgPSByLmNoYXJzW29dLnBlblN0YXRlLmZvcmVncm91bmQ7XG4gICAgfVxuICAgIGNvbnN0IG4gPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBlLmNvbG9yLFxuICAgICAgdW5kZXJsaW5lOiBlLnVuZGVybGluZSxcbiAgICAgIGl0YWxpY3M6IGUuaXRhbGljcyxcbiAgICAgIGJhY2tncm91bmQ6IFwiYmxhY2tcIixcbiAgICAgIGZsYXNoOiAhMVxuICAgIH07XG4gICAgdGhpcy5zZXRQZW4obik7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBiYWNrZ3JvdW5kL2V4dHJhIGZvcmVncm91bmQsIGJ1dCBmaXJzdCBkbyBiYWNrX3NwYWNlLCBhbmQgdGhlbiBpbnNlcnQgc3BhY2UgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS5cbiAgICovXG4gIHNldEJrZ0RhdGEoZSkge1xuICAgIHRoaXMubG9nZ2VyLmxvZygyLCAoKSA9PiBcImJrZ0RhdGEgPSBcIiArIGF0KGUpKSwgdGhpcy5iYWNrU3BhY2UoKSwgdGhpcy5zZXRQZW4oZSksIHRoaXMuaW5zZXJ0Q2hhcigzMik7XG4gIH1cbiAgc2V0Um9sbFVwUm93cyhlKSB7XG4gICAgdGhpcy5uclJvbGxVcFJvd3MgPSBlO1xuICB9XG4gIHJvbGxVcCgpIHtcbiAgICBpZiAodGhpcy5uclJvbGxVcFJvd3MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZygzLCBcInJvbGxfdXAgYnV0IG5yUm9sbFVwUm93cyBub3Qgc2V0IHlldFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIubG9nKDEsICgpID0+IHRoaXMuZ2V0RGlzcGxheVRleHQoKSk7XG4gICAgY29uc3QgZSA9IHRoaXMuY3VyclJvdyArIDEgLSB0aGlzLm5yUm9sbFVwUm93cywgdCA9IHRoaXMucm93cy5zcGxpY2UoZSwgMSlbMF07XG4gICAgdC5jbGVhcigpLCB0aGlzLnJvd3Muc3BsaWNlKHRoaXMuY3VyclJvdywgMCwgdCksIHRoaXMubG9nZ2VyLmxvZygyLCBcIlJvbGxpbmcgdXBcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhbGwgbm9uLWVtcHR5IHJvd3Mgd2l0aCBhcyB1bmljb2RlIHRleHQuXG4gICAqL1xuICBnZXREaXNwbGF5VGV4dChlKSB7XG4gICAgZSA9IGUgfHwgITE7XG4gICAgY29uc3QgdCA9IFtdO1xuICAgIGxldCByID0gXCJcIiwgbiA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRHI7IGkrKykge1xuICAgICAgY29uc3QgbyA9IHRoaXMucm93c1tpXS5nZXRUZXh0U3RyaW5nKCk7XG4gICAgICBvICYmIChuID0gaSArIDEsIGUgPyB0LnB1c2goXCJSb3cgXCIgKyBuICsgXCI6ICdcIiArIG8gKyBcIidcIikgOiB0LnB1c2goby50cmltKCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHQubGVuZ3RoID4gMCAmJiAoZSA/IHIgPSBcIltcIiArIHQuam9pbihcIiB8IFwiKSArIFwiXVwiIDogciA9IHQuam9pbihgXG5gKSksIHI7XG4gIH1cbiAgZ2V0VGV4dEFuZEZvcm1hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzO1xuICB9XG59XG5jbGFzcyBlZiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICB0aGlzLmNoTnIgPSB2b2lkIDAsIHRoaXMub3V0cHV0RmlsdGVyID0gdm9pZCAwLCB0aGlzLm1vZGUgPSB2b2lkIDAsIHRoaXMudmVyYm9zZSA9IHZvaWQgMCwgdGhpcy5kaXNwbGF5ZWRNZW1vcnkgPSB2b2lkIDAsIHRoaXMubm9uRGlzcGxheWVkTWVtb3J5ID0gdm9pZCAwLCB0aGlzLmxhc3RPdXRwdXRTY3JlZW4gPSB2b2lkIDAsIHRoaXMuY3VyclJvbGxVcFJvdyA9IHZvaWQgMCwgdGhpcy53cml0ZVNjcmVlbiA9IHZvaWQgMCwgdGhpcy5jdWVTdGFydFRpbWUgPSB2b2lkIDAsIHRoaXMubG9nZ2VyID0gdm9pZCAwLCB0aGlzLmNoTnIgPSBlLCB0aGlzLm91dHB1dEZpbHRlciA9IHQsIHRoaXMubW9kZSA9IG51bGwsIHRoaXMudmVyYm9zZSA9IDAsIHRoaXMuZGlzcGxheWVkTWVtb3J5ID0gbmV3IHdsKHIpLCB0aGlzLm5vbkRpc3BsYXllZE1lbW9yeSA9IG5ldyB3bChyKSwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuID0gbmV3IHdsKHIpLCB0aGlzLmN1cnJSb2xsVXBSb3cgPSB0aGlzLmRpc3BsYXllZE1lbW9yeS5yb3dzW0RyIC0gMV0sIHRoaXMud3JpdGVTY3JlZW4gPSB0aGlzLmRpc3BsYXllZE1lbW9yeSwgdGhpcy5tb2RlID0gbnVsbCwgdGhpcy5jdWVTdGFydFRpbWUgPSBudWxsLCB0aGlzLmxvZ2dlciA9IHI7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5tb2RlID0gbnVsbCwgdGhpcy5kaXNwbGF5ZWRNZW1vcnkucmVzZXQoKSwgdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnkucmVzZXQoKSwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuLnJlc2V0KCksIHRoaXMub3V0cHV0RmlsdGVyLnJlc2V0KCksIHRoaXMuY3VyclJvbGxVcFJvdyA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LnJvd3NbRHIgLSAxXSwgdGhpcy53cml0ZVNjcmVlbiA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LCB0aGlzLm1vZGUgPSBudWxsLCB0aGlzLmN1ZVN0YXJ0VGltZSA9IG51bGw7XG4gIH1cbiAgZ2V0SGFuZGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRGaWx0ZXI7XG4gIH1cbiAgc2V0SGFuZGxlcihlKSB7XG4gICAgdGhpcy5vdXRwdXRGaWx0ZXIgPSBlO1xuICB9XG4gIHNldFBBQyhlKSB7XG4gICAgdGhpcy53cml0ZVNjcmVlbi5zZXRQQUMoZSk7XG4gIH1cbiAgc2V0QmtnRGF0YShlKSB7XG4gICAgdGhpcy53cml0ZVNjcmVlbi5zZXRCa2dEYXRhKGUpO1xuICB9XG4gIHNldE1vZGUoZSkge1xuICAgIGUgIT09IHRoaXMubW9kZSAmJiAodGhpcy5tb2RlID0gZSwgdGhpcy5sb2dnZXIubG9nKDIsICgpID0+IFwiTU9ERT1cIiArIGUpLCB0aGlzLm1vZGUgPT09IFwiTU9ERV9QT1AtT05cIiA/IHRoaXMud3JpdGVTY3JlZW4gPSB0aGlzLm5vbkRpc3BsYXllZE1lbW9yeSA6ICh0aGlzLndyaXRlU2NyZWVuID0gdGhpcy5kaXNwbGF5ZWRNZW1vcnksIHRoaXMud3JpdGVTY3JlZW4ucmVzZXQoKSksIHRoaXMubW9kZSAhPT0gXCJNT0RFX1JPTEwtVVBcIiAmJiAodGhpcy5kaXNwbGF5ZWRNZW1vcnkubnJSb2xsVXBSb3dzID0gbnVsbCwgdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnkubnJSb2xsVXBSb3dzID0gbnVsbCksIHRoaXMubW9kZSA9IGUpO1xuICB9XG4gIGluc2VydENoYXJzKGUpIHtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspXG4gICAgICB0aGlzLndyaXRlU2NyZWVuLmluc2VydENoYXIoZVtyXSk7XG4gICAgY29uc3QgdCA9IHRoaXMud3JpdGVTY3JlZW4gPT09IHRoaXMuZGlzcGxheWVkTWVtb3J5ID8gXCJESVNQXCIgOiBcIk5PTl9ESVNQXCI7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsICgpID0+IHQgKyBcIjogXCIgKyB0aGlzLndyaXRlU2NyZWVuLmdldERpc3BsYXlUZXh0KCEwKSksICh0aGlzLm1vZGUgPT09IFwiTU9ERV9QQUlOVC1PTlwiIHx8IHRoaXMubW9kZSA9PT0gXCJNT0RFX1JPTEwtVVBcIikgJiYgKHRoaXMubG9nZ2VyLmxvZygxLCAoKSA9PiBcIkRJU1BMQVlFRDogXCIgKyB0aGlzLmRpc3BsYXllZE1lbW9yeS5nZXREaXNwbGF5VGV4dCghMCkpLCB0aGlzLm91dHB1dERhdGFVcGRhdGUoKSk7XG4gIH1cbiAgY2NSQ0woKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiUkNMIC0gUmVzdW1lIENhcHRpb24gTG9hZGluZ1wiKSwgdGhpcy5zZXRNb2RlKFwiTU9ERV9QT1AtT05cIik7XG4gIH1cbiAgY2NCUygpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJCUyAtIEJhY2tTcGFjZVwiKSwgdGhpcy5tb2RlICE9PSBcIk1PREVfVEVYVFwiICYmICh0aGlzLndyaXRlU2NyZWVuLmJhY2tTcGFjZSgpLCB0aGlzLndyaXRlU2NyZWVuID09PSB0aGlzLmRpc3BsYXllZE1lbW9yeSAmJiB0aGlzLm91dHB1dERhdGFVcGRhdGUoKSk7XG4gIH1cbiAgY2NBT0YoKSB7XG4gIH1cbiAgY2NBT04oKSB7XG4gIH1cbiAgY2NERVIoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiREVSLSBEZWxldGUgdG8gRW5kIG9mIFJvd1wiKSwgdGhpcy53cml0ZVNjcmVlbi5jbGVhclRvRW5kT2ZSb3coKSwgdGhpcy5vdXRwdXREYXRhVXBkYXRlKCk7XG4gIH1cbiAgY2NSVShlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiUlUoXCIgKyBlICsgXCIpIC0gUm9sbCBVcFwiKSwgdGhpcy53cml0ZVNjcmVlbiA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LCB0aGlzLnNldE1vZGUoXCJNT0RFX1JPTEwtVVBcIiksIHRoaXMud3JpdGVTY3JlZW4uc2V0Um9sbFVwUm93cyhlKTtcbiAgfVxuICBjY0ZPTigpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJGT04gLSBGbGFzaCBPblwiKSwgdGhpcy53cml0ZVNjcmVlbi5zZXRQZW4oe1xuICAgICAgZmxhc2g6ICEwXG4gICAgfSk7XG4gIH1cbiAgY2NSREMoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiUkRDIC0gUmVzdW1lIERpcmVjdCBDYXB0aW9uaW5nXCIpLCB0aGlzLnNldE1vZGUoXCJNT0RFX1BBSU5ULU9OXCIpO1xuICB9XG4gIGNjVFIoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiVFJcIiksIHRoaXMuc2V0TW9kZShcIk1PREVfVEVYVFwiKTtcbiAgfVxuICBjY1JURCgpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJSVERcIiksIHRoaXMuc2V0TW9kZShcIk1PREVfVEVYVFwiKTtcbiAgfVxuICBjY0VETSgpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJFRE0gLSBFcmFzZSBEaXNwbGF5ZWQgTWVtb3J5XCIpLCB0aGlzLmRpc3BsYXllZE1lbW9yeS5yZXNldCgpLCB0aGlzLm91dHB1dERhdGFVcGRhdGUoITApO1xuICB9XG4gIGNjQ1IoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiQ1IgLSBDYXJyaWFnZSBSZXR1cm5cIiksIHRoaXMud3JpdGVTY3JlZW4ucm9sbFVwKCksIHRoaXMub3V0cHV0RGF0YVVwZGF0ZSghMCk7XG4gIH1cbiAgY2NFTk0oKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiRU5NIC0gRXJhc2UgTm9uLWRpc3BsYXllZCBNZW1vcnlcIiksIHRoaXMubm9uRGlzcGxheWVkTWVtb3J5LnJlc2V0KCk7XG4gIH1cbiAgY2NFT0MoKSB7XG4gICAgaWYgKHRoaXMubG9nZ2VyLmxvZygyLCBcIkVPQyAtIEVuZCBPZiBDYXB0aW9uXCIpLCB0aGlzLm1vZGUgPT09IFwiTU9ERV9QT1AtT05cIikge1xuICAgICAgY29uc3QgZSA9IHRoaXMuZGlzcGxheWVkTWVtb3J5O1xuICAgICAgdGhpcy5kaXNwbGF5ZWRNZW1vcnkgPSB0aGlzLm5vbkRpc3BsYXllZE1lbW9yeSwgdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnkgPSBlLCB0aGlzLndyaXRlU2NyZWVuID0gdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnksIHRoaXMubG9nZ2VyLmxvZygxLCAoKSA9PiBcIkRJU1A6IFwiICsgdGhpcy5kaXNwbGF5ZWRNZW1vcnkuZ2V0RGlzcGxheVRleHQoKSk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0RGF0YVVwZGF0ZSghMCk7XG4gIH1cbiAgY2NUTyhlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiVE8oXCIgKyBlICsgXCIpIC0gVGFiIE9mZnNldFwiKSwgdGhpcy53cml0ZVNjcmVlbi5tb3ZlQ3Vyc29yKGUpO1xuICB9XG4gIGNjTUlEUk9XKGUpIHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgZmxhc2g6ICExXG4gICAgfTtcbiAgICBpZiAodC51bmRlcmxpbmUgPSBlICUgMiA9PT0gMSwgdC5pdGFsaWNzID0gZSA+PSA0NiwgdC5pdGFsaWNzKVxuICAgICAgdC5mb3JlZ3JvdW5kID0gXCJ3aGl0ZVwiO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgciA9IE1hdGguZmxvb3IoZSAvIDIpIC0gMTYsIG4gPSBbXCJ3aGl0ZVwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiLCBcImN5YW5cIiwgXCJyZWRcIiwgXCJ5ZWxsb3dcIiwgXCJtYWdlbnRhXCJdO1xuICAgICAgdC5mb3JlZ3JvdW5kID0gbltyXTtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiTUlEUk9XOiBcIiArIGF0KHQpKSwgdGhpcy53cml0ZVNjcmVlbi5zZXRQZW4odCk7XG4gIH1cbiAgb3V0cHV0RGF0YVVwZGF0ZShlID0gITEpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5sb2dnZXIudGltZTtcbiAgICB0ICE9PSBudWxsICYmIHRoaXMub3V0cHV0RmlsdGVyICYmICh0aGlzLmN1ZVN0YXJ0VGltZSA9PT0gbnVsbCAmJiAhdGhpcy5kaXNwbGF5ZWRNZW1vcnkuaXNFbXB0eSgpID8gdGhpcy5jdWVTdGFydFRpbWUgPSB0IDogdGhpcy5kaXNwbGF5ZWRNZW1vcnkuZXF1YWxzKHRoaXMubGFzdE91dHB1dFNjcmVlbikgfHwgKHRoaXMub3V0cHV0RmlsdGVyLm5ld0N1ZSh0aGlzLmN1ZVN0YXJ0VGltZSwgdCwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuKSwgZSAmJiB0aGlzLm91dHB1dEZpbHRlci5kaXNwYXRjaEN1ZSAmJiB0aGlzLm91dHB1dEZpbHRlci5kaXNwYXRjaEN1ZSgpLCB0aGlzLmN1ZVN0YXJ0VGltZSA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LmlzRW1wdHkoKSA/IG51bGwgOiB0KSwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuLmNvcHkodGhpcy5kaXNwbGF5ZWRNZW1vcnkpKTtcbiAgfVxuICBjdWVTcGxpdEF0VGltZShlKSB7XG4gICAgdGhpcy5vdXRwdXRGaWx0ZXIgJiYgKHRoaXMuZGlzcGxheWVkTWVtb3J5LmlzRW1wdHkoKSB8fCAodGhpcy5vdXRwdXRGaWx0ZXIubmV3Q3VlICYmIHRoaXMub3V0cHV0RmlsdGVyLm5ld0N1ZSh0aGlzLmN1ZVN0YXJ0VGltZSwgZSwgdGhpcy5kaXNwbGF5ZWRNZW1vcnkpLCB0aGlzLmN1ZVN0YXJ0VGltZSA9IGUpKTtcbiAgfVxufVxuY2xhc3MgdGYge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy5jaGFubmVscyA9IHZvaWQgMCwgdGhpcy5jdXJyZW50Q2hhbm5lbCA9IDAsIHRoaXMuY21kSGlzdG9yeSA9IFB3KCksIHRoaXMubG9nZ2VyID0gdm9pZCAwO1xuICAgIGNvbnN0IG4gPSB0aGlzLmxvZ2dlciA9IG5ldyBMdygpO1xuICAgIHRoaXMuY2hhbm5lbHMgPSBbbnVsbCwgbmV3IGVmKGUsIHQsIG4pLCBuZXcgZWYoZSArIDEsIHIsIG4pXTtcbiAgfVxuICBnZXRIYW5kbGVyKGUpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tlXS5nZXRIYW5kbGVyKCk7XG4gIH1cbiAgc2V0SGFuZGxlcihlLCB0KSB7XG4gICAgdGhpcy5jaGFubmVsc1tlXS5zZXRIYW5kbGVyKHQpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgZGF0YSBmb3IgdGltZSB0IGluIGZvcm1zIG9mIGxpc3Qgb2YgYnl0ZXMgKHVuc2lnbmVkIGludHMpLiBUaGUgYnl0ZXMgYXJlIHRyZWF0ZWQgYXMgcGFpcnMuXG4gICAqL1xuICBhZGREYXRhKGUsIHQpIHtcbiAgICB0aGlzLmxvZ2dlci50aW1lID0gZTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHQubGVuZ3RoOyByICs9IDIpIHtcbiAgICAgIGNvbnN0IG4gPSB0W3JdICYgMTI3LCBpID0gdFtyICsgMV0gJiAxMjc7XG4gICAgICBsZXQgbyA9ICExLCBhID0gbnVsbDtcbiAgICAgIGlmIChuID09PSAwICYmIGkgPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdGhpcy5sb2dnZXIubG9nKDMsICgpID0+IFwiW1wiICsgTnMoW3Rbcl0sIHRbciArIDFdXSkgKyBcIl0gLT4gKFwiICsgTnMoW24sIGldKSArIFwiKVwiKTtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmNtZEhpc3Rvcnk7XG4gICAgICBpZiAobiA+PSAxNiAmJiBuIDw9IDMxKSB7XG4gICAgICAgIGlmIChEdyhuLCBpLCBsKSkge1xuICAgICAgICAgIGVvKG51bGwsIG51bGwsIGwpLCB0aGlzLmxvZ2dlci5sb2coMywgKCkgPT4gXCJSZXBlYXRlZCBjb21tYW5kIChcIiArIE5zKFtuLCBpXSkgKyBcIikgaXMgZHJvcHBlZFwiKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbyhuLCBpLCB0aGlzLmNtZEhpc3RvcnkpLCBvID0gdGhpcy5wYXJzZUNtZChuLCBpKSwgbyB8fCAobyA9IHRoaXMucGFyc2VNaWRyb3cobiwgaSkpLCBvIHx8IChvID0gdGhpcy5wYXJzZVBBQyhuLCBpKSksIG8gfHwgKG8gPSB0aGlzLnBhcnNlQmFja2dyb3VuZEF0dHJpYnV0ZXMobiwgaSkpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGVvKG51bGwsIG51bGwsIGwpO1xuICAgICAgaWYgKCFvICYmIChhID0gdGhpcy5wYXJzZUNoYXJzKG4sIGkpLCBhKSkge1xuICAgICAgICBjb25zdCB1ID0gdGhpcy5jdXJyZW50Q2hhbm5lbDtcbiAgICAgICAgdSAmJiB1ID4gMCA/IHRoaXMuY2hhbm5lbHNbdV0uaW5zZXJ0Q2hhcnMoYSkgOiB0aGlzLmxvZ2dlci5sb2coMiwgXCJObyBjaGFubmVsIGZvdW5kIHlldC4gVEVYVC1NT0RFP1wiKTtcbiAgICAgIH1cbiAgICAgICFvICYmICFhICYmIHRoaXMubG9nZ2VyLmxvZygyLCAoKSA9PiBcIkNvdWxkbid0IHBhcnNlIGNsZWFuZWQgZGF0YSBcIiArIE5zKFtuLCBpXSkgKyBcIiBvcmlnOiBcIiArIE5zKFt0W3JdLCB0W3IgKyAxXV0pKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYSBjb21tYW5kIHdhcyBmb3VuZFxuICAgKi9cbiAgcGFyc2VDbWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAoZSA9PT0gMjAgfHwgZSA9PT0gMjggfHwgZSA9PT0gMjEgfHwgZSA9PT0gMjkpICYmIHQgPj0gMzIgJiYgdCA8PSA0NywgbiA9IChlID09PSAyMyB8fCBlID09PSAzMSkgJiYgdCA+PSAzMyAmJiB0IDw9IDM1O1xuICAgIGlmICghKHIgfHwgbikpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgaSA9IGUgPT09IDIwIHx8IGUgPT09IDIxIHx8IGUgPT09IDIzID8gMSA6IDIsIG8gPSB0aGlzLmNoYW5uZWxzW2ldO1xuICAgIHJldHVybiBlID09PSAyMCB8fCBlID09PSAyMSB8fCBlID09PSAyOCB8fCBlID09PSAyOSA/IHQgPT09IDMyID8gby5jY1JDTCgpIDogdCA9PT0gMzMgPyBvLmNjQlMoKSA6IHQgPT09IDM0ID8gby5jY0FPRigpIDogdCA9PT0gMzUgPyBvLmNjQU9OKCkgOiB0ID09PSAzNiA/IG8uY2NERVIoKSA6IHQgPT09IDM3ID8gby5jY1JVKDIpIDogdCA9PT0gMzggPyBvLmNjUlUoMykgOiB0ID09PSAzOSA/IG8uY2NSVSg0KSA6IHQgPT09IDQwID8gby5jY0ZPTigpIDogdCA9PT0gNDEgPyBvLmNjUkRDKCkgOiB0ID09PSA0MiA/IG8uY2NUUigpIDogdCA9PT0gNDMgPyBvLmNjUlREKCkgOiB0ID09PSA0NCA/IG8uY2NFRE0oKSA6IHQgPT09IDQ1ID8gby5jY0NSKCkgOiB0ID09PSA0NiA/IG8uY2NFTk0oKSA6IHQgPT09IDQ3ICYmIG8uY2NFT0MoKSA6IG8uY2NUTyh0IC0gMzIpLCB0aGlzLmN1cnJlbnRDaGFubmVsID0gaSwgITA7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIG1pZHJvdyBzdHlsaW5nIGNvbW1hbmRcbiAgICovXG4gIHBhcnNlTWlkcm93KGUsIHQpIHtcbiAgICBsZXQgciA9IDA7XG4gICAgaWYgKChlID09PSAxNyB8fCBlID09PSAyNSkgJiYgdCA+PSAzMiAmJiB0IDw9IDQ3KSB7XG4gICAgICBpZiAoZSA9PT0gMTcgPyByID0gMSA6IHIgPSAyLCByICE9PSB0aGlzLmN1cnJlbnRDaGFubmVsKVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXIubG9nKDAsIFwiTWlzbWF0Y2ggY2hhbm5lbCBpbiBtaWRyb3cgcGFyc2luZ1wiKSwgITE7XG4gICAgICBjb25zdCBuID0gdGhpcy5jaGFubmVsc1tyXTtcbiAgICAgIHJldHVybiBuID8gKG4uY2NNSURST1codCksIHRoaXMubG9nZ2VyLmxvZygzLCAoKSA9PiBcIk1JRFJPVyAoXCIgKyBOcyhbZSwgdF0pICsgXCIpXCIpLCAhMCkgOiAhMTtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZSBQcmVhYmxlIEFjY2VzcyBDb2RlcyAoVGFibGUgNTMpLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVGVsbHMgaWYgUEFDIGZvdW5kXG4gICAqL1xuICBwYXJzZVBBQyhlLCB0KSB7XG4gICAgbGV0IHI7XG4gICAgY29uc3QgbiA9IChlID49IDE3ICYmIGUgPD0gMjMgfHwgZSA+PSAyNSAmJiBlIDw9IDMxKSAmJiB0ID49IDY0ICYmIHQgPD0gMTI3LCBpID0gKGUgPT09IDE2IHx8IGUgPT09IDI0KSAmJiB0ID49IDY0ICYmIHQgPD0gOTU7XG4gICAgaWYgKCEobiB8fCBpKSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCBvID0gZSA8PSAyMyA/IDEgOiAyO1xuICAgIHQgPj0gNjQgJiYgdCA8PSA5NSA/IHIgPSBvID09PSAxID8gd3dbZV0gOiBJd1tlXSA6IHIgPSBvID09PSAxID8gQXdbZV0gOiBfd1tlXTtcbiAgICBjb25zdCBhID0gdGhpcy5jaGFubmVsc1tvXTtcbiAgICByZXR1cm4gYSA/IChhLnNldFBBQyh0aGlzLmludGVycHJldFBBQyhyLCB0KSksIHRoaXMuY3VycmVudENoYW5uZWwgPSBvLCAhMCkgOiAhMTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJwcmV0IHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgcGFjLCBhbmQgcmV0dXJuIHRoZSBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybnMgcGFjRGF0YSB3aXRoIHN0eWxlIHBhcmFtZXRlcnNcbiAgICovXG4gIGludGVycHJldFBBQyhlLCB0KSB7XG4gICAgbGV0IHI7XG4gICAgY29uc3QgbiA9IHtcbiAgICAgIGNvbG9yOiBudWxsLFxuICAgICAgaXRhbGljczogITEsXG4gICAgICBpbmRlbnQ6IG51bGwsXG4gICAgICB1bmRlcmxpbmU6ICExLFxuICAgICAgcm93OiBlXG4gICAgfTtcbiAgICByZXR1cm4gdCA+IDk1ID8gciA9IHQgLSA5NiA6IHIgPSB0IC0gNjQsIG4udW5kZXJsaW5lID0gKHIgJiAxKSA9PT0gMSwgciA8PSAxMyA/IG4uY29sb3IgPSBbXCJ3aGl0ZVwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiLCBcImN5YW5cIiwgXCJyZWRcIiwgXCJ5ZWxsb3dcIiwgXCJtYWdlbnRhXCIsIFwid2hpdGVcIl1bTWF0aC5mbG9vcihyIC8gMildIDogciA8PSAxNSA/IChuLml0YWxpY3MgPSAhMCwgbi5jb2xvciA9IFwid2hpdGVcIikgOiBuLmluZGVudCA9IE1hdGguZmxvb3IoKHIgLSAxNikgLyAyKSAqIDQsIG47XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIGNoYXJhY3RlcnMuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IHdpdGggMSB0byAyIGNvZGVzIGNvcnJlc3BvbmRpbmcgdG8gY2hhcnMsIGlmIGZvdW5kLiBudWxsIG90aGVyd2lzZS5cbiAgICovXG4gIHBhcnNlQ2hhcnMoZSwgdCkge1xuICAgIGxldCByLCBuID0gbnVsbCwgaSA9IG51bGw7XG4gICAgaWYgKGUgPj0gMjUgPyAociA9IDIsIGkgPSBlIC0gOCkgOiAociA9IDEsIGkgPSBlKSwgaSA+PSAxNyAmJiBpIDw9IDE5KSB7XG4gICAgICBsZXQgbztcbiAgICAgIGkgPT09IDE3ID8gbyA9IHQgKyA4MCA6IGkgPT09IDE4ID8gbyA9IHQgKyAxMTIgOiBvID0gdCArIDE0NCwgdGhpcy5sb2dnZXIubG9nKDIsICgpID0+IFwiU3BlY2lhbCBjaGFyICdcIiArIEdwKG8pICsgXCInIGluIGNoYW5uZWwgXCIgKyByKSwgbiA9IFtvXTtcbiAgICB9IGVsc2UgZSA+PSAzMiAmJiBlIDw9IDEyNyAmJiAobiA9IHQgPT09IDAgPyBbZV0gOiBbZSwgdF0pO1xuICAgIHJldHVybiBuICYmIHRoaXMubG9nZ2VyLmxvZygzLCAoKSA9PiBcIkNoYXIgY29kZXMgPSAgXCIgKyBOcyhuKS5qb2luKFwiLFwiKSksIG47XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIGV4dGVuZGVkIGJhY2tncm91bmQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIG5ldyBmb3JlZ3JvdW5kIGNvbG9yIGJsYWNrLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGJhY2tncm91bmQgYXR0cmlidXRlcyBhcmUgZm91bmRcbiAgICovXG4gIHBhcnNlQmFja2dyb3VuZEF0dHJpYnV0ZXMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAoZSA9PT0gMTYgfHwgZSA9PT0gMjQpICYmIHQgPj0gMzIgJiYgdCA8PSA0NywgbiA9IChlID09PSAyMyB8fCBlID09PSAzMSkgJiYgdCA+PSA0NSAmJiB0IDw9IDQ3O1xuICAgIGlmICghKHIgfHwgbikpXG4gICAgICByZXR1cm4gITE7XG4gICAgbGV0IGk7XG4gICAgY29uc3QgbyA9IHt9O1xuICAgIGUgPT09IDE2IHx8IGUgPT09IDI0ID8gKGkgPSBNYXRoLmZsb29yKCh0IC0gMzIpIC8gMiksIG8uYmFja2dyb3VuZCA9IFJ3W2ldLCB0ICUgMiA9PT0gMSAmJiAoby5iYWNrZ3JvdW5kID0gby5iYWNrZ3JvdW5kICsgXCJfc2VtaVwiKSkgOiB0ID09PSA0NSA/IG8uYmFja2dyb3VuZCA9IFwidHJhbnNwYXJlbnRcIiA6IChvLmZvcmVncm91bmQgPSBcImJsYWNrXCIsIHQgPT09IDQ3ICYmIChvLnVuZGVybGluZSA9ICEwKSk7XG4gICAgY29uc3QgYSA9IGUgPD0gMjMgPyAxIDogMjtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1thXS5zZXRCa2dEYXRhKG8pLCAhMDtcbiAgfVxuICAvKipcbiAgICogUmVzZXQgc3RhdGUgb2YgcGFyc2VyIGFuZCBpdHMgY2hhbm5lbHMuXG4gICAqL1xuICByZXNldCgpIHtcbiAgICBmb3IgKGxldCBlID0gMDsgZSA8IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbHMpLmxlbmd0aDsgZSsrKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5jaGFubmVsc1tlXTtcbiAgICAgIHQgJiYgdC5yZXNldCgpO1xuICAgIH1cbiAgICBlbyhudWxsLCBudWxsLCB0aGlzLmNtZEhpc3RvcnkpO1xuICB9XG4gIC8qKlxuICAgKiBUcmlnZ2VyIHRoZSBnZW5lcmF0aW9uIG9mIGEgY3VlLCBhbmQgdGhlIHN0YXJ0IG9mIGEgbmV3IG9uZSBpZiBkaXNwbGF5U2NyZWVucyBhcmUgbm90IGVtcHR5LlxuICAgKi9cbiAgY3VlU3BsaXRBdFRpbWUoZSkge1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgciA9IHRoaXMuY2hhbm5lbHNbdF07XG4gICAgICByICYmIHIuY3VlU3BsaXRBdFRpbWUoZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbyhzLCBlLCB0KSB7XG4gIHQuYSA9IHMsIHQuYiA9IGU7XG59XG5mdW5jdGlvbiBEdyhzLCBlLCB0KSB7XG4gIHJldHVybiB0LmEgPT09IHMgJiYgdC5iID09PSBlO1xufVxuZnVuY3Rpb24gUHcoKSB7XG4gIHJldHVybiB7XG4gICAgYTogbnVsbCxcbiAgICBiOiBudWxsXG4gIH07XG59XG52YXIgT3UgPSAoZnVuY3Rpb24oKSB7XG4gIGlmIChyYSAhPSBudWxsICYmIHJhLlZUVEN1ZSlcbiAgICByZXR1cm4gc2VsZi5WVFRDdWU7XG4gIGNvbnN0IHMgPSBbXCJcIiwgXCJsclwiLCBcInJsXCJdLCBlID0gW1wic3RhcnRcIiwgXCJtaWRkbGVcIiwgXCJlbmRcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl07XG4gIGZ1bmN0aW9uIHQoYSwgbCkge1xuICAgIGlmICh0eXBlb2YgbCAhPSBcInN0cmluZ1wiIHx8ICFBcnJheS5pc0FycmF5KGEpKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IGMgPSBsLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIH5hLmluZGV4T2YoYykgPyBjIDogITE7XG4gIH1cbiAgZnVuY3Rpb24gcihhKSB7XG4gICAgcmV0dXJuIHQocywgYSk7XG4gIH1cbiAgZnVuY3Rpb24gbihhKSB7XG4gICAgcmV0dXJuIHQoZSwgYSk7XG4gIH1cbiAgZnVuY3Rpb24gaShhLCAuLi5sKSB7XG4gICAgbGV0IGMgPSAxO1xuICAgIGZvciAoOyBjIDwgYXJndW1lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICBjb25zdCB1ID0gYXJndW1lbnRzW2NdO1xuICAgICAgZm9yIChjb25zdCBkIGluIHUpXG4gICAgICAgIGFbZF0gPSB1W2RdO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxuICBmdW5jdGlvbiBvKGEsIGwsIGMpIHtcbiAgICBjb25zdCB1ID0gdGhpcywgZCA9IHtcbiAgICAgIGVudW1lcmFibGU6ICEwXG4gICAgfTtcbiAgICB1Lmhhc0JlZW5SZXNldCA9ICExO1xuICAgIGxldCBoID0gXCJcIiwgZiA9ICExLCBwID0gYSwgeSA9IGwsIEUgPSBjLCBiID0gbnVsbCwgUiA9IFwiXCIsIEEgPSAhMCwgRiA9IFwiYXV0b1wiLCBNID0gXCJzdGFydFwiLCBIID0gNTAsIEsgPSBcIm1pZGRsZVwiLCBqID0gNTAsIEMgPSBcIm1pZGRsZVwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcImlkXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBoO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBoID0gXCJcIiArIGs7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJwYXVzZU9uRXhpdFwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZjtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgZiA9ICEhaztcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcInN0YXJ0VGltZVwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YXJ0IHRpbWUgbXVzdCBiZSBzZXQgdG8gYSBudW1iZXIuXCIpO1xuICAgICAgICBwID0gaywgdGhpcy5oYXNCZWVuUmVzZXQgPSAhMDtcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcImVuZFRpbWVcIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgayAhPSBcIm51bWJlclwiKVxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFbmQgdGltZSBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIHkgPSBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwidGV4dFwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgRSA9IFwiXCIgKyBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwicmVnaW9uXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBiID0gaywgdGhpcy5oYXNCZWVuUmVzZXQgPSAhMDtcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcInZlcnRpY2FsXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBSO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBjb25zdCAkID0gcihrKTtcbiAgICAgICAgaWYgKCQgPT09ICExKVxuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZC5cIik7XG4gICAgICAgIFIgPSAkLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwic25hcFRvTGluZXNcIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEE7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIEEgPSAhIWssIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJsaW5lXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAodHlwZW9mIGsgIT0gXCJudW1iZXJcIiAmJiBrICE9PSBcImF1dG9cIilcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG51bWJlciBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgRiA9IGssIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJsaW5lQWxpZ25cIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE07XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGNvbnN0ICQgPSBuKGspO1xuICAgICAgICBpZiAoISQpXG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgTSA9ICQsIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJwb3NpdGlvblwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKGsgPCAwIHx8IGsgPiAxMDApXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zaXRpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIEggPSBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwicG9zaXRpb25BbGlnblwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSztcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgY29uc3QgJCA9IG4oayk7XG4gICAgICAgIGlmICghJClcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICBLID0gJCwgdGhpcy5oYXNCZWVuUmVzZXQgPSAhMDtcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcInNpemVcIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGo7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmIChrIDwgMCB8fCBrID4gMTAwKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpemUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIGogPSBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwiYWxpZ25cIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEM7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGNvbnN0ICQgPSBuKGspO1xuICAgICAgICBpZiAoISQpXG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgQyA9ICQsIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCB1LmRpc3BsYXlTdGF0ZSA9IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gby5wcm90b3R5cGUuZ2V0Q3VlQXNIVE1MID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNlbGYuV2ViVlRULmNvbnZlcnRDdWVUb0RPTVRyZWUoc2VsZiwgdGhpcy50ZXh0KTtcbiAgfSwgbztcbn0pKCk7XG5jbGFzcyBNdyB7XG4gIGRlY29kZShlLCB0KSB7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlICE9IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIGV4cGVjdGVkIHN0cmluZyBkYXRhLlwiKTtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZVVSSUNvbXBvbmVudChlKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpwKHMpIHtcbiAgZnVuY3Rpb24gZShyLCBuLCBpLCBvKSB7XG4gICAgcmV0dXJuIChyIHwgMCkgKiAzNjAwICsgKG4gfCAwKSAqIDYwICsgKGkgfCAwKSArIHBhcnNlRmxvYXQobyB8fCAwKTtcbiAgfVxuICBjb25zdCB0ID0gcy5tYXRjaCgvXig/OihcXGQrKTopPyhcXGR7Mn0pOihcXGR7Mn0pKFxcLlxcZCspPy8pO1xuICByZXR1cm4gdCA/IHBhcnNlRmxvYXQodFsyXSkgPiA1OSA/IGUodFsyXSwgdFszXSwgMCwgdFs0XSkgOiBlKHRbMV0sIHRbMl0sIHRbM10sIHRbNF0pIDogbnVsbDtcbn1cbmNsYXNzIE93IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52YWx1ZXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICAvLyBPbmx5IGFjY2VwdCB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhbnkga2V5LlxuICBzZXQoZSwgdCkge1xuICAgICF0aGlzLmdldChlKSAmJiB0ICE9PSBcIlwiICYmICh0aGlzLnZhbHVlc1tlXSA9IHQpO1xuICB9XG4gIC8vIFJldHVybiB0aGUgdmFsdWUgZm9yIGEga2V5LCBvciBhIGRlZmF1bHQgdmFsdWUuXG4gIC8vIElmICdkZWZhdWx0S2V5JyBpcyBwYXNzZWQgdGhlbiAnZGZsdCcgaXMgYXNzdW1lZCB0byBiZSBhbiBvYmplY3Qgd2l0aFxuICAvLyBhIG51bWJlciBvZiBwb3NzaWJsZSBkZWZhdWx0IHZhbHVlcyBhcyBwcm9wZXJ0aWVzIHdoZXJlICdkZWZhdWx0S2V5JyBpc1xuICAvLyB0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgY2hvc2VuOyBvdGhlcndpc2UgaXQncyBhc3N1bWVkIHRvIGJlXG4gIC8vIGEgc2luZ2xlIHZhbHVlLlxuICBnZXQoZSwgdCwgcikge1xuICAgIHJldHVybiByID8gdGhpcy5oYXMoZSkgPyB0aGlzLnZhbHVlc1tlXSA6IHRbcl0gOiB0aGlzLmhhcyhlKSA/IHRoaXMudmFsdWVzW2VdIDogdDtcbiAgfVxuICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSB2YWx1ZSBmb3IgYSBrZXkuXG4gIGhhcyhlKSB7XG4gICAgcmV0dXJuIGUgaW4gdGhpcy52YWx1ZXM7XG4gIH1cbiAgLy8gQWNjZXB0IGEgc2V0dGluZyBpZiBpdHMgb25lIG9mIHRoZSBnaXZlbiBhbHRlcm5hdGl2ZXMuXG4gIGFsdChlLCB0LCByKSB7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCByLmxlbmd0aDsgKytuKVxuICAgICAgaWYgKHQgPT09IHJbbl0pIHtcbiAgICAgICAgdGhpcy5zZXQoZSwgdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgKHNpZ25lZCkgaW50ZWdlci5cbiAgaW50ZWdlcihlLCB0KSB7XG4gICAgL14tP1xcZCskLy50ZXN0KHQpICYmIHRoaXMuc2V0KGUsIHBhcnNlSW50KHQsIDEwKSk7XG4gIH1cbiAgLy8gQWNjZXB0IGEgc2V0dGluZyBpZiBpdHMgYSB2YWxpZCBwZXJjZW50YWdlLlxuICBwZXJjZW50KGUsIHQpIHtcbiAgICBpZiAoL14oW1xcZF17MSwzfSkoXFwuW1xcZF0qKT8lJC8udGVzdCh0KSkge1xuICAgICAgY29uc3QgciA9IHBhcnNlRmxvYXQodCk7XG4gICAgICBpZiAociA+PSAwICYmIHIgPD0gMTAwKVxuICAgICAgICByZXR1cm4gdGhpcy5zZXQoZSwgciksICEwO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbn1cbmZ1bmN0aW9uIEtwKHMsIGUsIHQsIHIpIHtcbiAgY29uc3QgbiA9IHIgPyBzLnNwbGl0KHIpIDogW3NdO1xuICBmb3IgKGNvbnN0IGkgaW4gbikge1xuICAgIGlmICh0eXBlb2YgbltpXSAhPSBcInN0cmluZ1wiKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbyA9IG5baV0uc3BsaXQodCk7XG4gICAgaWYgKG8ubGVuZ3RoICE9PSAyKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgYSA9IG9bMF0sIGwgPSBvWzFdO1xuICAgIGUoYSwgbCk7XG4gIH1cbn1cbmNvbnN0IGJjID0gbmV3IE91KDAsIDAsIFwiXCIpLCB0byA9IGJjLmFsaWduID09PSBcIm1pZGRsZVwiID8gXCJtaWRkbGVcIiA6IFwiY2VudGVyXCI7XG5mdW5jdGlvbiBCdyhzLCBlLCB0KSB7XG4gIGNvbnN0IHIgPSBzO1xuICBmdW5jdGlvbiBuKCkge1xuICAgIGNvbnN0IGEgPSBqcChzKTtcbiAgICBpZiAoYSA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCB0aW1lc3RhbXA6IFwiICsgcik7XG4gICAgcmV0dXJuIHMgPSBzLnJlcGxhY2UoL15bXlxcc2EtekEtWi1dKy8sIFwiXCIpLCBhO1xuICB9XG4gIGZ1bmN0aW9uIGkoYSwgbCkge1xuICAgIGNvbnN0IGMgPSBuZXcgT3coKTtcbiAgICBLcChhLCBmdW5jdGlvbihoLCBmKSB7XG4gICAgICBsZXQgcDtcbiAgICAgIHN3aXRjaCAoaCkge1xuICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgZm9yIChsZXQgeSA9IHQubGVuZ3RoIC0gMTsgeSA+PSAwOyB5LS0pXG4gICAgICAgICAgICBpZiAodFt5XS5pZCA9PT0gZikge1xuICAgICAgICAgICAgICBjLnNldChoLCB0W3ldLnJlZ2lvbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidmVydGljYWxcIjpcbiAgICAgICAgICBjLmFsdChoLCBmLCBbXCJybFwiLCBcImxyXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgICBwID0gZi5zcGxpdChcIixcIiksIGMuaW50ZWdlcihoLCBwWzBdKSwgYy5wZXJjZW50KGgsIHBbMF0pICYmIGMuc2V0KFwic25hcFRvTGluZXNcIiwgITEpLCBjLmFsdChoLCBwWzBdLCBbXCJhdXRvXCJdKSwgcC5sZW5ndGggPT09IDIgJiYgYy5hbHQoXCJsaW5lQWxpZ25cIiwgcFsxXSwgW1wic3RhcnRcIiwgdG8sIFwiZW5kXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBvc2l0aW9uXCI6XG4gICAgICAgICAgcCA9IGYuc3BsaXQoXCIsXCIpLCBjLnBlcmNlbnQoaCwgcFswXSksIHAubGVuZ3RoID09PSAyICYmIGMuYWx0KFwicG9zaXRpb25BbGlnblwiLCBwWzFdLCBbXCJzdGFydFwiLCB0bywgXCJlbmRcIiwgXCJsaW5lLWxlZnRcIiwgXCJsaW5lLXJpZ2h0XCIsIFwiYXV0b1wiXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzaXplXCI6XG4gICAgICAgICAgYy5wZXJjZW50KGgsIGYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYWxpZ25cIjpcbiAgICAgICAgICBjLmFsdChoLCBmLCBbXCJzdGFydFwiLCB0bywgXCJlbmRcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sIC86LywgL1xccy8pLCBsLnJlZ2lvbiA9IGMuZ2V0KFwicmVnaW9uXCIsIG51bGwpLCBsLnZlcnRpY2FsID0gYy5nZXQoXCJ2ZXJ0aWNhbFwiLCBcIlwiKTtcbiAgICBsZXQgdSA9IGMuZ2V0KFwibGluZVwiLCBcImF1dG9cIik7XG4gICAgdSA9PT0gXCJhdXRvXCIgJiYgYmMubGluZSA9PT0gLTEgJiYgKHUgPSAtMSksIGwubGluZSA9IHUsIGwubGluZUFsaWduID0gYy5nZXQoXCJsaW5lQWxpZ25cIiwgXCJzdGFydFwiKSwgbC5zbmFwVG9MaW5lcyA9IGMuZ2V0KFwic25hcFRvTGluZXNcIiwgITApLCBsLnNpemUgPSBjLmdldChcInNpemVcIiwgMTAwKSwgbC5hbGlnbiA9IGMuZ2V0KFwiYWxpZ25cIiwgdG8pO1xuICAgIGxldCBkID0gYy5nZXQoXCJwb3NpdGlvblwiLCBcImF1dG9cIik7XG4gICAgZCA9PT0gXCJhdXRvXCIgJiYgYmMucG9zaXRpb24gPT09IDUwICYmIChkID0gbC5hbGlnbiA9PT0gXCJzdGFydFwiIHx8IGwuYWxpZ24gPT09IFwibGVmdFwiID8gMCA6IGwuYWxpZ24gPT09IFwiZW5kXCIgfHwgbC5hbGlnbiA9PT0gXCJyaWdodFwiID8gMTAwIDogNTApLCBsLnBvc2l0aW9uID0gZDtcbiAgfVxuICBmdW5jdGlvbiBvKCkge1xuICAgIHMgPSBzLnJlcGxhY2UoL15cXHMrLywgXCJcIik7XG4gIH1cbiAgaWYgKG8oKSwgZS5zdGFydFRpbWUgPSBuKCksIG8oKSwgcy5zbGljZSgwLCAzKSAhPT0gXCItLT5cIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgdGltZSBzdGFtcCAodGltZSBzdGFtcHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgJy0tPicpOiBcIiArIHIpO1xuICBzID0gcy5zbGljZSgzKSwgbygpLCBlLmVuZFRpbWUgPSBuKCksIG8oKSwgaShzLCBlKTtcbn1cbmZ1bmN0aW9uIEhwKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvPGJyKD86IFxcLyk/Pi9naSwgYFxuYCk7XG59XG5jbGFzcyBGdyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhdGUgPSBcIklOSVRJQUxcIiwgdGhpcy5idWZmZXIgPSBcIlwiLCB0aGlzLmRlY29kZXIgPSBuZXcgTXcoKSwgdGhpcy5yZWdpb25MaXN0ID0gW10sIHRoaXMuY3VlID0gbnVsbCwgdGhpcy5vbmN1ZSA9IHZvaWQgMCwgdGhpcy5vbnBhcnNpbmdlcnJvciA9IHZvaWQgMCwgdGhpcy5vbmZsdXNoID0gdm9pZCAwO1xuICB9XG4gIHBhcnNlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcztcbiAgICBlICYmICh0LmJ1ZmZlciArPSB0LmRlY29kZXIuZGVjb2RlKGUsIHtcbiAgICAgIHN0cmVhbTogITBcbiAgICB9KSk7XG4gICAgZnVuY3Rpb24gcigpIHtcbiAgICAgIGxldCBpID0gdC5idWZmZXIsIG8gPSAwO1xuICAgICAgZm9yIChpID0gSHAoaSk7IG8gPCBpLmxlbmd0aCAmJiBpW29dICE9PSBcIlxcclwiICYmIGlbb10gIT09IGBcbmA7IClcbiAgICAgICAgKytvO1xuICAgICAgY29uc3QgYSA9IGkuc2xpY2UoMCwgbyk7XG4gICAgICByZXR1cm4gaVtvXSA9PT0gXCJcXHJcIiAmJiArK28sIGlbb10gPT09IGBcbmAgJiYgKytvLCB0LmJ1ZmZlciA9IGkuc2xpY2UobyksIGE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG4oaSkge1xuICAgICAgS3AoaSwgZnVuY3Rpb24obywgYSkge1xuICAgICAgfSwgLzovKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxldCBpID0gXCJcIjtcbiAgICAgIGlmICh0LnN0YXRlID09PSBcIklOSVRJQUxcIikge1xuICAgICAgICBpZiAoIS9cXHJcXG58XFxuLy50ZXN0KHQuYnVmZmVyKSlcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaSA9IHIoKTtcbiAgICAgICAgY29uc3QgYSA9IGkubWF0Y2goL14ow6/Cu8K/KT9XRUJWVFQoWyBcXHRdLiopPyQvKTtcbiAgICAgICAgaWYgKCEoYSAhPSBudWxsICYmIGFbMF0pKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBXZWJWVFQgc2lnbmF0dXJlLlwiKTtcbiAgICAgICAgdC5zdGF0ZSA9IFwiSEVBREVSXCI7XG4gICAgICB9XG4gICAgICBsZXQgbyA9ICExO1xuICAgICAgZm9yICg7IHQuYnVmZmVyOyApIHtcbiAgICAgICAgaWYgKCEvXFxyXFxufFxcbi8udGVzdCh0LmJ1ZmZlcikpXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHN3aXRjaCAobyA/IG8gPSAhMSA6IGkgPSByKCksIHQuc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFwiSEVBREVSXCI6XG4gICAgICAgICAgICAvOi8udGVzdChpKSA/IG4oaSkgOiBpIHx8ICh0LnN0YXRlID0gXCJJRFwiKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgXCJOT1RFXCI6XG4gICAgICAgICAgICBpIHx8ICh0LnN0YXRlID0gXCJJRFwiKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgXCJJRFwiOlxuICAgICAgICAgICAgaWYgKC9eTk9URSgkfFsgXFx0XSkvLnRlc3QoaSkpIHtcbiAgICAgICAgICAgICAgdC5zdGF0ZSA9IFwiTk9URVwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaSlcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAodC5jdWUgPSBuZXcgT3UoMCwgMCwgXCJcIiksIHQuc3RhdGUgPSBcIkNVRVwiLCBpLmluZGV4T2YoXCItLT5cIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHQuY3VlLmlkID0gaTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLy8gUHJvY2VzcyBsaW5lIGFzIHN0YXJ0IG9mIGEgY3VlLlxuICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICBjYXNlIFwiQ1VFXCI6XG4gICAgICAgICAgICBpZiAoIXQuY3VlKSB7XG4gICAgICAgICAgICAgIHQuc3RhdGUgPSBcIkJBRENVRVwiO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIEJ3KGksIHQuY3VlLCB0LnJlZ2lvbkxpc3QpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHQuY3VlID0gbnVsbCwgdC5zdGF0ZSA9IFwiQkFEQ1VFXCI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdC5zdGF0ZSA9IFwiQ1VFVEVYVFwiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIkNVRVRFWFRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgYSA9IGkuaW5kZXhPZihcIi0tPlwiKSAhPT0gLTE7XG4gICAgICAgICAgICAgIGlmICghaSB8fCBhICYmIChvID0gITApKSB7XG4gICAgICAgICAgICAgICAgdC5vbmN1ZSAmJiB0LmN1ZSAmJiB0Lm9uY3VlKHQuY3VlKSwgdC5jdWUgPSBudWxsLCB0LnN0YXRlID0gXCJJRFwiO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmN1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgdC5jdWUudGV4dCAmJiAodC5jdWUudGV4dCArPSBgXG5gKSwgdC5jdWUudGV4dCArPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIkJBRENVRVwiOlxuICAgICAgICAgICAgaSB8fCAodC5zdGF0ZSA9IFwiSURcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHQuc3RhdGUgPT09IFwiQ1VFVEVYVFwiICYmIHQuY3VlICYmIHQub25jdWUgJiYgdC5vbmN1ZSh0LmN1ZSksIHQuY3VlID0gbnVsbCwgdC5zdGF0ZSA9IHQuc3RhdGUgPT09IFwiSU5JVElBTFwiID8gXCJCQURXRUJWVFRcIiA6IFwiQkFEQ1VFXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZsdXNoKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzO1xuICAgIHRyeSB7XG4gICAgICBpZiAoKGUuY3VlIHx8IGUuc3RhdGUgPT09IFwiSEVBREVSXCIpICYmIChlLmJ1ZmZlciArPSBgXG5cbmAsIGUucGFyc2UoKSksIGUuc3RhdGUgPT09IFwiSU5JVElBTFwiIHx8IGUuc3RhdGUgPT09IFwiQkFEV0VCVlRUXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBXZWJWVFQgc2lnbmF0dXJlLlwiKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICBlLm9ucGFyc2luZ2Vycm9yICYmIGUub25wYXJzaW5nZXJyb3IodCk7XG4gICAgfVxuICAgIHJldHVybiBlLm9uZmx1c2ggJiYgZS5vbmZsdXNoKCksIHRoaXM7XG4gIH1cbn1cbmNvbnN0IE53ID0gL1xcclxcbnxcXG5cXHJ8XFxufFxcci9nLCBBbCA9IGZ1bmN0aW9uKGUsIHQsIHIgPSAwKSB7XG4gIHJldHVybiBlLnNsaWNlKHIsIHIgKyB0Lmxlbmd0aCkgPT09IHQ7XG59LCBVdyA9IGZ1bmN0aW9uKGUpIHtcbiAgbGV0IHQgPSBwYXJzZUludChlLnNsaWNlKC0zKSk7XG4gIGNvbnN0IHIgPSBwYXJzZUludChlLnNsaWNlKC02LCAtNCkpLCBuID0gcGFyc2VJbnQoZS5zbGljZSgtOSwgLTcpKSwgaSA9IGUubGVuZ3RoID4gOSA/IHBhcnNlSW50KGUuc3Vic3RyaW5nKDAsIGUuaW5kZXhPZihcIjpcIikpKSA6IDA7XG4gIGlmICghdWUodCkgfHwgIXVlKHIpIHx8ICF1ZShuKSB8fCAhdWUoaSkpXG4gICAgdGhyb3cgRXJyb3IoYE1hbGZvcm1lZCBYLVRJTUVTVEFNUC1NQVA6IExvY2FsOiR7ZX1gKTtcbiAgcmV0dXJuIHQgKz0gMWUzICogciwgdCArPSA2MCAqIDFlMyAqIG4sIHQgKz0gMzYwMCAqIDFlMyAqIGksIHQ7XG59O1xuZnVuY3Rpb24gQnUocywgZSwgdCkge1xuICByZXR1cm4gWG4ocy50b1N0cmluZygpKSArIFhuKGUudG9TdHJpbmcoKSkgKyBYbih0KTtcbn1cbmNvbnN0ICR3ID0gZnVuY3Rpb24oZSwgdCwgcikge1xuICBsZXQgbiA9IGVbdF0sIGkgPSBlW24ucHJldkNDXTtcbiAgaWYgKCFpIHx8ICFpLm5ldyAmJiBuLm5ldykge1xuICAgIGUuY2NPZmZzZXQgPSBlLnByZXNlbnRhdGlvbk9mZnNldCA9IG4uc3RhcnQsIG4ubmV3ID0gITE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoOyAobyA9IGkpICE9IG51bGwgJiYgby5uZXc7ICkge1xuICAgIHZhciBvO1xuICAgIGUuY2NPZmZzZXQgKz0gbi5zdGFydCAtIGkuc3RhcnQsIG4ubmV3ID0gITEsIG4gPSBpLCBpID0gZVtuLnByZXZDQ107XG4gIH1cbiAgZS5wcmVzZW50YXRpb25PZmZzZXQgPSByO1xufTtcbmZ1bmN0aW9uIEd3KHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgY29uc3QgYSA9IG5ldyBGdygpLCBsID0gVHIobmV3IFVpbnQ4QXJyYXkocykpLnRyaW0oKS5yZXBsYWNlKE53LCBgXG5gKS5zcGxpdChgXG5gKSwgYyA9IFtdLCB1ID0gZSA/IFdUKGUuYmFzZVRpbWUsIGUudGltZXNjYWxlKSA6IDA7XG4gIGxldCBkID0gXCIwMDowMC4wMDBcIiwgaCA9IDAsIGYgPSAwLCBwLCB5ID0gITA7XG4gIGEub25jdWUgPSBmdW5jdGlvbihFKSB7XG4gICAgY29uc3QgYiA9IHRbcl07XG4gICAgbGV0IFIgPSB0LmNjT2Zmc2V0O1xuICAgIGNvbnN0IEEgPSAoaCAtIHUpIC8gOWU0O1xuICAgIGlmIChiICE9IG51bGwgJiYgYi5uZXcgJiYgKGYgIT09IHZvaWQgMCA/IFIgPSB0LmNjT2Zmc2V0ID0gYi5zdGFydCA6ICR3KHQsIHIsIEEpKSwgQSkge1xuICAgICAgaWYgKCFlKSB7XG4gICAgICAgIHAgPSBuZXcgRXJyb3IoXCJNaXNzaW5nIGluaXRQVFMgZm9yIFZUVCBNUEVHVFNcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFIgPSBBIC0gdC5wcmVzZW50YXRpb25PZmZzZXQ7XG4gICAgfVxuICAgIGNvbnN0IEYgPSBFLmVuZFRpbWUgLSBFLnN0YXJ0VGltZSwgTSA9IEFyKChFLnN0YXJ0VGltZSArIFIgLSBmKSAqIDllNCwgbiAqIDllNCkgLyA5ZTQ7XG4gICAgRS5zdGFydFRpbWUgPSBNYXRoLm1heChNLCAwKSwgRS5lbmRUaW1lID0gTWF0aC5tYXgoTSArIEYsIDApO1xuICAgIGNvbnN0IEggPSBFLnRleHQudHJpbSgpO1xuICAgIEUudGV4dCA9IGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQoSCkpLCBFLmlkIHx8IChFLmlkID0gQnUoRS5zdGFydFRpbWUsIEUuZW5kVGltZSwgSCkpLCBFLmVuZFRpbWUgPiAwICYmIGMucHVzaChFKTtcbiAgfSwgYS5vbnBhcnNpbmdlcnJvciA9IGZ1bmN0aW9uKEUpIHtcbiAgICBwID0gRTtcbiAgfSwgYS5vbmZsdXNoID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHApIHtcbiAgICAgIG8ocCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGkoYyk7XG4gIH0sIGwuZm9yRWFjaCgoRSkgPT4ge1xuICAgIGlmICh5KVxuICAgICAgaWYgKEFsKEUsIFwiWC1USU1FU1RBTVAtTUFQPVwiKSkge1xuICAgICAgICB5ID0gITEsIEUuc2xpY2UoMTYpLnNwbGl0KFwiLFwiKS5mb3JFYWNoKChiKSA9PiB7XG4gICAgICAgICAgQWwoYiwgXCJMT0NBTDpcIikgPyBkID0gYi5zbGljZSg2KSA6IEFsKGIsIFwiTVBFR1RTOlwiKSAmJiAoaCA9IHBhcnNlSW50KGIuc2xpY2UoNykpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZiA9IFV3KGQpIC8gMWUzO1xuICAgICAgICB9IGNhdGNoIChiKSB7XG4gICAgICAgICAgcCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIEUgPT09IFwiXCIgJiYgKHkgPSAhMSk7XG4gICAgYS5wYXJzZShFICsgYFxuYCk7XG4gIH0pLCBhLmZsdXNoKCk7XG59XG5jb25zdCBJbCA9IFwic3RwcC50dG1sLmltMXRcIiwgcXAgPSAvXihcXGR7Mix9KTooXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KVxcLj8oXFxkKyk/JC8sIFdwID0gL14oXFxkKig/OlxcLlxcZCopPykoaHxtfHN8bXN8Znx0KSQvLCBWdyA9IHtcbiAgbGVmdDogXCJzdGFydFwiLFxuICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gIHJpZ2h0OiBcImVuZFwiLFxuICBzdGFydDogXCJzdGFydFwiLFxuICBlbmQ6IFwiZW5kXCJcbn07XG5mdW5jdGlvbiByZihzLCBlLCB0LCByKSB7XG4gIGNvbnN0IG4gPSBHZShuZXcgVWludDhBcnJheShzKSwgW1wibWRhdFwiXSk7XG4gIGlmIChuLmxlbmd0aCA9PT0gMCkge1xuICAgIHIobmV3IEVycm9yKFwiQ291bGQgbm90IHBhcnNlIElNU0MxIG1kYXRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpID0gbi5tYXAoKGEpID0+IFRyKGEpKSwgbyA9IHFUKGUuYmFzZVRpbWUsIDEsIGUudGltZXNjYWxlKTtcbiAgdHJ5IHtcbiAgICBpLmZvckVhY2goKGEpID0+IHQoancoYSwgbykpKTtcbiAgfSBjYXRjaCAoYSkge1xuICAgIHIoYSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGp3KHMsIGUpIHtcbiAgY29uc3QgbiA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcocywgXCJ0ZXh0L3htbFwiKS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInR0XCIpWzBdO1xuICBpZiAoIW4pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0dG1sXCIpO1xuICBjb25zdCBpID0ge1xuICAgIGZyYW1lUmF0ZTogMzAsXG4gICAgc3ViRnJhbWVSYXRlOiAxLFxuICAgIGZyYW1lUmF0ZU11bHRpcGxpZXI6IDAsXG4gICAgdGlja1JhdGU6IDBcbiAgfSwgbyA9IE9iamVjdC5rZXlzKGkpLnJlZHVjZSgoZCwgaCkgPT4gKGRbaF0gPSBuLmdldEF0dHJpYnV0ZShgdHRwOiR7aH1gKSB8fCBpW2hdLCBkKSwge30pLCBhID0gbi5nZXRBdHRyaWJ1dGUoXCJ4bWw6c3BhY2VcIikgIT09IFwicHJlc2VydmVcIiwgbCA9IHNmKF9sKG4sIFwic3R5bGluZ1wiLCBcInN0eWxlXCIpKSwgYyA9IHNmKF9sKG4sIFwibGF5b3V0XCIsIFwicmVnaW9uXCIpKSwgdSA9IF9sKG4sIFwiYm9keVwiLCBcIltiZWdpbl1cIik7XG4gIHJldHVybiBbXS5tYXAuY2FsbCh1LCAoZCkgPT4ge1xuICAgIGNvbnN0IGggPSB6cChkLCBhKTtcbiAgICBpZiAoIWggfHwgIWQuaGFzQXR0cmlidXRlKFwiYmVnaW5cIikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBmID0gTGwoZC5nZXRBdHRyaWJ1dGUoXCJiZWdpblwiKSwgbyksIHAgPSBMbChkLmdldEF0dHJpYnV0ZShcImR1clwiKSwgbyk7XG4gICAgbGV0IHkgPSBMbChkLmdldEF0dHJpYnV0ZShcImVuZFwiKSwgbyk7XG4gICAgaWYgKGYgPT09IG51bGwpXG4gICAgICB0aHJvdyBuZihkKTtcbiAgICBpZiAoeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHAgPT09IG51bGwpXG4gICAgICAgIHRocm93IG5mKGQpO1xuICAgICAgeSA9IGYgKyBwO1xuICAgIH1cbiAgICBjb25zdCBFID0gbmV3IE91KGYgLSBlLCB5IC0gZSwgaCk7XG4gICAgRS5pZCA9IEJ1KEUuc3RhcnRUaW1lLCBFLmVuZFRpbWUsIEUudGV4dCk7XG4gICAgY29uc3QgYiA9IGNbZC5nZXRBdHRyaWJ1dGUoXCJyZWdpb25cIildLCBSID0gbFtkLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpXSwgQSA9IEt3KGIsIFIsIGwpLCB7XG4gICAgICB0ZXh0QWxpZ246IEZcbiAgICB9ID0gQTtcbiAgICBpZiAoRikge1xuICAgICAgY29uc3QgTSA9IFZ3W0ZdO1xuICAgICAgTSAmJiAoRS5saW5lQWxpZ24gPSBNKSwgRS5hbGlnbiA9IEY7XG4gICAgfVxuICAgIHJldHVybiBudChFLCBBKSwgRTtcbiAgfSkuZmlsdGVyKChkKSA9PiBkICE9PSBudWxsKTtcbn1cbmZ1bmN0aW9uIF9sKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSlbMF07XG4gIHJldHVybiByID8gW10uc2xpY2UuY2FsbChyLnF1ZXJ5U2VsZWN0b3JBbGwodCkpIDogW107XG59XG5mdW5jdGlvbiBzZihzKSB7XG4gIHJldHVybiBzLnJlZHVjZSgoZSwgdCkgPT4ge1xuICAgIGNvbnN0IHIgPSB0LmdldEF0dHJpYnV0ZShcInhtbDppZFwiKTtcbiAgICByZXR1cm4gciAmJiAoZVtyXSA9IHQpLCBlO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiB6cChzLCBlKSB7XG4gIHJldHVybiBbXS5zbGljZS5jYWxsKHMuY2hpbGROb2RlcykucmVkdWNlKCh0LCByLCBuKSA9PiB7XG4gICAgdmFyIGk7XG4gICAgcmV0dXJuIHIubm9kZU5hbWUgPT09IFwiYnJcIiAmJiBuID8gdCArIGBcbmAgOiAoaSA9IHIuY2hpbGROb2RlcykgIT0gbnVsbCAmJiBpLmxlbmd0aCA/IHpwKHIsIGUpIDogZSA/IHQgKyByLnRleHRDb250ZW50LnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKSA6IHQgKyByLnRleHRDb250ZW50O1xuICB9LCBcIlwiKTtcbn1cbmZ1bmN0aW9uIEt3KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IFwiaHR0cDovL3d3dy53My5vcmcvbnMvdHRtbCNzdHlsaW5nXCI7XG4gIGxldCBuID0gbnVsbDtcbiAgY29uc3QgaSA9IFtcbiAgICBcImRpc3BsYXlBbGlnblwiLFxuICAgIFwidGV4dEFsaWduXCIsXG4gICAgXCJjb2xvclwiLFxuICAgIFwiYmFja2dyb3VuZENvbG9yXCIsXG4gICAgXCJmb250U2l6ZVwiLFxuICAgIFwiZm9udEZhbWlseVwiXG4gICAgLy8gJ2ZvbnRXZWlnaHQnLFxuICAgIC8vICdsaW5lSGVpZ2h0JyxcbiAgICAvLyAnd3JhcE9wdGlvbicsXG4gICAgLy8gJ2ZvbnRTdHlsZScsXG4gICAgLy8gJ2RpcmVjdGlvbicsXG4gICAgLy8gJ3dyaXRpbmdNb2RlJ1xuICBdLCBvID0gcyAhPSBudWxsICYmIHMuaGFzQXR0cmlidXRlKFwic3R5bGVcIikgPyBzLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpIDogbnVsbDtcbiAgcmV0dXJuIG8gJiYgdC5oYXNPd25Qcm9wZXJ0eShvKSAmJiAobiA9IHRbb10pLCBpLnJlZHVjZSgoYSwgbCkgPT4ge1xuICAgIGNvbnN0IGMgPSBSbChlLCByLCBsKSB8fCBSbChzLCByLCBsKSB8fCBSbChuLCByLCBsKTtcbiAgICByZXR1cm4gYyAmJiAoYVtsXSA9IGMpLCBhO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiBSbChzLCBlLCB0KSB7XG4gIHJldHVybiBzICYmIHMuaGFzQXR0cmlidXRlTlMoZSwgdCkgPyBzLmdldEF0dHJpYnV0ZU5TKGUsIHQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIG5mKHMpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHR0bWwgdGltZXN0YW1wICR7c31gKTtcbn1cbmZ1bmN0aW9uIExsKHMsIGUpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiBudWxsO1xuICBsZXQgdCA9IGpwKHMpO1xuICByZXR1cm4gdCA9PT0gbnVsbCAmJiAocXAudGVzdChzKSA/IHQgPSBIdyhzLCBlKSA6IFdwLnRlc3QocykgJiYgKHQgPSBxdyhzLCBlKSkpLCB0O1xufVxuZnVuY3Rpb24gSHcocywgZSkge1xuICBjb25zdCB0ID0gcXAuZXhlYyhzKSwgciA9ICh0WzRdIHwgMCkgKyAodFs1XSB8IDApIC8gZS5zdWJGcmFtZVJhdGU7XG4gIHJldHVybiAodFsxXSB8IDApICogMzYwMCArICh0WzJdIHwgMCkgKiA2MCArICh0WzNdIHwgMCkgKyByIC8gZS5mcmFtZVJhdGU7XG59XG5mdW5jdGlvbiBxdyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBXcC5leGVjKHMpLCByID0gTnVtYmVyKHRbMV0pO1xuICBzd2l0Y2ggKHRbMl0pIHtcbiAgICBjYXNlIFwiaFwiOlxuICAgICAgcmV0dXJuIHIgKiAzNjAwO1xuICAgIGNhc2UgXCJtXCI6XG4gICAgICByZXR1cm4gciAqIDYwO1xuICAgIGNhc2UgXCJtc1wiOlxuICAgICAgcmV0dXJuIHIgKiAxZTM7XG4gICAgY2FzZSBcImZcIjpcbiAgICAgIHJldHVybiByIC8gZS5mcmFtZVJhdGU7XG4gICAgY2FzZSBcInRcIjpcbiAgICAgIHJldHVybiByIC8gZS50aWNrUmF0ZTtcbiAgfVxuICByZXR1cm4gcjtcbn1cbmNsYXNzIHJvIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHRoaXMudGltZWxpbmVDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmN1ZVJhbmdlcyA9IFtdLCB0aGlzLnRyYWNrTmFtZSA9IHZvaWQgMCwgdGhpcy5zdGFydFRpbWUgPSBudWxsLCB0aGlzLmVuZFRpbWUgPSBudWxsLCB0aGlzLnNjcmVlbiA9IG51bGwsIHRoaXMudGltZWxpbmVDb250cm9sbGVyID0gZSwgdGhpcy50cmFja05hbWUgPSB0O1xuICB9XG4gIGRpc3BhdGNoQ3VlKCkge1xuICAgIHRoaXMuc3RhcnRUaW1lICE9PSBudWxsICYmICh0aGlzLnRpbWVsaW5lQ29udHJvbGxlci5hZGRDdWVzKHRoaXMudHJhY2tOYW1lLCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lLCB0aGlzLnNjcmVlbiwgdGhpcy5jdWVSYW5nZXMpLCB0aGlzLnN0YXJ0VGltZSA9IG51bGwpO1xuICB9XG4gIG5ld0N1ZShlLCB0LCByKSB7XG4gICAgKHRoaXMuc3RhcnRUaW1lID09PSBudWxsIHx8IHRoaXMuc3RhcnRUaW1lID4gZSkgJiYgKHRoaXMuc3RhcnRUaW1lID0gZSksIHRoaXMuZW5kVGltZSA9IHQsIHRoaXMuc2NyZWVuID0gciwgdGhpcy50aW1lbGluZUNvbnRyb2xsZXIuY3JlYXRlQ2FwdGlvbnNUcmFjayh0aGlzLnRyYWNrTmFtZSk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5jdWVSYW5nZXMgPSBbXSwgdGhpcy5zdGFydFRpbWUgPSBudWxsO1xuICB9XG59XG5jbGFzcyBXdyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLmVuYWJsZWQgPSAhMCwgdGhpcy5DdWVzID0gdm9pZCAwLCB0aGlzLnRleHRUcmFja3MgPSBbXSwgdGhpcy50cmFja3MgPSBbXSwgdGhpcy5pbml0UFRTID0gW10sIHRoaXMudW5wYXJzZWRWdHRGcmFncyA9IFtdLCB0aGlzLmNhcHRpb25zVHJhY2tzID0ge30sIHRoaXMubm9uTmF0aXZlQ2FwdGlvbnNUcmFja3MgPSB7fSwgdGhpcy5jZWE2MDhQYXJzZXIxID0gdm9pZCAwLCB0aGlzLmNlYTYwOFBhcnNlcjIgPSB2b2lkIDAsIHRoaXMubGFzdENjID0gLTEsIHRoaXMubGFzdFNuID0gLTEsIHRoaXMubGFzdFBhcnRJbmRleCA9IC0xLCB0aGlzLnByZXZDQyA9IC0xLCB0aGlzLnZ0dENDcyA9IGFmKCksIHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzID0gdm9pZCAwLCB0aGlzLmhscyA9IGUsIHRoaXMuY29uZmlnID0gZS5jb25maWcsIHRoaXMuQ3VlcyA9IGUuY29uZmlnLmN1ZUhhbmRsZXIsIHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzID0ge1xuICAgICAgdGV4dFRyYWNrMToge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2sxTGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2sxTGFuZ3VhZ2VDb2RlXG4gICAgICB9LFxuICAgICAgdGV4dFRyYWNrMjoge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2syTGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2syTGFuZ3VhZ2VDb2RlXG4gICAgICB9LFxuICAgICAgdGV4dFRyYWNrMzoge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2szTGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2szTGFuZ3VhZ2VDb2RlXG4gICAgICB9LFxuICAgICAgdGV4dFRyYWNrNDoge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2s0TGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2s0TGFuZ3VhZ2VDb2RlXG4gICAgICB9XG4gICAgfSwgZS5vbihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tTX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19MT0FESU5HLCB0aGlzLm9uRnJhZ0xvYWRpbmcsIHRoaXMpLCBlLm9uKEkuRlJBR19MT0FERUQsIHRoaXMub25GcmFnTG9hZGVkLCB0aGlzKSwgZS5vbihJLkZSQUdfUEFSU0lOR19VU0VSREFUQSwgdGhpcy5vbkZyYWdQYXJzaW5nVXNlcmRhdGEsIHRoaXMpLCBlLm9uKEkuRlJBR19ERUNSWVBURUQsIHRoaXMub25GcmFnRGVjcnlwdGVkLCB0aGlzKSwgZS5vbihJLklOSVRfUFRTX0ZPVU5ELCB0aGlzLm9uSW5pdFB0c0ZvdW5kLCB0aGlzKSwgZS5vbihJLlNVQlRJVExFX1RSQUNLU19DTEVBUkVELCB0aGlzLm9uU3VidGl0bGVUcmFja3NDbGVhcmVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfVFJBQ0tTX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BRElORywgdGhpcy5vbkZyYWdMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5GUkFHX0xPQURFRCwgdGhpcy5vbkZyYWdMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfUEFSU0lOR19VU0VSREFUQSwgdGhpcy5vbkZyYWdQYXJzaW5nVXNlcmRhdGEsIHRoaXMpLCBlLm9mZihJLkZSQUdfREVDUllQVEVELCB0aGlzLm9uRnJhZ0RlY3J5cHRlZCwgdGhpcyksIGUub2ZmKEkuSU5JVF9QVFNfRk9VTkQsIHRoaXMub25Jbml0UHRzRm91bmQsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLU19DTEVBUkVELCB0aGlzLm9uU3VidGl0bGVUcmFja3NDbGVhcmVkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfRkxVU0hJTkcsIHRoaXMub25CdWZmZXJGbHVzaGluZywgdGhpcyksIHRoaXMuaGxzID0gdGhpcy5jb25maWcgPSB0aGlzLm1lZGlhID0gbnVsbCwgdGhpcy5jZWE2MDhQYXJzZXIxID0gdGhpcy5jZWE2MDhQYXJzZXIyID0gdm9pZCAwO1xuICB9XG4gIGluaXRDZWE2MDhQYXJzZXJzKCkge1xuICAgIGNvbnN0IGUgPSBuZXcgcm8odGhpcywgXCJ0ZXh0VHJhY2sxXCIpLCB0ID0gbmV3IHJvKHRoaXMsIFwidGV4dFRyYWNrMlwiKSwgciA9IG5ldyBybyh0aGlzLCBcInRleHRUcmFjazNcIiksIG4gPSBuZXcgcm8odGhpcywgXCJ0ZXh0VHJhY2s0XCIpO1xuICAgIHRoaXMuY2VhNjA4UGFyc2VyMSA9IG5ldyB0ZigxLCBlLCB0KSwgdGhpcy5jZWE2MDhQYXJzZXIyID0gbmV3IHRmKDMsIHIsIG4pO1xuICB9XG4gIGFkZEN1ZXMoZSwgdCwgciwgbiwgaSkge1xuICAgIGxldCBvID0gITE7XG4gICAgZm9yIChsZXQgYSA9IGkubGVuZ3RoOyBhLS07ICkge1xuICAgICAgY29uc3QgbCA9IGlbYV0sIGMgPSB6dyhsWzBdLCBsWzFdLCB0LCByKTtcbiAgICAgIGlmIChjID49IDAgJiYgKGxbMF0gPSBNYXRoLm1pbihsWzBdLCB0KSwgbFsxXSA9IE1hdGgubWF4KGxbMV0sIHIpLCBvID0gITAsIGMgLyAociAtIHQpID4gMC41KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobyB8fCBpLnB1c2goW3QsIHJdKSwgdGhpcy5jb25maWcucmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5KSB7XG4gICAgICBjb25zdCBhID0gdGhpcy5jYXB0aW9uc1RyYWNrc1tlXTtcbiAgICAgIHRoaXMuQ3Vlcy5uZXdDdWUoYSwgdCwgciwgbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLkN1ZXMubmV3Q3VlKG51bGwsIHQsIHIsIG4pO1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkNVRVNfUEFSU0VELCB7XG4gICAgICAgIHR5cGU6IFwiY2FwdGlvbnNcIixcbiAgICAgICAgY3VlczogYSxcbiAgICAgICAgdHJhY2s6IGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvLyBUcmlnZ2VyZWQgd2hlbiBhbiBpbml0aWFsIFBUUyBpcyBmb3VuZDsgdXNlZCBmb3Igc3luY2hyb25pc2F0aW9uIG9mIFdlYlZUVC5cbiAgb25Jbml0UHRzRm91bmQoZSwge1xuICAgIGZyYWc6IHQsXG4gICAgaWQ6IHIsXG4gICAgaW5pdFBUUzogbixcbiAgICB0aW1lc2NhbGU6IGksXG4gICAgdHJhY2tJZDogb1xuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgdW5wYXJzZWRWdHRGcmFnczogYVxuICAgIH0gPSB0aGlzO1xuICAgIHIgPT09IHBlLk1BSU4gJiYgKHRoaXMuaW5pdFBUU1t0LmNjXSA9IHtcbiAgICAgIGJhc2VUaW1lOiBuLFxuICAgICAgdGltZXNjYWxlOiBpLFxuICAgICAgdHJhY2tJZDogb1xuICAgIH0pLCBhLmxlbmd0aCAmJiAodGhpcy51bnBhcnNlZFZ0dEZyYWdzID0gW10sIGEuZm9yRWFjaCgobCkgPT4ge1xuICAgICAgdGhpcy5pbml0UFRTW2wuZnJhZy5jY10gPyB0aGlzLm9uRnJhZ0xvYWRlZChJLkZSQUdfTE9BREVELCBsKSA6IHRoaXMuaGxzLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICBzdWNjZXNzOiAhMSxcbiAgICAgICAgZnJhZzogbC5mcmFnLFxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiU3VidGl0bGUgZGlzY29udGludWl0eSBkb21haW4gZG9lcyBub3QgbWF0Y2ggbWFpblwiKVxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG4gIGdldEV4aXN0aW5nVHJhY2soZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKHIpXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHIudGV4dFRyYWNrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gci50ZXh0VHJhY2tzW25dO1xuICAgICAgICBpZiAob2YoaSwge1xuICAgICAgICAgIG5hbWU6IGUsXG4gICAgICAgICAgbGFuZzogdCxcbiAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IFwidHJhbnNjcmliZXMtc3Bva2VuLWRpYWxvZyxkZXNjcmliZXMtbXVzaWMtYW5kLXNvdW5kXCJcbiAgICAgICAgfSkpXG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY3JlYXRlQ2FwdGlvbnNUcmFjayhlKSB7XG4gICAgdGhpcy5jb25maWcucmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5ID8gdGhpcy5jcmVhdGVOYXRpdmVUcmFjayhlKSA6IHRoaXMuY3JlYXRlTm9uTmF0aXZlVHJhY2soZSk7XG4gIH1cbiAgY3JlYXRlTmF0aXZlVHJhY2soZSkge1xuICAgIGlmICh0aGlzLmNhcHRpb25zVHJhY2tzW2VdKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhcHRpb25zUHJvcGVydGllczogdCxcbiAgICAgIGNhcHRpb25zVHJhY2tzOiByLFxuICAgICAgbWVkaWE6IG5cbiAgICB9ID0gdGhpcywge1xuICAgICAgbGFiZWw6IGksXG4gICAgICBsYW5ndWFnZUNvZGU6IG9cbiAgICB9ID0gdFtlXSwgYSA9IHRoaXMuZ2V0RXhpc3RpbmdUcmFjayhpLCBvKTtcbiAgICBpZiAoYSlcbiAgICAgIHJbZV0gPSBhLCBTbihyW2VdKSwgTnAocltlXSwgbik7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBsID0gdGhpcy5jcmVhdGVUZXh0VHJhY2soXCJjYXB0aW9uc1wiLCBpLCBvKTtcbiAgICAgIGwgJiYgKGxbZV0gPSAhMCwgcltlXSA9IGwpO1xuICAgIH1cbiAgfVxuICBjcmVhdGVOb25OYXRpdmVUcmFjayhlKSB7XG4gICAgaWYgKHRoaXMubm9uTmF0aXZlQ2FwdGlvbnNUcmFja3NbZV0pXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzW2VdO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdC5sYWJlbCwgbiA9IHtcbiAgICAgIF9pZDogZSxcbiAgICAgIGxhYmVsOiByLFxuICAgICAga2luZDogXCJjYXB0aW9uc1wiLFxuICAgICAgZGVmYXVsdDogdC5tZWRpYSA/ICEhdC5tZWRpYS5kZWZhdWx0IDogITEsXG4gICAgICBjbG9zZWRDYXB0aW9uczogdC5tZWRpYVxuICAgIH07XG4gICAgdGhpcy5ub25OYXRpdmVDYXB0aW9uc1RyYWNrc1tlXSA9IG4sIHRoaXMuaGxzLnRyaWdnZXIoSS5OT05fTkFUSVZFX1RFWFRfVFJBQ0tTX0ZPVU5ELCB7XG4gICAgICB0cmFja3M6IFtuXVxuICAgIH0pO1xuICB9XG4gIGNyZWF0ZVRleHRUcmFjayhlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IHRoaXMubWVkaWE7XG4gICAgaWYgKG4pXG4gICAgICByZXR1cm4gbi5hZGRUZXh0VHJhY2soZSwgdCwgcik7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5tZWRpYSA9IHQubWVkaWEsIHQubWVkaWFTb3VyY2UgfHwgdGhpcy5fY2xlYW5UcmFja3MoKTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKGUsIHQpIHtcbiAgICBjb25zdCByID0gISF0LnRyYW5zZmVyTWVkaWE7XG4gICAgaWYgKHRoaXMubWVkaWEgPSBudWxsLCByKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhcHRpb25zVHJhY2tzOiBuXG4gICAgfSA9IHRoaXM7XG4gICAgT2JqZWN0LmtleXMobikuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgU24obltpXSksIGRlbGV0ZSBuW2ldO1xuICAgIH0pLCB0aGlzLm5vbk5hdGl2ZUNhcHRpb25zVHJhY2tzID0ge307XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5sYXN0Q2MgPSAtMSwgdGhpcy5sYXN0U24gPSAtMSwgdGhpcy5sYXN0UGFydEluZGV4ID0gLTEsIHRoaXMucHJldkNDID0gLTEsIHRoaXMudnR0Q0NzID0gYWYoKSwgdGhpcy5fY2xlYW5UcmFja3MoKSwgdGhpcy50cmFja3MgPSBbXSwgdGhpcy5jYXB0aW9uc1RyYWNrcyA9IHt9LCB0aGlzLm5vbk5hdGl2ZUNhcHRpb25zVHJhY2tzID0ge30sIHRoaXMudGV4dFRyYWNrcyA9IFtdLCB0aGlzLnVucGFyc2VkVnR0RnJhZ3MgPSBbXSwgdGhpcy5pbml0UFRTID0gW10sIHRoaXMuY2VhNjA4UGFyc2VyMSAmJiB0aGlzLmNlYTYwOFBhcnNlcjIgJiYgKHRoaXMuY2VhNjA4UGFyc2VyMS5yZXNldCgpLCB0aGlzLmNlYTYwOFBhcnNlcjIucmVzZXQoKSk7XG4gIH1cbiAgX2NsZWFuVHJhY2tzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHQgPSBlLnRleHRUcmFja3M7XG4gICAgaWYgKHQpXG4gICAgICBmb3IgKGxldCByID0gMDsgciA8IHQubGVuZ3RoOyByKyspXG4gICAgICAgIFNuKHRbcl0pO1xuICB9XG4gIG9uU3VidGl0bGVUcmFja3NVcGRhdGVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gdC5zdWJ0aXRsZVRyYWNrcyB8fCBbXSwgbiA9IHIuc29tZSgoaSkgPT4gaS50ZXh0Q29kZWMgPT09IElsKTtcbiAgICBpZiAodGhpcy5jb25maWcuZW5hYmxlV2ViVlRUIHx8IG4gJiYgdGhpcy5jb25maWcuZW5hYmxlSU1TQzEpIHtcbiAgICAgIGlmIChBcCh0aGlzLnRyYWNrcywgcikpIHtcbiAgICAgICAgdGhpcy50cmFja3MgPSByO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50ZXh0VHJhY2tzID0gW10sIHRoaXMudHJhY2tzID0gciwgdGhpcy5jb25maWcucmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5KSB7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLm1lZGlhLCBhID0gbyA/IEVvKG8udGV4dFRyYWNrcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy50cmFja3MuZm9yRWFjaCgobCwgYykgPT4ge1xuICAgICAgICAgIGxldCB1O1xuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGEubGVuZ3RoOyBoKyspXG4gICAgICAgICAgICAgIGlmIChhW2hdICYmIG9mKGFbaF0sIGwpKSB7XG4gICAgICAgICAgICAgICAgZCA9IGFbaF0sIGFbaF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkICYmICh1ID0gZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1KVxuICAgICAgICAgICAgU24odSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkID0gWXAobCk7XG4gICAgICAgICAgICB1ID0gdGhpcy5jcmVhdGVUZXh0VHJhY2soZCwgbC5uYW1lLCBsLmxhbmcpLCB1ICYmICh1Lm1vZGUgPSBcImRpc2FibGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1ICYmIHRoaXMudGV4dFRyYWNrcy5wdXNoKHUpO1xuICAgICAgICB9KSwgYSAhPSBudWxsICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbCA9IGEuZmlsdGVyKChjKSA9PiBjICE9PSBudWxsKS5tYXAoKGMpID0+IGMubGFiZWwpO1xuICAgICAgICAgIGwubGVuZ3RoICYmIHRoaXMuaGxzLmxvZ2dlci53YXJuKGBNZWRpYSBlbGVtZW50IGNvbnRhaW5zIHVudXNlZCBzdWJ0aXRsZSB0cmFja3M6ICR7bC5qb2luKFwiLCBcIil9LiBSZXBsYWNlIG1lZGlhIGVsZW1lbnQgZm9yIGVhY2ggc291cmNlIHRvIGNsZWFyIFRleHRUcmFja3MgYW5kIGNhcHRpb25zIG1lbnUuYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLnRyYWNrcy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgbGFiZWw6IGEubmFtZSxcbiAgICAgICAgICBraW5kOiBhLnR5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICBkZWZhdWx0OiBhLmRlZmF1bHQsXG4gICAgICAgICAgc3VidGl0bGVUcmFjazogYVxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5OT05fTkFUSVZFX1RFWFRfVFJBQ0tTX0ZPVU5ELCB7XG4gICAgICAgICAgdHJhY2tzOiBvXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvbk1hbmlmZXN0TG9hZGVkKGUsIHQpIHtcbiAgICB0aGlzLmNvbmZpZy5lbmFibGVDRUE3MDhDYXB0aW9ucyAmJiB0LmNhcHRpb25zICYmIHQuY2FwdGlvbnMuZm9yRWFjaCgocikgPT4ge1xuICAgICAgY29uc3QgbiA9IC8oPzpDQ3xTRVJWSUNFKShbMS00XSkvLmV4ZWMoci5pbnN0cmVhbUlkKTtcbiAgICAgIGlmICghbilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgaSA9IGB0ZXh0VHJhY2ske25bMV19YCwgbyA9IHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzW2ldO1xuICAgICAgbyAmJiAoby5sYWJlbCA9IHIubmFtZSwgci5sYW5nICYmIChvLmxhbmd1YWdlQ29kZSA9IHIubGFuZyksIG8ubWVkaWEgPSByKTtcbiAgICB9KTtcbiAgfVxuICBjbG9zZWRDYXB0aW9uc0ZvckxldmVsKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMubGV2ZWxzW2UubGV2ZWxdO1xuICAgIHJldHVybiB0ID09IG51bGwgPyB2b2lkIDAgOiB0LmF0dHJzW1wiQ0xPU0VELUNBUFRJT05TXCJdO1xuICB9XG4gIG9uRnJhZ0xvYWRpbmcoZSwgdCkge1xuICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdC5mcmFnLnR5cGUgPT09IHBlLk1BSU4pIHtcbiAgICAgIHZhciByLCBuO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjZWE2MDhQYXJzZXIxOiBpLFxuICAgICAgICBjZWE2MDhQYXJzZXIyOiBvLFxuICAgICAgICBsYXN0U246IGFcbiAgICAgIH0gPSB0aGlzLCB7XG4gICAgICAgIGNjOiBsLFxuICAgICAgICBzbjogY1xuICAgICAgfSA9IHQuZnJhZywgdSA9IChyID0gKG4gPSB0LnBhcnQpID09IG51bGwgPyB2b2lkIDAgOiBuLmluZGV4KSAhPSBudWxsID8gciA6IC0xO1xuICAgICAgaSAmJiBvICYmIChjICE9PSBhICsgMSB8fCBjID09PSBhICYmIHUgIT09IHRoaXMubGFzdFBhcnRJbmRleCArIDEgfHwgbCAhPT0gdGhpcy5sYXN0Q2MpICYmIChpLnJlc2V0KCksIG8ucmVzZXQoKSksIHRoaXMubGFzdENjID0gbCwgdGhpcy5sYXN0U24gPSBjLCB0aGlzLmxhc3RQYXJ0SW5kZXggPSB1O1xuICAgIH1cbiAgfVxuICBvbkZyYWdMb2FkZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHIsXG4gICAgICBwYXlsb2FkOiBuXG4gICAgfSA9IHQ7XG4gICAgaWYgKHIudHlwZSA9PT0gcGUuU1VCVElUTEUpXG4gICAgICBpZiAobi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGkgPSByLmRlY3J5cHRkYXRhLCBvID0gXCJzdGF0c1wiIGluIHQ7XG4gICAgICAgIGlmIChpID09IG51bGwgfHwgIWkuZW5jcnlwdGVkIHx8IG8pIHtcbiAgICAgICAgICBjb25zdCBhID0gdGhpcy50cmFja3Nbci5sZXZlbF0sIGwgPSB0aGlzLnZ0dENDcztcbiAgICAgICAgICBsW3IuY2NdIHx8IChsW3IuY2NdID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHIuc3RhcnQsXG4gICAgICAgICAgICBwcmV2Q0M6IHRoaXMucHJldkNDLFxuICAgICAgICAgICAgbmV3OiAhMFxuICAgICAgICAgIH0sIHRoaXMucHJldkNDID0gci5jYyksIGEgJiYgYS50ZXh0Q29kZWMgPT09IElsID8gdGhpcy5fcGFyc2VJTVNDMShyLCBuKSA6IHRoaXMuX3BhcnNlVlRUcyh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICAgIHN1Y2Nlc3M6ICExLFxuICAgICAgICAgIGZyYWc6IHIsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkVtcHR5IHN1YnRpdGxlIHBheWxvYWRcIilcbiAgICAgICAgfSk7XG4gIH1cbiAgX3BhcnNlSU1TQzEoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscztcbiAgICByZih0LCB0aGlzLmluaXRQVFNbZS5jY10sIChuKSA9PiB7XG4gICAgICB0aGlzLl9hcHBlbmRDdWVzKG4sIGUubGV2ZWwpLCByLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICBzdWNjZXNzOiAhMCxcbiAgICAgICAgZnJhZzogZVxuICAgICAgfSk7XG4gICAgfSwgKG4pID0+IHtcbiAgICAgIHIubG9nZ2VyLmxvZyhgRmFpbGVkIHRvIHBhcnNlIElNU0MxOiAke259YCksIHIudHJpZ2dlcihJLlNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VELCB7XG4gICAgICAgIHN1Y2Nlc3M6ICExLFxuICAgICAgICBmcmFnOiBlLFxuICAgICAgICBlcnJvcjogblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgX3BhcnNlVlRUcyhlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHBheWxvYWQ6IG5cbiAgICB9ID0gZSwge1xuICAgICAgaW5pdFBUUzogaSxcbiAgICAgIHVucGFyc2VkVnR0RnJhZ3M6IG9cbiAgICB9ID0gdGhpcywgYSA9IGkubGVuZ3RoIC0gMTtcbiAgICBpZiAoIWlbci5jY10gJiYgYSA9PT0gLTEpIHtcbiAgICAgIG8ucHVzaChlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbCA9IHRoaXMuaGxzLCBjID0gKHQgPSByLmluaXRTZWdtZW50KSAhPSBudWxsICYmIHQuZGF0YSA/IF9yKHIuaW5pdFNlZ21lbnQuZGF0YSwgbmV3IFVpbnQ4QXJyYXkobikpLmJ1ZmZlciA6IG47XG4gICAgR3coYywgdGhpcy5pbml0UFRTW3IuY2NdLCB0aGlzLnZ0dENDcywgci5jYywgci5zdGFydCwgKHUpID0+IHtcbiAgICAgIHRoaXMuX2FwcGVuZEN1ZXModSwgci5sZXZlbCksIGwudHJpZ2dlcihJLlNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VELCB7XG4gICAgICAgIHN1Y2Nlc3M6ICEwLFxuICAgICAgICBmcmFnOiByXG4gICAgICB9KTtcbiAgICB9LCAodSkgPT4ge1xuICAgICAgY29uc3QgZCA9IHUubWVzc2FnZSA9PT0gXCJNaXNzaW5nIGluaXRQVFMgZm9yIFZUVCBNUEVHVFNcIjtcbiAgICAgIGQgPyBvLnB1c2goZSkgOiB0aGlzLl9mYWxsYmFja1RvSU1TQzEociwgbiksIGwubG9nZ2VyLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFZUVCBjdWU6ICR7dX1gKSwgIShkICYmIGEgPiByLmNjKSAmJiBsLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICBzdWNjZXNzOiAhMSxcbiAgICAgICAgZnJhZzogcixcbiAgICAgICAgZXJyb3I6IHVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF9mYWxsYmFja1RvSU1TQzEoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnRyYWNrc1tlLmxldmVsXTtcbiAgICByLnRleHRDb2RlYyB8fCByZih0LCB0aGlzLmluaXRQVFNbZS5jY10sICgpID0+IHtcbiAgICAgIHIudGV4dENvZGVjID0gSWwsIHRoaXMuX3BhcnNlSU1TQzEoZSwgdCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgci50ZXh0Q29kZWMgPSBcInd2dHRcIjtcbiAgICB9KTtcbiAgfVxuICBfYXBwZW5kQ3VlcyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzO1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZW5kZXJUZXh0VHJhY2tzTmF0aXZlbHkpIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLnRleHRUcmFja3NbdF07XG4gICAgICBpZiAoIW4gfHwgbi5tb2RlID09PSBcImRpc2FibGVkXCIpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGUuZm9yRWFjaCgoaSkgPT4gVXAobiwgaSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuID0gdGhpcy50cmFja3NbdF07XG4gICAgICBpZiAoIW4pXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGkgPSBuLmRlZmF1bHQgPyBcImRlZmF1bHRcIiA6IFwic3VidGl0bGVzXCIgKyB0O1xuICAgICAgci50cmlnZ2VyKEkuQ1VFU19QQVJTRUQsIHtcbiAgICAgICAgdHlwZTogXCJzdWJ0aXRsZXNcIixcbiAgICAgICAgY3VlczogZSxcbiAgICAgICAgdHJhY2s6IGlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBvbkZyYWdEZWNyeXB0ZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHJcbiAgICB9ID0gdDtcbiAgICByLnR5cGUgPT09IHBlLlNVQlRJVExFICYmIHRoaXMub25GcmFnTG9hZGVkKEkuRlJBR19MT0FERUQsIHQpO1xuICB9XG4gIG9uU3VidGl0bGVUcmFja3NDbGVhcmVkKCkge1xuICAgIHRoaXMudHJhY2tzID0gW10sIHRoaXMuY2FwdGlvbnNUcmFja3MgPSB7fTtcbiAgfVxuICBvbkZyYWdQYXJzaW5nVXNlcmRhdGEoZSwgdCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbmZpZy5lbmFibGVDRUE3MDhDYXB0aW9ucylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgc2FtcGxlczogblxuICAgIH0gPSB0O1xuICAgIGlmICghKHIudHlwZSA9PT0gcGUuTUFJTiAmJiB0aGlzLmNsb3NlZENhcHRpb25zRm9yTGV2ZWwocikgPT09IFwiTk9ORVwiKSlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvID0gbltpXS5ieXRlcztcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICB0aGlzLmNlYTYwOFBhcnNlcjEgfHwgdGhpcy5pbml0Q2VhNjA4UGFyc2VycygpO1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmV4dHJhY3RDZWE2MDhEYXRhKG8pO1xuICAgICAgICAgIHRoaXMuY2VhNjA4UGFyc2VyMS5hZGREYXRhKG5baV0ucHRzLCBhWzBdKSwgdGhpcy5jZWE2MDhQYXJzZXIyLmFkZERhdGEobltpXS5wdHMsIGFbMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgb25CdWZmZXJGbHVzaGluZyhlLCB7XG4gICAgc3RhcnRPZmZzZXQ6IHQsXG4gICAgZW5kT2Zmc2V0OiByLFxuICAgIGVuZE9mZnNldFN1YnRpdGxlczogbixcbiAgICB0eXBlOiBpXG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYTogb1xuICAgIH0gPSB0aGlzO1xuICAgIGlmICghKCFvIHx8IG8uY3VycmVudFRpbWUgPCByKSkge1xuICAgICAgaWYgKCFpIHx8IGkgPT09IFwidmlkZW9cIikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY2FwdGlvbnNUcmFja3M6IGFcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIE9iamVjdC5rZXlzKGEpLmZvckVhY2goKGwpID0+IFNjKGFbbF0sIHQsIHIpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5yZW5kZXJUZXh0VHJhY2tzTmF0aXZlbHkgJiYgdCA9PT0gMCAmJiBuICE9PSB2b2lkIDApIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRleHRUcmFja3M6IGFcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIE9iamVjdC5rZXlzKGEpLmZvckVhY2goKGwpID0+IFNjKGFbbF0sIHQsIG4pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZXh0cmFjdENlYTYwOERhdGEoZSkge1xuICAgIGNvbnN0IHQgPSBbW10sIFtdXSwgciA9IGVbMF0gJiAzMTtcbiAgICBsZXQgbiA9IDI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBlW24rK10sIGEgPSAxMjcgJiBlW24rK10sIGwgPSAxMjcgJiBlW24rK107XG4gICAgICBpZiAoYSA9PT0gMCAmJiBsID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGlmICgoNCAmIG8pICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IHUgPSAzICYgbztcbiAgICAgICAgKHUgPT09IDAgfHwgdSA9PT0gMSkgJiYgKHRbdV0ucHVzaChhKSwgdFt1XS5wdXNoKGwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIFlwKHMpIHtcbiAgcmV0dXJuIHMuY2hhcmFjdGVyaXN0aWNzICYmIC90cmFuc2NyaWJlcy1zcG9rZW4tZGlhbG9nL2dpLnRlc3Qocy5jaGFyYWN0ZXJpc3RpY3MpICYmIC9kZXNjcmliZXMtbXVzaWMtYW5kLXNvdW5kL2dpLnRlc3Qocy5jaGFyYWN0ZXJpc3RpY3MpID8gXCJjYXB0aW9uc1wiIDogXCJzdWJ0aXRsZXNcIjtcbn1cbmZ1bmN0aW9uIG9mKHMsIGUpIHtcbiAgcmV0dXJuICEhcyAmJiBzLmtpbmQgPT09IFlwKGUpICYmIHljKGUsIHMpO1xufVxuZnVuY3Rpb24gencocywgZSwgdCwgcikge1xuICByZXR1cm4gTWF0aC5taW4oZSwgcikgLSBNYXRoLm1heChzLCB0KTtcbn1cbmZ1bmN0aW9uIGFmKCkge1xuICByZXR1cm4ge1xuICAgIGNjT2Zmc2V0OiAwLFxuICAgIHByZXNlbnRhdGlvbk9mZnNldDogMCxcbiAgICAwOiB7XG4gICAgICBzdGFydDogMCxcbiAgICAgIHByZXZDQzogLTEsXG4gICAgICBuZXc6ICEwXG4gICAgfVxuICB9O1xufVxuY29uc3QgWXcgPSAvXFxzLywgWncgPSB7XG4gIG5ld0N1ZShzLCBlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IFtdO1xuICAgIGxldCBpLCBvLCBhLCBsLCBjO1xuICAgIGNvbnN0IHUgPSBzZWxmLlZUVEN1ZSB8fCBzZWxmLlRleHRUcmFja0N1ZTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8IHIucm93cy5sZW5ndGg7IGgrKylcbiAgICAgIGlmIChpID0gci5yb3dzW2hdLCBhID0gITAsIGwgPSAwLCBjID0gXCJcIiwgIWkuaXNFbXB0eSgpKSB7XG4gICAgICAgIHZhciBkO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGkuY2hhcnMubGVuZ3RoOyB5KyspXG4gICAgICAgICAgWXcudGVzdChpLmNoYXJzW3ldLnVjaGFyKSAmJiBhID8gbCsrIDogKGMgKz0gaS5jaGFyc1t5XS51Y2hhciwgYSA9ICExKTtcbiAgICAgICAgaS5jdWVTdGFydFRpbWUgPSBlLCBlID09PSB0ICYmICh0ICs9IDFlLTQpLCBsID49IDE2ID8gbC0tIDogbCsrO1xuICAgICAgICBjb25zdCBmID0gSHAoYy50cmltKCkpLCBwID0gQnUoZSwgdCwgZik7XG4gICAgICAgIHMgIT0gbnVsbCAmJiAoZCA9IHMuY3VlcykgIT0gbnVsbCAmJiBkLmdldEN1ZUJ5SWQocCkgfHwgKG8gPSBuZXcgdShlLCB0LCBmKSwgby5pZCA9IHAsIG8ubGluZSA9IGggKyAxLCBvLmFsaWduID0gXCJsZWZ0XCIsIG8ucG9zaXRpb24gPSAxMCArIE1hdGgubWluKDgwLCBNYXRoLmZsb29yKGwgKiA4IC8gMzIpICogMTApLCBuLnB1c2gobykpO1xuICAgICAgfVxuICAgIHJldHVybiBzICYmIG4ubGVuZ3RoICYmIChuLnNvcnQoKGgsIGYpID0+IGgubGluZSA9PT0gXCJhdXRvXCIgfHwgZi5saW5lID09PSBcImF1dG9cIiA/IDAgOiBoLmxpbmUgPiA4ICYmIGYubGluZSA+IDggPyBmLmxpbmUgLSBoLmxpbmUgOiBoLmxpbmUgLSBmLmxpbmUpLCBuLmZvckVhY2goKGgpID0+IFVwKHMsIGgpKSksIG47XG4gIH1cbn07XG5mdW5jdGlvbiBYdygpIHtcbiAgaWYgKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZWxmLmZldGNoICYmIHNlbGYuQWJvcnRDb250cm9sbGVyICYmIHNlbGYuUmVhZGFibGVTdHJlYW0gJiYgc2VsZi5SZXF1ZXN0XG4gIClcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBzZWxmLlJlYWRhYmxlU3RyZWFtKHt9KSwgITA7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICByZXR1cm4gITE7XG59XG5jb25zdCBKdyA9IC8oXFxkKyktKFxcZCspXFwvKFxcZCspLztcbmNsYXNzIGxmIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuZmV0Y2hTZXR1cCA9IHZvaWQgMCwgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHZvaWQgMCwgdGhpcy5yZXF1ZXN0ID0gbnVsbCwgdGhpcy5yZXNwb25zZSA9IG51bGwsIHRoaXMuY29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5jb250ZXh0ID0gbnVsbCwgdGhpcy5jb25maWcgPSBudWxsLCB0aGlzLmNhbGxiYWNrcyA9IG51bGwsIHRoaXMuc3RhdHMgPSB2b2lkIDAsIHRoaXMubG9hZGVyID0gbnVsbCwgdGhpcy5mZXRjaFNldHVwID0gZS5mZXRjaFNldHVwIHx8IHJBLCB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgc2VsZi5BYm9ydENvbnRyb2xsZXIoKSwgdGhpcy5zdGF0cyA9IG5ldyBmdSgpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5sb2FkZXIgPSB0aGlzLmNhbGxiYWNrcyA9IHRoaXMuY29udGV4dCA9IHRoaXMuY29uZmlnID0gdGhpcy5yZXF1ZXN0ID0gbnVsbCwgdGhpcy5hYm9ydEludGVybmFsKCksIHRoaXMucmVzcG9uc2UgPSBudWxsLCB0aGlzLmZldGNoU2V0dXAgPSB0aGlzLmNvbnRyb2xsZXIgPSB0aGlzLnN0YXRzID0gbnVsbDtcbiAgfVxuICBhYm9ydEludGVybmFsKCkge1xuICAgIHRoaXMuY29udHJvbGxlciAmJiAhdGhpcy5zdGF0cy5sb2FkaW5nLmVuZCAmJiAodGhpcy5zdGF0cy5hYm9ydGVkID0gITAsIHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgfVxuICBhYm9ydCgpIHtcbiAgICB2YXIgZTtcbiAgICB0aGlzLmFib3J0SW50ZXJuYWwoKSwgKGUgPSB0aGlzLmNhbGxiYWNrcykgIT0gbnVsbCAmJiBlLm9uQWJvcnQgJiYgdGhpcy5jYWxsYmFja3Mub25BYm9ydCh0aGlzLnN0YXRzLCB0aGlzLmNvbnRleHQsIHRoaXMucmVzcG9uc2UpO1xuICB9XG4gIGxvYWQoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSB0aGlzLnN0YXRzO1xuICAgIGlmIChuLmxvYWRpbmcuc3RhcnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkZXIgY2FuIG9ubHkgYmUgdXNlZCBvbmNlLlwiKTtcbiAgICBuLmxvYWRpbmcuc3RhcnQgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGkgPSBRdyhlLCB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsKSwgbyA9IGUucmVzcG9uc2VUeXBlID09PSBcImFycmF5YnVmZmVyXCIsIGEgPSBvID8gXCJieXRlTGVuZ3RoXCIgOiBcImxlbmd0aFwiLCB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogbCxcbiAgICAgIG1heExvYWRUaW1lTXM6IGNcbiAgICB9ID0gdC5sb2FkUG9saWN5O1xuICAgIHRoaXMuY29udGV4dCA9IGUsIHRoaXMuY29uZmlnID0gdCwgdGhpcy5jYWxsYmFja3MgPSByLCB0aGlzLnJlcXVlc3QgPSB0aGlzLmZldGNoU2V0dXAoZSwgaSksIHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0LnRpbWVvdXQgPSBsICYmIHVlKGwpID8gbCA6IGMsIHRoaXMucmVxdWVzdFRpbWVvdXQgPSBzZWxmLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxsYmFja3MgJiYgKHRoaXMuYWJvcnRJbnRlcm5hbCgpLCB0aGlzLmNhbGxiYWNrcy5vblRpbWVvdXQobiwgZSwgdGhpcy5yZXNwb25zZSkpO1xuICAgIH0sIHQudGltZW91dCksICh4aSh0aGlzLnJlcXVlc3QpID8gdGhpcy5yZXF1ZXN0LnRoZW4oc2VsZi5mZXRjaCkgOiBzZWxmLmZldGNoKHRoaXMucmVxdWVzdCkpLnRoZW4oKGQpID0+IHtcbiAgICAgIHZhciBoO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHRoaXMubG9hZGVyID0gZDtcbiAgICAgIGNvbnN0IGYgPSBNYXRoLm1heChzZWxmLnBlcmZvcm1hbmNlLm5vdygpLCBuLmxvYWRpbmcuc3RhcnQpO1xuICAgICAgaWYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0LnRpbWVvdXQgPSBjLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgJiYgKHRoaXMuYWJvcnRJbnRlcm5hbCgpLCB0aGlzLmNhbGxiYWNrcy5vblRpbWVvdXQobiwgZSwgdGhpcy5yZXNwb25zZSkpO1xuICAgICAgfSwgYyAtIChmIC0gbi5sb2FkaW5nLnN0YXJ0KSksICFkLm9rKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBzdGF0dXM6IHksXG4gICAgICAgICAgc3RhdHVzVGV4dDogRVxuICAgICAgICB9ID0gZDtcbiAgICAgICAgdGhyb3cgbmV3IHNBKEUgfHwgXCJmZXRjaCwgYmFkIG5ldHdvcmsgcmVzcG9uc2VcIiwgeSwgZCk7XG4gICAgICB9XG4gICAgICBuLmxvYWRpbmcuZmlyc3QgPSBmLCBuLnRvdGFsID0gdEEoZC5oZWFkZXJzKSB8fCBuLnRvdGFsO1xuICAgICAgY29uc3QgcCA9IChoID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgPyB2b2lkIDAgOiBoLm9uUHJvZ3Jlc3M7XG4gICAgICByZXR1cm4gcCAmJiB1ZSh0LmhpZ2hXYXRlck1hcmspID8gdGhpcy5sb2FkUHJvZ3Jlc3NpdmVseShkLCBuLCBlLCB0LmhpZ2hXYXRlck1hcmssIHApIDogbyA/IGQuYXJyYXlCdWZmZXIoKSA6IGUucmVzcG9uc2VUeXBlID09PSBcImpzb25cIiA/IGQuanNvbigpIDogZC50ZXh0KCk7XG4gICAgfSkudGhlbigoZCkgPT4ge1xuICAgICAgdmFyIGgsIGY7XG4gICAgICBjb25zdCBwID0gdGhpcy5yZXNwb25zZTtcbiAgICAgIGlmICghcClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyIGRlc3Ryb3llZFwiKTtcbiAgICAgIHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCBuLmxvYWRpbmcuZW5kID0gTWF0aC5tYXgoc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgbi5sb2FkaW5nLmZpcnN0KTtcbiAgICAgIGNvbnN0IHkgPSBkW2FdO1xuICAgICAgeSAmJiAobi5sb2FkZWQgPSBuLnRvdGFsID0geSk7XG4gICAgICBjb25zdCBFID0ge1xuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICBkYXRhOiBkLFxuICAgICAgICBjb2RlOiBwLnN0YXR1c1xuICAgICAgfSwgYiA9IChoID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgPyB2b2lkIDAgOiBoLm9uUHJvZ3Jlc3M7XG4gICAgICBiICYmICF1ZSh0LmhpZ2hXYXRlck1hcmspICYmIGIobiwgZSwgZCwgcCksIChmID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgZi5vblN1Y2Nlc3MoRSwgbiwgZSwgcCk7XG4gICAgfSkuY2F0Y2goKGQpID0+IHtcbiAgICAgIHZhciBoO1xuICAgICAgaWYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCBuLmFib3J0ZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGYgPSBkICYmIGQuY29kZSB8fCAwLCBwID0gZCA/IGQubWVzc2FnZSA6IG51bGw7XG4gICAgICAoaCA9IHRoaXMuY2FsbGJhY2tzKSA9PSBudWxsIHx8IGgub25FcnJvcih7XG4gICAgICAgIGNvZGU6IGYsXG4gICAgICAgIHRleHQ6IHBcbiAgICAgIH0sIGUsIGQgPyBkLmRldGFpbHMgOiBudWxsLCBuKTtcbiAgICB9KTtcbiAgfVxuICBnZXRDYWNoZUFnZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiYWdlXCIpO1xuICAgICAgZSA9IHQgPyBwYXJzZUZsb2F0KHQpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZ2V0UmVzcG9uc2VIZWFkZXIoZSkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlID8gdGhpcy5yZXNwb25zZS5oZWFkZXJzLmdldChlKSA6IG51bGw7XG4gIH1cbiAgbG9hZFByb2dyZXNzaXZlbHkoZSwgdCwgciwgbiA9IDAsIGkpIHtcbiAgICBjb25zdCBvID0gbmV3IGlwKCksIGEgPSBlLmJvZHkuZ2V0UmVhZGVyKCksIGwgPSAoKSA9PiBhLnJlYWQoKS50aGVuKChjKSA9PiB7XG4gICAgICBpZiAoYy5kb25lKVxuICAgICAgICByZXR1cm4gby5kYXRhTGVuZ3RoICYmIGkodCwgciwgby5mbHVzaCgpLmJ1ZmZlciwgZSksIFByb21pc2UucmVzb2x2ZShuZXcgQXJyYXlCdWZmZXIoMCkpO1xuICAgICAgY29uc3QgdSA9IGMudmFsdWUsIGQgPSB1Lmxlbmd0aDtcbiAgICAgIHJldHVybiB0LmxvYWRlZCArPSBkLCBkIDwgbiB8fCBvLmRhdGFMZW5ndGggPyAoby5wdXNoKHUpLCBvLmRhdGFMZW5ndGggPj0gbiAmJiBpKHQsIHIsIG8uZmx1c2goKS5idWZmZXIsIGUpKSA6IGkodCwgciwgdS5idWZmZXIsIGUpLCBsKCk7XG4gICAgfSkuY2F0Y2goKCkgPT4gUHJvbWlzZS5yZWplY3QoKSk7XG4gICAgcmV0dXJuIGwoKTtcbiAgfVxufVxuZnVuY3Rpb24gUXcocywgZSkge1xuICBjb25zdCB0ID0ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBtb2RlOiBcImNvcnNcIixcbiAgICBjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiLFxuICAgIHNpZ25hbDogZSxcbiAgICBoZWFkZXJzOiBuZXcgc2VsZi5IZWFkZXJzKG50KHt9LCBzLmhlYWRlcnMpKVxuICB9O1xuICByZXR1cm4gcy5yYW5nZUVuZCAmJiB0LmhlYWRlcnMuc2V0KFwiUmFuZ2VcIiwgXCJieXRlcz1cIiArIHMucmFuZ2VTdGFydCArIFwiLVwiICsgU3RyaW5nKHMucmFuZ2VFbmQgLSAxKSksIHQ7XG59XG5mdW5jdGlvbiBlQShzKSB7XG4gIGNvbnN0IGUgPSBKdy5leGVjKHMpO1xuICBpZiAoZSlcbiAgICByZXR1cm4gcGFyc2VJbnQoZVsyXSkgLSBwYXJzZUludChlWzFdKSArIDE7XG59XG5mdW5jdGlvbiB0QShzKSB7XG4gIGNvbnN0IGUgPSBzLmdldChcIkNvbnRlbnQtUmFuZ2VcIik7XG4gIGlmIChlKSB7XG4gICAgY29uc3QgciA9IGVBKGUpO1xuICAgIGlmICh1ZShyKSlcbiAgICAgIHJldHVybiByO1xuICB9XG4gIGNvbnN0IHQgPSBzLmdldChcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICBpZiAodClcbiAgICByZXR1cm4gcGFyc2VJbnQodCk7XG59XG5mdW5jdGlvbiByQShzLCBlKSB7XG4gIHJldHVybiBuZXcgc2VsZi5SZXF1ZXN0KHMudXJsLCBlKTtcbn1cbmNsYXNzIHNBIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgc3VwZXIoZSksIHRoaXMuY29kZSA9IHZvaWQgMCwgdGhpcy5kZXRhaWxzID0gdm9pZCAwLCB0aGlzLmNvZGUgPSB0LCB0aGlzLmRldGFpbHMgPSByO1xuICB9XG59XG5jb25zdCBuQSA9IC9eYWdlOlxccypbXFxkLl0rXFxzKiQvaW07XG5jbGFzcyBacCB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLnhoclNldHVwID0gdm9pZCAwLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gdm9pZCAwLCB0aGlzLnJldHJ5VGltZW91dCA9IHZvaWQgMCwgdGhpcy5yZXRyeURlbGF5ID0gdm9pZCAwLCB0aGlzLmNvbmZpZyA9IG51bGwsIHRoaXMuY2FsbGJhY2tzID0gbnVsbCwgdGhpcy5jb250ZXh0ID0gbnVsbCwgdGhpcy5sb2FkZXIgPSBudWxsLCB0aGlzLnN0YXRzID0gdm9pZCAwLCB0aGlzLnhoclNldHVwID0gZSAmJiBlLnhoclNldHVwIHx8IG51bGwsIHRoaXMuc3RhdHMgPSBuZXcgZnUoKSwgdGhpcy5yZXRyeURlbGF5ID0gMDtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbnVsbCwgdGhpcy5hYm9ydEludGVybmFsKCksIHRoaXMubG9hZGVyID0gbnVsbCwgdGhpcy5jb25maWcgPSBudWxsLCB0aGlzLmNvbnRleHQgPSBudWxsLCB0aGlzLnhoclNldHVwID0gbnVsbDtcbiAgfVxuICBhYm9ydEludGVybmFsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmxvYWRlcjtcbiAgICBzZWxmLmNsZWFyVGltZW91dCh0aGlzLnJlcXVlc3RUaW1lb3V0KSwgc2VsZi5jbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVvdXQpLCBlICYmIChlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGwsIGUub25wcm9ncmVzcyA9IG51bGwsIGUucmVhZHlTdGF0ZSAhPT0gNCAmJiAodGhpcy5zdGF0cy5hYm9ydGVkID0gITAsIGUuYWJvcnQoKSkpO1xuICB9XG4gIGFib3J0KCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMuYWJvcnRJbnRlcm5hbCgpLCAoZSA9IHRoaXMuY2FsbGJhY2tzKSAhPSBudWxsICYmIGUub25BYm9ydCAmJiB0aGlzLmNhbGxiYWNrcy5vbkFib3J0KHRoaXMuc3RhdHMsIHRoaXMuY29udGV4dCwgdGhpcy5sb2FkZXIpO1xuICB9XG4gIGxvYWQoZSwgdCwgcikge1xuICAgIGlmICh0aGlzLnN0YXRzLmxvYWRpbmcuc3RhcnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkZXIgY2FuIG9ubHkgYmUgdXNlZCBvbmNlLlwiKTtcbiAgICB0aGlzLnN0YXRzLmxvYWRpbmcuc3RhcnQgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpLCB0aGlzLmNvbnRleHQgPSBlLCB0aGlzLmNvbmZpZyA9IHQsIHRoaXMuY2FsbGJhY2tzID0gciwgdGhpcy5sb2FkSW50ZXJuYWwoKTtcbiAgfVxuICBsb2FkSW50ZXJuYWwoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiBlLFxuICAgICAgY29udGV4dDogdFxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSB8fCAhdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdGhpcy5sb2FkZXIgPSBuZXcgc2VsZi5YTUxIdHRwUmVxdWVzdCgpLCBuID0gdGhpcy5zdGF0cztcbiAgICBuLmxvYWRpbmcuZmlyc3QgPSAwLCBuLmxvYWRlZCA9IDAsIG4uYWJvcnRlZCA9ICExO1xuICAgIGNvbnN0IGkgPSB0aGlzLnhoclNldHVwO1xuICAgIGkgPyBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghKHRoaXMubG9hZGVyICE9PSByIHx8IHRoaXMuc3RhdHMuYWJvcnRlZCkpXG4gICAgICAgIHJldHVybiBpKHIsIHQudXJsKTtcbiAgICB9KS5jYXRjaCgobykgPT4ge1xuICAgICAgaWYgKCEodGhpcy5sb2FkZXIgIT09IHIgfHwgdGhpcy5zdGF0cy5hYm9ydGVkKSlcbiAgICAgICAgcmV0dXJuIHIub3BlbihcIkdFVFwiLCB0LnVybCwgITApLCBpKHIsIHQudXJsKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubG9hZGVyICE9PSByIHx8IHRoaXMuc3RhdHMuYWJvcnRlZCB8fCB0aGlzLm9wZW5BbmRTZW5kWGhyKHIsIHQsIGUpO1xuICAgIH0pLmNhdGNoKChvKSA9PiB7XG4gICAgICB2YXIgYTtcbiAgICAgIChhID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgYS5vbkVycm9yKHtcbiAgICAgICAgY29kZTogci5zdGF0dXMsXG4gICAgICAgIHRleHQ6IG8ubWVzc2FnZVxuICAgICAgfSwgdCwgciwgbik7XG4gICAgfSkgOiB0aGlzLm9wZW5BbmRTZW5kWGhyKHIsIHQsIGUpO1xuICB9XG4gIG9wZW5BbmRTZW5kWGhyKGUsIHQsIHIpIHtcbiAgICBlLnJlYWR5U3RhdGUgfHwgZS5vcGVuKFwiR0VUXCIsIHQudXJsLCAhMCk7XG4gICAgY29uc3QgbiA9IHQuaGVhZGVycywge1xuICAgICAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IGksXG4gICAgICBtYXhMb2FkVGltZU1zOiBvXG4gICAgfSA9IHIubG9hZFBvbGljeTtcbiAgICBpZiAobilcbiAgICAgIGZvciAoY29uc3QgYSBpbiBuKVxuICAgICAgICBlLnNldFJlcXVlc3RIZWFkZXIoYSwgblthXSk7XG4gICAgdC5yYW5nZUVuZCAmJiBlLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLCBcImJ5dGVzPVwiICsgdC5yYW5nZVN0YXJ0ICsgXCItXCIgKyAodC5yYW5nZUVuZCAtIDEpKSwgZS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLnJlYWR5c3RhdGVjaGFuZ2UuYmluZCh0aGlzKSwgZS5vbnByb2dyZXNzID0gdGhpcy5sb2FkcHJvZ3Jlc3MuYmluZCh0aGlzKSwgZS5yZXNwb25zZVR5cGUgPSB0LnJlc3BvbnNlVHlwZSwgc2VsZi5jbGVhclRpbWVvdXQodGhpcy5yZXF1ZXN0VGltZW91dCksIHIudGltZW91dCA9IGkgJiYgdWUoaSkgPyBpIDogbywgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHNlbGYuc2V0VGltZW91dCh0aGlzLmxvYWR0aW1lb3V0LmJpbmQodGhpcyksIHIudGltZW91dCksIGUuc2VuZCgpO1xuICB9XG4gIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogZSxcbiAgICAgIGxvYWRlcjogdCxcbiAgICAgIHN0YXRzOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFlIHx8ICF0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0LnJlYWR5U3RhdGUsIGkgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAoIXIuYWJvcnRlZCAmJiBuID49IDIgJiYgKHIubG9hZGluZy5maXJzdCA9PT0gMCAmJiAoci5sb2FkaW5nLmZpcnN0ID0gTWF0aC5tYXgoc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgci5sb2FkaW5nLnN0YXJ0KSwgaS50aW1lb3V0ICE9PSBpLmxvYWRQb2xpY3kubWF4TG9hZFRpbWVNcyAmJiAoc2VsZi5jbGVhclRpbWVvdXQodGhpcy5yZXF1ZXN0VGltZW91dCksIGkudGltZW91dCA9IGkubG9hZFBvbGljeS5tYXhMb2FkVGltZU1zLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0KHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKSwgaS5sb2FkUG9saWN5Lm1heExvYWRUaW1lTXMgLSAoci5sb2FkaW5nLmZpcnN0IC0gci5sb2FkaW5nLnN0YXJ0KSkpKSwgbiA9PT0gNCkpIHtcbiAgICAgIHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGwsIHQub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICBjb25zdCBjID0gdC5zdGF0dXMsIHUgPSB0LnJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCIgPyB0LnJlc3BvbnNlVGV4dCA6IG51bGw7XG4gICAgICBpZiAoYyA+PSAyMDAgJiYgYyA8IDMwMCkge1xuICAgICAgICBjb25zdCBwID0gdSA/PyB0LnJlc3BvbnNlO1xuICAgICAgICBpZiAocCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG8sIGE7XG4gICAgICAgICAgci5sb2FkaW5nLmVuZCA9IE1hdGgubWF4KHNlbGYucGVyZm9ybWFuY2Uubm93KCksIHIubG9hZGluZy5maXJzdCk7XG4gICAgICAgICAgY29uc3QgeSA9IHQucmVzcG9uc2VUeXBlID09PSBcImFycmF5YnVmZmVyXCIgPyBwLmJ5dGVMZW5ndGggOiBwLmxlbmd0aDtcbiAgICAgICAgICByLmxvYWRlZCA9IHIudG90YWwgPSB5LCByLmJ3RXN0aW1hdGUgPSByLnRvdGFsICogOGUzIC8gKHIubG9hZGluZy5lbmQgLSByLmxvYWRpbmcuZmlyc3QpO1xuICAgICAgICAgIGNvbnN0IEUgPSAobyA9IHRoaXMuY2FsbGJhY2tzKSA9PSBudWxsID8gdm9pZCAwIDogby5vblByb2dyZXNzO1xuICAgICAgICAgIEUgJiYgRShyLCBlLCBwLCB0KTtcbiAgICAgICAgICBjb25zdCBiID0ge1xuICAgICAgICAgICAgdXJsOiB0LnJlc3BvbnNlVVJMLFxuICAgICAgICAgICAgZGF0YTogcCxcbiAgICAgICAgICAgIGNvZGU6IGNcbiAgICAgICAgICB9O1xuICAgICAgICAgIChhID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgYS5vblN1Y2Nlc3MoYiwgciwgZSwgdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkID0gaS5sb2FkUG9saWN5LmVycm9yUmV0cnksIGggPSByLnJldHJ5LCBmID0ge1xuICAgICAgICB1cmw6IGUudXJsLFxuICAgICAgICBkYXRhOiB2b2lkIDAsXG4gICAgICAgIGNvZGU6IGNcbiAgICAgIH07XG4gICAgICBpZiAodGEoZCwgaCwgITEsIGYpKVxuICAgICAgICB0aGlzLnJldHJ5KGQpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBsO1xuICAgICAgICBydC5lcnJvcihgJHtjfSB3aGlsZSBsb2FkaW5nICR7ZS51cmx9YCksIChsID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgbC5vbkVycm9yKHtcbiAgICAgICAgICBjb2RlOiBjLFxuICAgICAgICAgIHRleHQ6IHQuc3RhdHVzVGV4dFxuICAgICAgICB9LCBlLCB0LCByKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9hZHRpbWVvdXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuO1xuICAgIGNvbnN0IGUgPSB0aGlzLmNvbmZpZy5sb2FkUG9saWN5LnRpbWVvdXRSZXRyeSwgdCA9IHRoaXMuc3RhdHMucmV0cnk7XG4gICAgaWYgKHRhKGUsIHQsICEwKSlcbiAgICAgIHRoaXMucmV0cnkoZSk7XG4gICAgZWxzZSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHJ0Lndhcm4oYHRpbWVvdXQgd2hpbGUgbG9hZGluZyAkeyhyID0gdGhpcy5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogci51cmx9YCk7XG4gICAgICBjb25zdCBuID0gdGhpcy5jYWxsYmFja3M7XG4gICAgICBuICYmICh0aGlzLmFib3J0SW50ZXJuYWwoKSwgbi5vblRpbWVvdXQodGhpcy5zdGF0cywgdGhpcy5jb250ZXh0LCB0aGlzLmxvYWRlcikpO1xuICAgIH1cbiAgfVxuICByZXRyeShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogdCxcbiAgICAgIHN0YXRzOiByXG4gICAgfSA9IHRoaXM7XG4gICAgdGhpcy5yZXRyeURlbGF5ID0geXUoZSwgci5yZXRyeSksIHIucmV0cnkrKywgcnQud2FybihgJHtzdGF0dXMgPyBcIkhUVFAgU3RhdHVzIFwiICsgc3RhdHVzIDogXCJUaW1lb3V0XCJ9IHdoaWxlIGxvYWRpbmcgJHt0ID09IG51bGwgPyB2b2lkIDAgOiB0LnVybH0sIHJldHJ5aW5nICR7ci5yZXRyeX0vJHtlLm1heE51bVJldHJ5fSBpbiAke3RoaXMucmV0cnlEZWxheX1tc2ApLCB0aGlzLmFib3J0SW50ZXJuYWwoKSwgdGhpcy5sb2FkZXIgPSBudWxsLCBzZWxmLmNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCksIHRoaXMucmV0cnlUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0KHRoaXMubG9hZEludGVybmFsLmJpbmQodGhpcyksIHRoaXMucmV0cnlEZWxheSk7XG4gIH1cbiAgbG9hZHByb2dyZXNzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdGF0cztcbiAgICB0LmxvYWRlZCA9IGUubG9hZGVkLCBlLmxlbmd0aENvbXB1dGFibGUgJiYgKHQudG90YWwgPSBlLnRvdGFsKTtcbiAgfVxuICBnZXRDYWNoZUFnZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgaWYgKHRoaXMubG9hZGVyICYmIG5BLnRlc3QodGhpcy5sb2FkZXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sb2FkZXIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJhZ2VcIik7XG4gICAgICBlID0gdCA/IHBhcnNlRmxvYXQodCkgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXRSZXNwb25zZUhlYWRlcihlKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyICYmIG5ldyBSZWdFeHAoYF4ke2V9OlxcXFxzKltcXFxcZC5dK1xcXFxzKiRgLCBcImltXCIpLnRlc3QodGhpcy5sb2FkZXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpID8gdGhpcy5sb2FkZXIuZ2V0UmVzcG9uc2VIZWFkZXIoZSkgOiBudWxsO1xuICB9XG59XG5jb25zdCBpQSA9IHtcbiAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IDhlMyxcbiAgbWF4TG9hZFRpbWVNczogMmU0LFxuICB0aW1lb3V0UmV0cnk6IG51bGwsXG4gIGVycm9yUmV0cnk6IG51bGxcbn0sIG9BID0gdHQodHQoe1xuICBhdXRvU3RhcnRMb2FkOiAhMCxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBzdGFydFBvc2l0aW9uOiAtMSxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBkZWZhdWx0QXVkaW9Db2RlYzogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IHN0cmVhbS1jb250cm9sbGVyXG4gIGRlYnVnOiAhMSxcbiAgLy8gdXNlZCBieSBsb2dnZXJcbiAgY2FwTGV2ZWxPbkZQU0Ryb3A6ICExLFxuICAvLyB1c2VkIGJ5IGZwcy1jb250cm9sbGVyXG4gIGNhcExldmVsVG9QbGF5ZXJTaXplOiAhMSxcbiAgLy8gdXNlZCBieSBjYXAtbGV2ZWwtY29udHJvbGxlclxuICBpZ25vcmVEZXZpY2VQaXhlbFJhdGlvOiAhMSxcbiAgLy8gdXNlZCBieSBjYXAtbGV2ZWwtY29udHJvbGxlclxuICBtYXhEZXZpY2VQaXhlbFJhdGlvOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gIC8vIHVzZWQgYnkgY2FwLWxldmVsLWNvbnRyb2xsZXJcbiAgcHJlZmVyTWFuYWdlZE1lZGlhU291cmNlOiAhMCxcbiAgaW5pdGlhbExpdmVNYW5pZmVzdFNpemU6IDEsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgbWF4QnVmZmVyTGVuZ3RoOiAzMCxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBiYWNrQnVmZmVyTGVuZ3RoOiAxIC8gMCxcbiAgLy8gdXNlZCBieSBidWZmZXItY29udHJvbGxlclxuICBmcm9udEJ1ZmZlckZsdXNoVGhyZXNob2xkOiAxIC8gMCxcbiAgc3RhcnRPblNlZ21lbnRCb3VuZGFyeTogITEsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgbWF4QnVmZmVyU2l6ZTogNjAgKiAxZTMgKiAxZTMsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgbWF4RnJhZ0xvb2tVcFRvbGVyYW5jZTogMC4yNSxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBtYXhCdWZmZXJIb2xlOiAwLjEsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXIgYW5kIGdhcC1jb250cm9sbGVyXG4gIGRldGVjdFN0YWxsV2l0aEN1cnJlbnRUaW1lTXM6IDEyNTAsXG4gIC8vIHVzZWQgYnkgZ2FwLWNvbnRyb2xsZXJcbiAgaGlnaEJ1ZmZlcldhdGNoZG9nUGVyaW9kOiAyLFxuICAvLyB1c2VkIGJ5IGdhcC1jb250cm9sbGVyXG4gIG51ZGdlT2Zmc2V0OiAwLjEsXG4gIC8vIHVzZWQgYnkgZ2FwLWNvbnRyb2xsZXJcbiAgbnVkZ2VNYXhSZXRyeTogMyxcbiAgLy8gdXNlZCBieSBnYXAtY29udHJvbGxlclxuICBudWRnZU9uVmlkZW9Ib2xlOiAhMCxcbiAgLy8gdXNlZCBieSBnYXAtY29udHJvbGxlclxuICBsaXZlU3luY01vZGU6IFwiZWRnZVwiLFxuICAvLyB1c2VkIGJ5IHN0cmVhbS1jb250cm9sbGVyXG4gIGxpdmVTeW5jRHVyYXRpb25Db3VudDogMyxcbiAgLy8gdXNlZCBieSBsYXRlbmN5LWNvbnRyb2xsZXJcbiAgbGl2ZVN5bmNPblN0YWxsSW5jcmVhc2U6IDEsXG4gIC8vIHVzZWQgYnkgbGF0ZW5jeS1jb250cm9sbGVyXG4gIGxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudDogMSAvIDAsXG4gIC8vIHVzZWQgYnkgbGF0ZW5jeS1jb250cm9sbGVyXG4gIGxpdmVTeW5jRHVyYXRpb246IHZvaWQgMCxcbiAgLy8gdXNlZCBieSBsYXRlbmN5LWNvbnRyb2xsZXJcbiAgbGl2ZU1heExhdGVuY3lEdXJhdGlvbjogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IGxhdGVuY3ktY29udHJvbGxlclxuICBtYXhMaXZlU3luY1BsYXliYWNrUmF0ZTogMSxcbiAgLy8gdXNlZCBieSBsYXRlbmN5LWNvbnRyb2xsZXJcbiAgbGl2ZUR1cmF0aW9uSW5maW5pdHk6ICExLFxuICAvLyB1c2VkIGJ5IGJ1ZmZlci1jb250cm9sbGVyXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYmFja0J1ZmZlckxlbmd0aFxuICAgKi9cbiAgbGl2ZUJhY2tCdWZmZXJMZW5ndGg6IG51bGwsXG4gIC8vIHVzZWQgYnkgYnVmZmVyLWNvbnRyb2xsZXJcbiAgbWF4TWF4QnVmZmVyTGVuZ3RoOiA2MDAsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgZW5hYmxlV29ya2VyOiAhMCxcbiAgLy8gdXNlZCBieSB0cmFuc211eGVyXG4gIHdvcmtlclBhdGg6IG51bGwsXG4gIC8vIHVzZWQgYnkgdHJhbnNtdXhlclxuICBlbmFibGVTb2Z0d2FyZUFFUzogITAsXG4gIC8vIHVzZWQgYnkgZGVjcnlwdGVyXG4gIHN0YXJ0TGV2ZWw6IHZvaWQgMCxcbiAgLy8gdXNlZCBieSBsZXZlbC1jb250cm9sbGVyXG4gIHN0YXJ0RnJhZ1ByZWZldGNoOiAhMSxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBmcHNEcm9wcGVkTW9uaXRvcmluZ1BlcmlvZDogNWUzLFxuICAvLyB1c2VkIGJ5IGZwcy1jb250cm9sbGVyXG4gIGZwc0Ryb3BwZWRNb25pdG9yaW5nVGhyZXNob2xkOiAwLjIsXG4gIC8vIHVzZWQgYnkgZnBzLWNvbnRyb2xsZXJcbiAgYXBwZW5kRXJyb3JNYXhSZXRyeTogMyxcbiAgLy8gdXNlZCBieSBidWZmZXItY29udHJvbGxlclxuICBpZ25vcmVQbGF5bGlzdFBhcnNpbmdFcnJvcnM6ICExLFxuICBsb2FkZXI6IFpwLFxuICAvLyBsb2FkZXI6IEZldGNoTG9hZGVyLFxuICBmTG9hZGVyOiB2b2lkIDAsXG4gIC8vIHVzZWQgYnkgZnJhZ21lbnQtbG9hZGVyXG4gIHBMb2FkZXI6IHZvaWQgMCxcbiAgLy8gdXNlZCBieSBwbGF5bGlzdC1sb2FkZXJcbiAgeGhyU2V0dXA6IHZvaWQgMCxcbiAgLy8gdXNlZCBieSB4aHItbG9hZGVyXG4gIGxpY2Vuc2VYaHJTZXR1cDogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIGxpY2Vuc2VSZXNwb25zZUNhbGxiYWNrOiB2b2lkIDAsXG4gIC8vIHVzZWQgYnkgZW1lLWNvbnRyb2xsZXJcbiAgYWJyQ29udHJvbGxlcjogeWIsXG4gIGJ1ZmZlckNvbnRyb2xsZXI6IGwyLFxuICBjYXBMZXZlbENvbnRyb2xsZXI6IER1LFxuICBlcnJvckNvbnRyb2xsZXI6IGJiLFxuICBmcHNDb250cm9sbGVyOiBjdyxcbiAgc3RyZXRjaFNob3J0VmlkZW9UcmFjazogITEsXG4gIC8vIHVzZWQgYnkgbXA0LXJlbXV4ZXJcbiAgbWF4QXVkaW9GcmFtZXNEcmlmdDogMSxcbiAgLy8gdXNlZCBieSBtcDQtcmVtdXhlclxuICBmb3JjZUtleUZyYW1lT25EaXNjb250aW51aXR5OiAhMCxcbiAgLy8gdXNlZCBieSB0cy1kZW11eGVyXG4gIGFickV3bWFGYXN0TGl2ZTogMyxcbiAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBhYnJFd21hU2xvd0xpdmU6IDksXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyRXdtYUZhc3RWb0Q6IDMsXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyRXdtYVNsb3dWb0Q6IDksXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyRXdtYURlZmF1bHRFc3RpbWF0ZTogNWU1LFxuICAvLyA1MDAga2JwcyAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBhYnJFd21hRGVmYXVsdEVzdGltYXRlTWF4OiA1ZTYsXG4gIC8vIDUgbWJwc1xuICBhYnJCYW5kV2lkdGhGYWN0b3I6IDAuOTUsXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyQmFuZFdpZHRoVXBGYWN0b3I6IDAuNyxcbiAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBhYnJNYXhXaXRoUmVhbEJpdHJhdGU6ICExLFxuICAvLyB1c2VkIGJ5IGFici1jb250cm9sbGVyXG4gIG1heFN0YXJ2YXRpb25EZWxheTogNCxcbiAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBtYXhMb2FkaW5nRGVsYXk6IDQsXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgbWluQXV0b0JpdHJhdGU6IDAsXG4gIC8vIHVzZWQgYnkgaGxzXG4gIGVtZUVuYWJsZWQ6ICExLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIHdpZGV2aW5lTGljZW5zZVVybDogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIGRybVN5c3RlbXM6IHt9LFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIGRybVN5c3RlbU9wdGlvbnM6IHt9LFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIHJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2Vzc0Z1bmM6IFlnLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIHJlcXVpcmVLZXlTeXN0ZW1BY2Nlc3NPblN0YXJ0OiAhMSxcbiAgLy8gdXNlZCBieSBlbWUtY29udHJvbGxlclxuICB0ZXN0QmFuZHdpZHRoOiAhMCxcbiAgcHJvZ3Jlc3NpdmU6ICExLFxuICBsb3dMYXRlbmN5TW9kZTogITAsXG4gIGNtY2Q6IHZvaWQgMCxcbiAgZW5hYmxlRGF0ZVJhbmdlTWV0YWRhdGFDdWVzOiAhMCxcbiAgZW5hYmxlRW1zZ01ldGFkYXRhQ3VlczogITAsXG4gIGVuYWJsZUVtc2dLTFZNZXRhZGF0YTogITEsXG4gIGVuYWJsZUlEM01ldGFkYXRhQ3VlczogITAsXG4gIGVuYWJsZUludGVyc3RpdGlhbFBsYXliYWNrOiAhMCxcbiAgaW50ZXJzdGl0aWFsQXBwZW5kSW5QbGFjZTogITAsXG4gIGludGVyc3RpdGlhbExpdmVMb29rQWhlYWQ6IDEwLFxuICB1c2VNZWRpYUNhcGFiaWxpdGllczogITAsXG4gIHByZXNlcnZlTWFudWFsTGV2ZWxPbkVycm9yOiAhMSxcbiAgY2VydExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiBpQVxuICB9LFxuICBrZXlMb2FkUG9saWN5OiB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IDhlMyxcbiAgICAgIG1heExvYWRUaW1lTXM6IDJlNCxcbiAgICAgIHRpbWVvdXRSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogMSxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAxZTMsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMmU0LFxuICAgICAgICBiYWNrb2ZmOiBcImxpbmVhclwiXG4gICAgICB9LFxuICAgICAgZXJyb3JSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogOCxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAxZTMsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMmU0LFxuICAgICAgICBiYWNrb2ZmOiBcImxpbmVhclwiXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtYW5pZmVzdExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMSAvIDAsXG4gICAgICBtYXhMb2FkVGltZU1zOiAyZTQsXG4gICAgICB0aW1lb3V0UmV0cnk6IHtcbiAgICAgICAgbWF4TnVtUmV0cnk6IDIsXG4gICAgICAgIHJldHJ5RGVsYXlNczogMCxcbiAgICAgICAgbWF4UmV0cnlEZWxheU1zOiAwXG4gICAgICB9LFxuICAgICAgZXJyb3JSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogMSxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAxZTMsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogOGUzXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwbGF5bGlzdExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMWU0LFxuICAgICAgbWF4TG9hZFRpbWVNczogMmU0LFxuICAgICAgdGltZW91dFJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiAyLFxuICAgICAgICByZXRyeURlbGF5TXM6IDAsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMFxuICAgICAgfSxcbiAgICAgIGVycm9yUmV0cnk6IHtcbiAgICAgICAgbWF4TnVtUmV0cnk6IDIsXG4gICAgICAgIHJldHJ5RGVsYXlNczogMWUzLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDhlM1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZnJhZ0xvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMWU0LFxuICAgICAgbWF4TG9hZFRpbWVNczogMTJlNCxcbiAgICAgIHRpbWVvdXRSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogNCxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAwLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDBcbiAgICAgIH0sXG4gICAgICBlcnJvclJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiA2LFxuICAgICAgICByZXRyeURlbGF5TXM6IDFlMyxcbiAgICAgICAgbWF4UmV0cnlEZWxheU1zOiA4ZTNcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHN0ZWVyaW5nTWFuaWZlc3RMb2FkUG9saWN5OiB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IDFlNCxcbiAgICAgIG1heExvYWRUaW1lTXM6IDJlNCxcbiAgICAgIHRpbWVvdXRSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogMixcbiAgICAgICAgcmV0cnlEZWxheU1zOiAwLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDBcbiAgICAgIH0sXG4gICAgICBlcnJvclJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiAxLFxuICAgICAgICByZXRyeURlbGF5TXM6IDFlMyxcbiAgICAgICAgbWF4UmV0cnlEZWxheU1zOiA4ZTNcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGludGVyc3RpdGlhbEFzc2V0TGlzdExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMWU0LFxuICAgICAgbWF4TG9hZFRpbWVNczogM2U0LFxuICAgICAgdGltZW91dFJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiAwLFxuICAgICAgICByZXRyeURlbGF5TXM6IDAsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMFxuICAgICAgfSxcbiAgICAgIGVycm9yUmV0cnk6IHtcbiAgICAgICAgbWF4TnVtUmV0cnk6IDAsXG4gICAgICAgIHJldHJ5RGVsYXlNczogMWUzLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDhlM1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gVGhlc2UgZGVmYXVsdCBzZXR0aW5ncyBhcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYWJvdmUgcG9saWNpZXNcbiAgLy8gYW5kIGFyZSBtYWludGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBtYW5pZmVzdExvYWRpbmdUaW1lT3V0OiAxZTQsXG4gIG1hbmlmZXN0TG9hZGluZ01heFJldHJ5OiAxLFxuICBtYW5pZmVzdExvYWRpbmdSZXRyeURlbGF5OiAxZTMsXG4gIG1hbmlmZXN0TG9hZGluZ01heFJldHJ5VGltZW91dDogNjRlMyxcbiAgbGV2ZWxMb2FkaW5nVGltZU91dDogMWU0LFxuICBsZXZlbExvYWRpbmdNYXhSZXRyeTogNCxcbiAgbGV2ZWxMb2FkaW5nUmV0cnlEZWxheTogMWUzLFxuICBsZXZlbExvYWRpbmdNYXhSZXRyeVRpbWVvdXQ6IDY0ZTMsXG4gIGZyYWdMb2FkaW5nVGltZU91dDogMmU0LFxuICBmcmFnTG9hZGluZ01heFJldHJ5OiA2LFxuICBmcmFnTG9hZGluZ1JldHJ5RGVsYXk6IDFlMyxcbiAgZnJhZ0xvYWRpbmdNYXhSZXRyeVRpbWVvdXQ6IDY0ZTNcbn0sIGFBKCkpLCB7fSwge1xuICBzdWJ0aXRsZVN0cmVhbUNvbnRyb2xsZXI6IFN3LFxuICBzdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjogaHcsXG4gIHRpbWVsaW5lQ29udHJvbGxlcjogV3csXG4gIGF1ZGlvU3RyZWFtQ29udHJvbGxlcjogbjIsXG4gIGF1ZGlvVHJhY2tDb250cm9sbGVyOiBpMixcbiAgZW1lQ29udHJvbGxlcjogX24sXG4gIGNtY2RDb250cm9sbGVyOiBpdyxcbiAgY29udGVudFN0ZWVyaW5nQ29udHJvbGxlcjogYXcsXG4gIGludGVyc3RpdGlhbHNDb250cm9sbGVyOiB4d1xufSk7XG5mdW5jdGlvbiBhQSgpIHtcbiAgcmV0dXJuIHtcbiAgICBjdWVIYW5kbGVyOiBadyxcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBlbmFibGVXZWJWVFQ6ICEwLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGVuYWJsZUlNU0MxOiAhMCxcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBlbmFibGVDRUE3MDhDYXB0aW9uczogITAsXG4gICAgLy8gdXNlZCBieSB0aW1lbGluZS1jb250cm9sbGVyXG4gICAgY2FwdGlvbnNUZXh0VHJhY2sxTGFiZWw6IFwiRW5nbGlzaFwiLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGNhcHRpb25zVGV4dFRyYWNrMUxhbmd1YWdlQ29kZTogXCJlblwiLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGNhcHRpb25zVGV4dFRyYWNrMkxhYmVsOiBcIlNwYW5pc2hcIixcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBjYXB0aW9uc1RleHRUcmFjazJMYW5ndWFnZUNvZGU6IFwiZXNcIixcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBjYXB0aW9uc1RleHRUcmFjazNMYWJlbDogXCJVbmtub3duIENDXCIsXG4gICAgLy8gdXNlZCBieSB0aW1lbGluZS1jb250cm9sbGVyXG4gICAgY2FwdGlvbnNUZXh0VHJhY2szTGFuZ3VhZ2VDb2RlOiBcIlwiLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGNhcHRpb25zVGV4dFRyYWNrNExhYmVsOiBcIlVua25vd24gQ0NcIixcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBjYXB0aW9uc1RleHRUcmFjazRMYW5ndWFnZUNvZGU6IFwiXCIsXG4gICAgLy8gdXNlZCBieSB0aW1lbGluZS1jb250cm9sbGVyXG4gICAgcmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5OiAhMFxuICB9O1xufVxuZnVuY3Rpb24gbEEocywgZSwgdCkge1xuICBpZiAoKGUubGl2ZVN5bmNEdXJhdGlvbkNvdW50IHx8IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50KSAmJiAoZS5saXZlU3luY0R1cmF0aW9uIHx8IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbikpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBobHMuanMgY29uZmlnOiBkb24ndCBtaXggdXAgbGl2ZVN5bmNEdXJhdGlvbkNvdW50L2xpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCBhbmQgbGl2ZVN5bmNEdXJhdGlvbi9saXZlTWF4TGF0ZW5jeUR1cmF0aW9uXCIpO1xuICBpZiAoZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uQ291bnQgIT09IHZvaWQgMCAmJiAoZS5saXZlU3luY0R1cmF0aW9uQ291bnQgPT09IHZvaWQgMCB8fCBlLmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCA8PSBlLmxpdmVTeW5jRHVyYXRpb25Db3VudCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGhscy5qcyBjb25maWc6IFwibGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50XCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gXCJsaXZlU3luY0R1cmF0aW9uQ291bnRcIicpO1xuICBpZiAoZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uICE9PSB2b2lkIDAgJiYgKGUubGl2ZVN5bmNEdXJhdGlvbiA9PT0gdm9pZCAwIHx8IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbiA8PSBlLmxpdmVTeW5jRHVyYXRpb24pKVxuICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBobHMuanMgY29uZmlnOiBcImxpdmVNYXhMYXRlbmN5RHVyYXRpb25cIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBcImxpdmVTeW5jRHVyYXRpb25cIicpO1xuICBjb25zdCByID0gVGMocyksIG4gPSBbXCJtYW5pZmVzdFwiLCBcImxldmVsXCIsIFwiZnJhZ1wiXSwgaSA9IFtcIlRpbWVPdXRcIiwgXCJNYXhSZXRyeVwiLCBcIlJldHJ5RGVsYXlcIiwgXCJNYXhSZXRyeVRpbWVvdXRcIl07XG4gIHJldHVybiBuLmZvckVhY2goKG8pID0+IHtcbiAgICBjb25zdCBhID0gYCR7byA9PT0gXCJsZXZlbFwiID8gXCJwbGF5bGlzdFwiIDogb31Mb2FkUG9saWN5YCwgbCA9IGVbYV0gPT09IHZvaWQgMCwgYyA9IFtdO1xuICAgIGkuZm9yRWFjaCgodSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGAke299TG9hZGluZyR7dX1gLCBoID0gZVtkXTtcbiAgICAgIGlmIChoICE9PSB2b2lkIDAgJiYgbCkge1xuICAgICAgICBjLnB1c2goZCk7XG4gICAgICAgIGNvbnN0IGYgPSByW2FdLmRlZmF1bHQ7XG4gICAgICAgIHN3aXRjaCAoZVthXSA9IHtcbiAgICAgICAgICBkZWZhdWx0OiBmXG4gICAgICAgIH0sIHUpIHtcbiAgICAgICAgICBjYXNlIFwiVGltZU91dFwiOlxuICAgICAgICAgICAgZi5tYXhMb2FkVGltZU1zID0gaCwgZi5tYXhUaW1lVG9GaXJzdEJ5dGVNcyA9IGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTWF4UmV0cnlcIjpcbiAgICAgICAgICAgIGYuZXJyb3JSZXRyeS5tYXhOdW1SZXRyeSA9IGgsIGYudGltZW91dFJldHJ5Lm1heE51bVJldHJ5ID0gaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJSZXRyeURlbGF5XCI6XG4gICAgICAgICAgICBmLmVycm9yUmV0cnkucmV0cnlEZWxheU1zID0gaCwgZi50aW1lb3V0UmV0cnkucmV0cnlEZWxheU1zID0gaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJNYXhSZXRyeVRpbWVvdXRcIjpcbiAgICAgICAgICAgIGYuZXJyb3JSZXRyeS5tYXhSZXRyeURlbGF5TXMgPSBoLCBmLnRpbWVvdXRSZXRyeS5tYXhSZXRyeURlbGF5TXMgPSBoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSwgYy5sZW5ndGggJiYgdC53YXJuKGBobHMuanMgY29uZmlnOiBcIiR7Yy5qb2luKCdcIiwgXCInKX1cIiBzZXR0aW5nKHMpIGFyZSBkZXByZWNhdGVkLCB1c2UgXCIke2F9XCI6ICR7YXQoZVthXSl9YCk7XG4gIH0pLCB0dCh0dCh7fSwgciksIGUpO1xufVxuZnVuY3Rpb24gVGMocykge1xuICByZXR1cm4gcyAmJiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiID8gQXJyYXkuaXNBcnJheShzKSA/IHMubWFwKFRjKSA6IE9iamVjdC5rZXlzKHMpLnJlZHVjZSgoZSwgdCkgPT4gKGVbdF0gPSBUYyhzW3RdKSwgZSksIHt9KSA6IHM7XG59XG5mdW5jdGlvbiBjQShzLCBlKSB7XG4gIGNvbnN0IHQgPSBzLmxvYWRlcjtcbiAgdCAhPT0gbGYgJiYgdCAhPT0gWnAgPyAoZS5sb2coXCJbY29uZmlnXTogQ3VzdG9tIGxvYWRlciBkZXRlY3RlZCwgY2Fubm90IGVuYWJsZSBwcm9ncmVzc2l2ZSBzdHJlYW1pbmdcIiksIHMucHJvZ3Jlc3NpdmUgPSAhMSkgOiBYdygpICYmIChzLmxvYWRlciA9IGxmLCBzLnByb2dyZXNzaXZlID0gITAsIHMuZW5hYmxlU29mdHdhcmVBRVMgPSAhMCwgZS5sb2coXCJbY29uZmlnXTogUHJvZ3Jlc3NpdmUgc3RyZWFtaW5nIGVuYWJsZWQsIHVzaW5nIEZldGNoTG9hZGVyXCIpKTtcbn1cbmNvbnN0IHhvID0gMiwgdUEgPSAwLjEsIGRBID0gMC4wNSwgaEEgPSAxMDA7XG5jbGFzcyBmQSBleHRlbmRzIEhnIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHN1cGVyKFwiZ2FwLWNvbnRyb2xsZXJcIiwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5mcmFnbWVudFRyYWNrZXIgPSB2b2lkIDAsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLm1lZGlhU291cmNlID0gdm9pZCAwLCB0aGlzLm51ZGdlUmV0cnkgPSAwLCB0aGlzLnN0YWxsUmVwb3J0ZWQgPSAhMSwgdGhpcy5zdGFsbGVkID0gbnVsbCwgdGhpcy5tb3ZlZCA9ICExLCB0aGlzLnNlZWtpbmcgPSAhMSwgdGhpcy5idWZmZXJlZCA9IHt9LCB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDAsIHRoaXMuZW5kZWQgPSAwLCB0aGlzLndhaXRpbmcgPSAwLCB0aGlzLm9uTWVkaWFQbGF5aW5nID0gKCkgPT4ge1xuICAgICAgdGhpcy5lbmRlZCA9IDAsIHRoaXMud2FpdGluZyA9IDA7XG4gICAgfSwgdGhpcy5vbk1lZGlhV2FpdGluZyA9ICgpID0+IHtcbiAgICAgIHZhciByO1xuICAgICAgKHIgPSB0aGlzLm1lZGlhKSAhPSBudWxsICYmIHIuc2Vla2luZyB8fCAodGhpcy53YWl0aW5nID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgdGhpcy50aWNrKCkpO1xuICAgIH0sIHRoaXMub25NZWRpYUVuZGVkID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGxzKSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICB0aGlzLmVuZGVkID0gKChyID0gdGhpcy5tZWRpYSkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuY3VycmVudFRpbWUpIHx8IDEsIHRoaXMuaGxzLnRyaWdnZXIoSS5NRURJQV9FTkRFRCwge1xuICAgICAgICAgIHN0YWxsZWQ6ICExXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHRoaXMuaGxzID0gZSwgdGhpcy5mcmFnbWVudFRyYWNrZXIgPSB0LCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcykpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5vZmYoSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpLCB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5tZWRpYSA9IHRoaXMuaGxzID0gdGhpcy5mcmFnbWVudFRyYWNrZXIgPSBudWxsLCB0aGlzLm1lZGlhU291cmNlID0gdm9pZCAwO1xuICB9XG4gIG9uTWVkaWFBdHRhY2hlZChlLCB0KSB7XG4gICAgdGhpcy5zZXRJbnRlcnZhbChoQSksIHRoaXMubWVkaWFTb3VyY2UgPSB0Lm1lZGlhU291cmNlO1xuICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhID0gdC5tZWRpYTtcbiAgICBjcihyLCBcInBsYXlpbmdcIiwgdGhpcy5vbk1lZGlhUGxheWluZyksIGNyKHIsIFwid2FpdGluZ1wiLCB0aGlzLm9uTWVkaWFXYWl0aW5nKSwgY3IociwgXCJlbmRlZFwiLCB0aGlzLm9uTWVkaWFFbmRlZCk7XG4gIH1cbiAgb25NZWRpYURldGFjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5jbGVhckludGVydmFsKCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IHJcbiAgICB9ID0gdGhpcztcbiAgICByICYmIChwcihyLCBcInBsYXlpbmdcIiwgdGhpcy5vbk1lZGlhUGxheWluZyksIHByKHIsIFwid2FpdGluZ1wiLCB0aGlzLm9uTWVkaWFXYWl0aW5nKSwgcHIociwgXCJlbmRlZFwiLCB0aGlzLm9uTWVkaWFFbmRlZCksIHRoaXMubWVkaWEgPSBudWxsKSwgdGhpcy5tZWRpYVNvdXJjZSA9IHZvaWQgMDtcbiAgfVxuICBvbkJ1ZmZlckFwcGVuZGVkKGUsIHQpIHtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gdC50aW1lUmFuZ2VzO1xuICB9XG4gIGdldCBoYXNCdWZmZXJlZCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5idWZmZXJlZCkubGVuZ3RoID4gMDtcbiAgfVxuICB0aWNrKCkge1xuICAgIHZhciBlO1xuICAgIGlmICghKChlID0gdGhpcy5tZWRpYSkgIT0gbnVsbCAmJiBlLnJlYWR5U3RhdGUpIHx8ICF0aGlzLmhhc0J1ZmZlcmVkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHQgPSB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lO1xuICAgIHRoaXMucG9sbCh0LCB0aGlzLmxhc3RDdXJyZW50VGltZSksIHRoaXMubGFzdEN1cnJlbnRUaW1lID0gdDtcbiAgfVxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBwbGF5aGVhZCBpcyBzdHVjayB3aXRoaW4gYSBnYXAsIGFuZCBpZiBzbywgYXR0ZW1wdHMgdG8gZnJlZSBpdC5cbiAgICogQSBnYXAgaXMgYW4gdW5idWZmZXJlZCByYW5nZSBiZXR3ZWVuIHR3byBidWZmZXJlZCByYW5nZXMgKG9yIHRoZSBzdGFydCBhbmQgdGhlIGZpcnN0IGJ1ZmZlcmVkIHJhbmdlKS5cbiAgICpcbiAgICogQHBhcmFtIGxhc3RDdXJyZW50VGltZSAtIFByZXZpb3VzbHkgcmVhZCBwbGF5aGVhZCBwb3NpdGlvblxuICAgKi9cbiAgcG9sbChlLCB0KSB7XG4gICAgdmFyIHIsIG47XG4gICAgY29uc3QgaSA9IChyID0gdGhpcy5obHMpID09IG51bGwgPyB2b2lkIDAgOiByLmNvbmZpZztcbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IHRoaXMubWVkaWE7XG4gICAgaWYgKCFvKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlZWtpbmc6IGFcbiAgICB9ID0gbywgbCA9IHRoaXMuc2Vla2luZyAmJiAhYSwgYyA9ICF0aGlzLnNlZWtpbmcgJiYgYSwgdSA9IG8ucGF1c2VkICYmICFhIHx8IG8uZW5kZWQgfHwgby5wbGF5YmFja1JhdGUgPT09IDA7XG4gICAgaWYgKHRoaXMuc2Vla2luZyA9IGEsIGUgIT09IHQpIHtcbiAgICAgIHQgJiYgKHRoaXMuZW5kZWQgPSAwKSwgdGhpcy5tb3ZlZCA9ICEwLCBhIHx8ICh0aGlzLm51ZGdlUmV0cnkgPSAwLCBpLm51ZGdlT25WaWRlb0hvbGUgJiYgIXUgJiYgZSA+IHQgJiYgdGhpcy5udWRnZU9uVmlkZW9Ib2xlKGUsIHQpKSwgdGhpcy53YWl0aW5nID09PSAwICYmIHRoaXMuc3RhbGxSZXNvbHZlZChlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGMgfHwgbCkge1xuICAgICAgbCAmJiB0aGlzLnN0YWxsUmVzb2x2ZWQoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1KSB7XG4gICAgICB0aGlzLm51ZGdlUmV0cnkgPSAwLCB0aGlzLnN0YWxsUmVzb2x2ZWQoZSksICF0aGlzLmVuZGVkICYmIG8uZW5kZWQgJiYgdGhpcy5obHMgJiYgKHRoaXMuZW5kZWQgPSBlIHx8IDEsIHRoaXMuaGxzLnRyaWdnZXIoSS5NRURJQV9FTkRFRCwge1xuICAgICAgICBzdGFsbGVkOiAhMVxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIUNlLmdldEJ1ZmZlcmVkKG8pLmxlbmd0aCkge1xuICAgICAgdGhpcy5udWRnZVJldHJ5ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IENlLmJ1ZmZlckluZm8obywgZSwgMCksIGggPSBkLm5leHRTdGFydCB8fCAwLCBmID0gdGhpcy5mcmFnbWVudFRyYWNrZXI7XG4gICAgaWYgKGEgJiYgZiAmJiB0aGlzLmhscykge1xuICAgICAgY29uc3QgSCA9IGNmKHRoaXMuaGxzLmluRmxpZ2h0RnJhZ21lbnRzLCBlKSwgSyA9IGQubGVuID4geG8sIGogPSAhaCB8fCBIIHx8IGggLSBlID4geG8gJiYgIWYuZ2V0UGFydGlhbEZyYWdtZW50KGUpO1xuICAgICAgaWYgKEsgfHwgailcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5tb3ZlZCA9ICExO1xuICAgIH1cbiAgICBjb25zdCBwID0gKG4gPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IG4ubGF0ZXN0TGV2ZWxEZXRhaWxzO1xuICAgIGlmICghdGhpcy5tb3ZlZCAmJiB0aGlzLnN0YWxsZWQgIT09IG51bGwgJiYgZikge1xuICAgICAgaWYgKCEoZC5sZW4gPiAwKSAmJiAhaClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgSyA9IE1hdGgubWF4KGgsIGQuc3RhcnQgfHwgMCkgLSBlLCBDID0gISEocCAhPSBudWxsICYmIHAubGl2ZSkgPyBwLnRhcmdldGR1cmF0aW9uICogMiA6IHhvLCBrID0gc28oZSwgZik7XG4gICAgICBpZiAoSyA+IDAgJiYgKEsgPD0gQyB8fCBrKSkge1xuICAgICAgICBvLnBhdXNlZCB8fCB0aGlzLl90cnlTa2lwQnVmZmVySG9sZShrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB5ID0gaS5kZXRlY3RTdGFsbFdpdGhDdXJyZW50VGltZU1zLCBFID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgYiA9IHRoaXMud2FpdGluZztcbiAgICBsZXQgUiA9IHRoaXMuc3RhbGxlZDtcbiAgICBpZiAoUiA9PT0gbnVsbClcbiAgICAgIGlmIChiID4gMCAmJiBFIC0gYiA8IHkpXG4gICAgICAgIFIgPSB0aGlzLnN0YWxsZWQgPSBiO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhbGxlZCA9IEU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjb25zdCBBID0gRSAtIFI7XG4gICAgaWYgKCFhICYmIChBID49IHkgfHwgYikgJiYgdGhpcy5obHMpIHtcbiAgICAgIHZhciBGO1xuICAgICAgaWYgKCgoRiA9IHRoaXMubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiBGLnJlYWR5U3RhdGUpID09PSBcImVuZGVkXCIgJiYgIShwICE9IG51bGwgJiYgcC5saXZlKSAmJiBNYXRoLmFicyhlIC0gKChwID09IG51bGwgPyB2b2lkIDAgOiBwLmVkZ2UpIHx8IDApKSA8IDEpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5kZWQpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVuZGVkID0gZSB8fCAxLCB0aGlzLmhscy50cmlnZ2VyKEkuTUVESUFfRU5ERUQsIHtcbiAgICAgICAgICBzdGFsbGVkOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3JlcG9ydFN0YWxsKGQpLCAhdGhpcy5tZWRpYSB8fCAhdGhpcy5obHMpXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgTSA9IENlLmJ1ZmZlckluZm8obywgZSwgaS5tYXhCdWZmZXJIb2xlKTtcbiAgICB0aGlzLl90cnlGaXhCdWZmZXJTdGFsbChNLCBBLCBlKTtcbiAgfVxuICBzdGFsbFJlc29sdmVkKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdGFsbGVkO1xuICAgIGlmICh0ICYmIHRoaXMuaGxzICYmICh0aGlzLnN0YWxsZWQgPSBudWxsLCB0aGlzLnN0YWxsUmVwb3J0ZWQpKSB7XG4gICAgICBjb25zdCByID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSAtIHQ7XG4gICAgICB0aGlzLmxvZyhgcGxheWJhY2sgbm90IHN0dWNrIGFueW1vcmUgQCR7ZX0sIGFmdGVyICR7TWF0aC5yb3VuZChyKX1tc2ApLCB0aGlzLnN0YWxsUmVwb3J0ZWQgPSAhMSwgdGhpcy53YWl0aW5nID0gMCwgdGhpcy5obHMudHJpZ2dlcihJLlNUQUxMX1JFU09MVkVELCB7fSk7XG4gICAgfVxuICB9XG4gIG51ZGdlT25WaWRlb0hvbGUoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IG4gPSB0aGlzLmJ1ZmZlcmVkLnZpZGVvO1xuICAgIGlmICh0aGlzLmhscyAmJiB0aGlzLm1lZGlhICYmIHRoaXMuZnJhZ21lbnRUcmFja2VyICYmIChyID0gdGhpcy5idWZmZXJlZC5hdWRpbykgIT0gbnVsbCAmJiByLmxlbmd0aCAmJiBuICYmIG4ubGVuZ3RoID4gMSAmJiBlID4gbi5lbmQoMCkpIHtcbiAgICAgIGNvbnN0IGkgPSBDZS5idWZmZXJlZEluZm8oQ2UudGltZVJhbmdlc1RvQXJyYXkodGhpcy5idWZmZXJlZC5hdWRpbyksIGUsIDApO1xuICAgICAgaWYgKGkubGVuID4gMSAmJiB0ID49IGkuc3RhcnQpIHtcbiAgICAgICAgY29uc3QgbyA9IENlLnRpbWVSYW5nZXNUb0FycmF5KG4pLCBhID0gQ2UuYnVmZmVyZWRJbmZvKG8sIHQsIDApLmJ1ZmZlcmVkSW5kZXg7XG4gICAgICAgIGlmIChhID4gLTEgJiYgYSA8IG8ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGNvbnN0IGwgPSBDZS5idWZmZXJlZEluZm8obywgZSwgMCkuYnVmZmVyZWRJbmRleCwgYyA9IG9bYV0uZW5kLCB1ID0gb1thICsgMV0uc3RhcnQ7XG4gICAgICAgICAgaWYgKChsID09PSAtMSB8fCBsID4gYSkgJiYgdSAtIGMgPCAxICYmIC8vIGBtYXhCdWZmZXJIb2xlYCBtYXkgYmUgdG9vIHNtYWxsIGFuZCBzZXR0aW5nIGl0IHRvIDAgc2hvdWxkIG5vdCBkaXNhYmxlIHRoaXMgZmVhdHVyZVxuICAgICAgICAgIGUgLSBjIDwgMikge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBFcnJvcihgbnVkZ2luZyBwbGF5aGVhZCB0byBmbHVzaCBwaXBlbGluZSBhZnRlciB2aWRlbyBob2xlLiBjdXJyZW50VGltZTogJHtlfSBob2xlOiAke2N9IC0+ICR7dX0gYnVmZmVyZWQgaW5kZXg6ICR7bH1gKTtcbiAgICAgICAgICAgIHRoaXMud2FybihkLm1lc3NhZ2UpLCB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lICs9IDFlLTY7XG4gICAgICAgICAgICBsZXQgaCA9IHNvKGUsIHRoaXMuZnJhZ21lbnRUcmFja2VyKTtcbiAgICAgICAgICAgIGggJiYgXCJmcmFnbWVudFwiIGluIGggPyBoID0gaC5mcmFnbWVudCA6IGggfHwgKGggPSB2b2lkIDApO1xuICAgICAgICAgICAgY29uc3QgZiA9IENlLmJ1ZmZlckluZm8odGhpcy5tZWRpYSwgZSwgMCk7XG4gICAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgICAgICAgICAgIGRldGFpbHM6IEouQlVGRkVSX1NFRUtfT1ZFUl9IT0xFLFxuICAgICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICAgIGVycm9yOiBkLFxuICAgICAgICAgICAgICByZWFzb246IGQubWVzc2FnZSxcbiAgICAgICAgICAgICAgZnJhZzogaCxcbiAgICAgICAgICAgICAgYnVmZmVyOiBmLmxlbixcbiAgICAgICAgICAgICAgYnVmZmVySW5mbzogZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBEZXRlY3RzIGFuZCBhdHRlbXB0cyB0byBmaXgga25vd24gYnVmZmVyIHN0YWxsaW5nIGlzc3Vlcy5cbiAgICogQHBhcmFtIGJ1ZmZlckluZm8gLSBUaGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBidWZmZXIuXG4gICAqIEBwYXJhbSBzdGFsbGVkRHVyYXRpb25NcyAtIFRoZSBhbW91bnQgb2YgdGltZSBIbHMuanMgaGFzIGJlZW4gc3RhbGxpbmcgZm9yLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeUZpeEJ1ZmZlclN0YWxsKGUsIHQsIHIpIHtcbiAgICB2YXIgbiwgaTtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudFRyYWNrZXI6IG8sXG4gICAgICBtZWRpYTogYVxuICAgIH0gPSB0aGlzLCBsID0gKG4gPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IG4uY29uZmlnO1xuICAgIGlmICghYSB8fCAhbyB8fCAhbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjID0gKGkgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IGkubGF0ZXN0TGV2ZWxEZXRhaWxzLCB1ID0gc28ociwgbyk7XG4gICAgaWYgKCh1IHx8IGMgIT0gbnVsbCAmJiBjLmxpdmUgJiYgciA8IGMuZnJhZ21lbnRTdGFydCkgJiYgKHRoaXMuX3RyeVNraXBCdWZmZXJIb2xlKHUpIHx8ICF0aGlzLm1lZGlhKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBkID0gZS5idWZmZXJlZCwgaCA9IHRoaXMuYWRqYWNlbnRUcmF2ZXJzYWwoZSwgcik7XG4gICAgKGQgJiYgZC5sZW5ndGggPiAxICYmIGUubGVuID4gbC5tYXhCdWZmZXJIb2xlIHx8IGUubmV4dFN0YXJ0ICYmIChlLm5leHRTdGFydCAtIHIgPCBsLm1heEJ1ZmZlckhvbGUgfHwgaCkpICYmICh0ID4gbC5oaWdoQnVmZmVyV2F0Y2hkb2dQZXJpb2QgKiAxZTMgfHwgdGhpcy53YWl0aW5nKSAmJiAodGhpcy53YXJuKFwiVHJ5aW5nIHRvIG51ZGdlIHBsYXloZWFkIG92ZXIgYnVmZmVyLWhvbGVcIiksIHRoaXMuX3RyeU51ZGdlQnVmZmVyKGUpKTtcbiAgfVxuICBhZGphY2VudFRyYXZlcnNhbChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuZnJhZ21lbnRUcmFja2VyLCBuID0gZS5uZXh0U3RhcnQ7XG4gICAgaWYgKHIgJiYgbikge1xuICAgICAgY29uc3QgaSA9IHIuZ2V0RnJhZ0F0UG9zKHQsIHBlLk1BSU4pLCBvID0gci5nZXRGcmFnQXRQb3MobiwgcGUuTUFJTik7XG4gICAgICBpZiAoaSAmJiBvKVxuICAgICAgICByZXR1cm4gby5zbiAtIGkuc24gPCAyO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgQlVGRkVSX1NUQUxMRURfRVJST1IgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgcGVyIHN0YWxsIHBlcmlvZC5cbiAgICogQHBhcmFtIGJ1ZmZlckxlbiAtIFRoZSBwbGF5aGVhZCBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIHNlZ21lbnQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVwb3J0U3RhbGwoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogdCxcbiAgICAgIG1lZGlhOiByLFxuICAgICAgc3RhbGxSZXBvcnRlZDogbixcbiAgICAgIHN0YWxsZWQ6IGlcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIW4gJiYgaSAhPT0gbnVsbCAmJiByICYmIHQpIHtcbiAgICAgIHRoaXMuc3RhbGxSZXBvcnRlZCA9ICEwO1xuICAgICAgY29uc3QgbyA9IG5ldyBFcnJvcihgUGxheWJhY2sgc3RhbGxpbmcgYXQgQCR7ci5jdXJyZW50VGltZX0gZHVlIHRvIGxvdyBidWZmZXIgKCR7YXQoZSl9KWApO1xuICAgICAgdGhpcy53YXJuKG8ubWVzc2FnZSksIHQudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLkJVRkZFUl9TVEFMTEVEX0VSUk9SLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGVycm9yOiBvLFxuICAgICAgICBidWZmZXI6IGUubGVuLFxuICAgICAgICBidWZmZXJJbmZvOiBlLFxuICAgICAgICBzdGFsbGVkOiB7XG4gICAgICAgICAgc3RhcnQ6IGlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBmaXggYnVmZmVyIHN0YWxscyBieSBqdW1waW5nIG92ZXIga25vd24gZ2FwcyBjYXVzZWQgYnkgcGFydGlhbCBmcmFnbWVudHNcbiAgICogQHBhcmFtIGFwcGVuZGVkIC0gVGhlIGZyYWdtZW50IG9yIHBhcnQgZm91bmQgYXQgdGhlIGN1cnJlbnQgdGltZSAod2hlcmUgcGxheWJhY2sgaXMgc3RhbGxpbmcpLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeVNraXBCdWZmZXJIb2xlKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudFRyYWNrZXI6IHIsXG4gICAgICBtZWRpYTogblxuICAgIH0gPSB0aGlzLCBpID0gKHQgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IHQuY29uZmlnO1xuICAgIGlmICghbiB8fCAhciB8fCAhaSlcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IG8gPSBuLmN1cnJlbnRUaW1lLCBhID0gQ2UuYnVmZmVySW5mbyhuLCBvLCAwKSwgbCA9IG8gPCBhLnN0YXJ0ID8gYS5zdGFydCA6IGEubmV4dFN0YXJ0O1xuICAgIGlmIChsICYmIHRoaXMuaGxzKSB7XG4gICAgICBjb25zdCB1ID0gYS5sZW4gPD0gaS5tYXhCdWZmZXJIb2xlLCBkID0gYS5sZW4gPiAwICYmIGEubGVuIDwgMSAmJiBuLnJlYWR5U3RhdGUgPCAzLCBoID0gbCAtIG87XG4gICAgICBpZiAoaCA+IDAgJiYgKHUgfHwgZCkpIHtcbiAgICAgICAgaWYgKGggPiBpLm1heEJ1ZmZlckhvbGUpIHtcbiAgICAgICAgICBsZXQgcCA9ICExO1xuICAgICAgICAgIGlmIChvID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gci5nZXRBcHBlbmRlZEZyYWcoMCwgcGUuTUFJTik7XG4gICAgICAgICAgICB5ICYmIGwgPCB5LmVuZCAmJiAocCA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwICYmIGUpIHtcbiAgICAgICAgICAgIHZhciBjO1xuICAgICAgICAgICAgaWYgKCEoKGMgPSB0aGlzLmhscy5sb2FkTGV2ZWxPYmopICE9IG51bGwgJiYgYy5kZXRhaWxzKSB8fCBjZih0aGlzLmhscy5pbkZsaWdodEZyYWdtZW50cywgbCkpXG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgbGV0IEUgPSAhMSwgYiA9IGUuZW5kO1xuICAgICAgICAgICAgZm9yICg7IGIgPCBsOyApIHtcbiAgICAgICAgICAgICAgY29uc3QgUiA9IHNvKGIsIHIpO1xuICAgICAgICAgICAgICBpZiAoUilcbiAgICAgICAgICAgICAgICBiICs9IFIuZHVyYXRpb247XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIEUgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEUpXG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmID0gTWF0aC5tYXgobCArIGRBLCBvICsgdUEpO1xuICAgICAgICBpZiAodGhpcy53YXJuKGBza2lwcGluZyBob2xlLCBhZGp1c3RpbmcgY3VycmVudFRpbWUgZnJvbSAke299IHRvICR7Zn1gKSwgdGhpcy5tb3ZlZCA9ICEwLCBuLmN1cnJlbnRUaW1lID0gZiwgIShlICE9IG51bGwgJiYgZS5nYXApKSB7XG4gICAgICAgICAgY29uc3QgcCA9IG5ldyBFcnJvcihgZnJhZ21lbnQgbG9hZGVkIHdpdGggYnVmZmVyIGhvbGVzLCBzZWVraW5nIGZyb20gJHtvfSB0byAke2Z9YCksIHkgPSB7XG4gICAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICAgIGRldGFpbHM6IEouQlVGRkVSX1NFRUtfT1ZFUl9IT0xFLFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZXJyb3I6IHAsXG4gICAgICAgICAgICByZWFzb246IHAubWVzc2FnZSxcbiAgICAgICAgICAgIGJ1ZmZlcjogYS5sZW4sXG4gICAgICAgICAgICBidWZmZXJJbmZvOiBhXG4gICAgICAgICAgfTtcbiAgICAgICAgICBlICYmIChcImZyYWdtZW50XCIgaW4gZSA/IHkucGFydCA9IGUgOiB5LmZyYWcgPSBlKSwgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGZpeCBidWZmZXIgc3RhbGxzIGJ5IGFkdmFuY2luZyB0aGUgbWVkaWFFbGVtZW50J3MgY3VycmVudCB0aW1lIGJ5IGEgc21hbGwgYW1vdW50LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeU51ZGdlQnVmZmVyKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IHQsXG4gICAgICBtZWRpYTogcixcbiAgICAgIG51ZGdlUmV0cnk6IG5cbiAgICB9ID0gdGhpcywgaSA9IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuY29uZmlnO1xuICAgIGlmICghciB8fCAhaSlcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IG8gPSByLmN1cnJlbnRUaW1lO1xuICAgIGlmICh0aGlzLm51ZGdlUmV0cnkrKywgbiA8IGkubnVkZ2VNYXhSZXRyeSkge1xuICAgICAgY29uc3QgYSA9IG8gKyAobiArIDEpICogaS5udWRnZU9mZnNldCwgbCA9IG5ldyBFcnJvcihgTnVkZ2luZyAnY3VycmVudFRpbWUnIGZyb20gJHtvfSB0byAke2F9YCk7XG4gICAgICB0aGlzLndhcm4obC5tZXNzYWdlKSwgci5jdXJyZW50VGltZSA9IGEsIHQudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLkJVRkZFUl9OVURHRV9PTl9TVEFMTCxcbiAgICAgICAgZXJyb3I6IGwsXG4gICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgYnVmZmVyOiBlLmxlbixcbiAgICAgICAgYnVmZmVySW5mbzogZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSBuZXcgRXJyb3IoYFBsYXloZWFkIHN0aWxsIG5vdCBtb3Zpbmcgd2hpbGUgZW5vdWdoIGRhdGEgYnVmZmVyZWQgQCR7b30gYWZ0ZXIgJHtpLm51ZGdlTWF4UmV0cnl9IG51ZGdlc2ApO1xuICAgICAgdGhpcy5lcnJvcihhLm1lc3NhZ2UpLCB0LnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfU1RBTExFRF9FUlJPUixcbiAgICAgICAgZXJyb3I6IGEsXG4gICAgICAgIGZhdGFsOiAhMCxcbiAgICAgICAgYnVmZmVyOiBlLmxlbixcbiAgICAgICAgYnVmZmVySW5mbzogZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjZihzLCBlKSB7XG4gIGNvbnN0IHQgPSB1ZihzLm1haW4pO1xuICBpZiAodCAmJiB0LnN0YXJ0IDw9IGUpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSB1ZihzLmF1ZGlvKTtcbiAgcmV0dXJuIHIgJiYgci5zdGFydCA8PSBlID8gciA6IG51bGw7XG59XG5mdW5jdGlvbiB1ZihzKSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gbnVsbDtcbiAgc3dpdGNoIChzLnN0YXRlKSB7XG4gICAgY2FzZSBuZS5JRExFOlxuICAgIGNhc2UgbmUuU1RPUFBFRDpcbiAgICBjYXNlIG5lLkVOREVEOlxuICAgIGNhc2UgbmUuRVJST1I6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcy5mcmFnO1xufVxuZnVuY3Rpb24gc28ocywgZSkge1xuICByZXR1cm4gZS5nZXRBcHBlbmRlZEZyYWcocywgcGUuTUFJTikgfHwgZS5nZXRQYXJ0aWFsRnJhZ21lbnQocyk7XG59XG5jb25zdCBnQSA9IDAuMjU7XG5mdW5jdGlvbiB3YygpIHtcbiAgaWYgKCEodHlwZW9mIHNlbGYgPiBcInVcIikpXG4gICAgcmV0dXJuIHNlbGYuVlRUQ3VlIHx8IHNlbGYuVGV4dFRyYWNrQ3VlO1xufVxuZnVuY3Rpb24gQ2wocywgZSwgdCwgciwgbikge1xuICBsZXQgaSA9IG5ldyBzKGUsIHQsIFwiXCIpO1xuICB0cnkge1xuICAgIGkudmFsdWUgPSByLCBuICYmIChpLnR5cGUgPSBuKTtcbiAgfSBjYXRjaCB7XG4gICAgaSA9IG5ldyBzKGUsIHQsIGF0KG4gPyB0dCh7XG4gICAgICB0eXBlOiBuXG4gICAgfSwgcikgOiByKSk7XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5jb25zdCBubyA9ICgoKSA9PiB7XG4gIGNvbnN0IHMgPSB3YygpO1xuICB0cnkge1xuICAgIHMgJiYgbmV3IHMoMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBcIlwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbn0pKCk7XG5jbGFzcyBwQSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5pZDNUcmFjayA9IG51bGwsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLmRhdGVSYW5nZUN1ZXNBcHBlbmRlZCA9IHt9LCB0aGlzLnJlbW92ZUN1ZXMgPSAhMCwgdGhpcy5hc3NldEN1ZSA9IHZvaWQgMCwgdGhpcy5vbkV2ZW50Q3VlRW50ZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmhscyAmJiB0aGlzLmhscy50cmlnZ2VyKEkuRVZFTlRfQ1VFX0VOVEVSLCB7fSk7XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLl9yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLmlkM1RyYWNrID0gbnVsbCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuZGF0ZVJhbmdlQ3Vlc0FwcGVuZGVkID0ge30sIHRoaXMuaGxzID0gdGhpcy5vbkV2ZW50Q3VlRW50ZXIgPSBudWxsO1xuICB9XG4gIF9yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9uKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCBlLm9uKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuRlJBR19QQVJTSU5HX01FVEFEQVRBLCB0aGlzLm9uRnJhZ1BhcnNpbmdNZXRhZGF0YSwgdGhpcyksIGUub24oSS5CVUZGRVJfRkxVU0hJTkcsIHRoaXMub25CdWZmZXJGbHVzaGluZywgdGhpcyksIGUub24oSS5MRVZFTF9VUERBVEVELCB0aGlzLm9uTGV2ZWxVcGRhdGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMX1BUU19VUERBVEVELCB0aGlzLm9uTGV2ZWxQdHNVcGRhdGVkLCB0aGlzKSk7XG4gIH1cbiAgX3VucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5vZmYoSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuRlJBR19QQVJTSU5HX01FVEFEQVRBLCB0aGlzLm9uRnJhZ1BhcnNpbmdNZXRhZGF0YSwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNISU5HLCB0aGlzLm9uQnVmZmVyRmx1c2hpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1BUU19VUERBVEVELCB0aGlzLm9uTGV2ZWxQdHNVcGRhdGVkLCB0aGlzKSk7XG4gIH1cbiAgLy8gQWRkIElEMyBtZXRhdGFkYXRhIHRleHQgdHJhY2suXG4gIG9uTWVkaWFBdHRhY2hpbmcoZSwgdCkge1xuICAgIHZhciByO1xuICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCAoKHIgPSB0Lm92ZXJyaWRlcykgPT0gbnVsbCA/IHZvaWQgMCA6IHIuY3VlUmVtb3ZhbCkgPT09ICExICYmICh0aGlzLnJlbW92ZUN1ZXMgPSAhMSk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGVkKCkge1xuICAgIHZhciBlO1xuICAgIGNvbnN0IHQgPSAoZSA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogZS5sYXRlc3RMZXZlbERldGFpbHM7XG4gICAgdCAmJiB0aGlzLnVwZGF0ZURhdGVSYW5nZUN1ZXModCk7XG4gIH1cbiAgb25NZWRpYURldGFjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5tZWRpYSA9IG51bGwsICF0LnRyYW5zZmVyTWVkaWEgJiYgKHRoaXMuaWQzVHJhY2sgJiYgKHRoaXMucmVtb3ZlQ3VlcyAmJiBTbih0aGlzLmlkM1RyYWNrLCB0aGlzLm9uRXZlbnRDdWVFbnRlciksIHRoaXMuaWQzVHJhY2sgPSBudWxsKSwgdGhpcy5kYXRlUmFuZ2VDdWVzQXBwZW5kZWQgPSB7fSk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5kYXRlUmFuZ2VDdWVzQXBwZW5kZWQgPSB7fTtcbiAgfVxuICBjcmVhdGVUcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuZ2V0SUQzVHJhY2soZS50ZXh0VHJhY2tzKTtcbiAgICByZXR1cm4gdC5tb2RlID0gXCJoaWRkZW5cIiwgdDtcbiAgfVxuICBnZXRJRDNUcmFjayhlKSB7XG4gICAgaWYgKHRoaXMubWVkaWEpIHtcbiAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykge1xuICAgICAgICBjb25zdCByID0gZVt0XTtcbiAgICAgICAgaWYgKHIua2luZCA9PT0gXCJtZXRhZGF0YVwiICYmIHIubGFiZWwgPT09IFwiaWQzXCIpXG4gICAgICAgICAgcmV0dXJuIE5wKHIsIHRoaXMubWVkaWEpLCByO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWVkaWEuYWRkVGV4dFRyYWNrKFwibWV0YWRhdGFcIiwgXCJpZDNcIik7XG4gICAgfVxuICB9XG4gIG9uRnJhZ1BhcnNpbmdNZXRhZGF0YShlLCB0KSB7XG4gICAgaWYgKCF0aGlzLm1lZGlhIHx8ICF0aGlzLmhscylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVFbXNnTWV0YWRhdGFDdWVzOiByLFxuICAgICAgZW5hYmxlSUQzTWV0YWRhdGFDdWVzOiBuXG4gICAgfSA9IHRoaXMuaGxzLmNvbmZpZztcbiAgICBpZiAoIXIgJiYgIW4pXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgc2FtcGxlczogaVxuICAgIH0gPSB0O1xuICAgIHRoaXMuaWQzVHJhY2sgfHwgKHRoaXMuaWQzVHJhY2sgPSB0aGlzLmNyZWF0ZVRyYWNrKHRoaXMubWVkaWEpKTtcbiAgICBjb25zdCBvID0gd2MoKTtcbiAgICBpZiAobylcbiAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykge1xuICAgICAgICBjb25zdCBsID0gaVthXS50eXBlO1xuICAgICAgICBpZiAobCA9PT0gYnIuZW1zZyAmJiAhciB8fCAhbilcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYyA9IGhwKGlbYV0uZGF0YSksIHUgPSBpW2FdLnB0cztcbiAgICAgICAgbGV0IGQgPSB1ICsgaVthXS5kdXJhdGlvbjtcbiAgICAgICAgZCA+IG5vICYmIChkID0gbm8pLCBkIC0gdSA8PSAwICYmIChkID0gdSArIGdBKTtcbiAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBjLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgY29uc3QgcCA9IGNbZl07XG4gICAgICAgICAgaWYgKCFmcChwKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJZDNDdWVFbmRzKHUsIGwpO1xuICAgICAgICAgICAgY29uc3QgeSA9IENsKG8sIHUsIGQsIHAsIGwpO1xuICAgICAgICAgICAgeSAmJiB0aGlzLmlkM1RyYWNrLmFkZEN1ZSh5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICB1cGRhdGVJZDNDdWVFbmRzKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gKHIgPSB0aGlzLmlkM1RyYWNrKSA9PSBudWxsID8gdm9pZCAwIDogci5jdWVzO1xuICAgIGlmIChuKVxuICAgICAgZm9yIChsZXQgaSA9IG4ubGVuZ3RoOyBpLS07ICkge1xuICAgICAgICBjb25zdCBvID0gbltpXTtcbiAgICAgICAgby50eXBlID09PSB0ICYmIG8uc3RhcnRUaW1lIDwgZSAmJiBvLmVuZFRpbWUgPT09IG5vICYmIChvLmVuZFRpbWUgPSBlKTtcbiAgICAgIH1cbiAgfVxuICBvbkJ1ZmZlckZsdXNoaW5nKGUsIHtcbiAgICBzdGFydE9mZnNldDogdCxcbiAgICBlbmRPZmZzZXQ6IHIsXG4gICAgdHlwZTogblxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgaWQzVHJhY2s6IGksXG4gICAgICBobHM6IG9cbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIW8pXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGVuYWJsZUVtc2dNZXRhZGF0YUN1ZXM6IGEsXG4gICAgICAgIGVuYWJsZUlEM01ldGFkYXRhQ3VlczogbFxuICAgICAgfVxuICAgIH0gPSBvO1xuICAgIGlmIChpICYmIChhIHx8IGwpKSB7XG4gICAgICBsZXQgYztcbiAgICAgIG4gPT09IFwiYXVkaW9cIiA/IGMgPSAodSkgPT4gdS50eXBlID09PSBici5hdWRpb0lkMyAmJiBsIDogbiA9PT0gXCJ2aWRlb1wiID8gYyA9ICh1KSA9PiB1LnR5cGUgPT09IGJyLmVtc2cgJiYgYSA6IGMgPSAodSkgPT4gdS50eXBlID09PSBici5hdWRpb0lkMyAmJiBsIHx8IHUudHlwZSA9PT0gYnIuZW1zZyAmJiBhLCBTYyhpLCB0LCByLCBjKTtcbiAgICB9XG4gIH1cbiAgb25MZXZlbFVwZGF0ZWQoZSwge1xuICAgIGRldGFpbHM6IHRcbiAgfSkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlQ3Vlcyh0LCAhMCk7XG4gIH1cbiAgb25MZXZlbFB0c1VwZGF0ZWQoZSwgdCkge1xuICAgIE1hdGguYWJzKHQuZHJpZnQpID4gMC4wMSAmJiB0aGlzLnVwZGF0ZURhdGVSYW5nZUN1ZXModC5kZXRhaWxzKTtcbiAgfVxuICB1cGRhdGVEYXRlUmFuZ2VDdWVzKGUsIHQpIHtcbiAgICBpZiAoIXRoaXMuaGxzIHx8ICF0aGlzLm1lZGlhKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGFzc2V0UGxheWVySWQ6IHIsXG4gICAgICB0aW1lbGluZU9mZnNldDogbixcbiAgICAgIGVuYWJsZURhdGVSYW5nZU1ldGFkYXRhQ3VlczogaSxcbiAgICAgIGludGVyc3RpdGlhbHNDb250cm9sbGVyOiBvXG4gICAgfSA9IHRoaXMuaGxzLmNvbmZpZztcbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgYSA9IHdjKCk7XG4gICAgaWYgKHIgJiYgbiAmJiAhbykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmcmFnbWVudFN0YXJ0OiB5LFxuICAgICAgICBmcmFnbWVudEVuZDogRVxuICAgICAgfSA9IGU7XG4gICAgICBsZXQgYiA9IHRoaXMuYXNzZXRDdWU7XG4gICAgICBiID8gKGIuc3RhcnRUaW1lID0geSwgYi5lbmRUaW1lID0gRSkgOiBhICYmIChiID0gdGhpcy5hc3NldEN1ZSA9IENsKGEsIHksIEUsIHtcbiAgICAgICAgYXNzZXRQbGF5ZXJJZDogdGhpcy5obHMuY29uZmlnLmFzc2V0UGxheWVySWRcbiAgICAgIH0sIFwiaGxzanMuaW50ZXJzdGl0aWFsLmFzc2V0XCIpLCBiICYmIChiLmlkID0gciwgdGhpcy5pZDNUcmFjayB8fCAodGhpcy5pZDNUcmFjayA9IHRoaXMuY3JlYXRlVHJhY2sodGhpcy5tZWRpYSkpLCB0aGlzLmlkM1RyYWNrLmFkZEN1ZShiKSwgYi5hZGRFdmVudExpc3RlbmVyKFwiZW50ZXJcIiwgdGhpcy5vbkV2ZW50Q3VlRW50ZXIpKSk7XG4gICAgfVxuICAgIGlmICghZS5oYXNQcm9ncmFtRGF0ZVRpbWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgaWQzVHJhY2s6IGxcbiAgICB9ID0gdGhpcywge1xuICAgICAgZGF0ZVJhbmdlczogY1xuICAgIH0gPSBlLCB1ID0gT2JqZWN0LmtleXMoYyk7XG4gICAgbGV0IGQgPSB0aGlzLmRhdGVSYW5nZUN1ZXNBcHBlbmRlZDtcbiAgICBpZiAobCAmJiB0KSB7XG4gICAgICB2YXIgaDtcbiAgICAgIGlmICgoaCA9IGwuY3VlcykgIT0gbnVsbCAmJiBoLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB5ID0gT2JqZWN0LmtleXMoZCkuZmlsdGVyKChFKSA9PiAhdS5pbmNsdWRlcyhFKSk7XG4gICAgICAgIGZvciAobGV0IEUgPSB5Lmxlbmd0aDsgRS0tOyApIHtcbiAgICAgICAgICB2YXIgZjtcbiAgICAgICAgICBjb25zdCBiID0geVtFXSwgUiA9IChmID0gZFtiXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGYuY3VlcztcbiAgICAgICAgICBkZWxldGUgZFtiXSwgUiAmJiBPYmplY3Qua2V5cyhSKS5mb3JFYWNoKChBKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBGID0gUltBXTtcbiAgICAgICAgICAgIGlmIChGKSB7XG4gICAgICAgICAgICAgIEYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVudGVyXCIsIHRoaXMub25FdmVudEN1ZUVudGVyKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsLnJlbW92ZUN1ZShGKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIGQgPSB0aGlzLmRhdGVSYW5nZUN1ZXNBcHBlbmRlZCA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBwID0gZS5mcmFnbWVudHNbZS5mcmFnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKCEodS5sZW5ndGggPT09IDAgfHwgIXVlKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAucHJvZ3JhbURhdGVUaW1lKSkpIHtcbiAgICAgIHRoaXMuaWQzVHJhY2sgfHwgKHRoaXMuaWQzVHJhY2sgPSB0aGlzLmNyZWF0ZVRyYWNrKHRoaXMubWVkaWEpKTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdS5sZW5ndGg7IHkrKykge1xuICAgICAgICBjb25zdCBFID0gdVt5XSwgYiA9IGNbRV0sIFIgPSBiLnN0YXJ0VGltZSwgQSA9IGRbRV0sIEYgPSAoQSA9PSBudWxsID8gdm9pZCAwIDogQS5jdWVzKSB8fCB7fTtcbiAgICAgICAgbGV0IE0gPSAoQSA9PSBudWxsID8gdm9pZCAwIDogQS5kdXJhdGlvbktub3duKSB8fCAhMSwgSCA9IG5vO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZHVyYXRpb246IEssXG4gICAgICAgICAgZW5kRGF0ZTogalxuICAgICAgICB9ID0gYjtcbiAgICAgICAgaWYgKGogJiYgSyAhPT0gbnVsbClcbiAgICAgICAgICBIID0gUiArIEssIE0gPSAhMDtcbiAgICAgICAgZWxzZSBpZiAoYi5lbmRPbk5leHQgJiYgIU0pIHtcbiAgICAgICAgICBjb25zdCBrID0gdS5yZWR1Y2UoKCQsIFcpID0+IHtcbiAgICAgICAgICAgIGlmIChXICE9PSBiLmlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IF8gPSBjW1ddO1xuICAgICAgICAgICAgICBpZiAoXy5jbGFzcyA9PT0gYi5jbGFzcyAmJiBfLnN0YXJ0RGF0ZSA+IGIuc3RhcnREYXRlICYmICghJCB8fCBiLnN0YXJ0RGF0ZSA8ICQuc3RhcnREYXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkO1xuICAgICAgICAgIH0sIG51bGwpO1xuICAgICAgICAgIGsgJiYgKEggPSBrLnN0YXJ0VGltZSwgTSA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDID0gT2JqZWN0LmtleXMoYi5hdHRyKTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBDLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgY29uc3QgJCA9IENba107XG4gICAgICAgICAgaWYgKCFPYigkKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IFcgPSBGWyRdO1xuICAgICAgICAgIGlmIChXKVxuICAgICAgICAgICAgTSAmJiAhKEEgIT0gbnVsbCAmJiBBLmR1cmF0aW9uS25vd24pID8gVy5lbmRUaW1lID0gSCA6IE1hdGguYWJzKFcuc3RhcnRUaW1lIC0gUikgPiAwLjAxICYmIChXLnN0YXJ0VGltZSA9IFIsIFcuZW5kVGltZSA9IEgpO1xuICAgICAgICAgIGVsc2UgaWYgKGEpIHtcbiAgICAgICAgICAgIGxldCBfID0gYi5hdHRyWyRdO1xuICAgICAgICAgICAgQmIoJCkgJiYgKF8gPSBJZyhfKSk7XG4gICAgICAgICAgICBjb25zdCB4ID0gQ2woYSwgUiwgSCwge1xuICAgICAgICAgICAgICBrZXk6ICQsXG4gICAgICAgICAgICAgIGRhdGE6IF9cbiAgICAgICAgICAgIH0sIGJyLmRhdGVSYW5nZSk7XG4gICAgICAgICAgICB4ICYmICh4LmlkID0gRSwgdGhpcy5pZDNUcmFjay5hZGRDdWUoeCksIEZbJF0gPSB4LCBvICYmICgkID09PSBcIlgtQVNTRVQtTElTVFwiIHx8ICQgPT09IFwiWC1BU1NFVC1VUkxcIikgJiYgeC5hZGRFdmVudExpc3RlbmVyKFwiZW50ZXJcIiwgdGhpcy5vbkV2ZW50Q3VlRW50ZXIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZFtFXSA9IHtcbiAgICAgICAgICBjdWVzOiBGLFxuICAgICAgICAgIGRhdGVSYW5nZTogYixcbiAgICAgICAgICBkdXJhdGlvbktub3duOiBNXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyBtQSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLmN1cnJlbnRUaW1lID0gMCwgdGhpcy5zdGFsbENvdW50ID0gMCwgdGhpcy5fbGF0ZW5jeSA9IG51bGwsIHRoaXMuX3RhcmdldExhdGVuY3lVcGRhdGVkID0gITEsIHRoaXMub25UaW1ldXBkYXRlID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtZWRpYTogdFxuICAgICAgfSA9IHRoaXMsIHIgPSB0aGlzLmxldmVsRGV0YWlscztcbiAgICAgIGlmICghdCB8fCAhcilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHQuY3VycmVudFRpbWU7XG4gICAgICBjb25zdCBuID0gdGhpcy5jb21wdXRlTGF0ZW5jeSgpO1xuICAgICAgaWYgKG4gPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMuX2xhdGVuY3kgPSBuO1xuICAgICAgY29uc3Qge1xuICAgICAgICBsb3dMYXRlbmN5TW9kZTogaSxcbiAgICAgICAgbWF4TGl2ZVN5bmNQbGF5YmFja1JhdGU6IG9cbiAgICAgIH0gPSB0aGlzLmNvbmZpZztcbiAgICAgIGlmICghaSB8fCBvID09PSAxIHx8ICFyLmxpdmUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLnRhcmdldExhdGVuY3k7XG4gICAgICBpZiAoYSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbCA9IG4gLSBhLCBjID0gTWF0aC5taW4odGhpcy5tYXhMYXRlbmN5LCBhICsgci50YXJnZXRkdXJhdGlvbik7XG4gICAgICBpZiAobCA8IGMgJiYgbCA+IDAuMDUgJiYgdGhpcy5mb3J3YXJkQnVmZmVyTGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBkID0gTWF0aC5taW4oMiwgTWF0aC5tYXgoMSwgbykpLCBoID0gTWF0aC5yb3VuZCgyIC8gKDEgKyBNYXRoLmV4cCgtMC43NSAqIGwgLSB0aGlzLmVkZ2VTdGFsbGVkKSkgKiAyMCkgLyAyMCwgZiA9IE1hdGgubWluKGQsIE1hdGgubWF4KDEsIGgpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VNZWRpYVBsYXliYWNrUmF0ZSh0LCBmKTtcbiAgICAgIH0gZWxzZSB0LnBsYXliYWNrUmF0ZSAhPT0gMSAmJiB0LnBsYXliYWNrUmF0ZSAhPT0gMCAmJiB0aGlzLmNoYW5nZU1lZGlhUGxheWJhY2tSYXRlKHQsIDEpO1xuICAgIH0sIHRoaXMuaGxzID0gZSwgdGhpcy5jb25maWcgPSBlLmNvbmZpZywgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIGdldCBsZXZlbERldGFpbHMoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuICgoZSA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogZS5sYXRlc3RMZXZlbERldGFpbHMpIHx8IG51bGw7XG4gIH1cbiAgZ2V0IGxhdGVuY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhdGVuY3kgfHwgMDtcbiAgfVxuICBnZXQgbWF4TGF0ZW5jeSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWc6IGVcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uO1xuICAgIGNvbnN0IHQgPSB0aGlzLmxldmVsRGV0YWlscztcbiAgICByZXR1cm4gdCA/IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50ICogdC50YXJnZXRkdXJhdGlvbiA6IDA7XG4gIH1cbiAgZ2V0IHRhcmdldExhdGVuY3koKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIGlmIChlID09PSBudWxsIHx8IHRoaXMuaGxzID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgaG9sZEJhY2s6IHQsXG4gICAgICBwYXJ0SG9sZEJhY2s6IHIsXG4gICAgICB0YXJnZXRkdXJhdGlvbjogblxuICAgIH0gPSBlLCB7XG4gICAgICBsaXZlU3luY0R1cmF0aW9uOiBpLFxuICAgICAgbGl2ZVN5bmNEdXJhdGlvbkNvdW50OiBvLFxuICAgICAgbG93TGF0ZW5jeU1vZGU6IGFcbiAgICB9ID0gdGhpcy5jb25maWcsIGwgPSB0aGlzLmhscy51c2VyQ29uZmlnO1xuICAgIGxldCBjID0gYSAmJiByIHx8IHQ7XG4gICAgKHRoaXMuX3RhcmdldExhdGVuY3lVcGRhdGVkIHx8IGwubGl2ZVN5bmNEdXJhdGlvbiB8fCBsLmxpdmVTeW5jRHVyYXRpb25Db3VudCB8fCBjID09PSAwKSAmJiAoYyA9IGkgIT09IHZvaWQgMCA/IGkgOiBvICogbik7XG4gICAgY29uc3QgdSA9IG47XG4gICAgcmV0dXJuIGMgKyBNYXRoLm1pbih0aGlzLnN0YWxsQ291bnQgKiB0aGlzLmNvbmZpZy5saXZlU3luY09uU3RhbGxJbmNyZWFzZSwgdSk7XG4gIH1cbiAgc2V0IHRhcmdldExhdGVuY3koZSkge1xuICAgIHRoaXMuc3RhbGxDb3VudCA9IDAsIHRoaXMuY29uZmlnLmxpdmVTeW5jRHVyYXRpb24gPSBlLCB0aGlzLl90YXJnZXRMYXRlbmN5VXBkYXRlZCA9ICEwO1xuICB9XG4gIGdldCBsaXZlU3luY1Bvc2l0aW9uKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmVzdGltYXRlTGl2ZUVkZ2UoKSwgdCA9IHRoaXMudGFyZ2V0TGF0ZW5jeTtcbiAgICBpZiAoZSA9PT0gbnVsbCB8fCB0ID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgciA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIGlmIChyID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbiA9IHIuZWRnZSwgaSA9IGUgLSB0IC0gdGhpcy5lZGdlU3RhbGxlZCwgbyA9IG4gLSByLnRvdGFsZHVyYXRpb24sIGEgPSBuIC0gKHRoaXMuY29uZmlnLmxvd0xhdGVuY3lNb2RlICYmIHIucGFydFRhcmdldCB8fCByLnRhcmdldGR1cmF0aW9uKTtcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobywgaSksIGEpO1xuICB9XG4gIGdldCBkcmlmdCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5sZXZlbERldGFpbHM7XG4gICAgcmV0dXJuIGUgPT09IG51bGwgPyAxIDogZS5kcmlmdDtcbiAgfVxuICBnZXQgZWRnZVN0YWxsZWQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIGlmIChlID09PSBudWxsKVxuICAgICAgcmV0dXJuIDA7XG4gICAgY29uc3QgdCA9ICh0aGlzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSAmJiBlLnBhcnRUYXJnZXQgfHwgZS50YXJnZXRkdXJhdGlvbikgKiAzO1xuICAgIHJldHVybiBNYXRoLm1heChlLmFnZSAtIHQsIDApO1xuICB9XG4gIGdldCBmb3J3YXJkQnVmZmVyTGVuZ3RoKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBlXG4gICAgfSA9IHRoaXMsIHQgPSB0aGlzLmxldmVsRGV0YWlscztcbiAgICBpZiAoIWUgfHwgIXQpXG4gICAgICByZXR1cm4gMDtcbiAgICBjb25zdCByID0gZS5idWZmZXJlZC5sZW5ndGg7XG4gICAgcmV0dXJuIChyID8gZS5idWZmZXJlZC5lbmQociAtIDEpIDogdC5lZGdlKSAtIHRoaXMuY3VycmVudFRpbWU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5vbk1lZGlhRGV0YWNoaW5nKCksIHRoaXMuaGxzID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9uKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfVVBEQVRFRCwgdGhpcy5vbkxldmVsVXBkYXRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKSk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9mZihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpLCBlLm9mZihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpKTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCB0aGlzLm1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIHRoaXMub25UaW1ldXBkYXRlKTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKCkge1xuICAgIHRoaXMubWVkaWEgJiYgKHRoaXMubWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRpbWV1cGRhdGVcIiwgdGhpcy5vblRpbWV1cGRhdGUpLCB0aGlzLm1lZGlhID0gbnVsbCk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5fbGF0ZW5jeSA9IG51bGwsIHRoaXMuc3RhbGxDb3VudCA9IDA7XG4gIH1cbiAgb25MZXZlbFVwZGF0ZWQoZSwge1xuICAgIGRldGFpbHM6IHRcbiAgfSkge1xuICAgIHQuYWR2YW5jZWQgJiYgdGhpcy5vblRpbWV1cGRhdGUoKSwgIXQubGl2ZSAmJiB0aGlzLm1lZGlhICYmIHRoaXMubWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRpbWV1cGRhdGVcIiwgdGhpcy5vblRpbWV1cGRhdGUpO1xuICB9XG4gIG9uRXJyb3IoZSwgdCkge1xuICAgIHZhciByO1xuICAgIHQuZGV0YWlscyA9PT0gSi5CVUZGRVJfU1RBTExFRF9FUlJPUiAmJiAodGhpcy5zdGFsbENvdW50KyssIHRoaXMuaGxzICYmIChyID0gdGhpcy5sZXZlbERldGFpbHMpICE9IG51bGwgJiYgci5saXZlICYmIHRoaXMuaGxzLmxvZ2dlci53YXJuKFwiW2xhdGVuY3ktY29udHJvbGxlcl06IFN0YWxsIGRldGVjdGVkLCBhZGp1c3RpbmcgdGFyZ2V0IGxhdGVuY3lcIikpO1xuICB9XG4gIGNoYW5nZU1lZGlhUGxheWJhY2tSYXRlKGUsIHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICBlLnBsYXliYWNrUmF0ZSAhPT0gdCAmJiAoKHIgPSB0aGlzLmhscykgPT0gbnVsbCB8fCByLmxvZ2dlci5kZWJ1ZyhgW2xhdGVuY3ktY29udHJvbGxlcl06IGxhdGVuY3k9JHt0aGlzLmxhdGVuY3kudG9GaXhlZCgzKX0sIHRhcmdldExhdGVuY3k9JHsobiA9IHRoaXMudGFyZ2V0TGF0ZW5jeSkgPT0gbnVsbCA/IHZvaWQgMCA6IG4udG9GaXhlZCgzKX0sIGZvcndhcmRCdWZmZXJMZW5ndGg9JHt0aGlzLmZvcndhcmRCdWZmZXJMZW5ndGgudG9GaXhlZCgzKX06IGFkanVzdGluZyBwbGF5YmFjayByYXRlIGZyb20gJHtlLnBsYXliYWNrUmF0ZX0gdG8gJHt0fWApLCBlLnBsYXliYWNrUmF0ZSA9IHQpO1xuICB9XG4gIGVzdGltYXRlTGl2ZUVkZ2UoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIHJldHVybiBlID09PSBudWxsID8gbnVsbCA6IGUuZWRnZSArIGUuYWdlO1xuICB9XG4gIGNvbXB1dGVMYXRlbmN5KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmVzdGltYXRlTGl2ZUVkZ2UoKTtcbiAgICByZXR1cm4gZSA9PT0gbnVsbCA/IG51bGwgOiBlIC0gdGhpcy5jdXJyZW50VGltZTtcbiAgfVxufVxuY2xhc3MgeUEgZXh0ZW5kcyBrdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcihlLCBcImxldmVsLWNvbnRyb2xsZXJcIiksIHRoaXMuX2xldmVscyA9IFtdLCB0aGlzLl9maXJzdExldmVsID0gLTEsIHRoaXMuX21heEF1dG9MZXZlbCA9IC0xLCB0aGlzLl9zdGFydExldmVsID0gdm9pZCAwLCB0aGlzLmN1cnJlbnRMZXZlbCA9IG51bGwsIHRoaXMuY3VycmVudExldmVsSW5kZXggPSAtMSwgdGhpcy5tYW51YWxMZXZlbEluZGV4ID0gLTEsIHRoaXMuc3RlZXJpbmcgPSB2b2lkIDAsIHRoaXMub25QYXJzZWRDb21wbGV0ZSA9IHZvaWQgMCwgdGhpcy5zdGVlcmluZyA9IHQsIHRoaXMuX3JlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgX3JlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURFRCwgdGhpcy5vbk1hbmlmZXN0TG9hZGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMU19VUERBVEVELCB0aGlzLm9uTGV2ZWxzVXBkYXRlZCwgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKSwgZS5vbihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIF91bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfQlVGRkVSRUQsIHRoaXMub25GcmFnQnVmZmVyZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLnN0ZWVyaW5nID0gbnVsbCwgdGhpcy5yZXNldExldmVscygpLCBzdXBlci5kZXN0cm95KCk7XG4gIH1cbiAgc3RvcExvYWQoKSB7XG4gICAgdGhpcy5fbGV2ZWxzLmZvckVhY2goKHQpID0+IHtcbiAgICAgIHQubG9hZEVycm9yID0gMCwgdC5mcmFnbWVudEVycm9yID0gMDtcbiAgICB9KSwgc3VwZXIuc3RvcExvYWQoKTtcbiAgfVxuICByZXNldExldmVscygpIHtcbiAgICB0aGlzLl9zdGFydExldmVsID0gdm9pZCAwLCB0aGlzLm1hbnVhbExldmVsSW5kZXggPSAtMSwgdGhpcy5jdXJyZW50TGV2ZWxJbmRleCA9IC0xLCB0aGlzLmN1cnJlbnRMZXZlbCA9IG51bGwsIHRoaXMuX2xldmVscyA9IFtdLCB0aGlzLl9tYXhBdXRvTGV2ZWwgPSAtMTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZyhlLCB0KSB7XG4gICAgdGhpcy5yZXNldExldmVscygpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscy5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlLCBuID0gW10sIGkgPSB7fSwgbyA9IHt9O1xuICAgIGxldCBhID0gITEsIGwgPSAhMSwgYyA9ICExO1xuICAgIHQubGV2ZWxzLmZvckVhY2goKHUpID0+IHtcbiAgICAgIGNvbnN0IGQgPSB1LmF0dHJzO1xuICAgICAgbGV0IHtcbiAgICAgICAgYXVkaW9Db2RlYzogaCxcbiAgICAgICAgdmlkZW9Db2RlYzogZlxuICAgICAgfSA9IHU7XG4gICAgICBoICYmICh1LmF1ZGlvQ29kZWMgPSBoID0gWG8oaCwgcikgfHwgdm9pZCAwKSwgZiAmJiAoZiA9IHUudmlkZW9Db2RlYyA9IEpTKGYpKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IHAsXG4gICAgICAgIGhlaWdodDogeSxcbiAgICAgICAgdW5rbm93bkNvZGVjczogRVxuICAgICAgfSA9IHUsIGIgPSAoRSA9PSBudWxsID8gdm9pZCAwIDogRS5sZW5ndGgpIHx8IDA7XG4gICAgICBpZiAoYSB8fCAoYSA9ICEhKHAgJiYgeSkpLCBsIHx8IChsID0gISFmKSwgYyB8fCAoYyA9ICEhaCksIGIgfHwgaCAmJiAhdGhpcy5pc0F1ZGlvU3VwcG9ydGVkKGgpIHx8IGYgJiYgIXRoaXMuaXNWaWRlb1N1cHBvcnRlZChmKSkge1xuICAgICAgICB0aGlzLmxvZyhgU29tZSBvciBhbGwgQ09ERUNTIG5vdCBzdXBwb3J0ZWQgXCIke2QuQ09ERUNTfVwiYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgQ09ERUNTOiBSLFxuICAgICAgICBcIkZSQU1FLVJBVEVcIjogQSxcbiAgICAgICAgXCJIRENQLUxFVkVMXCI6IEYsXG4gICAgICAgIFwiUEFUSFdBWS1JRFwiOiBNLFxuICAgICAgICBSRVNPTFVUSU9OOiBILFxuICAgICAgICBcIlZJREVPLVJBTkdFXCI6IEtcbiAgICAgIH0gPSBkLCBDID0gYCR7YCR7TSB8fCBcIi5cIn0tYH0ke3UuYml0cmF0ZX0tJHtIfS0ke0F9LSR7Un0tJHtLfS0ke0Z9YDtcbiAgICAgIGlmIChpW0NdKVxuICAgICAgICBpZiAoaVtDXS51cmkgIT09IHUudXJsICYmICF1LmF0dHJzW1wiUEFUSFdBWS1JRFwiXSkge1xuICAgICAgICAgIGNvbnN0IGsgPSBvW0NdICs9IDE7XG4gICAgICAgICAgdS5hdHRyc1tcIlBBVEhXQVktSURcIl0gPSBuZXcgQXJyYXkoayArIDEpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIGNvbnN0ICQgPSB0aGlzLmNyZWF0ZUxldmVsKHUpO1xuICAgICAgICAgIGlbQ10gPSAkLCBuLnB1c2goJCk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGlbQ10uYWRkR3JvdXBJZChcImF1ZGlvXCIsIGQuQVVESU8pLCBpW0NdLmFkZEdyb3VwSWQoXCJ0ZXh0XCIsIGQuU1VCVElUTEVTKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBrID0gdGhpcy5jcmVhdGVMZXZlbCh1KTtcbiAgICAgICAgaVtDXSA9IGssIG9bQ10gPSAxLCBuLnB1c2goayk7XG4gICAgICB9XG4gICAgfSksIHRoaXMuZmlsdGVyQW5kU29ydE1lZGlhT3B0aW9ucyhuLCB0LCBhLCBsLCBjKTtcbiAgfVxuICBjcmVhdGVMZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBtaShlKSwgciA9IGUuc3VwcGxlbWVudGFsO1xuICAgIGlmIChyICE9IG51bGwgJiYgci52aWRlb0NvZGVjICYmICF0aGlzLmlzVmlkZW9TdXBwb3J0ZWQoci52aWRlb0NvZGVjKSkge1xuICAgICAgY29uc3QgbiA9IG5ldyBFcnJvcihgU1VQUExFTUVOVEFMLUNPREVDUyBub3Qgc3VwcG9ydGVkIFwiJHtyLnZpZGVvQ29kZWN9XCJgKTtcbiAgICAgIHRoaXMubG9nKG4ubWVzc2FnZSksIHQuc3VwcG9ydGVkUmVzdWx0ID0gRmcobiwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfVxuICBpc0F1ZGlvU3VwcG9ydGVkKGUpIHtcbiAgICByZXR1cm4gZ2koZSwgXCJhdWRpb1wiLCB0aGlzLmhscy5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlKTtcbiAgfVxuICBpc1ZpZGVvU3VwcG9ydGVkKGUpIHtcbiAgICByZXR1cm4gZ2koZSwgXCJ2aWRlb1wiLCB0aGlzLmhscy5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlKTtcbiAgfVxuICBmaWx0ZXJBbmRTb3J0TWVkaWFPcHRpb25zKGUsIHQsIHIsIG4sIGkpIHtcbiAgICB2YXIgbztcbiAgICBsZXQgYSA9IFtdLCBsID0gW10sIGMgPSBlO1xuICAgIGNvbnN0IHUgPSAoKG8gPSB0LnN0YXRzKSA9PSBudWxsID8gdm9pZCAwIDogby5wYXJzaW5nKSB8fCB7fTtcbiAgICBpZiAoKHIgfHwgbikgJiYgaSAmJiAoYyA9IGMuZmlsdGVyKCh7XG4gICAgICB2aWRlb0NvZGVjOiBSLFxuICAgICAgdmlkZW9SYW5nZTogQSxcbiAgICAgIHdpZHRoOiBGLFxuICAgICAgaGVpZ2h0OiBNXG4gICAgfSkgPT4gKCEhUiB8fCAhIShGICYmIE0pKSAmJiBsYihBKSkpLCBjLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhscykge1xuICAgICAgICAgIGxldCBSID0gXCJubyBsZXZlbCB3aXRoIGNvbXBhdGlibGUgY29kZWNzIGZvdW5kIGluIG1hbmlmZXN0XCIsIEEgPSBSO1xuICAgICAgICAgIHQubGV2ZWxzLmxlbmd0aCAmJiAoQSA9IGBvbmUgb3IgbW9yZSBDT0RFQ1MgaW4gdmFyaWFudCBub3Qgc3VwcG9ydGVkOiAke2F0KHQubGV2ZWxzLm1hcCgoTSkgPT4gTS5hdHRycy5DT0RFQ1MpLmZpbHRlcigoTSwgSCwgSykgPT4gSy5pbmRleE9mKE0pID09PSBIKSl9YCwgdGhpcy53YXJuKEEpLCBSICs9IGAgKCR7QX0pYCk7XG4gICAgICAgICAgY29uc3QgRiA9IG5ldyBFcnJvcihSKTtcbiAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5NQU5JRkVTVF9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SLFxuICAgICAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICAgICAgdXJsOiB0LnVybCxcbiAgICAgICAgICAgIGVycm9yOiBGLFxuICAgICAgICAgICAgcmVhc29uOiBBXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLCB1LmVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0LmF1ZGlvVHJhY2tzICYmIChhID0gdC5hdWRpb1RyYWNrcy5maWx0ZXIoKFIpID0+ICFSLmF1ZGlvQ29kZWMgfHwgdGhpcy5pc0F1ZGlvU3VwcG9ydGVkKFIuYXVkaW9Db2RlYykpLCBkZihhKSksIHQuc3VidGl0bGVzICYmIChsID0gdC5zdWJ0aXRsZXMsIGRmKGwpKTtcbiAgICBjb25zdCBkID0gYy5zbGljZSgwKTtcbiAgICBjLnNvcnQoKFIsIEEpID0+IHtcbiAgICAgIGlmIChSLmF0dHJzW1wiSERDUC1MRVZFTFwiXSAhPT0gQS5hdHRyc1tcIkhEQ1AtTEVWRUxcIl0pXG4gICAgICAgIHJldHVybiAoUi5hdHRyc1tcIkhEQ1AtTEVWRUxcIl0gfHwgXCJcIikgPiAoQS5hdHRyc1tcIkhEQ1AtTEVWRUxcIl0gfHwgXCJcIikgPyAxIDogLTE7XG4gICAgICBpZiAociAmJiBSLmhlaWdodCAhPT0gQS5oZWlnaHQpXG4gICAgICAgIHJldHVybiBSLmhlaWdodCAtIEEuaGVpZ2h0O1xuICAgICAgaWYgKFIuZnJhbWVSYXRlICE9PSBBLmZyYW1lUmF0ZSlcbiAgICAgICAgcmV0dXJuIFIuZnJhbWVSYXRlIC0gQS5mcmFtZVJhdGU7XG4gICAgICBpZiAoUi52aWRlb1JhbmdlICE9PSBBLnZpZGVvUmFuZ2UpXG4gICAgICAgIHJldHVybiBKby5pbmRleE9mKFIudmlkZW9SYW5nZSkgLSBKby5pbmRleE9mKEEudmlkZW9SYW5nZSk7XG4gICAgICBpZiAoUi52aWRlb0NvZGVjICE9PSBBLnZpZGVvQ29kZWMpIHtcbiAgICAgICAgY29uc3QgRiA9IHNoKFIudmlkZW9Db2RlYyksIE0gPSBzaChBLnZpZGVvQ29kZWMpO1xuICAgICAgICBpZiAoRiAhPT0gTSlcbiAgICAgICAgICByZXR1cm4gTSAtIEY7XG4gICAgICB9XG4gICAgICBpZiAoUi51cmkgPT09IEEudXJpICYmIFIuY29kZWNTZXQgIT09IEEuY29kZWNTZXQpIHtcbiAgICAgICAgY29uc3QgRiA9IFpvKFIuY29kZWNTZXQpLCBNID0gWm8oQS5jb2RlY1NldCk7XG4gICAgICAgIGlmIChGICE9PSBNKVxuICAgICAgICAgIHJldHVybiBNIC0gRjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSLmF2ZXJhZ2VCaXRyYXRlICE9PSBBLmF2ZXJhZ2VCaXRyYXRlID8gUi5hdmVyYWdlQml0cmF0ZSAtIEEuYXZlcmFnZUJpdHJhdGUgOiAwO1xuICAgIH0pO1xuICAgIGxldCBoID0gZFswXTtcbiAgICBpZiAodGhpcy5zdGVlcmluZyAmJiAoYyA9IHRoaXMuc3RlZXJpbmcuZmlsdGVyUGFyc2VkTGV2ZWxzKGMpLCBjLmxlbmd0aCAhPT0gZC5sZW5ndGgpKSB7XG4gICAgICBmb3IgKGxldCBSID0gMDsgUiA8IGQubGVuZ3RoOyBSKyspXG4gICAgICAgIGlmIChkW1JdLnBhdGh3YXlJZCA9PT0gY1swXS5wYXRod2F5SWQpIHtcbiAgICAgICAgICBoID0gZFtSXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9sZXZlbHMgPSBjO1xuICAgIGZvciAobGV0IFIgPSAwOyBSIDwgYy5sZW5ndGg7IFIrKylcbiAgICAgIGlmIChjW1JdID09PSBoKSB7XG4gICAgICAgIHZhciBmO1xuICAgICAgICB0aGlzLl9maXJzdExldmVsID0gUjtcbiAgICAgICAgY29uc3QgQSA9IGguYml0cmF0ZSwgRiA9IHRoaXMuaGxzLmJhbmR3aWR0aEVzdGltYXRlO1xuICAgICAgICBpZiAodGhpcy5sb2coYG1hbmlmZXN0IGxvYWRlZCwgJHtjLmxlbmd0aH0gbGV2ZWwocykgZm91bmQsIGZpcnN0IGJpdHJhdGU6ICR7QX1gKSwgKChmID0gdGhpcy5obHMudXNlckNvbmZpZykgPT0gbnVsbCA/IHZvaWQgMCA6IGYuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSkgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnN0IE0gPSBNYXRoLm1pbihBLCB0aGlzLmhscy5jb25maWcuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZU1heCk7XG4gICAgICAgICAgTSA+IEYgJiYgRiA9PT0gdGhpcy5obHMuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSAmJiAodGhpcy5obHMuYmFuZHdpZHRoRXN0aW1hdGUgPSBNKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjb25zdCBwID0gaSAmJiAhbiwgeSA9IHRoaXMuaGxzLmNvbmZpZywgRSA9ICEhKHkuYXVkaW9TdHJlYW1Db250cm9sbGVyICYmIHkuYXVkaW9UcmFja0NvbnRyb2xsZXIpLCBiID0ge1xuICAgICAgbGV2ZWxzOiBjLFxuICAgICAgYXVkaW9UcmFja3M6IGEsXG4gICAgICBzdWJ0aXRsZVRyYWNrczogbCxcbiAgICAgIHNlc3Npb25EYXRhOiB0LnNlc3Npb25EYXRhLFxuICAgICAgc2Vzc2lvbktleXM6IHQuc2Vzc2lvbktleXMsXG4gICAgICBmaXJzdExldmVsOiB0aGlzLl9maXJzdExldmVsLFxuICAgICAgc3RhdHM6IHQuc3RhdHMsXG4gICAgICBhdWRpbzogaSxcbiAgICAgIHZpZGVvOiBuLFxuICAgICAgYWx0QXVkaW86IEUgJiYgIXAgJiYgYS5zb21lKChSKSA9PiAhIVIudXJsKVxuICAgIH07XG4gICAgdS5lbmQgPSBwZXJmb3JtYW5jZS5ub3coKSwgdGhpcy5obHMudHJpZ2dlcihJLk1BTklGRVNUX1BBUlNFRCwgYik7XG4gIH1cbiAgZ2V0IGxldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiB0aGlzLl9sZXZlbHM7XG4gIH1cbiAgZ2V0IGxvYWRMZXZlbE9iaigpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGV2ZWw7XG4gIH1cbiAgZ2V0IGxldmVsKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMZXZlbEluZGV4O1xuICB9XG4gIHNldCBsZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuX2xldmVscztcbiAgICBpZiAodC5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm47XG4gICAgaWYgKGUgPCAwIHx8IGUgPj0gdC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHUgPSBuZXcgRXJyb3IoXCJpbnZhbGlkIGxldmVsIGlkeFwiKSwgZCA9IGUgPCAwO1xuICAgICAgaWYgKHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5PVEhFUl9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5MRVZFTF9TV0lUQ0hfRVJST1IsXG4gICAgICAgIGxldmVsOiBlLFxuICAgICAgICBmYXRhbDogZCxcbiAgICAgICAgZXJyb3I6IHUsXG4gICAgICAgIHJlYXNvbjogdS5tZXNzYWdlXG4gICAgICB9KSwgZClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZSA9IE1hdGgubWluKGUsIHQubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGNvbnN0IHIgPSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4LCBuID0gdGhpcy5jdXJyZW50TGV2ZWwsIGkgPSBuID8gbi5hdHRyc1tcIlBBVEhXQVktSURcIl0gOiB2b2lkIDAsIG8gPSB0W2VdLCBhID0gby5hdHRyc1tcIlBBVEhXQVktSURcIl07XG4gICAgaWYgKHRoaXMuY3VycmVudExldmVsSW5kZXggPSBlLCB0aGlzLmN1cnJlbnRMZXZlbCA9IG8sIHIgPT09IGUgJiYgbiAmJiBpID09PSBhKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMubG9nKGBTd2l0Y2hpbmcgdG8gbGV2ZWwgJHtlfSAoJHtvLmhlaWdodCA/IG8uaGVpZ2h0ICsgXCJwIFwiIDogXCJcIn0ke28udmlkZW9SYW5nZSA/IG8udmlkZW9SYW5nZSArIFwiIFwiIDogXCJcIn0ke28uY29kZWNTZXQgPyBvLmNvZGVjU2V0ICsgXCIgXCIgOiBcIlwifUAke28uYml0cmF0ZX0pJHthID8gXCIgd2l0aCBQYXRod2F5IFwiICsgYSA6IFwiXCJ9IGZyb20gbGV2ZWwgJHtyfSR7aSA/IFwiIHdpdGggUGF0aHdheSBcIiArIGkgOiBcIlwifWApO1xuICAgIGNvbnN0IGwgPSB7XG4gICAgICBsZXZlbDogZSxcbiAgICAgIGF0dHJzOiBvLmF0dHJzLFxuICAgICAgZGV0YWlsczogby5kZXRhaWxzLFxuICAgICAgYml0cmF0ZTogby5iaXRyYXRlLFxuICAgICAgYXZlcmFnZUJpdHJhdGU6IG8uYXZlcmFnZUJpdHJhdGUsXG4gICAgICBtYXhCaXRyYXRlOiBvLm1heEJpdHJhdGUsXG4gICAgICByZWFsQml0cmF0ZTogby5yZWFsQml0cmF0ZSxcbiAgICAgIHdpZHRoOiBvLndpZHRoLFxuICAgICAgaGVpZ2h0OiBvLmhlaWdodCxcbiAgICAgIGNvZGVjU2V0OiBvLmNvZGVjU2V0LFxuICAgICAgYXVkaW9Db2RlYzogby5hdWRpb0NvZGVjLFxuICAgICAgdmlkZW9Db2RlYzogby52aWRlb0NvZGVjLFxuICAgICAgYXVkaW9Hcm91cHM6IG8uYXVkaW9Hcm91cHMsXG4gICAgICBzdWJ0aXRsZUdyb3Vwczogby5zdWJ0aXRsZUdyb3VwcyxcbiAgICAgIGxvYWRlZDogby5sb2FkZWQsXG4gICAgICBsb2FkRXJyb3I6IG8ubG9hZEVycm9yLFxuICAgICAgZnJhZ21lbnRFcnJvcjogby5mcmFnbWVudEVycm9yLFxuICAgICAgbmFtZTogby5uYW1lLFxuICAgICAgaWQ6IG8uaWQsXG4gICAgICB1cmk6IG8udXJpLFxuICAgICAgdXJsOiBvLnVybCxcbiAgICAgIHVybElkOiAwLFxuICAgICAgYXVkaW9Hcm91cElkczogby5hdWRpb0dyb3VwSWRzLFxuICAgICAgdGV4dEdyb3VwSWRzOiBvLnRleHRHcm91cElkc1xuICAgIH07XG4gICAgdGhpcy5obHMudHJpZ2dlcihJLkxFVkVMX1NXSVRDSElORywgbCk7XG4gICAgY29uc3QgYyA9IG8uZGV0YWlscztcbiAgICBpZiAoIWMgfHwgYy5saXZlKSB7XG4gICAgICBjb25zdCB1ID0gdGhpcy5zd2l0Y2hQYXJhbXMoby51cmksIG4gPT0gbnVsbCA/IHZvaWQgMCA6IG4uZGV0YWlscywgYyk7XG4gICAgICB0aGlzLmxvYWRQbGF5bGlzdCh1KTtcbiAgICB9XG4gIH1cbiAgZ2V0IG1hbnVhbExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLm1hbnVhbExldmVsSW5kZXg7XG4gIH1cbiAgc2V0IG1hbnVhbExldmVsKGUpIHtcbiAgICB0aGlzLm1hbnVhbExldmVsSW5kZXggPSBlLCB0aGlzLl9zdGFydExldmVsID09PSB2b2lkIDAgJiYgKHRoaXMuX3N0YXJ0TGV2ZWwgPSBlKSwgZSAhPT0gLTEgJiYgKHRoaXMubGV2ZWwgPSBlKTtcbiAgfVxuICBnZXQgZmlyc3RMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RMZXZlbDtcbiAgfVxuICBzZXQgZmlyc3RMZXZlbChlKSB7XG4gICAgdGhpcy5fZmlyc3RMZXZlbCA9IGU7XG4gIH1cbiAgZ2V0IHN0YXJ0TGV2ZWwoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0TGV2ZWwgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgZSA9IHRoaXMuaGxzLmNvbmZpZy5zdGFydExldmVsO1xuICAgICAgcmV0dXJuIGUgIT09IHZvaWQgMCA/IGUgOiB0aGlzLmhscy5maXJzdEF1dG9MZXZlbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0TGV2ZWw7XG4gIH1cbiAgc2V0IHN0YXJ0TGV2ZWwoZSkge1xuICAgIHRoaXMuX3N0YXJ0TGV2ZWwgPSBlO1xuICB9XG4gIGdldCBwYXRod2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGVlcmluZyA/IHRoaXMuc3RlZXJpbmcucGF0aHdheXMoKSA6IFtdO1xuICB9XG4gIGdldCBwYXRod2F5UHJpb3JpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RlZXJpbmcgPyB0aGlzLnN0ZWVyaW5nLnBhdGh3YXlQcmlvcml0eSA6IG51bGw7XG4gIH1cbiAgc2V0IHBhdGh3YXlQcmlvcml0eShlKSB7XG4gICAgaWYgKHRoaXMuc3RlZXJpbmcpIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLnN0ZWVyaW5nLnBhdGh3YXlzKCksIHIgPSBlLmZpbHRlcigobikgPT4gdC5pbmRleE9mKG4pICE9PSAtMSk7XG4gICAgICBpZiAoZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRoaXMud2FybihgcGF0aHdheVByaW9yaXR5ICR7ZX0gc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIHBhdGh3YXkgZnJvbSBsaXN0OiAke3R9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RlZXJpbmcucGF0aHdheVByaW9yaXR5ID0gcjtcbiAgICB9XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgdC5mYXRhbCB8fCAhdC5jb250ZXh0IHx8IHQuY29udGV4dC50eXBlID09PSBLZS5MRVZFTCAmJiB0LmNvbnRleHQubGV2ZWwgPT09IHRoaXMubGV2ZWwgJiYgdGhpcy5jaGVja1JldHJ5KHQpO1xuICB9XG4gIC8vIHJlc2V0IGVycm9ycyBvbiB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIGEgZnJhZ21lbnRcbiAgb25GcmFnQnVmZmVyZWQoZSwge1xuICAgIGZyYWc6IHRcbiAgfSkge1xuICAgIGlmICh0ICE9PSB2b2lkIDAgJiYgdC50eXBlID09PSBwZS5NQUlOKSB7XG4gICAgICBjb25zdCByID0gdC5lbGVtZW50YXJ5U3RyZWFtcztcbiAgICAgIGlmICghT2JqZWN0LmtleXMocikuc29tZSgoaSkgPT4gISFyW2ldKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbiA9IHRoaXMuX2xldmVsc1t0LmxldmVsXTtcbiAgICAgIG4gIT0gbnVsbCAmJiBuLmxvYWRFcnJvciAmJiAodGhpcy5sb2coYFJlc2V0dGluZyBsZXZlbCBlcnJvciBjb3VudCBvZiAke24ubG9hZEVycm9yfSBvbiBmcmFnIGJ1ZmZlcmVkYCksIG4ubG9hZEVycm9yID0gMCk7XG4gICAgfVxuICB9XG4gIG9uTGV2ZWxMb2FkZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsOiBuLFxuICAgICAgZGV0YWlsczogaVxuICAgIH0gPSB0LCBvID0gdC5sZXZlbEluZm87XG4gICAgaWYgKCFvKSB7XG4gICAgICB2YXIgYTtcbiAgICAgIHRoaXMud2FybihgSW52YWxpZCBsZXZlbCBpbmRleCAke259YCksIChhID0gdC5kZWxpdmVyeURpcmVjdGl2ZXMpICE9IG51bGwgJiYgYS5za2lwICYmIChpLmRlbHRhVXBkYXRlRmFpbGVkID0gITApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobyA9PT0gdGhpcy5jdXJyZW50TGV2ZWwgfHwgdC53aXRob3V0TXVsdGlWYXJpYW50KSB7XG4gICAgICBvLmZyYWdtZW50RXJyb3IgPT09IDAgJiYgKG8ubG9hZEVycm9yID0gMCk7XG4gICAgICBsZXQgbCA9IG8uZGV0YWlscztcbiAgICAgIGwgPT09IHQuZGV0YWlscyAmJiBsLmFkdmFuY2VkICYmIChsID0gdm9pZCAwKSwgdGhpcy5wbGF5bGlzdExvYWRlZChuLCB0LCBsKTtcbiAgICB9IGVsc2UgKHIgPSB0LmRlbGl2ZXJ5RGlyZWN0aXZlcykgIT0gbnVsbCAmJiByLnNraXAgJiYgKGkuZGVsdGFVcGRhdGVGYWlsZWQgPSAhMCk7XG4gIH1cbiAgbG9hZFBsYXlsaXN0KGUpIHtcbiAgICBzdXBlci5sb2FkUGxheWxpc3QoKSwgdGhpcy5zaG91bGRMb2FkUGxheWxpc3QodGhpcy5jdXJyZW50TGV2ZWwpICYmIHRoaXMuc2NoZWR1bGVMb2FkaW5nKHRoaXMuY3VycmVudExldmVsLCBlKTtcbiAgfVxuICBsb2FkaW5nUGxheWxpc3QoZSwgdCkge1xuICAgIHN1cGVyLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICBjb25zdCByID0gdGhpcy5nZXRVcmxXaXRoRGlyZWN0aXZlcyhlLnVyaSwgdCksIG4gPSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4LCBpID0gZS5hdHRyc1tcIlBBVEhXQVktSURcIl0sIG8gPSBlLmRldGFpbHMsIGEgPSBvID09IG51bGwgPyB2b2lkIDAgOiBvLmFnZTtcbiAgICB0aGlzLmxvZyhgTG9hZGluZyBsZXZlbCBpbmRleCAke259JHsodCA9PSBudWxsID8gdm9pZCAwIDogdC5tc24pICE9PSB2b2lkIDAgPyBcIiBhdCBzbiBcIiArIHQubXNuICsgXCIgcGFydCBcIiArIHQucGFydCA6IFwiXCJ9JHtpID8gXCIgUGF0aHdheSBcIiArIGkgOiBcIlwifSR7YSAmJiBvLmxpdmUgPyBcIiBhZ2UgXCIgKyBhLnRvRml4ZWQoMSkgKyAoby50eXBlICYmIFwiIFwiICsgby50eXBlIHx8IFwiXCIpIDogXCJcIn0gJHtyfWApLCB0aGlzLmhscy50cmlnZ2VyKEkuTEVWRUxfTE9BRElORywge1xuICAgICAgdXJsOiByLFxuICAgICAgbGV2ZWw6IG4sXG4gICAgICBsZXZlbEluZm86IGUsXG4gICAgICBwYXRod2F5SWQ6IGUuYXR0cnNbXCJQQVRIV0FZLUlEXCJdLFxuICAgICAgaWQ6IDAsXG4gICAgICAvLyBEZXByZWNhdGVkIExldmVsIHVybElkXG4gICAgICBkZWxpdmVyeURpcmVjdGl2ZXM6IHQgfHwgbnVsbFxuICAgIH0pO1xuICB9XG4gIGdldCBuZXh0TG9hZExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLm1hbnVhbExldmVsSW5kZXggIT09IC0xID8gdGhpcy5tYW51YWxMZXZlbEluZGV4IDogdGhpcy5obHMubmV4dEF1dG9MZXZlbDtcbiAgfVxuICBzZXQgbmV4dExvYWRMZXZlbChlKSB7XG4gICAgdGhpcy5sZXZlbCA9IGUsIHRoaXMubWFudWFsTGV2ZWxJbmRleCA9PT0gLTEgJiYgKHRoaXMuaGxzLm5leHRBdXRvTGV2ZWwgPSBlKTtcbiAgfVxuICByZW1vdmVMZXZlbChlKSB7XG4gICAgdmFyIHQ7XG4gICAgaWYgKHRoaXMuX2xldmVscy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMuX2xldmVscy5maWx0ZXIoKGksIG8pID0+IG8gIT09IGUgPyAhMCA6ICh0aGlzLnN0ZWVyaW5nICYmIHRoaXMuc3RlZXJpbmcucmVtb3ZlTGV2ZWwoaSksIGkgPT09IHRoaXMuY3VycmVudExldmVsICYmICh0aGlzLmN1cnJlbnRMZXZlbCA9IG51bGwsIHRoaXMuY3VycmVudExldmVsSW5kZXggPSAtMSwgaS5kZXRhaWxzICYmIGkuZGV0YWlscy5mcmFnbWVudHMuZm9yRWFjaCgoYSkgPT4gYS5sZXZlbCA9IC0xKSksICExKSk7XG4gICAgcnAociksIHRoaXMuX2xldmVscyA9IHIsIHRoaXMuY3VycmVudExldmVsSW5kZXggPiAtMSAmJiAodCA9IHRoaXMuY3VycmVudExldmVsKSAhPSBudWxsICYmIHQuZGV0YWlscyAmJiAodGhpcy5jdXJyZW50TGV2ZWxJbmRleCA9IHRoaXMuY3VycmVudExldmVsLmRldGFpbHMuZnJhZ21lbnRzWzBdLmxldmVsKSwgdGhpcy5tYW51YWxMZXZlbEluZGV4ID4gLTEgJiYgKHRoaXMubWFudWFsTGV2ZWxJbmRleCA9IHRoaXMuY3VycmVudExldmVsSW5kZXgpO1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5fZmlyc3RMZXZlbCA9IE1hdGgubWluKHRoaXMuX2ZpcnN0TGV2ZWwsIG4pLCB0aGlzLl9zdGFydExldmVsICYmICh0aGlzLl9zdGFydExldmVsID0gTWF0aC5taW4odGhpcy5fc3RhcnRMZXZlbCwgbikpLCB0aGlzLmhscy50cmlnZ2VyKEkuTEVWRUxTX1VQREFURUQsIHtcbiAgICAgIGxldmVsczogclxuICAgIH0pO1xuICB9XG4gIG9uTGV2ZWxzVXBkYXRlZChlLCB7XG4gICAgbGV2ZWxzOiB0XG4gIH0pIHtcbiAgICB0aGlzLl9sZXZlbHMgPSB0O1xuICB9XG4gIGNoZWNrTWF4QXV0b1VwZGF0ZWQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXV0b0xldmVsQ2FwcGluZzogZSxcbiAgICAgIG1heEF1dG9MZXZlbDogdCxcbiAgICAgIG1heEhkY3BMZXZlbDogclxuICAgIH0gPSB0aGlzLmhscztcbiAgICB0aGlzLl9tYXhBdXRvTGV2ZWwgIT09IHQgJiYgKHRoaXMuX21heEF1dG9MZXZlbCA9IHQsIHRoaXMuaGxzLnRyaWdnZXIoSS5NQVhfQVVUT19MRVZFTF9VUERBVEVELCB7XG4gICAgICBhdXRvTGV2ZWxDYXBwaW5nOiBlLFxuICAgICAgbGV2ZWxzOiB0aGlzLmxldmVscyxcbiAgICAgIG1heEF1dG9MZXZlbDogdCxcbiAgICAgIG1pbkF1dG9MZXZlbDogdGhpcy5obHMubWluQXV0b0xldmVsLFxuICAgICAgbWF4SGRjcExldmVsOiByXG4gICAgfSkpO1xuICB9XG59XG5mdW5jdGlvbiBkZihzKSB7XG4gIGNvbnN0IGUgPSB7fTtcbiAgcy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgY29uc3QgciA9IHQuZ3JvdXBJZCB8fCBcIlwiO1xuICAgIHQuaWQgPSBlW3JdID0gZVtyXSB8fCAwLCBlW3JdKys7XG4gIH0pO1xufVxuZnVuY3Rpb24gWHAoKSB7XG4gIHJldHVybiBzZWxmLlNvdXJjZUJ1ZmZlciB8fCBzZWxmLldlYktpdFNvdXJjZUJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIEpwKCkge1xuICBpZiAoIU1zKCkpXG4gICAgcmV0dXJuICExO1xuICBjb25zdCBlID0gWHAoKTtcbiAgcmV0dXJuICFlIHx8IGUucHJvdG90eXBlICYmIHR5cGVvZiBlLnByb3RvdHlwZS5hcHBlbmRCdWZmZXIgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlLnByb3RvdHlwZS5yZW1vdmUgPT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gdkEoKSB7XG4gIGlmICghSnAoKSlcbiAgICByZXR1cm4gITE7XG4gIGNvbnN0IHMgPSBNcygpO1xuICByZXR1cm4gdHlwZW9mIChzID09IG51bGwgPyB2b2lkIDAgOiBzLmlzVHlwZVN1cHBvcnRlZCkgPT0gXCJmdW5jdGlvblwiICYmIChbXCJhdmMxLjQyRTAxRSxtcDRhLjQwLjJcIiwgXCJhdjAxLjAuMDFNLjA4XCIsIFwidnAwOS4wMC41MC4wOFwiXS5zb21lKChlKSA9PiBzLmlzVHlwZVN1cHBvcnRlZChwaShlLCBcInZpZGVvXCIpKSkgfHwgW1wibXA0YS40MC4yXCIsIFwiZkxhQ1wiXS5zb21lKChlKSA9PiBzLmlzVHlwZVN1cHBvcnRlZChwaShlLCBcImF1ZGlvXCIpKSkpO1xufVxuZnVuY3Rpb24gRUEoKSB7XG4gIHZhciBzO1xuICBjb25zdCBlID0gWHAoKTtcbiAgcmV0dXJuIHR5cGVvZiAoZSA9PSBudWxsIHx8IChzID0gZS5wcm90b3R5cGUpID09IG51bGwgPyB2b2lkIDAgOiBzLmNoYW5nZVR5cGUpID09IFwiZnVuY3Rpb25cIjtcbn1cbmNvbnN0IHhBID0gMTAwO1xuY2xhc3MgU0EgZXh0ZW5kcyBUdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICBzdXBlcihlLCB0LCByLCBcInN0cmVhbS1jb250cm9sbGVyXCIsIHBlLk1BSU4pLCB0aGlzLmF1ZGlvQ29kZWNTd2FwID0gITEsIHRoaXMubGV2ZWwgPSAtMSwgdGhpcy5fZm9yY2VTdGFydExvYWQgPSAhMSwgdGhpcy5faGFzRW5vdWdoVG9TdGFydCA9ICExLCB0aGlzLmFsdEF1ZGlvID0gMCwgdGhpcy5hdWRpb09ubHkgPSAhMSwgdGhpcy5mcmFnUGxheWluZyA9IG51bGwsIHRoaXMuZnJhZ0xhc3RLYnBzID0gMCwgdGhpcy5jb3VsZEJhY2t0cmFjayA9ICExLCB0aGlzLmJhY2t0cmFja0ZyYWdtZW50ID0gbnVsbCwgdGhpcy5hdWRpb0NvZGVjU3dpdGNoID0gITEsIHRoaXMudmlkZW9CdWZmZXIgPSBudWxsLCB0aGlzLm9uTWVkaWFQbGF5aW5nID0gKCkgPT4ge1xuICAgICAgdGhpcy50aWNrKCk7XG4gICAgfSwgdGhpcy5vbk1lZGlhU2Vla2VkID0gKCkgPT4ge1xuICAgICAgY29uc3QgbiA9IHRoaXMubWVkaWEsIGkgPSBuID8gbi5jdXJyZW50VGltZSA6IG51bGw7XG4gICAgICBpZiAoaSA9PT0gbnVsbCB8fCAhdWUoaSkgfHwgKHRoaXMubG9nKGBNZWRpYSBzZWVrZWQgdG8gJHtpLnRvRml4ZWQoMyl9YCksICF0aGlzLmdldEJ1ZmZlcmVkRnJhZyhpKSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmdldEZ3ZEJ1ZmZlckluZm9BdFBvcyhuLCBpLCBwZS5NQUlOLCAwKTtcbiAgICAgIGlmIChvID09PSBudWxsIHx8IG8ubGVuID09PSAwKSB7XG4gICAgICAgIHRoaXMud2FybihgTWFpbiBmb3J3YXJkIGJ1ZmZlciBsZW5ndGggYXQgJHtpfSBvbiBcInNlZWtlZFwiIGV2ZW50ICR7byA/IG8ubGVuIDogXCJlbXB0eVwifSlgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50aWNrKCk7XG4gICAgfSwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHN1cGVyLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfTE9BREVELCB0aGlzLm9uTGV2ZWxMb2FkZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19MT0FEX0VNRVJHRU5DWV9BQk9SVEVELCB0aGlzLm9uRnJhZ0xvYWRFbWVyZ2VuY3lBYm9ydGVkLCB0aGlzKSwgZS5vbihJLkFVRElPX1RSQUNLX1NXSVRDSElORywgdGhpcy5vbkF1ZGlvVHJhY2tTd2l0Y2hpbmcsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfU1dJVENIRUQsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0NSRUFURUQsIHRoaXMub25CdWZmZXJDcmVhdGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSEVELCB0aGlzLm9uQnVmZmVyRmx1c2hlZCwgdGhpcyksIGUub24oSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19CVUZGRVJFRCwgdGhpcy5vbkZyYWdCdWZmZXJlZCwgdGhpcyk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBzdXBlci51bnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vZmYoSS5NQU5JRkVTVF9QQVJTRUQsIHRoaXMub25NYW5pZmVzdFBhcnNlZCwgdGhpcyksIGUub2ZmKEkuTEVWRUxfTE9BREVELCB0aGlzLm9uTGV2ZWxMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCwgdGhpcy5vbkZyYWdMb2FkRW1lcmdlbmN5QWJvcnRlZCwgdGhpcyksIGUub2ZmKEkuQVVESU9fVFJBQ0tfU1dJVENISU5HLCB0aGlzLm9uQXVkaW9UcmFja1N3aXRjaGluZywgdGhpcyksIGUub2ZmKEkuQVVESU9fVFJBQ0tfU1dJVENIRUQsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9DUkVBVEVELCB0aGlzLm9uQnVmZmVyQ3JlYXRlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNIRUQsIHRoaXMub25CdWZmZXJGbHVzaGVkLCB0aGlzKSwgZS5vZmYoSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfQlVGRkVSRUQsIHRoaXMub25GcmFnQnVmZmVyZWQsIHRoaXMpO1xuICB9XG4gIG9uSGFuZGxlckRlc3Ryb3lpbmcoKSB7XG4gICAgdGhpcy5vbk1lZGlhUGxheWluZyA9IHRoaXMub25NZWRpYVNlZWtlZCA9IG51bGwsIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpLCBzdXBlci5vbkhhbmRsZXJEZXN0cm95aW5nKCk7XG4gIH1cbiAgc3RhcnRMb2FkKGUsIHQpIHtcbiAgICBpZiAodGhpcy5sZXZlbHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGFzdEN1cnJlbnRUaW1lOiByLFxuICAgICAgICBobHM6IG5cbiAgICAgIH0gPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuc3RvcExvYWQoKSwgdGhpcy5zZXRJbnRlcnZhbCh4QSksIHRoaXMubGV2ZWwgPSAtMSwgIXRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkKSB7XG4gICAgICAgIGxldCBpID0gbi5zdGFydExldmVsO1xuICAgICAgICBpID09PSAtMSAmJiAobi5jb25maWcudGVzdEJhbmR3aWR0aCAmJiB0aGlzLmxldmVscy5sZW5ndGggPiAxID8gKGkgPSAwLCB0aGlzLmJpdHJhdGVUZXN0ID0gITApIDogaSA9IG4uZmlyc3RBdXRvTGV2ZWwpLCBuLm5leHRMb2FkTGV2ZWwgPSBpLCB0aGlzLmxldmVsID0gbi5sb2FkTGV2ZWwsIHRoaXMuX2hhc0Vub3VnaFRvU3RhcnQgPSAhIXQ7XG4gICAgICB9XG4gICAgICByID4gMCAmJiBlID09PSAtMSAmJiAhdCAmJiAodGhpcy5sb2coYE92ZXJyaWRlIHN0YXJ0UG9zaXRpb24gd2l0aCBsYXN0Q3VycmVudFRpbWUgQCR7ci50b0ZpeGVkKDMpfWApLCBlID0gciksIHRoaXMuc3RhdGUgPSBuZS5JRExFLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUgKyB0aGlzLnRpbWVsaW5lT2Zmc2V0LCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0ID8gLTEgOiBlLCB0aGlzLnRpY2soKTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuX2ZvcmNlU3RhcnRMb2FkID0gITAsIHRoaXMuc3RhdGUgPSBuZS5TVE9QUEVEO1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIHRoaXMuX2ZvcmNlU3RhcnRMb2FkID0gITEsIHN1cGVyLnN0b3BMb2FkKCk7XG4gIH1cbiAgZG9UaWNrKCkge1xuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSBuZS5XQUlUSU5HX0xFVkVMOiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBsZXZlbHM6IGUsXG4gICAgICAgICAgbGV2ZWw6IHRcbiAgICAgICAgfSA9IHRoaXMsIHIgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlW3RdLCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5kZXRhaWxzO1xuICAgICAgICBpZiAobiAmJiAoIW4ubGl2ZSB8fCB0aGlzLmxldmVsTGFzdExvYWRlZCA9PT0gciAmJiAhdGhpcy53YWl0Rm9yTGl2ZShyKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy53YWl0Rm9yQ2RuVHVuZUluKG4pKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IG5lLklETEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5obHMubmV4dExvYWRMZXZlbCAhPT0gdGhpcy5sZXZlbCkge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBuZS5GUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWTpcbiAgICAgICAgdGhpcy5jaGVja1JldHJ5RGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9PT0gbmUuSURMRSAmJiB0aGlzLmRvVGlja0lkbGUoKSwgdGhpcy5vblRpY2tFbmQoKTtcbiAgfVxuICBvblRpY2tFbmQoKSB7XG4gICAgdmFyIGU7XG4gICAgc3VwZXIub25UaWNrRW5kKCksIChlID0gdGhpcy5tZWRpYSkgIT0gbnVsbCAmJiBlLnJlYWR5U3RhdGUgJiYgdGhpcy5tZWRpYS5zZWVraW5nID09PSAhMSAmJiAodGhpcy5sYXN0Q3VycmVudFRpbWUgPSB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lKSwgdGhpcy5jaGVja0ZyYWdtZW50Q2hhbmdlZCgpO1xuICB9XG4gIGRvVGlja0lkbGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlLFxuICAgICAgbGV2ZWxMYXN0TG9hZGVkOiB0LFxuICAgICAgbGV2ZWxzOiByLFxuICAgICAgbWVkaWE6IG5cbiAgICB9ID0gdGhpcztcbiAgICBpZiAodCA9PT0gbnVsbCB8fCAhbiAmJiAhdGhpcy5wcmltYXJ5UHJlZmV0Y2ggJiYgKHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkIHx8ICFlLmNvbmZpZy5zdGFydEZyYWdQcmVmZXRjaCkgfHwgdGhpcy5hbHRBdWRpbyAmJiB0aGlzLmF1ZGlvT25seSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gdGhpcy5idWZmZXJpbmcgPyBlLm5leHRMb2FkTGV2ZWwgOiBlLmxvYWRMZXZlbDtcbiAgICBpZiAoIShyICE9IG51bGwgJiYgcltpXSkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IHJbaV0sIGEgPSB0aGlzLmdldE1haW5Gd2RCdWZmZXJJbmZvKCk7XG4gICAgaWYgKGEgPT09IG51bGwpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbCA9IHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCk7XG4gICAgaWYgKGwgJiYgdGhpcy5fc3RyZWFtRW5kZWQoYSwgbCkpIHtcbiAgICAgIGNvbnN0IHkgPSB7fTtcbiAgICAgIHRoaXMuYWx0QXVkaW8gPT09IDIgJiYgKHkudHlwZSA9IFwidmlkZW9cIiksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfRU9TLCB5KSwgdGhpcy5zdGF0ZSA9IG5lLkVOREVEO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYnVmZmVyaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIGUubG9hZExldmVsICE9PSBpICYmIGUubWFudWFsTGV2ZWwgPT09IC0xICYmIHRoaXMubG9nKGBBZGFwdGluZyB0byBsZXZlbCAke2l9IGZyb20gbGV2ZWwgJHt0aGlzLmxldmVsfWApLCB0aGlzLmxldmVsID0gZS5uZXh0TG9hZExldmVsID0gaTtcbiAgICBjb25zdCBjID0gby5kZXRhaWxzO1xuICAgIGlmICghYyB8fCB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX0xFVkVMIHx8IHRoaXMud2FpdEZvckxpdmUobykpIHtcbiAgICAgIHRoaXMubGV2ZWwgPSBpLCB0aGlzLnN0YXRlID0gbmUuV0FJVElOR19MRVZFTCwgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdSA9IGEubGVuLCBkID0gdGhpcy5nZXRNYXhCdWZmZXJMZW5ndGgoby5tYXhCaXRyYXRlKTtcbiAgICBpZiAodSA+PSBkKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgJiYgdGhpcy5iYWNrdHJhY2tGcmFnbWVudC5zdGFydCA+IGEuZW5kICYmICh0aGlzLmJhY2t0cmFja0ZyYWdtZW50ID0gbnVsbCk7XG4gICAgY29uc3QgaCA9IHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPyB0aGlzLmJhY2t0cmFja0ZyYWdtZW50LnN0YXJ0IDogYS5lbmQ7XG4gICAgbGV0IGYgPSB0aGlzLmdldE5leHRGcmFnbWVudChoLCBjKTtcbiAgICBpZiAodGhpcy5jb3VsZEJhY2t0cmFjayAmJiAhdGhpcy5mcmFnUHJldmlvdXMgJiYgZiAmJiBWdChmKSAmJiB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRTdGF0ZShmKSAhPT0gSHQuT0spIHtcbiAgICAgIHZhciBwO1xuICAgICAgY29uc3QgRSA9ICgocCA9IHRoaXMuYmFja3RyYWNrRnJhZ21lbnQpICE9IG51bGwgPyBwIDogZikuc24gLSBjLnN0YXJ0U04sIGIgPSBjLmZyYWdtZW50c1tFIC0gMV07XG4gICAgICBiICYmIGYuY2MgPT09IGIuY2MgJiYgKGYgPSBiLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChiKSk7XG4gICAgfSBlbHNlIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgJiYgYS5sZW4gJiYgKHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPSBudWxsKTtcbiAgICBpZiAoZiAmJiB0aGlzLmlzTG9vcExvYWRpbmcoZiwgaCkpIHtcbiAgICAgIGlmICghZi5nYXApIHtcbiAgICAgICAgY29uc3QgRSA9IHRoaXMuYXVkaW9Pbmx5ICYmICF0aGlzLmFsdEF1ZGlvID8gb3QuQVVESU8gOiBvdC5WSURFTywgYiA9IChFID09PSBvdC5WSURFTyA/IHRoaXMudmlkZW9CdWZmZXIgOiB0aGlzLm1lZGlhQnVmZmVyKSB8fCB0aGlzLm1lZGlhO1xuICAgICAgICBiICYmIHRoaXMuYWZ0ZXJCdWZmZXJGbHVzaGVkKGIsIEUsIHBlLk1BSU4pO1xuICAgICAgfVxuICAgICAgZiA9IHRoaXMuZ2V0TmV4dEZyYWdtZW50TG9vcExvYWRpbmcoZiwgYywgYSwgcGUuTUFJTiwgZCk7XG4gICAgfVxuICAgIGYgJiYgKGYuaW5pdFNlZ21lbnQgJiYgIWYuaW5pdFNlZ21lbnQuZGF0YSAmJiAhdGhpcy5iaXRyYXRlVGVzdCAmJiAoZiA9IGYuaW5pdFNlZ21lbnQpLCB0aGlzLmxvYWRGcmFnbWVudChmLCBvLCBoKSk7XG4gIH1cbiAgbG9hZEZyYWdtZW50KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoZSk7XG4gICAgbiA9PT0gSHQuTk9UX0xPQURFRCB8fCBuID09PSBIdC5QQVJUSUFMID8gVnQoZSkgPyB0aGlzLmJpdHJhdGVUZXN0ID8gKHRoaXMubG9nKGBGcmFnbWVudCAke2Uuc259IG9mIGxldmVsICR7ZS5sZXZlbH0gaXMgYmVpbmcgZG93bmxvYWRlZCB0byB0ZXN0IGJpdHJhdGUgYW5kIHdpbGwgbm90IGJlIGJ1ZmZlcmVkYCksIHRoaXMuX2xvYWRCaXRyYXRlVGVzdEZyYWcoZSwgdCkpIDogc3VwZXIubG9hZEZyYWdtZW50KGUsIHQsIHIpIDogdGhpcy5fbG9hZEluaXRTZWdtZW50KGUsIHQpIDogdGhpcy5jbGVhclRyYWNrZXJJZk5lZWRlZChlKTtcbiAgfVxuICBnZXRCdWZmZXJlZEZyYWcoZSkge1xuICAgIHJldHVybiB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRCdWZmZXJlZEZyYWcoZSwgcGUuTUFJTik7XG4gIH1cbiAgZm9sbG93aW5nQnVmZmVyZWRGcmFnKGUpIHtcbiAgICByZXR1cm4gZSA/IHRoaXMuZ2V0QnVmZmVyZWRGcmFnKGUuZW5kICsgMC41KSA6IG51bGw7XG4gIH1cbiAgLypcbiAgICBvbiBpbW1lZGlhdGUgbGV2ZWwgc3dpdGNoIDpcbiAgICAgLSBwYXVzZSBwbGF5YmFjayBpZiBwbGF5aW5nXG4gICAgIC0gY2FuY2VsIGFueSBwZW5kaW5nIGxvYWQgcmVxdWVzdFxuICAgICAtIGFuZCB0cmlnZ2VyIGEgYnVmZmVyIGZsdXNoXG4gICovXG4gIGltbWVkaWF0ZUxldmVsU3dpdGNoKCkge1xuICAgIHRoaXMuYWJvcnRDdXJyZW50RnJhZygpLCB0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICB9XG4gIC8qKlxuICAgKiB0cnkgdG8gc3dpdGNoIEFTQVAgd2l0aG91dCBicmVha2luZyB2aWRlbyBwbGF5YmFjazpcbiAgICogaW4gb3JkZXIgdG8gZW5zdXJlIHNtb290aCBidXQgcXVpY2sgbGV2ZWwgc3dpdGNoaW5nLFxuICAgKiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgZmx1c2hhYmxlIGJ1ZmZlciByYW5nZVxuICAgKiB3ZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgbmV3IHNlZ21lbnQgZmV0Y2ggdGltZVxuICAgKi9cbiAgbmV4dExldmVsU3dpdGNoKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIG1lZGlhOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKHQgIT0gbnVsbCAmJiB0LnJlYWR5U3RhdGUpIHtcbiAgICAgIGxldCByO1xuICAgICAgY29uc3QgbiA9IHRoaXMuZ2V0QXBwZW5kZWRGcmFnKHQuY3VycmVudFRpbWUpO1xuICAgICAgbiAmJiBuLnN0YXJ0ID4gMSAmJiB0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLCBuLnN0YXJ0IC0gMSk7XG4gICAgICBjb25zdCBpID0gdGhpcy5nZXRMZXZlbERldGFpbHMoKTtcbiAgICAgIGlmIChpICE9IG51bGwgJiYgaS5saXZlKSB7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLmdldE1haW5Gd2RCdWZmZXJJbmZvKCk7XG4gICAgICAgIGlmICghYSB8fCBhLmxlbiA8IGkudGFyZ2V0ZHVyYXRpb24gKiAyKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdC5wYXVzZWQgJiYgZSkge1xuICAgICAgICBjb25zdCBhID0gdGhpcy5obHMubmV4dExvYWRMZXZlbCwgbCA9IGVbYV0sIGMgPSB0aGlzLmZyYWdMYXN0S2JwcztcbiAgICAgICAgYyAmJiB0aGlzLmZyYWdDdXJyZW50ID8gciA9IHRoaXMuZnJhZ0N1cnJlbnQuZHVyYXRpb24gKiBsLm1heEJpdHJhdGUgLyAoMWUzICogYykgKyAxIDogciA9IDA7XG4gICAgICB9IGVsc2VcbiAgICAgICAgciA9IDA7XG4gICAgICBjb25zdCBvID0gdGhpcy5nZXRCdWZmZXJlZEZyYWcodC5jdXJyZW50VGltZSArIHIpO1xuICAgICAgaWYgKG8pIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuZm9sbG93aW5nQnVmZmVyZWRGcmFnKG8pO1xuICAgICAgICBpZiAoYSkge1xuICAgICAgICAgIHRoaXMuYWJvcnRDdXJyZW50RnJhZygpO1xuICAgICAgICAgIGNvbnN0IGwgPSBhLm1heFN0YXJ0UFRTID8gYS5tYXhTdGFydFBUUyA6IGEuc3RhcnQsIGMgPSBhLmR1cmF0aW9uLCB1ID0gTWF0aC5tYXgoby5lbmQsIGwgKyBNYXRoLm1pbihNYXRoLm1heChjIC0gdGhpcy5jb25maWcubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSwgYyAqICh0aGlzLmNvdWxkQmFja3RyYWNrID8gMC41IDogMC4xMjUpKSwgYyAqICh0aGlzLmNvdWxkQmFja3RyYWNrID8gMC43NSA6IDAuMjUpKSk7XG4gICAgICAgICAgdGhpcy5mbHVzaE1haW5CdWZmZXIodSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhYm9ydEN1cnJlbnRGcmFnKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmZyYWdDdXJyZW50O1xuICAgIHN3aXRjaCAodGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPSBudWxsLCBlICYmIChlLmFib3J0UmVxdWVzdHMoKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQoZSkpLCB0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlIG5lLktFWV9MT0FESU5HOlxuICAgICAgY2FzZSBuZS5GUkFHX0xPQURJTkc6XG4gICAgICBjYXNlIG5lLkZSQUdfTE9BRElOR19XQUlUSU5HX1JFVFJZOlxuICAgICAgY2FzZSBuZS5QQVJTSU5HOlxuICAgICAgY2FzZSBuZS5QQVJTRUQ6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gdGhpcy5nZXRMb2FkUG9zaXRpb24oKTtcbiAgfVxuICBmbHVzaE1haW5CdWZmZXIoZSwgdCkge1xuICAgIHN1cGVyLmZsdXNoTWFpbkJ1ZmZlcihlLCB0LCB0aGlzLmFsdEF1ZGlvID09PSAyID8gXCJ2aWRlb1wiIDogbnVsbCk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGVkKGUsIHQpIHtcbiAgICBzdXBlci5vbk1lZGlhQXR0YWNoZWQoZSwgdCk7XG4gICAgY29uc3QgciA9IHQubWVkaWE7XG4gICAgY3IociwgXCJwbGF5aW5nXCIsIHRoaXMub25NZWRpYVBsYXlpbmcpLCBjcihyLCBcInNlZWtlZFwiLCB0aGlzLm9uTWVkaWFTZWVrZWQpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiByXG4gICAgfSA9IHRoaXM7XG4gICAgciAmJiAocHIociwgXCJwbGF5aW5nXCIsIHRoaXMub25NZWRpYVBsYXlpbmcpLCBwcihyLCBcInNlZWtlZFwiLCB0aGlzLm9uTWVkaWFTZWVrZWQpKSwgdGhpcy52aWRlb0J1ZmZlciA9IG51bGwsIHRoaXMuZnJhZ1BsYXlpbmcgPSBudWxsLCBzdXBlci5vbk1lZGlhRGV0YWNoaW5nKGUsIHQpLCAhdC50cmFuc2Zlck1lZGlhICYmICh0aGlzLl9oYXNFbm91Z2hUb1N0YXJ0ID0gITEpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKCkge1xuICAgIHN1cGVyLm9uTWFuaWZlc3RMb2FkaW5nKCksIHRoaXMubG9nKFwiVHJpZ2dlciBCVUZGRVJfUkVTRVRcIiksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfUkVTRVQsIHZvaWQgMCksIHRoaXMuY291bGRCYWNrdHJhY2sgPSAhMSwgdGhpcy5mcmFnTGFzdEticHMgPSAwLCB0aGlzLmZyYWdQbGF5aW5nID0gdGhpcy5iYWNrdHJhY2tGcmFnbWVudCA9IG51bGwsIHRoaXMuYWx0QXVkaW8gPSAwLCB0aGlzLmF1ZGlvT25seSA9ICExO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIGxldCByID0gITEsIG4gPSAhMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gdC5sZXZlbHNbaV0uYXVkaW9Db2RlYztcbiAgICAgIG8gJiYgKHIgPSByIHx8IG8uaW5kZXhPZihcIm1wNGEuNDAuMlwiKSAhPT0gLTEsIG4gPSBuIHx8IG8uaW5kZXhPZihcIm1wNGEuNDAuNVwiKSAhPT0gLTEpO1xuICAgIH1cbiAgICB0aGlzLmF1ZGlvQ29kZWNTd2l0Y2ggPSByICYmIG4gJiYgIUVBKCksIHRoaXMuYXVkaW9Db2RlY1N3aXRjaCAmJiB0aGlzLmxvZyhcIkJvdGggQUFDL0hFLUFBQyBhdWRpbyBmb3VuZCBpbiBsZXZlbHM7IGRlY2xhcmluZyBsZXZlbCBjb2RlYyBhcyBIRS1BQUNcIiksIHRoaXMubGV2ZWxzID0gdC5sZXZlbHMsIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7XG4gIH1cbiAgb25MZXZlbExvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogclxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghciB8fCB0aGlzLnN0YXRlICE9PSBuZS5JRExFKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0LmxldmVsSW5mbztcbiAgICAoIW4uZGV0YWlscyB8fCBuLmRldGFpbHMubGl2ZSAmJiAodGhpcy5sZXZlbExhc3RMb2FkZWQgIT09IG4gfHwgbi5kZXRhaWxzLmV4cGlyZWQpIHx8IHRoaXMud2FpdEZvckNkblR1bmVJbihuLmRldGFpbHMpKSAmJiAodGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfTEVWRUwpO1xuICB9XG4gIG9uTGV2ZWxMb2FkZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogbixcbiAgICAgIHN0YXJ0RnJhZ1JlcXVlc3RlZDogaVxuICAgIH0gPSB0aGlzLCBvID0gdC5sZXZlbCwgYSA9IHQuZGV0YWlscywgbCA9IGEudG90YWxkdXJhdGlvbjtcbiAgICBpZiAoIW4pIHtcbiAgICAgIHRoaXMud2FybihgTGV2ZWxzIHdlcmUgcmVzZXQgd2hpbGUgbG9hZGluZyBsZXZlbCAke299YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nKGBMZXZlbCAke299IGxvYWRlZCBbJHthLnN0YXJ0U059LCR7YS5lbmRTTn1dJHthLmxhc3RQYXJ0U24gPyBgW3BhcnQtJHthLmxhc3RQYXJ0U259LSR7YS5sYXN0UGFydEluZGV4fV1gIDogXCJcIn0sIGNjIFske2Euc3RhcnRDQ30sICR7YS5lbmRDQ31dIGR1cmF0aW9uOiR7bH1gKTtcbiAgICBjb25zdCBjID0gdC5sZXZlbEluZm8sIHUgPSB0aGlzLmZyYWdDdXJyZW50O1xuICAgIHUgJiYgKHRoaXMuc3RhdGUgPT09IG5lLkZSQUdfTE9BRElORyB8fCB0aGlzLnN0YXRlID09PSBuZS5GUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWSkgJiYgdS5sZXZlbCAhPT0gdC5sZXZlbCAmJiB1LmxvYWRlciAmJiB0aGlzLmFib3J0Q3VycmVudEZyYWcoKTtcbiAgICBsZXQgZCA9IDA7XG4gICAgaWYgKGEubGl2ZSB8fCAociA9IGMuZGV0YWlscykgIT0gbnVsbCAmJiByLmxpdmUpIHtcbiAgICAgIHZhciBoO1xuICAgICAgaWYgKHRoaXMuY2hlY2tMaXZlVXBkYXRlKGEpLCBhLmRlbHRhVXBkYXRlRmFpbGVkKVxuICAgICAgICByZXR1cm47XG4gICAgICBkID0gdGhpcy5hbGlnblBsYXlsaXN0cyhhLCBjLmRldGFpbHMsIChoID0gdGhpcy5sZXZlbExhc3RMb2FkZWQpID09IG51bGwgPyB2b2lkIDAgOiBoLmRldGFpbHMpO1xuICAgIH1cbiAgICBpZiAoYy5kZXRhaWxzID0gYSwgdGhpcy5sZXZlbExhc3RMb2FkZWQgPSBjLCBpIHx8IHRoaXMuc2V0U3RhcnRQb3NpdGlvbihhLCBkKSwgdGhpcy5obHMudHJpZ2dlcihJLkxFVkVMX1VQREFURUQsIHtcbiAgICAgIGRldGFpbHM6IGEsXG4gICAgICBsZXZlbDogb1xuICAgIH0pLCB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX0xFVkVMKSB7XG4gICAgICBpZiAodGhpcy53YWl0Rm9yQ2RuVHVuZUluKGEpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnN0YXRlID0gbmUuSURMRTtcbiAgICB9XG4gICAgaSAmJiBhLmxpdmUgJiYgdGhpcy5zeW5jaHJvbml6ZVRvTGl2ZUVkZ2UoYSksIHRoaXMudGljaygpO1xuICB9XG4gIHN5bmNocm9uaXplVG9MaXZlRWRnZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiB0LFxuICAgICAgbWVkaWE6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IHRoaXMuaGxzLmxpdmVTeW5jUG9zaXRpb24sIGkgPSB0aGlzLmdldExvYWRQb3NpdGlvbigpLCBvID0gZS5mcmFnbWVudFN0YXJ0LCBhID0gZS5lZGdlLCBsID0gaSA+PSBvIC0gdC5tYXhGcmFnTG9va1VwVG9sZXJhbmNlICYmIGkgPD0gYTtcbiAgICBpZiAobiAhPT0gbnVsbCAmJiByLmR1cmF0aW9uID4gbiAmJiAoaSA8IG4gfHwgIWwpKSB7XG4gICAgICBjb25zdCB1ID0gdC5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uICE9PSB2b2lkIDAgPyB0LmxpdmVNYXhMYXRlbmN5RHVyYXRpb24gOiB0LmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCAqIGUudGFyZ2V0ZHVyYXRpb247XG4gICAgICBpZiAoKCFsICYmIHIucmVhZHlTdGF0ZSA8IDQgfHwgaSA8IGEgLSB1KSAmJiAodGhpcy5faGFzRW5vdWdoVG9TdGFydCB8fCAodGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gbiksIHIucmVhZHlTdGF0ZSkpXG4gICAgICAgIGlmICh0aGlzLndhcm4oYFBsYXliYWNrOiAke2kudG9GaXhlZCgzKX0gaXMgbG9jYXRlZCB0b28gZmFyIGZyb20gdGhlIGVuZCBvZiBsaXZlIHNsaWRpbmcgcGxheWxpc3Q6ICR7YX0sIHJlc2V0IGN1cnJlbnRUaW1lIHRvIDogJHtuLnRvRml4ZWQoMyl9YCksIHRoaXMuY29uZmlnLmxpdmVTeW5jTW9kZSA9PT0gXCJidWZmZXJlZFwiKSB7XG4gICAgICAgICAgdmFyIGM7XG4gICAgICAgICAgY29uc3QgZCA9IENlLmJ1ZmZlckluZm8ociwgbiwgMCk7XG4gICAgICAgICAgaWYgKCEoKGMgPSBkLmJ1ZmZlcmVkKSAhPSBudWxsICYmIGMubGVuZ3RoKSkge1xuICAgICAgICAgICAgci5jdXJyZW50VGltZSA9IG47XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkLnN0YXJ0IDw9IGkpIHtcbiAgICAgICAgICAgIHIuY3VycmVudFRpbWUgPSBuO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuZXh0U3RhcnQ6IGZcbiAgICAgICAgICB9ID0gQ2UuYnVmZmVyZWRJbmZvKGQuYnVmZmVyZWQsIGksIDApO1xuICAgICAgICAgIGYgJiYgKHIuY3VycmVudFRpbWUgPSBmKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgci5jdXJyZW50VGltZSA9IG47XG4gICAgfVxuICB9XG4gIF9oYW5kbGVGcmFnbWVudExvYWRQcm9ncmVzcyhlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3QgciA9IGUuZnJhZywge1xuICAgICAgcGFydDogbixcbiAgICAgIHBheWxvYWQ6IGlcbiAgICB9ID0gZSwge1xuICAgICAgbGV2ZWxzOiBvXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFvKSB7XG4gICAgICB0aGlzLndhcm4oYExldmVscyB3ZXJlIHJlc2V0IHdoaWxlIGZyYWdtZW50IGxvYWQgd2FzIGluIHByb2dyZXNzLiBGcmFnbWVudCAke3Iuc259IG9mIGxldmVsICR7ci5sZXZlbH0gd2lsbCBub3QgYmUgYnVmZmVyZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYSA9IG9bci5sZXZlbF07XG4gICAgaWYgKCFhKSB7XG4gICAgICB0aGlzLndhcm4oYExldmVsICR7ci5sZXZlbH0gbm90IGZvdW5kIG9uIHByb2dyZXNzYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGwgPSBhLmRldGFpbHM7XG4gICAgaWYgKCFsKSB7XG4gICAgICB0aGlzLndhcm4oYERyb3BwaW5nIGZyYWdtZW50ICR7ci5zbn0gb2YgbGV2ZWwgJHtyLmxldmVsfSBhZnRlciBsZXZlbCBkZXRhaWxzIHdlcmUgcmVzZXRgKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQocik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGMgPSBhLnZpZGVvQ29kZWMsIHUgPSBsLlBUU0tub3duIHx8ICFsLmxpdmUsIGQgPSAodCA9IHIuaW5pdFNlZ21lbnQpID09IG51bGwgPyB2b2lkIDAgOiB0LmRhdGEsIGggPSB0aGlzLl9nZXRBdWRpb0NvZGVjKGEpLCBmID0gdGhpcy50cmFuc211eGVyID0gdGhpcy50cmFuc211eGVyIHx8IG5ldyB3cCh0aGlzLmhscywgcGUuTUFJTiwgdGhpcy5faGFuZGxlVHJhbnNtdXhDb21wbGV0ZS5iaW5kKHRoaXMpLCB0aGlzLl9oYW5kbGVUcmFuc211eGVyRmx1c2guYmluZCh0aGlzKSksIHAgPSBuID8gbi5pbmRleCA6IC0xLCB5ID0gcCAhPT0gLTEsIEUgPSBuZXcgRXUoci5sZXZlbCwgci5zbiwgci5zdGF0cy5jaHVua0NvdW50LCBpLmJ5dGVMZW5ndGgsIHAsIHkpLCBiID0gdGhpcy5pbml0UFRTW3IuY2NdO1xuICAgIGYucHVzaChpLCBkLCBoLCBjLCByLCBuLCBsLnRvdGFsZHVyYXRpb24sIHUsIEUsIGIpO1xuICB9XG4gIG9uQXVkaW9UcmFja1N3aXRjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLCBuID0gdGhpcy5hbHRBdWRpbyA9PT0gMjtcbiAgICBpZiAoUW8odC51cmwsIHIpKVxuICAgICAgdGhpcy5hbHRBdWRpbyA9IDE7XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5tZWRpYUJ1ZmZlciAhPT0gdGhpcy5tZWRpYSkge1xuICAgICAgICB0aGlzLmxvZyhcIlN3aXRjaGluZyBvbiBtYWluIGF1ZGlvLCB1c2UgbWVkaWEuYnVmZmVyZWQgdG8gc2NoZWR1bGUgbWFpbiBmcmFnbWVudCBsb2FkaW5nXCIpLCB0aGlzLm1lZGlhQnVmZmVyID0gdGhpcy5tZWRpYTtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMuZnJhZ0N1cnJlbnQ7XG4gICAgICAgIG8gJiYgKHRoaXMubG9nKFwiU3dpdGNoaW5nIHRvIG1haW4gYXVkaW8gdHJhY2ssIGNhbmNlbCBtYWluIGZyYWdtZW50IGxvYWRcIiksIG8uYWJvcnRSZXF1ZXN0cygpLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChvKSksIHRoaXMucmVzZXRUcmFuc211eGVyKCksIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKTtcbiAgICAgIH0gZWxzZSB0aGlzLmF1ZGlvT25seSAmJiB0aGlzLnJlc2V0VHJhbnNtdXhlcigpO1xuICAgICAgaWYgKG4pIHtcbiAgICAgICAgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlQWxsRnJhZ21lbnRzKCksIHIub25jZShJLkJVRkZFUl9GTFVTSEVELCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5obHMgJiYgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSEVELCB0KTtcbiAgICAgICAgfSksIHIudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywge1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiAwLFxuICAgICAgICAgIGVuZE9mZnNldDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHR5cGU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHIudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSEVELCB0KTtcbiAgICB9XG4gIH1cbiAgb25BdWRpb1RyYWNrU3dpdGNoZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBRbyh0LnVybCwgdGhpcy5obHMpO1xuICAgIGlmIChyKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy52aWRlb0J1ZmZlcjtcbiAgICAgIG4gJiYgdGhpcy5tZWRpYUJ1ZmZlciAhPT0gbiAmJiAodGhpcy5sb2coXCJTd2l0Y2hpbmcgb24gYWx0ZXJuYXRlIGF1ZGlvLCB1c2UgdmlkZW8uYnVmZmVyZWQgdG8gc2NoZWR1bGUgbWFpbiBmcmFnbWVudCBsb2FkaW5nXCIpLCB0aGlzLm1lZGlhQnVmZmVyID0gbik7XG4gICAgfVxuICAgIHRoaXMuYWx0QXVkaW8gPSByID8gMiA6IDAsIHRoaXMudGljaygpO1xuICB9XG4gIG9uQnVmZmVyQ3JlYXRlZChlLCB0KSB7XG4gICAgY29uc3QgciA9IHQudHJhY2tzO1xuICAgIGxldCBuLCBpLCBvID0gITE7XG4gICAgZm9yIChjb25zdCBhIGluIHIpIHtcbiAgICAgIGNvbnN0IGwgPSByW2FdO1xuICAgICAgaWYgKGwuaWQgPT09IFwibWFpblwiKSB7XG4gICAgICAgIGlmIChpID0gYSwgbiA9IGwsIGEgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgIGNvbnN0IGMgPSByW2FdO1xuICAgICAgICAgIGMgJiYgKHRoaXMudmlkZW9CdWZmZXIgPSBjLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICBvID0gITA7XG4gICAgfVxuICAgIG8gJiYgbiA/ICh0aGlzLmxvZyhgQWx0ZXJuYXRlIHRyYWNrIGZvdW5kLCB1c2UgJHtpfS5idWZmZXJlZCB0byBzY2hlZHVsZSBtYWluIGZyYWdtZW50IGxvYWRpbmdgKSwgdGhpcy5tZWRpYUJ1ZmZlciA9IG4uYnVmZmVyKSA6IHRoaXMubWVkaWFCdWZmZXIgPSB0aGlzLm1lZGlhO1xuICB9XG4gIG9uRnJhZ0J1ZmZlcmVkKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgcGFydDogblxuICAgIH0gPSB0LCBpID0gci50eXBlID09PSBwZS5NQUlOO1xuICAgIGlmIChpKSB7XG4gICAgICBpZiAodGhpcy5mcmFnQ29udGV4dENoYW5nZWQocikpIHtcbiAgICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCAke3Iuc259JHtuID8gXCIgcDogXCIgKyBuLmluZGV4IDogXCJcIn0gb2YgbGV2ZWwgJHtyLmxldmVsfSBmaW5pc2hlZCBidWZmZXJpbmcsIGJ1dCB3YXMgYWJvcnRlZC4gc3RhdGU6ICR7dGhpcy5zdGF0ZX1gKSwgdGhpcy5zdGF0ZSA9PT0gbmUuUEFSU0VEICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGEgPSBuID8gbi5zdGF0cyA6IHIuc3RhdHM7XG4gICAgICB0aGlzLmZyYWdMYXN0S2JwcyA9IE1hdGgucm91bmQoOCAqIGEudG90YWwgLyAoYS5idWZmZXJpbmcuZW5kIC0gYS5sb2FkaW5nLmZpcnN0KSksIFZ0KHIpICYmICh0aGlzLmZyYWdQcmV2aW91cyA9IHIpLCB0aGlzLmZyYWdCdWZmZXJlZENvbXBsZXRlKHIsIG4pO1xuICAgIH1cbiAgICBjb25zdCBvID0gdGhpcy5tZWRpYTtcbiAgICBvICYmICghdGhpcy5faGFzRW5vdWdoVG9TdGFydCAmJiBDZS5nZXRCdWZmZXJlZChvKS5sZW5ndGggJiYgKHRoaXMuX2hhc0Vub3VnaFRvU3RhcnQgPSAhMCwgdGhpcy5zZWVrVG9TdGFydFBvcygpKSwgaSAmJiB0aGlzLnRpY2soKSk7XG4gIH1cbiAgZ2V0IGhhc0Vub3VnaFRvU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0Vub3VnaFRvU3RhcnQ7XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgaWYgKHQuZmF0YWwpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBuZS5FUlJPUjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0LmRldGFpbHMpIHtcbiAgICAgIGNhc2UgSi5GUkFHX0dBUDpcbiAgICAgIGNhc2UgSi5GUkFHX1BBUlNJTkdfRVJST1I6XG4gICAgICBjYXNlIEouRlJBR19ERUNSWVBUX0VSUk9SOlxuICAgICAgY2FzZSBKLkZSQUdfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5GUkFHX0xPQURfVElNRU9VVDpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9USU1FT1VUOlxuICAgICAgICB0aGlzLm9uRnJhZ21lbnRPcktleUxvYWRFcnJvcihwZS5NQUlOLCB0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEouTEVWRUxfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5MRVZFTF9MT0FEX1RJTUVPVVQ6XG4gICAgICBjYXNlIEouTEVWRUxfUEFSU0lOR19FUlJPUjpcbiAgICAgICAgIXQubGV2ZWxSZXRyeSAmJiB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX0xFVkVMICYmICgociA9IHQuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIudHlwZSkgPT09IEtlLkxFVkVMICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLkJVRkZFUl9BRERfQ09ERUNfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX0FQUEVORF9FUlJPUjpcbiAgICAgICAgaWYgKHQucGFyZW50ICE9PSBcIm1haW5cIilcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVkdWNlTGVuZ3RoQW5kRmx1c2hCdWZmZXIodCkgJiYgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgSi5CVUZGRVJfRlVMTF9FUlJPUjpcbiAgICAgICAgaWYgKHQucGFyZW50ICE9PSBcIm1haW5cIilcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVkdWNlTGVuZ3RoQW5kRmx1c2hCdWZmZXIodCkgJiYgKCF0aGlzLmNvbmZpZy5pbnRlcnN0aXRpYWxzQ29udHJvbGxlciAmJiB0aGlzLmNvbmZpZy5hc3NldFBsYXllcklkID8gdGhpcy5faGFzRW5vdWdoVG9TdGFydCA9ICEwIDogdGhpcy5mbHVzaE1haW5CdWZmZXIoMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLklOVEVSTkFMX0VYQ0VQVElPTjpcbiAgICAgICAgdGhpcy5yZWNvdmVyV29ya2VyRXJyb3IodCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBvbkZyYWdMb2FkRW1lcmdlbmN5QWJvcnRlZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gbmUuSURMRSwgdGhpcy5faGFzRW5vdWdoVG9TdGFydCB8fCAodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMSwgdGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gdGhpcy5sYXN0Q3VycmVudFRpbWUpLCB0aGlzLnRpY2tJbW1lZGlhdGUoKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoZWQoZSwge1xuICAgIHR5cGU6IHRcbiAgfSkge1xuICAgIGlmICh0ICE9PSBvdC5BVURJTyB8fCAhdGhpcy5hbHRBdWRpbykge1xuICAgICAgY29uc3QgciA9ICh0ID09PSBvdC5WSURFTyA/IHRoaXMudmlkZW9CdWZmZXIgOiB0aGlzLm1lZGlhQnVmZmVyKSB8fCB0aGlzLm1lZGlhO1xuICAgICAgciAmJiAodGhpcy5hZnRlckJ1ZmZlckZsdXNoZWQociwgdCwgcGUuTUFJTiksIHRoaXMudGljaygpKTtcbiAgICB9XG4gIH1cbiAgb25MZXZlbHNVcGRhdGVkKGUsIHQpIHtcbiAgICB0aGlzLmxldmVsID4gLTEgJiYgdGhpcy5mcmFnQ3VycmVudCAmJiAodGhpcy5sZXZlbCA9IHRoaXMuZnJhZ0N1cnJlbnQubGV2ZWwsIHRoaXMubGV2ZWwgPT09IC0xICYmIHRoaXMucmVzZXRXaGVuTWlzc2luZ0NvbnRleHQodGhpcy5mcmFnQ3VycmVudCkpLCB0aGlzLmxldmVscyA9IHQubGV2ZWxzO1xuICB9XG4gIHN3YXBBdWRpb0NvZGVjKCkge1xuICAgIHRoaXMuYXVkaW9Db2RlY1N3YXAgPSAhdGhpcy5hdWRpb0NvZGVjU3dhcDtcbiAgfVxuICAvKipcbiAgICogU2Vla3MgdG8gdGhlIHNldCBzdGFydFBvc2l0aW9uIGlmIG5vdCBlcXVhbCB0byB0aGUgbWVkaWFFbGVtZW50J3MgY3VycmVudCB0aW1lLlxuICAgKi9cbiAgc2Vla1RvU3RhcnRQb3MoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGVcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IGUuY3VycmVudFRpbWU7XG4gICAgbGV0IHIgPSB0aGlzLnN0YXJ0UG9zaXRpb247XG4gICAgaWYgKHIgPj0gMCAmJiB0IDwgcikge1xuICAgICAgaWYgKGUuc2Vla2luZykge1xuICAgICAgICB0aGlzLmxvZyhgY291bGQgbm90IHNlZWsgdG8gJHtyfSwgYWxyZWFkeSBzZWVraW5nIGF0ICR7dH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbiA9IHRoaXMudGltZWxpbmVPZmZzZXQ7XG4gICAgICBuICYmIHIgJiYgKHIgKz0gbik7XG4gICAgICBjb25zdCBpID0gdGhpcy5nZXRMZXZlbERldGFpbHMoKSwgbyA9IENlLmdldEJ1ZmZlcmVkKGUpLCBhID0gby5sZW5ndGggPyBvLnN0YXJ0KDApIDogMCwgbCA9IGEgLSByLCBjID0gTWF0aC5tYXgodGhpcy5jb25maWcubWF4QnVmZmVySG9sZSwgdGhpcy5jb25maWcubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSk7XG4gICAgICAodGhpcy5jb25maWcuc3RhcnRPblNlZ21lbnRCb3VuZGFyeSB8fCBsID4gMCAmJiAobCA8IGMgfHwgdGhpcy5sb2FkaW5nUGFydHMgJiYgbCA8IDIgKiAoKGkgPT0gbnVsbCA/IHZvaWQgMCA6IGkucGFydFRhcmdldCkgfHwgMCkpKSAmJiAodGhpcy5sb2coYGFkanVzdGluZyBzdGFydCBwb3NpdGlvbiBieSAke2x9IHRvIG1hdGNoIGJ1ZmZlciBzdGFydGApLCByICs9IGwsIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHIpLCB0IDwgciAmJiAodGhpcy5sb2coYHNlZWsgdG8gdGFyZ2V0IHN0YXJ0IHBvc2l0aW9uICR7cn0gZnJvbSBjdXJyZW50IHRpbWUgJHt0fSBidWZmZXIgc3RhcnQgJHthfWApLCBlLmN1cnJlbnRUaW1lID0gcik7XG4gICAgfVxuICB9XG4gIF9nZXRBdWRpb0NvZGVjKGUpIHtcbiAgICBsZXQgdCA9IHRoaXMuY29uZmlnLmRlZmF1bHRBdWRpb0NvZGVjIHx8IGUuYXVkaW9Db2RlYztcbiAgICByZXR1cm4gdGhpcy5hdWRpb0NvZGVjU3dhcCAmJiB0ICYmICh0aGlzLmxvZyhcIlN3YXBwaW5nIGF1ZGlvIGNvZGVjXCIpLCB0LmluZGV4T2YoXCJtcDRhLjQwLjVcIikgIT09IC0xID8gdCA9IFwibXA0YS40MC4yXCIgOiB0ID0gXCJtcDRhLjQwLjVcIiksIHQ7XG4gIH1cbiAgX2xvYWRCaXRyYXRlVGVzdEZyYWcoZSwgdCkge1xuICAgIGUuYml0cmF0ZVRlc3QgPSAhMCwgdGhpcy5fZG9GcmFnTG9hZChlLCB0KS50aGVuKChyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhsczogblxuICAgICAgfSA9IHRoaXMsIGkgPSByID09IG51bGwgPyB2b2lkIDAgOiByLmZyYWc7XG4gICAgICBpZiAoIWkgfHwgdGhpcy5mcmFnQ29udGV4dENoYW5nZWQoaSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHQuZnJhZ21lbnRFcnJvciA9IDAsIHRoaXMuc3RhdGUgPSBuZS5JRExFLCB0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCA9ICExLCB0aGlzLmJpdHJhdGVUZXN0ID0gITE7XG4gICAgICBjb25zdCBvID0gaS5zdGF0cztcbiAgICAgIG8ucGFyc2luZy5zdGFydCA9IG8ucGFyc2luZy5lbmQgPSBvLmJ1ZmZlcmluZy5zdGFydCA9IG8uYnVmZmVyaW5nLmVuZCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIG4udHJpZ2dlcihJLkZSQUdfTE9BREVELCByKSwgaS5iaXRyYXRlVGVzdCA9ICExO1xuICAgIH0pLmNhdGNoKChyKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID09PSBuZS5TVE9QUEVEIHx8IHRoaXMuc3RhdGUgPT09IG5lLkVSUk9SIHx8ICh0aGlzLndhcm4ociksIHRoaXMucmVzZXRGcmFnbWVudExvYWRpbmcoZSkpO1xuICAgIH0pO1xuICB9XG4gIF9oYW5kbGVUcmFuc211eENvbXBsZXRlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5wbGF5bGlzdFR5cGUsIHtcbiAgICAgIGhsczogclxuICAgIH0gPSB0aGlzLCB7XG4gICAgICByZW11eFJlc3VsdDogbixcbiAgICAgIGNodW5rTWV0YTogaVxuICAgIH0gPSBlLCBvID0gdGhpcy5nZXRDdXJyZW50Q29udGV4dChpKTtcbiAgICBpZiAoIW8pIHtcbiAgICAgIHRoaXMucmVzZXRXaGVuTWlzc2luZ0NvbnRleHQoaSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IGEsXG4gICAgICBwYXJ0OiBsLFxuICAgICAgbGV2ZWw6IGNcbiAgICB9ID0gbywge1xuICAgICAgdmlkZW86IHUsXG4gICAgICB0ZXh0OiBkLFxuICAgICAgaWQzOiBoLFxuICAgICAgaW5pdFNlZ21lbnQ6IGZcbiAgICB9ID0gbiwge1xuICAgICAgZGV0YWlsczogcFxuICAgIH0gPSBjLCB5ID0gdGhpcy5hbHRBdWRpbyA/IHZvaWQgMCA6IG4uYXVkaW87XG4gICAgaWYgKHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKGEpKSB7XG4gICAgICB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUgPSBuZS5QQVJTSU5HLCBmKSB7XG4gICAgICBjb25zdCBFID0gZi50cmFja3M7XG4gICAgICBpZiAoRSkge1xuICAgICAgICBjb25zdCBGID0gYS5pbml0U2VnbWVudCB8fCBhO1xuICAgICAgICBpZiAodGhpcy51bmhhbmRsZWRFbmNyeXB0aW9uRXJyb3IoZiwgYSkpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9idWZmZXJJbml0U2VnbWVudChjLCBFLCBGLCBpKSwgci50cmlnZ2VyKEkuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCwge1xuICAgICAgICAgIGZyYWc6IEYsXG4gICAgICAgICAgaWQ6IHQsXG4gICAgICAgICAgdHJhY2tzOiBFXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYiA9IGYuaW5pdFBUUywgUiA9IGYudGltZXNjYWxlLCBBID0gdGhpcy5pbml0UFRTW2EuY2NdO1xuICAgICAgaWYgKHVlKGIpICYmICghQSB8fCBBLmJhc2VUaW1lICE9PSBiIHx8IEEudGltZXNjYWxlICE9PSBSKSkge1xuICAgICAgICBjb25zdCBGID0gZi50cmFja0lkO1xuICAgICAgICB0aGlzLmluaXRQVFNbYS5jY10gPSB7XG4gICAgICAgICAgYmFzZVRpbWU6IGIsXG4gICAgICAgICAgdGltZXNjYWxlOiBSLFxuICAgICAgICAgIHRyYWNrSWQ6IEZcbiAgICAgICAgfSwgci50cmlnZ2VyKEkuSU5JVF9QVFNfRk9VTkQsIHtcbiAgICAgICAgICBmcmFnOiBhLFxuICAgICAgICAgIGlkOiB0LFxuICAgICAgICAgIGluaXRQVFM6IGIsXG4gICAgICAgICAgdGltZXNjYWxlOiBSLFxuICAgICAgICAgIHRyYWNrSWQ6IEZcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh1ICYmIHApIHtcbiAgICAgIHkgJiYgdS50eXBlID09PSBcImF1ZGlvdmlkZW9cIiAmJiB0aGlzLmxvZ011eGVkRXJyKGEpO1xuICAgICAgY29uc3QgRSA9IHAuZnJhZ21lbnRzW2Euc24gLSAxIC0gcC5zdGFydFNOXSwgYiA9IGEuc24gPT09IHAuc3RhcnRTTiwgUiA9ICFFIHx8IGEuY2MgPiBFLmNjO1xuICAgICAgaWYgKG4uaW5kZXBlbmRlbnQgIT09ICExKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBzdGFydFBUUzogQSxcbiAgICAgICAgICBlbmRQVFM6IEYsXG4gICAgICAgICAgc3RhcnREVFM6IE0sXG4gICAgICAgICAgZW5kRFRTOiBIXG4gICAgICAgIH0gPSB1O1xuICAgICAgICBpZiAobClcbiAgICAgICAgICBsLmVsZW1lbnRhcnlTdHJlYW1zW3UudHlwZV0gPSB7XG4gICAgICAgICAgICBzdGFydFBUUzogQSxcbiAgICAgICAgICAgIGVuZFBUUzogRixcbiAgICAgICAgICAgIHN0YXJ0RFRTOiBNLFxuICAgICAgICAgICAgZW5kRFRTOiBIXG4gICAgICAgICAgfTtcbiAgICAgICAgZWxzZSBpZiAodS5maXJzdEtleUZyYW1lICYmIHUuaW5kZXBlbmRlbnQgJiYgaS5pZCA9PT0gMSAmJiAhUiAmJiAodGhpcy5jb3VsZEJhY2t0cmFjayA9ICEwKSwgdS5kcm9wcGVkICYmIHUuaW5kZXBlbmRlbnQpIHtcbiAgICAgICAgICBjb25zdCBLID0gdGhpcy5nZXRNYWluRndkQnVmZmVySW5mbygpLCBqID0gKEsgPyBLLmVuZCA6IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCkpICsgdGhpcy5jb25maWcubWF4QnVmZmVySG9sZSwgQyA9IHUuZmlyc3RLZXlGcmFtZVBUUyA/IHUuZmlyc3RLZXlGcmFtZVBUUyA6IEE7XG4gICAgICAgICAgaWYgKCFiICYmIGogPCBDIC0gdGhpcy5jb25maWcubWF4QnVmZmVySG9sZSAmJiAhUikge1xuICAgICAgICAgICAgdGhpcy5iYWNrdHJhY2soYSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBlbHNlIFIgJiYgKGEuZ2FwID0gITApO1xuICAgICAgICAgIGEuc2V0RWxlbWVudGFyeVN0cmVhbUluZm8odS50eXBlLCBhLnN0YXJ0LCBGLCBhLnN0YXJ0LCBILCAhMCk7XG4gICAgICAgIH0gZWxzZSBiICYmIEEgLSAocC5hcHBsaWVkVGltZWxpbmVPZmZzZXQgfHwgMCkgPiB4byAmJiAoYS5nYXAgPSAhMCk7XG4gICAgICAgIGEuc2V0RWxlbWVudGFyeVN0cmVhbUluZm8odS50eXBlLCBBLCBGLCBNLCBIKSwgdGhpcy5iYWNrdHJhY2tGcmFnbWVudCAmJiAodGhpcy5iYWNrdHJhY2tGcmFnbWVudCA9IGEpLCB0aGlzLmJ1ZmZlckZyYWdtZW50RGF0YSh1LCBhLCBsLCBpLCBiIHx8IFIpO1xuICAgICAgfSBlbHNlIGlmIChiIHx8IFIpXG4gICAgICAgIGEuZ2FwID0gITA7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5iYWNrdHJhY2soYSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhcnRQVFM6IEUsXG4gICAgICAgIGVuZFBUUzogYixcbiAgICAgICAgc3RhcnREVFM6IFIsXG4gICAgICAgIGVuZERUUzogQVxuICAgICAgfSA9IHk7XG4gICAgICBsICYmIChsLmVsZW1lbnRhcnlTdHJlYW1zW290LkFVRElPXSA9IHtcbiAgICAgICAgc3RhcnRQVFM6IEUsXG4gICAgICAgIGVuZFBUUzogYixcbiAgICAgICAgc3RhcnREVFM6IFIsXG4gICAgICAgIGVuZERUUzogQVxuICAgICAgfSksIGEuc2V0RWxlbWVudGFyeVN0cmVhbUluZm8ob3QuQVVESU8sIEUsIGIsIFIsIEEpLCB0aGlzLmJ1ZmZlckZyYWdtZW50RGF0YSh5LCBhLCBsLCBpKTtcbiAgICB9XG4gICAgaWYgKHAgJiYgaCAhPSBudWxsICYmIGguc2FtcGxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IEUgPSB7XG4gICAgICAgIGlkOiB0LFxuICAgICAgICBmcmFnOiBhLFxuICAgICAgICBkZXRhaWxzOiBwLFxuICAgICAgICBzYW1wbGVzOiBoLnNhbXBsZXNcbiAgICAgIH07XG4gICAgICByLnRyaWdnZXIoSS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIEUpO1xuICAgIH1cbiAgICBpZiAocCAmJiBkKSB7XG4gICAgICBjb25zdCBFID0ge1xuICAgICAgICBpZDogdCxcbiAgICAgICAgZnJhZzogYSxcbiAgICAgICAgZGV0YWlsczogcCxcbiAgICAgICAgc2FtcGxlczogZC5zYW1wbGVzXG4gICAgICB9O1xuICAgICAgci50cmlnZ2VyKEkuRlJBR19QQVJTSU5HX1VTRVJEQVRBLCBFKTtcbiAgICB9XG4gIH1cbiAgbG9nTXV4ZWRFcnIoZSkge1xuICAgIHRoaXMud2FybihgJHtWdChlKSA/IFwiTWVkaWFcIiA6IFwiSW5pdFwifSBzZWdtZW50IHdpdGggbXV4ZWQgYXVkaW92aWRlbyB3aGVyZSBvbmx5IHZpZGVvIGV4cGVjdGVkOiAke2UudXJsfWApO1xuICB9XG4gIF9idWZmZXJJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IG5lLlBBUlNJTkcpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5hdWRpb09ubHkgPSAhIXQuYXVkaW8gJiYgIXQudmlkZW8sIHRoaXMuYWx0QXVkaW8gJiYgIXRoaXMuYXVkaW9Pbmx5ICYmIChkZWxldGUgdC5hdWRpbywgdC5hdWRpb3ZpZGVvICYmIHRoaXMubG9nTXV4ZWRFcnIocikpO1xuICAgIGNvbnN0IHtcbiAgICAgIGF1ZGlvOiBpLFxuICAgICAgdmlkZW86IG8sXG4gICAgICBhdWRpb3ZpZGVvOiBhXG4gICAgfSA9IHQ7XG4gICAgaWYgKGkpIHtcbiAgICAgIGNvbnN0IGMgPSBlLmF1ZGlvQ29kZWM7XG4gICAgICBsZXQgdSA9IGZvKGkuY29kZWMsIGMpO1xuICAgICAgdSA9PT0gXCJtcDRhXCIgJiYgKHUgPSBcIm1wNGEuNDAuNVwiKTtcbiAgICAgIGNvbnN0IGQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGhpcy5hdWRpb0NvZGVjU3dpdGNoKSB7XG4gICAgICAgIHUgJiYgKHUuaW5kZXhPZihcIm1wNGEuNDAuNVwiKSAhPT0gLTEgPyB1ID0gXCJtcDRhLjQwLjJcIiA6IHUgPSBcIm1wNGEuNDAuNVwiKTtcbiAgICAgICAgY29uc3QgaCA9IGkubWV0YWRhdGE7XG4gICAgICAgIGggJiYgXCJjaGFubmVsQ291bnRcIiBpbiBoICYmIChoLmNoYW5uZWxDb3VudCB8fCAxKSAhPT0gMSAmJiBkLmluZGV4T2YoXCJmaXJlZm94XCIpID09PSAtMSAmJiAodSA9IFwibXA0YS40MC41XCIpO1xuICAgICAgfVxuICAgICAgdSAmJiB1LmluZGV4T2YoXCJtcDRhLjQwLjVcIikgIT09IC0xICYmIGQuaW5kZXhPZihcImFuZHJvaWRcIikgIT09IC0xICYmIGkuY29udGFpbmVyICE9PSBcImF1ZGlvL21wZWdcIiAmJiAodSA9IFwibXA0YS40MC4yXCIsIHRoaXMubG9nKGBBbmRyb2lkOiBmb3JjZSBhdWRpbyBjb2RlYyB0byAke3V9YCkpLCBjICYmIGMgIT09IHUgJiYgdGhpcy5sb2coYFN3YXBwaW5nIG1hbmlmZXN0IGF1ZGlvIGNvZGVjIFwiJHtjfVwiIGZvciBcIiR7dX1cImApLCBpLmxldmVsQ29kZWMgPSB1LCBpLmlkID0gcGUuTUFJTiwgdGhpcy5sb2coYEluaXQgYXVkaW8gYnVmZmVyLCBjb250YWluZXI6JHtpLmNvbnRhaW5lcn0sIGNvZGVjc1tzZWxlY3RlZC9sZXZlbC9wYXJzZWRdPVske3UgfHwgXCJcIn0vJHtjIHx8IFwiXCJ9LyR7aS5jb2RlY31dYCksIGRlbGV0ZSB0LmF1ZGlvdmlkZW87XG4gICAgfVxuICAgIGlmIChvKSB7XG4gICAgICBvLmxldmVsQ29kZWMgPSBlLnZpZGVvQ29kZWMsIG8uaWQgPSBwZS5NQUlOO1xuICAgICAgY29uc3QgYyA9IG8uY29kZWM7XG4gICAgICBpZiAoKGMgPT0gbnVsbCA/IHZvaWQgMCA6IGMubGVuZ3RoKSA9PT0gNClcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgY2FzZSBcImh2YzFcIjpcbiAgICAgICAgICBjYXNlIFwiaGV2MVwiOlxuICAgICAgICAgICAgby5jb2RlYyA9IFwiaHZjMS4xLjYuTDEyMC45MFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImF2MDFcIjpcbiAgICAgICAgICAgIG8uY29kZWMgPSBcImF2MDEuMC4wNE0uMDhcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhdmMxXCI6XG4gICAgICAgICAgICBvLmNvZGVjID0gXCJhdmMxLjQyZTAxZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIHRoaXMubG9nKGBJbml0IHZpZGVvIGJ1ZmZlciwgY29udGFpbmVyOiR7by5jb250YWluZXJ9LCBjb2RlY3NbbGV2ZWwvcGFyc2VkXT1bJHtlLnZpZGVvQ29kZWMgfHwgXCJcIn0vJHtjfV0ke28uY29kZWMgIT09IGMgPyBcIiBwYXJzZWQtY29ycmVjdGVkPVwiICsgby5jb2RlYyA6IFwiXCJ9JHtvLnN1cHBsZW1lbnRhbCA/IFwiIHN1cHBsZW1lbnRhbD1cIiArIG8uc3VwcGxlbWVudGFsIDogXCJcIn1gKSwgZGVsZXRlIHQuYXVkaW92aWRlbztcbiAgICB9XG4gICAgYSAmJiAodGhpcy5sb2coYEluaXQgYXVkaW92aWRlbyBidWZmZXIsIGNvbnRhaW5lcjoke2EuY29udGFpbmVyfSwgY29kZWNzW2xldmVsL3BhcnNlZF09WyR7ZS5jb2RlY3N9LyR7YS5jb2RlY31dYCksIGRlbGV0ZSB0LnZpZGVvLCBkZWxldGUgdC5hdWRpbyk7XG4gICAgY29uc3QgbCA9IE9iamVjdC5rZXlzKHQpO1xuICAgIGlmIChsLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQ09ERUNTLCB0KSwgIXRoaXMuaGxzKVxuICAgICAgICByZXR1cm47XG4gICAgICBsLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IHRbY10uaW5pdFNlZ21lbnQ7XG4gICAgICAgIGQgIT0gbnVsbCAmJiBkLmJ5dGVMZW5ndGggJiYgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9BUFBFTkRJTkcsIHtcbiAgICAgICAgICB0eXBlOiBjLFxuICAgICAgICAgIGRhdGE6IGQsXG4gICAgICAgICAgZnJhZzogcixcbiAgICAgICAgICBwYXJ0OiBudWxsLFxuICAgICAgICAgIGNodW5rTWV0YTogbixcbiAgICAgICAgICBwYXJlbnQ6IHIudHlwZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnRpY2tJbW1lZGlhdGUoKTtcbiAgfVxuICBnZXRNYWluRndkQnVmZmVySW5mbygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5tZWRpYUJ1ZmZlciAmJiB0aGlzLmFsdEF1ZGlvID09PSAyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RndkQnVmZmVySW5mbyhlLCBwZS5NQUlOKTtcbiAgfVxuICBnZXQgbWF4QnVmZmVyTGVuZ3RoKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIGxldmVsOiB0XG4gICAgfSA9IHRoaXMsIHIgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlW3RdO1xuICAgIHJldHVybiByID8gdGhpcy5nZXRNYXhCdWZmZXJMZW5ndGgoci5tYXhCaXRyYXRlKSA6IHRoaXMuY29uZmlnLm1heEJ1ZmZlckxlbmd0aDtcbiAgfVxuICBiYWNrdHJhY2soZSkge1xuICAgIHRoaXMuY291bGRCYWNrdHJhY2sgPSAhMCwgdGhpcy5iYWNrdHJhY2tGcmFnbWVudCA9IGUsIHRoaXMucmVzZXRUcmFuc211eGVyKCksIHRoaXMuZmx1c2hCdWZmZXJHYXAoZSksIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUpLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGUuc3RhcnQsIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICB9XG4gIGNoZWNrRnJhZ21lbnRDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLm1lZGlhO1xuICAgIGxldCB0ID0gbnVsbDtcbiAgICBpZiAoZSAmJiBlLnJlYWR5U3RhdGUgPiAxICYmIGUuc2Vla2luZyA9PT0gITEpIHtcbiAgICAgIGNvbnN0IHIgPSBlLmN1cnJlbnRUaW1lO1xuICAgICAgaWYgKENlLmlzQnVmZmVyZWQoZSwgcikgPyB0ID0gdGhpcy5nZXRBcHBlbmRlZEZyYWcocikgOiBDZS5pc0J1ZmZlcmVkKGUsIHIgKyAwLjEpICYmICh0ID0gdGhpcy5nZXRBcHBlbmRlZEZyYWcociArIDAuMSkpLCB0KSB7XG4gICAgICAgIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPSBudWxsO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5mcmFnUGxheWluZywgaSA9IHQubGV2ZWw7XG4gICAgICAgICghbiB8fCB0LnNuICE9PSBuLnNuIHx8IG4ubGV2ZWwgIT09IGkpICYmICh0aGlzLmZyYWdQbGF5aW5nID0gdCwgdGhpcy5obHMudHJpZ2dlcihJLkZSQUdfQ0hBTkdFRCwge1xuICAgICAgICAgIGZyYWc6IHRcbiAgICAgICAgfSksICghbiB8fCBuLmxldmVsICE9PSBpKSAmJiB0aGlzLmhscy50cmlnZ2VyKEkuTEVWRUxfU1dJVENIRUQsIHtcbiAgICAgICAgICBsZXZlbDogaVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBuZXh0TGV2ZWwoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubmV4dEJ1ZmZlcmVkRnJhZztcbiAgICByZXR1cm4gZSA/IGUubGV2ZWwgOiAtMTtcbiAgfVxuICBnZXQgY3VycmVudEZyYWcoKSB7XG4gICAgdmFyIGU7XG4gICAgaWYgKHRoaXMuZnJhZ1BsYXlpbmcpXG4gICAgICByZXR1cm4gdGhpcy5mcmFnUGxheWluZztcbiAgICBjb25zdCB0ID0gKChlID0gdGhpcy5tZWRpYSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuY3VycmVudFRpbWUpIHx8IHRoaXMubGFzdEN1cnJlbnRUaW1lO1xuICAgIHJldHVybiB1ZSh0KSA/IHRoaXMuZ2V0QXBwZW5kZWRGcmFnKHQpIDogbnVsbDtcbiAgfVxuICBnZXQgY3VycmVudFByb2dyYW1EYXRlVGltZSgpIHtcbiAgICB2YXIgZTtcbiAgICBjb25zdCB0ID0gKChlID0gdGhpcy5tZWRpYSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuY3VycmVudFRpbWUpIHx8IHRoaXMubGFzdEN1cnJlbnRUaW1lO1xuICAgIGlmICh1ZSh0KSkge1xuICAgICAgY29uc3QgciA9IHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCksIG4gPSB0aGlzLmN1cnJlbnRGcmFnIHx8IChyID8gSnMobnVsbCwgci5mcmFnbWVudHMsIHQpIDogbnVsbCk7XG4gICAgICBpZiAobikge1xuICAgICAgICBjb25zdCBpID0gbi5wcm9ncmFtRGF0ZVRpbWU7XG4gICAgICAgIGlmIChpICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgbyA9IGkgKyAodCAtIG4uc3RhcnQpICogMWUzO1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgY3VycmVudExldmVsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmN1cnJlbnRGcmFnO1xuICAgIHJldHVybiBlID8gZS5sZXZlbCA6IC0xO1xuICB9XG4gIGdldCBuZXh0QnVmZmVyZWRGcmFnKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmN1cnJlbnRGcmFnO1xuICAgIHJldHVybiBlID8gdGhpcy5mb2xsb3dpbmdCdWZmZXJlZEZyYWcoZSkgOiBudWxsO1xuICB9XG4gIGdldCBmb3JjZVN0YXJ0TG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VTdGFydExvYWQ7XG4gIH1cbn1cbmNsYXNzIGJBIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIoXCJrZXktbG9hZGVyXCIsIHQpLCB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy5rZXlJZFRvS2V5SW5mbyA9IHt9LCB0aGlzLmVtZUNvbnRyb2xsZXIgPSBudWxsLCB0aGlzLmNvbmZpZyA9IGU7XG4gIH1cbiAgYWJvcnQoZSkge1xuICAgIGZvciAoY29uc3QgciBpbiB0aGlzLmtleUlkVG9LZXlJbmZvKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5rZXlJZFRvS2V5SW5mb1tyXS5sb2FkZXI7XG4gICAgICBpZiAobikge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgaWYgKGUgJiYgZSAhPT0gKCh0ID0gbi5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogdC5mcmFnLnR5cGUpKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbi5hYm9ydCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkZXRhY2goKSB7XG4gICAgZm9yIChjb25zdCBlIGluIHRoaXMua2V5SWRUb0tleUluZm8pIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLmtleUlkVG9LZXlJbmZvW2VdO1xuICAgICAgKHQubWVkaWFLZXlTZXNzaW9uQ29udGV4dCB8fCB0LmRlY3J5cHRkYXRhLmlzQ29tbW9uRW5jcnlwdGlvbikgJiYgZGVsZXRlIHRoaXMua2V5SWRUb0tleUluZm9bZV07XG4gICAgfVxuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgICBmb3IgKGNvbnN0IGUgaW4gdGhpcy5rZXlJZFRvS2V5SW5mbykge1xuICAgICAgY29uc3QgdCA9IHRoaXMua2V5SWRUb0tleUluZm9bZV0ubG9hZGVyO1xuICAgICAgdCAmJiB0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5rZXlJZFRvS2V5SW5mbyA9IHt9O1xuICB9XG4gIGNyZWF0ZUtleUxvYWRFcnJvcihlLCB0ID0gSi5LRVlfTE9BRF9FUlJPUiwgciwgbiwgaSkge1xuICAgIHJldHVybiBuZXcgYXMoe1xuICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgIGRldGFpbHM6IHQsXG4gICAgICBmYXRhbDogITEsXG4gICAgICBmcmFnOiBlLFxuICAgICAgcmVzcG9uc2U6IGksXG4gICAgICBlcnJvcjogcixcbiAgICAgIG5ldHdvcmtEZXRhaWxzOiBuXG4gICAgfSk7XG4gIH1cbiAgbG9hZENsZWFyKGUsIHQsIHIpIHtcbiAgICBpZiAodGhpcy5lbWVDb250cm9sbGVyICYmIHRoaXMuY29uZmlnLmVtZUVuYWJsZWQgJiYgIXRoaXMuZW1lQ29udHJvbGxlci5nZXRTZWxlY3RlZEtleVN5c3RlbUZvcm1hdHMoKS5sZW5ndGgpIHtcbiAgICAgIGlmICh0Lmxlbmd0aClcbiAgICAgICAgZm9yIChsZXQgbiA9IDAsIGkgPSB0Lmxlbmd0aDsgbiA8IGk7IG4rKykge1xuICAgICAgICAgIGNvbnN0IG8gPSB0W25dO1xuICAgICAgICAgIGlmIChlLmNjIDw9IG8uY2MgJiYgKCFWdChlKSB8fCAhVnQobykgfHwgZS5zbiA8IG8uc24pIHx8ICFyICYmIG4gPT0gaSAtIDEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWVDb250cm9sbGVyLnNlbGVjdEtleVN5c3RlbUZvcm1hdChvKS50aGVuKChhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5lbWVDb250cm9sbGVyKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgby5zZXRLZXlGb3JtYXQoYSk7XG4gICAgICAgICAgICAgIGNvbnN0IGwgPSBwbyhhKTtcbiAgICAgICAgICAgICAgaWYgKGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1lQ29udHJvbGxlci5nZXRLZXlTeXN0ZW1BY2Nlc3MoW2xdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWcucmVxdWlyZUtleVN5c3RlbUFjY2Vzc09uU3RhcnQpIHtcbiAgICAgICAgY29uc3QgbiA9IHpuKHRoaXMuY29uZmlnKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiB0aGlzLmVtZUNvbnRyb2xsZXIuZ2V0S2V5U3lzdGVtQWNjZXNzKG4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsb2FkKGUpIHtcbiAgICByZXR1cm4gIWUuZGVjcnlwdGRhdGEgJiYgZS5lbmNyeXB0ZWQgJiYgdGhpcy5lbWVDb250cm9sbGVyICYmIHRoaXMuY29uZmlnLmVtZUVuYWJsZWQgPyB0aGlzLmVtZUNvbnRyb2xsZXIuc2VsZWN0S2V5U3lzdGVtRm9ybWF0KGUpLnRoZW4oKHQpID0+IHRoaXMubG9hZEludGVybmFsKGUsIHQpKSA6IHRoaXMubG9hZEludGVybmFsKGUpO1xuICB9XG4gIGxvYWRJbnRlcm5hbChlLCB0KSB7XG4gICAgdmFyIHIsIG47XG4gICAgdCAmJiBlLnNldEtleUZvcm1hdCh0KTtcbiAgICBjb25zdCBpID0gZS5kZWNyeXB0ZGF0YTtcbiAgICBpZiAoIWkpIHtcbiAgICAgIGNvbnN0IGMgPSBuZXcgRXJyb3IodCA/IGBFeHBlY3RlZCBmcmFnLmRlY3J5cHRkYXRhIHRvIGJlIGRlZmluZWQgYWZ0ZXIgc2V0dGluZyBmb3JtYXQgJHt0fWAgOiBgTWlzc2luZyBkZWNyeXB0aW9uIGRhdGEgb24gZnJhZ21lbnQgaW4gb25LZXlMb2FkaW5nIChlbWVFbmFibGVkIHdpdGggY29udHJvbGxlcjogJHt0aGlzLmVtZUNvbnRyb2xsZXIgJiYgdGhpcy5jb25maWcuZW1lRW5hYmxlZH0pYCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5jcmVhdGVLZXlMb2FkRXJyb3IoZSwgSi5LRVlfTE9BRF9FUlJPUiwgYykpO1xuICAgIH1cbiAgICBjb25zdCBvID0gaS51cmk7XG4gICAgaWYgKCFvKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHRoaXMuY3JlYXRlS2V5TG9hZEVycm9yKGUsIEouS0VZX0xPQURfRVJST1IsIG5ldyBFcnJvcihgSW52YWxpZCBrZXkgVVJJOiBcIiR7b31cImApKSk7XG4gICAgY29uc3QgYSA9IGtsKGkpO1xuICAgIGxldCBsID0gdGhpcy5rZXlJZFRvS2V5SW5mb1thXTtcbiAgICBpZiAoKHIgPSBsKSAhPSBudWxsICYmIHIuZGVjcnlwdGRhdGEua2V5KVxuICAgICAgcmV0dXJuIGkua2V5ID0gbC5kZWNyeXB0ZGF0YS5rZXksIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGZyYWc6IGUsXG4gICAgICAgIGtleUluZm86IGxcbiAgICAgIH0pO1xuICAgIGlmICh0aGlzLmVtZUNvbnRyb2xsZXIgJiYgKG4gPSBsKSAhPSBudWxsICYmIG4ua2V5TG9hZFByb21pc2UpXG4gICAgICBzd2l0Y2ggKHRoaXMuZW1lQ29udHJvbGxlci5nZXRLZXlTdGF0dXMobC5kZWNyeXB0ZGF0YSkpIHtcbiAgICAgICAgY2FzZSBcInVzYWJsZVwiOlxuICAgICAgICBjYXNlIFwidXNhYmxlLWluLWZ1dHVyZVwiOlxuICAgICAgICAgIHJldHVybiBsLmtleUxvYWRQcm9taXNlLnRoZW4oKHUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5SW5mbzogZFxuICAgICAgICAgICAgfSA9IHU7XG4gICAgICAgICAgICByZXR1cm4gaS5rZXkgPSBkLmRlY3J5cHRkYXRhLmtleSwge1xuICAgICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgICBrZXlJbmZvOiBkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIHN3aXRjaCAodGhpcy5sb2coYCR7dGhpcy5rZXlJZFRvS2V5SW5mb1thXSA/IFwiUmVsXCIgOiBcIkxcIn1vYWRpbmcke2kua2V5SWQgPyBcIiBrZXlJZDogXCIgKyBmcihpLmtleUlkKSA6IFwiXCJ9IFVSSTogJHtpLnVyaX0gZnJvbSAke2UudHlwZX0gJHtlLmxldmVsfWApLCBsID0gdGhpcy5rZXlJZFRvS2V5SW5mb1thXSA9IHtcbiAgICAgIGRlY3J5cHRkYXRhOiBpLFxuICAgICAga2V5TG9hZFByb21pc2U6IG51bGwsXG4gICAgICBsb2FkZXI6IG51bGwsXG4gICAgICBtZWRpYUtleVNlc3Npb25Db250ZXh0OiBudWxsXG4gICAgfSwgaS5tZXRob2QpIHtcbiAgICAgIGNhc2UgXCJTQU1QTEUtQUVTXCI6XG4gICAgICBjYXNlIFwiU0FNUExFLUFFUy1DRU5DXCI6XG4gICAgICBjYXNlIFwiU0FNUExFLUFFUy1DVFJcIjpcbiAgICAgICAgcmV0dXJuIGkua2V5Rm9ybWF0ID09PSBcImlkZW50aXR5XCIgPyB0aGlzLmxvYWRLZXlIVFRQKGwsIGUpIDogdGhpcy5sb2FkS2V5RU1FKGwsIGUpO1xuICAgICAgY2FzZSBcIkFFUy0xMjhcIjpcbiAgICAgIGNhc2UgXCJBRVMtMjU2XCI6XG4gICAgICBjYXNlIFwiQUVTLTI1Ni1DVFJcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEtleUhUVFAobCwgZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5jcmVhdGVLZXlMb2FkRXJyb3IoZSwgSi5LRVlfTE9BRF9FUlJPUiwgbmV3IEVycm9yKGBLZXkgc3VwcGxpZWQgd2l0aCB1bnN1cHBvcnRlZCBNRVRIT0Q6IFwiJHtpLm1ldGhvZH1cImApKSk7XG4gICAgfVxuICB9XG4gIGxvYWRLZXlFTUUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB7XG4gICAgICBmcmFnOiB0LFxuICAgICAga2V5SW5mbzogZVxuICAgIH07XG4gICAgaWYgKHRoaXMuZW1lQ29udHJvbGxlciAmJiB0aGlzLmNvbmZpZy5lbWVFbmFibGVkKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5lbWVDb250cm9sbGVyLmxvYWRLZXkocik7XG4gICAgICByZXR1cm4gKGUua2V5TG9hZFByb21pc2UgPSBuLnRoZW4oKGkpID0+IChlLm1lZGlhS2V5U2Vzc2lvbkNvbnRleHQgPSBpLCByKSkpLmNhdGNoKChpKSA9PiB7XG4gICAgICAgIHRocm93IGUua2V5TG9hZFByb21pc2UgPSBudWxsLCBcImRhdGFcIiBpbiBpICYmIChpLmRhdGEuZnJhZyA9IHQpLCBpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocik7XG4gIH1cbiAgbG9hZEtleUhUVFAoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmNvbmZpZywgbiA9IHIubG9hZGVyLCBpID0gbmV3IG4ocik7XG4gICAgcmV0dXJuIHQua2V5TG9hZGVyID0gZS5sb2FkZXIgPSBpLCBlLmtleUxvYWRQcm9taXNlID0gbmV3IFByb21pc2UoKG8sIGEpID0+IHtcbiAgICAgIGNvbnN0IGwgPSB7XG4gICAgICAgIGtleUluZm86IGUsXG4gICAgICAgIGZyYWc6IHQsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICB1cmw6IGUuZGVjcnlwdGRhdGEudXJpXG4gICAgICB9LCBjID0gci5rZXlMb2FkUG9saWN5LmRlZmF1bHQsIHUgPSB7XG4gICAgICAgIGxvYWRQb2xpY3k6IGMsXG4gICAgICAgIHRpbWVvdXQ6IGMubWF4TG9hZFRpbWVNcyxcbiAgICAgICAgbWF4UmV0cnk6IDAsXG4gICAgICAgIHJldHJ5RGVsYXk6IDAsXG4gICAgICAgIG1heFJldHJ5RGVsYXk6IDBcbiAgICAgIH0sIGQgPSB7XG4gICAgICAgIG9uU3VjY2VzczogKGgsIGYsIHAsIHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmcmFnOiBFLFxuICAgICAgICAgICAga2V5SW5mbzogYlxuICAgICAgICAgIH0gPSBwLCBSID0ga2woYi5kZWNyeXB0ZGF0YSk7XG4gICAgICAgICAgaWYgKCFFLmRlY3J5cHRkYXRhIHx8IGIgIT09IHRoaXMua2V5SWRUb0tleUluZm9bUl0pXG4gICAgICAgICAgICByZXR1cm4gYSh0aGlzLmNyZWF0ZUtleUxvYWRFcnJvcihFLCBKLktFWV9MT0FEX0VSUk9SLCBuZXcgRXJyb3IoXCJhZnRlciBrZXkgbG9hZCwgZGVjcnlwdGRhdGEgdW5zZXQgb3IgY2hhbmdlZFwiKSwgeSkpO1xuICAgICAgICAgIGIuZGVjcnlwdGRhdGEua2V5ID0gRS5kZWNyeXB0ZGF0YS5rZXkgPSBuZXcgVWludDhBcnJheShoLmRhdGEpLCBFLmtleUxvYWRlciA9IG51bGwsIGIubG9hZGVyID0gbnVsbCwgbyh7XG4gICAgICAgICAgICBmcmFnOiBFLFxuICAgICAgICAgICAga2V5SW5mbzogYlxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoaCwgZiwgcCwgeSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZiksIGEodGhpcy5jcmVhdGVLZXlMb2FkRXJyb3IodCwgSi5LRVlfTE9BRF9FUlJPUiwgbmV3IEVycm9yKGBIVFRQIEVycm9yICR7aC5jb2RlfSBsb2FkaW5nIGtleSAke2gudGV4dH1gKSwgcCwgdHQoe1xuICAgICAgICAgICAgdXJsOiBsLnVybCxcbiAgICAgICAgICAgIGRhdGE6IHZvaWQgMFxuICAgICAgICAgIH0sIGgpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVGltZW91dDogKGgsIGYsIHApID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2V0TG9hZGVyKGYpLCBhKHRoaXMuY3JlYXRlS2V5TG9hZEVycm9yKHQsIEouS0VZX0xPQURfVElNRU9VVCwgbmV3IEVycm9yKFwia2V5IGxvYWRpbmcgdGltZWQgb3V0XCIpLCBwKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQWJvcnQ6IChoLCBmLCBwKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNldExvYWRlcihmKSwgYSh0aGlzLmNyZWF0ZUtleUxvYWRFcnJvcih0LCBKLklOVEVSTkFMX0FCT1JURUQsIG5ldyBFcnJvcihcImtleSBsb2FkaW5nIGFib3J0ZWRcIiksIHApKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGkubG9hZChsLCB1LCBkKTtcbiAgICB9KTtcbiAgfVxuICByZXNldExvYWRlcihlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogdCxcbiAgICAgIGtleUluZm86IHIsXG4gICAgICB1cmw6IG5cbiAgICB9ID0gZSwgaSA9IHIubG9hZGVyO1xuICAgIHQua2V5TG9hZGVyID09PSBpICYmICh0LmtleUxvYWRlciA9IG51bGwsIHIubG9hZGVyID0gbnVsbCk7XG4gICAgY29uc3QgbyA9IGtsKHIuZGVjcnlwdGRhdGEpIHx8IG47XG4gICAgZGVsZXRlIHRoaXMua2V5SWRUb0tleUluZm9bb10sIGkgJiYgaS5kZXN0cm95KCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGtsKHMpIHtcbiAgaWYgKHMua2V5Rm9ybWF0ICE9PSBsci5GQUlSUExBWSkge1xuICAgIGNvbnN0IGUgPSBzLmtleUlkO1xuICAgIGlmIChlKVxuICAgICAgcmV0dXJuIGZyKGUpO1xuICB9XG4gIHJldHVybiBzLnVyaTtcbn1cbmZ1bmN0aW9uIGhmKHMpIHtcbiAgY29uc3Qge1xuICAgIHR5cGU6IGVcbiAgfSA9IHM7XG4gIHN3aXRjaCAoZSkge1xuICAgIGNhc2UgS2UuQVVESU9fVFJBQ0s6XG4gICAgICByZXR1cm4gcGUuQVVESU87XG4gICAgY2FzZSBLZS5TVUJUSVRMRV9UUkFDSzpcbiAgICAgIHJldHVybiBwZS5TVUJUSVRMRTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBlLk1BSU47XG4gIH1cbn1cbmZ1bmN0aW9uIERsKHMsIGUpIHtcbiAgbGV0IHQgPSBzLnVybDtcbiAgcmV0dXJuICh0ID09PSB2b2lkIDAgfHwgdC5pbmRleE9mKFwiZGF0YTpcIikgPT09IDApICYmICh0ID0gZS51cmwpLCB0O1xufVxuY2xhc3MgVEEge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMubG9hZGVycyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLnZhcmlhYmxlTGlzdCA9IG51bGwsIHRoaXMub25NYW5pZmVzdExvYWRlZCA9IHRoaXMuY2hlY2tBdXRvc3RhcnRMb2FkLCB0aGlzLmhscyA9IGUsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICBzdGFydExvYWQoZSkge1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIHRoaXMuZGVzdHJveUludGVybmFsTG9hZGVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfTE9BRElORywgdGhpcy5vbkF1ZGlvVHJhY2tMb2FkaW5nLCB0aGlzKSwgZS5vbihJLlNVQlRJVExFX1RSQUNLX0xPQURJTkcsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGluZywgdGhpcyksIGUub24oSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5MRVZFTF9MT0FESU5HLCB0aGlzLm9uTGV2ZWxMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19MT0FESU5HLCB0aGlzLm9uQXVkaW9UcmFja0xvYWRpbmcsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLX0xPQURJTkcsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGluZywgdGhpcyksIGUub2ZmKEkuTEVWRUxTX1VQREFURUQsIHRoaXMub25MZXZlbHNVcGRhdGVkLCB0aGlzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBkZWZhdWx0cyBvciBjb25maWd1cmVkIGxvYWRlci10eXBlIG92ZXJsb2FkcyAocExvYWRlciBhbmQgbG9hZGVyIGNvbmZpZyBwYXJhbXMpXG4gICAqL1xuICBjcmVhdGVJbnRlcm5hbExvYWRlcihlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaGxzLmNvbmZpZywgciA9IHQucExvYWRlciwgbiA9IHQubG9hZGVyLCBpID0gciB8fCBuLCBvID0gbmV3IGkodCk7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyc1tlLnR5cGVdID0gbywgbztcbiAgfVxuICBnZXRJbnRlcm5hbExvYWRlcihlKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyc1tlLnR5cGVdO1xuICB9XG4gIHJlc2V0SW50ZXJuYWxMb2FkZXIoZSkge1xuICAgIHRoaXMubG9hZGVyc1tlXSAmJiBkZWxldGUgdGhpcy5sb2FkZXJzW2VdO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGBkZXN0cm95YCBvbiBhbGwgaW50ZXJuYWwgbG9hZGVyIGluc3RhbmNlcyBtYXBwZWQgKG9uZSBwZXIgY29udGV4dCB0eXBlKVxuICAgKi9cbiAgZGVzdHJveUludGVybmFsTG9hZGVycygpIHtcbiAgICBmb3IgKGNvbnN0IGUgaW4gdGhpcy5sb2FkZXJzKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sb2FkZXJzW2VdO1xuICAgICAgdCAmJiB0LmRlc3Ryb3koKSwgdGhpcy5yZXNldEludGVybmFsTG9hZGVyKGUpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudmFyaWFibGVMaXN0ID0gbnVsbCwgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuZGVzdHJveUludGVybmFsTG9hZGVycygpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB1cmw6IHJcbiAgICB9ID0gdDtcbiAgICB0aGlzLnZhcmlhYmxlTGlzdCA9IG51bGwsIHRoaXMubG9hZCh7XG4gICAgICBpZDogbnVsbCxcbiAgICAgIGxldmVsOiAwLFxuICAgICAgcmVzcG9uc2VUeXBlOiBcInRleHRcIixcbiAgICAgIHR5cGU6IEtlLk1BTklGRVNULFxuICAgICAgdXJsOiByLFxuICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBudWxsLFxuICAgICAgbGV2ZWxPclRyYWNrOiBudWxsXG4gICAgfSk7XG4gIH1cbiAgb25MZXZlbExvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlkOiByLFxuICAgICAgbGV2ZWw6IG4sXG4gICAgICBwYXRod2F5SWQ6IGksXG4gICAgICB1cmw6IG8sXG4gICAgICBkZWxpdmVyeURpcmVjdGl2ZXM6IGEsXG4gICAgICBsZXZlbEluZm86IGxcbiAgICB9ID0gdDtcbiAgICB0aGlzLmxvYWQoe1xuICAgICAgaWQ6IHIsXG4gICAgICBsZXZlbDogbixcbiAgICAgIHBhdGh3YXlJZDogaSxcbiAgICAgIHJlc3BvbnNlVHlwZTogXCJ0ZXh0XCIsXG4gICAgICB0eXBlOiBLZS5MRVZFTCxcbiAgICAgIHVybDogbyxcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogYSxcbiAgICAgIGxldmVsT3JUcmFjazogbFxuICAgIH0pO1xuICB9XG4gIG9uQXVkaW9UcmFja0xvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIHVybDogaSxcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogbyxcbiAgICAgIHRyYWNrOiBhXG4gICAgfSA9IHQ7XG4gICAgdGhpcy5sb2FkKHtcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGxldmVsOiBudWxsLFxuICAgICAgcmVzcG9uc2VUeXBlOiBcInRleHRcIixcbiAgICAgIHR5cGU6IEtlLkFVRElPX1RSQUNLLFxuICAgICAgdXJsOiBpLFxuICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBvLFxuICAgICAgbGV2ZWxPclRyYWNrOiBhXG4gICAgfSk7XG4gIH1cbiAgb25TdWJ0aXRsZVRyYWNrTG9hZGluZyhlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgaWQ6IHIsXG4gICAgICBncm91cElkOiBuLFxuICAgICAgdXJsOiBpLFxuICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBvLFxuICAgICAgdHJhY2s6IGFcbiAgICB9ID0gdDtcbiAgICB0aGlzLmxvYWQoe1xuICAgICAgaWQ6IHIsXG4gICAgICBncm91cElkOiBuLFxuICAgICAgbGV2ZWw6IG51bGwsXG4gICAgICByZXNwb25zZVR5cGU6IFwidGV4dFwiLFxuICAgICAgdHlwZTogS2UuU1VCVElUTEVfVFJBQ0ssXG4gICAgICB1cmw6IGksXG4gICAgICBkZWxpdmVyeURpcmVjdGl2ZXM6IG8sXG4gICAgICBsZXZlbE9yVHJhY2s6IGFcbiAgICB9KTtcbiAgfVxuICBvbkxldmVsc1VwZGF0ZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmxvYWRlcnNbS2UuTEVWRUxdO1xuICAgIGlmIChyKSB7XG4gICAgICBjb25zdCBuID0gci5jb250ZXh0O1xuICAgICAgbiAmJiAhdC5sZXZlbHMuc29tZSgoaSkgPT4gaSA9PT0gbi5sZXZlbE9yVHJhY2spICYmIChyLmFib3J0KCksIGRlbGV0ZSB0aGlzLmxvYWRlcnNbS2UuTEVWRUxdKTtcbiAgICB9XG4gIH1cbiAgbG9hZChlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmNvbmZpZztcbiAgICBsZXQgbiA9IHRoaXMuZ2V0SW50ZXJuYWxMb2FkZXIoZSk7XG4gICAgaWYgKG4pIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmhscy5sb2dnZXIsIHUgPSBuLmNvbnRleHQ7XG4gICAgICBpZiAodSAmJiB1LmxldmVsT3JUcmFjayA9PT0gZS5sZXZlbE9yVHJhY2sgJiYgKHUudXJsID09PSBlLnVybCB8fCB1LmRlbGl2ZXJ5RGlyZWN0aXZlcyAmJiAhZS5kZWxpdmVyeURpcmVjdGl2ZXMpKSB7XG4gICAgICAgIHUudXJsID09PSBlLnVybCA/IGMubG9nKGBbcGxheWxpc3QtbG9hZGVyXTogaWdub3JlICR7ZS51cmx9IG9uZ29pbmcgcmVxdWVzdGApIDogYy5sb2coYFtwbGF5bGlzdC1sb2FkZXJdOiBpZ25vcmUgJHtlLnVybH0gaW4gZmF2b3Igb2YgJHt1LnVybH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYy5sb2coYFtwbGF5bGlzdC1sb2FkZXJdOiBhYm9ydGluZyBwcmV2aW91cyBsb2FkZXIgZm9yIHR5cGU6ICR7ZS50eXBlfWApLCBuLmFib3J0KCk7XG4gICAgfVxuICAgIGxldCBpO1xuICAgIGlmIChlLnR5cGUgPT09IEtlLk1BTklGRVNUID8gaSA9IHIubWFuaWZlc3RMb2FkUG9saWN5LmRlZmF1bHQgOiBpID0gbnQoe30sIHIucGxheWxpc3RMb2FkUG9saWN5LmRlZmF1bHQsIHtcbiAgICAgIHRpbWVvdXRSZXRyeTogbnVsbCxcbiAgICAgIGVycm9yUmV0cnk6IG51bGxcbiAgICB9KSwgbiA9IHRoaXMuY3JlYXRlSW50ZXJuYWxMb2FkZXIoZSksIHVlKCh0ID0gZS5kZWxpdmVyeURpcmVjdGl2ZXMpID09IG51bGwgPyB2b2lkIDAgOiB0LnBhcnQpKSB7XG4gICAgICBsZXQgYztcbiAgICAgIGlmIChlLnR5cGUgPT09IEtlLkxFVkVMICYmIGUubGV2ZWwgIT09IG51bGwgPyBjID0gdGhpcy5obHMubGV2ZWxzW2UubGV2ZWxdLmRldGFpbHMgOiBlLnR5cGUgPT09IEtlLkFVRElPX1RSQUNLICYmIGUuaWQgIT09IG51bGwgPyBjID0gdGhpcy5obHMuYXVkaW9UcmFja3NbZS5pZF0uZGV0YWlscyA6IGUudHlwZSA9PT0gS2UuU1VCVElUTEVfVFJBQ0sgJiYgZS5pZCAhPT0gbnVsbCAmJiAoYyA9IHRoaXMuaGxzLnN1YnRpdGxlVHJhY2tzW2UuaWRdLmRldGFpbHMpLCBjKSB7XG4gICAgICAgIGNvbnN0IHUgPSBjLnBhcnRUYXJnZXQsIGQgPSBjLnRhcmdldGR1cmF0aW9uO1xuICAgICAgICBpZiAodSAmJiBkKSB7XG4gICAgICAgICAgY29uc3QgaCA9IE1hdGgubWF4KHUgKiAzLCBkICogMC44KSAqIDFlMztcbiAgICAgICAgICBpID0gbnQoe30sIGksIHtcbiAgICAgICAgICAgIG1heFRpbWVUb0ZpcnN0Qnl0ZU1zOiBNYXRoLm1pbihoLCBpLm1heFRpbWVUb0ZpcnN0Qnl0ZU1zKSxcbiAgICAgICAgICAgIG1heExvYWRUaW1lTXM6IE1hdGgubWluKGgsIGkubWF4VGltZVRvRmlyc3RCeXRlTXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbyA9IGkuZXJyb3JSZXRyeSB8fCBpLnRpbWVvdXRSZXRyeSB8fCB7fSwgYSA9IHtcbiAgICAgIGxvYWRQb2xpY3k6IGksXG4gICAgICB0aW1lb3V0OiBpLm1heExvYWRUaW1lTXMsXG4gICAgICBtYXhSZXRyeTogby5tYXhOdW1SZXRyeSB8fCAwLFxuICAgICAgcmV0cnlEZWxheTogby5yZXRyeURlbGF5TXMgfHwgMCxcbiAgICAgIG1heFJldHJ5RGVsYXk6IG8ubWF4UmV0cnlEZWxheU1zIHx8IDBcbiAgICB9LCBsID0ge1xuICAgICAgb25TdWNjZXNzOiAoYywgdSwgZCwgaCkgPT4ge1xuICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRJbnRlcm5hbExvYWRlcihkKTtcbiAgICAgICAgdGhpcy5yZXNldEludGVybmFsTG9hZGVyKGQudHlwZSk7XG4gICAgICAgIGNvbnN0IHAgPSBjLmRhdGE7XG4gICAgICAgIHUucGFyc2luZy5zdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpLCB6ci5pc01lZGlhUGxheWxpc3QocCkgfHwgZC50eXBlICE9PSBLZS5NQU5JRkVTVCA/IHRoaXMuaGFuZGxlVHJhY2tPckxldmVsUGxheWxpc3QoYywgdSwgZCwgaCB8fCBudWxsLCBmKSA6IHRoaXMuaGFuZGxlTWFzdGVyUGxheWxpc3QoYywgdSwgZCwgaCk7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGMsIHUsIGQsIGgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVOZXR3b3JrRXJyb3IodSwgZCwgITEsIGMsIGgpO1xuICAgICAgfSxcbiAgICAgIG9uVGltZW91dDogKGMsIHUsIGQpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVOZXR3b3JrRXJyb3IodSwgZCwgITAsIHZvaWQgMCwgYyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBuLmxvYWQoZSwgYSwgbCk7XG4gIH1cbiAgY2hlY2tBdXRvc3RhcnRMb2FkKCkge1xuICAgIGlmICghdGhpcy5obHMpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGF1dG9TdGFydExvYWQ6IGUsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IHRcbiAgICAgIH0sXG4gICAgICBmb3JjZVN0YXJ0TG9hZDogclxuICAgIH0gPSB0aGlzLmhscztcbiAgICAoZSB8fCByKSAmJiAodGhpcy5obHMubG9nZ2VyLmxvZyhgJHtlID8gXCJhdXRvXCIgOiBcImZvcmNlXCJ9IHN0YXJ0TG9hZCB3aXRoIGNvbmZpZ3VyZWQgc3RhcnRQb3NpdGlvbiAke3R9YCksIHRoaXMuaGxzLnN0YXJ0TG9hZCh0KSk7XG4gIH1cbiAgaGFuZGxlTWFzdGVyUGxheWxpc3QoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSB0aGlzLmhscywgbyA9IGUuZGF0YSwgYSA9IERsKGUsIHIpLCBsID0genIucGFyc2VNYXN0ZXJQbGF5bGlzdChvLCBhKTtcbiAgICBpZiAobC5wbGF5bGlzdFBhcnNpbmdFcnJvcikge1xuICAgICAgdC5wYXJzaW5nLmVuZCA9IHBlcmZvcm1hbmNlLm5vdygpLCB0aGlzLmhhbmRsZU1hbmlmZXN0UGFyc2luZ0Vycm9yKGUsIHIsIGwucGxheWxpc3RQYXJzaW5nRXJyb3IsIG4sIHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjb250ZW50U3RlZXJpbmc6IGMsXG4gICAgICBsZXZlbHM6IHUsXG4gICAgICBzZXNzaW9uRGF0YTogZCxcbiAgICAgIHNlc3Npb25LZXlzOiBoLFxuICAgICAgc3RhcnRUaW1lT2Zmc2V0OiBmLFxuICAgICAgdmFyaWFibGVMaXN0OiBwXG4gICAgfSA9IGw7XG4gICAgdGhpcy52YXJpYWJsZUxpc3QgPSBwLCB1LmZvckVhY2goKFIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdW5rbm93bkNvZGVjczogQVxuICAgICAgfSA9IFI7XG4gICAgICBpZiAoQSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcHJlZmVyTWFuYWdlZE1lZGlhU291cmNlOiBGXG4gICAgICAgIH0gPSB0aGlzLmhscy5jb25maWc7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgYXVkaW9Db2RlYzogTSxcbiAgICAgICAgICB2aWRlb0NvZGVjOiBIXG4gICAgICAgIH0gPSBSO1xuICAgICAgICBmb3IgKGxldCBLID0gQS5sZW5ndGg7IEstLTsgKSB7XG4gICAgICAgICAgY29uc3QgaiA9IEFbS107XG4gICAgICAgICAgZ2koaiwgXCJhdWRpb1wiLCBGKSA/IChSLmF1ZGlvQ29kZWMgPSBNID0gTSA/IGAke019LCR7an1gIDogaiwgRm4uYXVkaW9bTS5zdWJzdHJpbmcoMCwgNCldID0gMiwgQS5zcGxpY2UoSywgMSkpIDogZ2koaiwgXCJ2aWRlb1wiLCBGKSAmJiAoUi52aWRlb0NvZGVjID0gSCA9IEggPyBgJHtIfSwke2p9YCA6IGosIEZuLnZpZGVvW0guc3Vic3RyaW5nKDAsIDQpXSA9IDIsIEEuc3BsaWNlKEssIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIEFVRElPOiB5ID0gW10sXG4gICAgICBTVUJUSVRMRVM6IEUsXG4gICAgICBcIkNMT1NFRC1DQVBUSU9OU1wiOiBiXG4gICAgfSA9IHpyLnBhcnNlTWFzdGVyUGxheWxpc3RNZWRpYShvLCBhLCBsKTtcbiAgICB5Lmxlbmd0aCAmJiAheS5zb21lKChBKSA9PiAhQS51cmwpICYmIHVbMF0uYXVkaW9Db2RlYyAmJiAhdVswXS5hdHRycy5BVURJTyAmJiAodGhpcy5obHMubG9nZ2VyLmxvZyhcIltwbGF5bGlzdC1sb2FkZXJdOiBhdWRpbyBjb2RlYyBzaWduYWxlZCBpbiBxdWFsaXR5IGxldmVsLCBidXQgbm8gZW1iZWRkZWQgYXVkaW8gdHJhY2sgc2lnbmFsZWQsIGNyZWF0ZSBvbmVcIiksIHkudW5zaGlmdCh7XG4gICAgICB0eXBlOiBcIm1haW5cIixcbiAgICAgIG5hbWU6IFwibWFpblwiLFxuICAgICAgZ3JvdXBJZDogXCJtYWluXCIsXG4gICAgICBkZWZhdWx0OiAhMSxcbiAgICAgIGF1dG9zZWxlY3Q6ICExLFxuICAgICAgZm9yY2VkOiAhMSxcbiAgICAgIGlkOiAtMSxcbiAgICAgIGF0dHJzOiBuZXcgZ3Qoe30pLFxuICAgICAgYml0cmF0ZTogMCxcbiAgICAgIHVybDogXCJcIlxuICAgIH0pKSwgaS50cmlnZ2VyKEkuTUFOSUZFU1RfTE9BREVELCB7XG4gICAgICBsZXZlbHM6IHUsXG4gICAgICBhdWRpb1RyYWNrczogeSxcbiAgICAgIHN1YnRpdGxlczogRSxcbiAgICAgIGNhcHRpb25zOiBiLFxuICAgICAgY29udGVudFN0ZWVyaW5nOiBjLFxuICAgICAgdXJsOiBhLFxuICAgICAgc3RhdHM6IHQsXG4gICAgICBuZXR3b3JrRGV0YWlsczogbixcbiAgICAgIHNlc3Npb25EYXRhOiBkLFxuICAgICAgc2Vzc2lvbktleXM6IGgsXG4gICAgICBzdGFydFRpbWVPZmZzZXQ6IGYsXG4gICAgICB2YXJpYWJsZUxpc3Q6IHBcbiAgICB9KTtcbiAgfVxuICBoYW5kbGVUcmFja09yTGV2ZWxQbGF5bGlzdChlLCB0LCByLCBuLCBpKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuaGxzLCB7XG4gICAgICBpZDogYSxcbiAgICAgIGxldmVsOiBsLFxuICAgICAgdHlwZTogY1xuICAgIH0gPSByLCB1ID0gRGwoZSwgciksIGQgPSB1ZShsKSA/IGwgOiB1ZShhKSA/IGEgOiAwLCBoID0gaGYociksIGYgPSB6ci5wYXJzZUxldmVsUGxheWxpc3QoZS5kYXRhLCB1LCBkLCBoLCAwLCB0aGlzLnZhcmlhYmxlTGlzdCk7XG4gICAgaWYgKGMgPT09IEtlLk1BTklGRVNUKSB7XG4gICAgICBjb25zdCBwID0ge1xuICAgICAgICBhdHRyczogbmV3IGd0KHt9KSxcbiAgICAgICAgYml0cmF0ZTogMCxcbiAgICAgICAgZGV0YWlsczogZixcbiAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgdXJsOiB1XG4gICAgICB9O1xuICAgICAgZi5yZXF1ZXN0U2NoZWR1bGVkID0gdC5sb2FkaW5nLnN0YXJ0ICsgUWcoZiwgMCksIG8udHJpZ2dlcihJLk1BTklGRVNUX0xPQURFRCwge1xuICAgICAgICBsZXZlbHM6IFtwXSxcbiAgICAgICAgYXVkaW9UcmFja3M6IFtdLFxuICAgICAgICB1cmw6IHUsXG4gICAgICAgIHN0YXRzOiB0LFxuICAgICAgICBuZXR3b3JrRGV0YWlsczogbixcbiAgICAgICAgc2Vzc2lvbkRhdGE6IG51bGwsXG4gICAgICAgIHNlc3Npb25LZXlzOiBudWxsLFxuICAgICAgICBjb250ZW50U3RlZXJpbmc6IG51bGwsXG4gICAgICAgIHN0YXJ0VGltZU9mZnNldDogbnVsbCxcbiAgICAgICAgdmFyaWFibGVMaXN0OiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdC5wYXJzaW5nLmVuZCA9IHBlcmZvcm1hbmNlLm5vdygpLCByLmxldmVsRGV0YWlscyA9IGYsIHRoaXMuaGFuZGxlUGxheWxpc3RMb2FkZWQoZiwgZSwgdCwgciwgbiwgaSk7XG4gIH1cbiAgaGFuZGxlTWFuaWZlc3RQYXJzaW5nRXJyb3IoZSwgdCwgciwgbiwgaSkge1xuICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgIGRldGFpbHM6IEouTUFOSUZFU1RfUEFSU0lOR19FUlJPUixcbiAgICAgIGZhdGFsOiB0LnR5cGUgPT09IEtlLk1BTklGRVNULFxuICAgICAgdXJsOiBlLnVybCxcbiAgICAgIGVycjogcixcbiAgICAgIGVycm9yOiByLFxuICAgICAgcmVhc29uOiByLm1lc3NhZ2UsXG4gICAgICByZXNwb25zZTogZSxcbiAgICAgIGNvbnRleHQ6IHQsXG4gICAgICBuZXR3b3JrRGV0YWlsczogbixcbiAgICAgIHN0YXRzOiBpXG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlTmV0d29ya0Vycm9yKGUsIHQsIHIgPSAhMSwgbiwgaSkge1xuICAgIGxldCBvID0gYEEgbmV0d29yayAke3IgPyBcInRpbWVvdXRcIiA6IFwiZXJyb3JcIiArIChuID8gXCIgKHN0YXR1cyBcIiArIG4uY29kZSArIFwiKVwiIDogXCJcIil9IG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgJHtlLnR5cGV9YDtcbiAgICBlLnR5cGUgPT09IEtlLkxFVkVMID8gbyArPSBgOiAke2UubGV2ZWx9IGlkOiAke2UuaWR9YCA6IChlLnR5cGUgPT09IEtlLkFVRElPX1RSQUNLIHx8IGUudHlwZSA9PT0gS2UuU1VCVElUTEVfVFJBQ0spICYmIChvICs9IGAgaWQ6ICR7ZS5pZH0gZ3JvdXAtaWQ6IFwiJHtlLmdyb3VwSWR9XCJgKTtcbiAgICBjb25zdCBhID0gbmV3IEVycm9yKG8pO1xuICAgIHRoaXMuaGxzLmxvZ2dlci53YXJuKGBbcGxheWxpc3QtbG9hZGVyXTogJHtvfWApO1xuICAgIGxldCBsID0gSi5VTktOT1dOLCBjID0gITE7XG4gICAgY29uc3QgdSA9IHRoaXMuZ2V0SW50ZXJuYWxMb2FkZXIoZSk7XG4gICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgIGNhc2UgS2UuTUFOSUZFU1Q6XG4gICAgICAgIGwgPSByID8gSi5NQU5JRkVTVF9MT0FEX1RJTUVPVVQgOiBKLk1BTklGRVNUX0xPQURfRVJST1IsIGMgPSAhMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEtlLkxFVkVMOlxuICAgICAgICBsID0gciA/IEouTEVWRUxfTE9BRF9USU1FT1VUIDogSi5MRVZFTF9MT0FEX0VSUk9SLCBjID0gITE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBLZS5BVURJT19UUkFDSzpcbiAgICAgICAgbCA9IHIgPyBKLkFVRElPX1RSQUNLX0xPQURfVElNRU9VVCA6IEouQVVESU9fVFJBQ0tfTE9BRF9FUlJPUiwgYyA9ICExO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2UuU1VCVElUTEVfVFJBQ0s6XG4gICAgICAgIGwgPSByID8gSi5TVUJUSVRMRV9UUkFDS19MT0FEX1RJTUVPVVQgOiBKLlNVQlRJVExFX0xPQURfRVJST1IsIGMgPSAhMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHUgJiYgdGhpcy5yZXNldEludGVybmFsTG9hZGVyKGUudHlwZSk7XG4gICAgY29uc3QgZCA9IHtcbiAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICBkZXRhaWxzOiBsLFxuICAgICAgZmF0YWw6IGMsXG4gICAgICB1cmw6IGUudXJsLFxuICAgICAgbG9hZGVyOiB1LFxuICAgICAgY29udGV4dDogZSxcbiAgICAgIGVycm9yOiBhLFxuICAgICAgbmV0d29ya0RldGFpbHM6IHQsXG4gICAgICBzdGF0czogaVxuICAgIH07XG4gICAgaWYgKG4pIHtcbiAgICAgIGNvbnN0IGggPSAodCA9PSBudWxsID8gdm9pZCAwIDogdC51cmwpIHx8IGUudXJsO1xuICAgICAgZC5yZXNwb25zZSA9IHR0KHtcbiAgICAgICAgdXJsOiBoLFxuICAgICAgICBkYXRhOiB2b2lkIDBcbiAgICAgIH0sIG4pO1xuICAgIH1cbiAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIGQpO1xuICB9XG4gIGhhbmRsZVBsYXlsaXN0TG9hZGVkKGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgICBjb25zdCBhID0gdGhpcy5obHMsIHtcbiAgICAgIHR5cGU6IGwsXG4gICAgICBsZXZlbDogYyxcbiAgICAgIGxldmVsT3JUcmFjazogdSxcbiAgICAgIGlkOiBkLFxuICAgICAgZ3JvdXBJZDogaCxcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogZlxuICAgIH0gPSBuLCBwID0gRGwodCwgbiksIHkgPSBoZihuKTtcbiAgICBsZXQgRSA9IHR5cGVvZiBuLmxldmVsID09IFwibnVtYmVyXCIgJiYgeSA9PT0gcGUuTUFJTiA/IGMgOiB2b2lkIDA7XG4gICAgY29uc3QgYiA9IGUucGxheWxpc3RQYXJzaW5nRXJyb3I7XG4gICAgaWYgKGIpIHtcbiAgICAgIGlmICh0aGlzLmhscy5sb2dnZXIud2FybihgJHtifSAke2UudXJsfWApLCAhYS5jb25maWcuaWdub3JlUGxheWxpc3RQYXJzaW5nRXJyb3JzKSB7XG4gICAgICAgIGEudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkxFVkVMX1BBUlNJTkdfRVJST1IsXG4gICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgIHVybDogcCxcbiAgICAgICAgICBlcnJvcjogYixcbiAgICAgICAgICByZWFzb246IGIubWVzc2FnZSxcbiAgICAgICAgICByZXNwb25zZTogdCxcbiAgICAgICAgICBjb250ZXh0OiBuLFxuICAgICAgICAgIGxldmVsOiBFLFxuICAgICAgICAgIHBhcmVudDogeSxcbiAgICAgICAgICBuZXR3b3JrRGV0YWlsczogaSxcbiAgICAgICAgICBzdGF0czogclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG51bGw7XG4gICAgfVxuICAgIGlmICghZS5mcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBSID0gZS5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihcIk5vIFNlZ21lbnRzIGZvdW5kIGluIFBsYXlsaXN0XCIpO1xuICAgICAgYS50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5MRVZFTF9FTVBUWV9FUlJPUixcbiAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICB1cmw6IHAsXG4gICAgICAgIGVycm9yOiBSLFxuICAgICAgICByZWFzb246IFIubWVzc2FnZSxcbiAgICAgICAgcmVzcG9uc2U6IHQsXG4gICAgICAgIGNvbnRleHQ6IG4sXG4gICAgICAgIGxldmVsOiBFLFxuICAgICAgICBwYXJlbnQ6IHksXG4gICAgICAgIG5ldHdvcmtEZXRhaWxzOiBpLFxuICAgICAgICBzdGF0czogclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZS5saXZlICYmIG8gJiYgKG8uZ2V0Q2FjaGVBZ2UgJiYgKGUuYWdlSGVhZGVyID0gby5nZXRDYWNoZUFnZSgpIHx8IDApLCAoIW8uZ2V0Q2FjaGVBZ2UgfHwgaXNOYU4oZS5hZ2VIZWFkZXIpKSAmJiAoZS5hZ2VIZWFkZXIgPSAwKSksIGwpIHtcbiAgICAgIGNhc2UgS2UuTUFOSUZFU1Q6XG4gICAgICBjYXNlIEtlLkxFVkVMOlxuICAgICAgICBpZiAoRSkge1xuICAgICAgICAgIGlmICghdSlcbiAgICAgICAgICAgIEUgPSAwO1xuICAgICAgICAgIGVsc2UgaWYgKHUgIT09IGEubGV2ZWxzW0VdKSB7XG4gICAgICAgICAgICBjb25zdCBSID0gYS5sZXZlbHMuaW5kZXhPZih1KTtcbiAgICAgICAgICAgIFIgPiAtMSAmJiAoRSA9IFIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhLnRyaWdnZXIoSS5MRVZFTF9MT0FERUQsIHtcbiAgICAgICAgICBkZXRhaWxzOiBlLFxuICAgICAgICAgIGxldmVsSW5mbzogdSB8fCBhLmxldmVsc1swXSxcbiAgICAgICAgICBsZXZlbDogRSB8fCAwLFxuICAgICAgICAgIGlkOiBkIHx8IDAsXG4gICAgICAgICAgc3RhdHM6IHIsXG4gICAgICAgICAgbmV0d29ya0RldGFpbHM6IGksXG4gICAgICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBmLFxuICAgICAgICAgIHdpdGhvdXRNdWx0aVZhcmlhbnQ6IGwgPT09IEtlLk1BTklGRVNUXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2UuQVVESU9fVFJBQ0s6XG4gICAgICAgIGEudHJpZ2dlcihJLkFVRElPX1RSQUNLX0xPQURFRCwge1xuICAgICAgICAgIGRldGFpbHM6IGUsXG4gICAgICAgICAgdHJhY2s6IHUsXG4gICAgICAgICAgaWQ6IGQgfHwgMCxcbiAgICAgICAgICBncm91cElkOiBoIHx8IFwiXCIsXG4gICAgICAgICAgc3RhdHM6IHIsXG4gICAgICAgICAgbmV0d29ya0RldGFpbHM6IGksXG4gICAgICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBmXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2UuU1VCVElUTEVfVFJBQ0s6XG4gICAgICAgIGEudHJpZ2dlcihJLlNVQlRJVExFX1RSQUNLX0xPQURFRCwge1xuICAgICAgICAgIGRldGFpbHM6IGUsXG4gICAgICAgICAgdHJhY2s6IHUsXG4gICAgICAgICAgaWQ6IGQgfHwgMCxcbiAgICAgICAgICBncm91cElkOiBoIHx8IFwiXCIsXG4gICAgICAgICAgc3RhdHM6IHIsXG4gICAgICAgICAgbmV0d29ya0RldGFpbHM6IGksXG4gICAgICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBmXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEhyIHtcbiAgLyoqXG4gICAqIEdldCB0aGUgdmlkZW8tZGV2L2hscy5qcyBwYWNrYWdlIHZlcnNpb24uXG4gICAqL1xuICBzdGF0aWMgZ2V0IHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHZpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcmVxdWlyZWQgTWVkaWFTb3VyY2UgRXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIGlzTVNFU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBKcCgpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiBNZWRpYVNvdXJjZSBFeHRlbnNpb25zIGFyZSBhdmFpbGFibGUgYW5kIGlzVHlwZVN1cHBvcnRlZCBjaGVja3MgcGFzcyBmb3IgYW55IGJhc2VsaW5lIGNvZGVjcy5cbiAgICovXG4gIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdkEoKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBNZWRpYVNvdXJjZSBnbG9iYWwgdXNlZCBmb3IgTVNFIHBsYXliYWNrIChNYW5hZ2VkTWVkaWFTb3VyY2UsIE1lZGlhU291cmNlLCBvciBXZWJLaXRNZWRpYVNvdXJjZSkuXG4gICAqL1xuICBzdGF0aWMgZ2V0TWVkaWFTb3VyY2UoKSB7XG4gICAgcmV0dXJuIE1zKCk7XG4gIH1cbiAgc3RhdGljIGdldCBFdmVudHMoKSB7XG4gICAgcmV0dXJuIEk7XG4gIH1cbiAgc3RhdGljIGdldCBNZXRhZGF0YVNjaGVtYSgpIHtcbiAgICByZXR1cm4gYnI7XG4gIH1cbiAgc3RhdGljIGdldCBFcnJvclR5cGVzKCkge1xuICAgIHJldHVybiB2ZTtcbiAgfVxuICBzdGF0aWMgZ2V0IEVycm9yRGV0YWlscygpIHtcbiAgICByZXR1cm4gSjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byBuZXcgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIGdldCBEZWZhdWx0Q29uZmlnKCkge1xuICAgIHJldHVybiBIci5kZWZhdWx0Q29uZmlnID8gSHIuZGVmYXVsdENvbmZpZyA6IG9BO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byBuZXcgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIHNldCBEZWZhdWx0Q29uZmlnKGUpIHtcbiAgICBIci5kZWZhdWx0Q29uZmlnID0gZTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBITFMgY2xpZW50IHRoYXQgY2FuIGF0dGFjaCB0byBleGFjdGx5IG9uZSBgSFRNTE1lZGlhRWxlbWVudGAuXG4gICAqIEBwYXJhbSB1c2VyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGFwcGxpZWQgb3ZlciBgSGxzLkRlZmF1bHRDb25maWdgXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy51c2VyQ29uZmlnID0gdm9pZCAwLCB0aGlzLmxvZ2dlciA9IHZvaWQgMCwgdGhpcy5jb3JlQ29tcG9uZW50cyA9IHZvaWQgMCwgdGhpcy5uZXR3b3JrQ29udHJvbGxlcnMgPSB2b2lkIDAsIHRoaXMuX2VtaXR0ZXIgPSBuZXcgd3UoKSwgdGhpcy5fYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLl9tYXhIZGNwTGV2ZWwgPSBudWxsLCB0aGlzLmFickNvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMuYnVmZmVyQ29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5jYXBMZXZlbENvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMubGF0ZW5jeUNvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMubGV2ZWxDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMuYXVkaW9TdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLnN1YnRpdGl0bGVTdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmF1ZGlvVHJhY2tDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmludGVyc3RpdGlhbHNDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmdhcENvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMuZW1lQ29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5jbWNkQ29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5fbWVkaWEgPSBudWxsLCB0aGlzLl91cmwgPSBudWxsLCB0aGlzLl9zZXNzaW9uSWQgPSB2b2lkIDAsIHRoaXMudHJpZ2dlcmluZ0V4Y2VwdGlvbiA9IHZvaWQgMCwgdGhpcy5zdGFydGVkID0gITE7XG4gICAgY29uc3QgdCA9IHRoaXMubG9nZ2VyID0gTFMoZS5kZWJ1ZyB8fCAhMSwgXCJIbHMgaW5zdGFuY2VcIiwgZS5hc3NldFBsYXllcklkKSwgciA9IHRoaXMuY29uZmlnID0gbEEoSHIuRGVmYXVsdENvbmZpZywgZSwgdCk7XG4gICAgdGhpcy51c2VyQ29uZmlnID0gZSwgci5wcm9ncmVzc2l2ZSAmJiBjQShyLCB0KTtcbiAgICBjb25zdCB7XG4gICAgICBhYnJDb250cm9sbGVyOiBuLFxuICAgICAgYnVmZmVyQ29udHJvbGxlcjogaSxcbiAgICAgIGNhcExldmVsQ29udHJvbGxlcjogbyxcbiAgICAgIGVycm9yQ29udHJvbGxlcjogYSxcbiAgICAgIGZwc0NvbnRyb2xsZXI6IGxcbiAgICB9ID0gciwgYyA9IG5ldyBhKHRoaXMpLCB1ID0gdGhpcy5hYnJDb250cm9sbGVyID0gbmV3IG4odGhpcyksIGQgPSBuZXcgVGIodGhpcyksIGggPSByLmludGVyc3RpdGlhbHNDb250cm9sbGVyLCBmID0gaCA/IHRoaXMuaW50ZXJzdGl0aWFsc0NvbnRyb2xsZXIgPSBuZXcgaCh0aGlzLCBIcikgOiBudWxsLCBwID0gdGhpcy5idWZmZXJDb250cm9sbGVyID0gbmV3IGkodGhpcywgZCksIHkgPSB0aGlzLmNhcExldmVsQ29udHJvbGxlciA9IG5ldyBvKHRoaXMpLCBFID0gbmV3IGwodGhpcyksIGIgPSBuZXcgVEEodGhpcyksIFIgPSByLmNvbnRlbnRTdGVlcmluZ0NvbnRyb2xsZXIsIEEgPSBSID8gbmV3IFIodGhpcykgOiBudWxsLCBGID0gdGhpcy5sZXZlbENvbnRyb2xsZXIgPSBuZXcgeUEodGhpcywgQSksIE0gPSBuZXcgcEEodGhpcyksIEggPSBuZXcgYkEodGhpcy5jb25maWcsIHRoaXMubG9nZ2VyKSwgSyA9IHRoaXMuc3RyZWFtQ29udHJvbGxlciA9IG5ldyBTQSh0aGlzLCBkLCBIKSwgaiA9IHRoaXMuZ2FwQ29udHJvbGxlciA9IG5ldyBmQSh0aGlzLCBkKTtcbiAgICB5LnNldFN0cmVhbUNvbnRyb2xsZXIoSyksIEUuc2V0U3RyZWFtQ29udHJvbGxlcihLKTtcbiAgICBjb25zdCBDID0gW2IsIEYsIEtdO1xuICAgIGYgJiYgQy5zcGxpY2UoMSwgMCwgZiksIEEgJiYgQy5zcGxpY2UoMSwgMCwgQSksIHRoaXMubmV0d29ya0NvbnRyb2xsZXJzID0gQztcbiAgICBjb25zdCBrID0gW3UsIHAsIGosIHksIEUsIE0sIGRdO1xuICAgIHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXIgPSB0aGlzLmNyZWF0ZUNvbnRyb2xsZXIoci5hdWRpb1RyYWNrQ29udHJvbGxlciwgQyk7XG4gICAgY29uc3QgJCA9IHIuYXVkaW9TdHJlYW1Db250cm9sbGVyO1xuICAgICQgJiYgQy5wdXNoKHRoaXMuYXVkaW9TdHJlYW1Db250cm9sbGVyID0gbmV3ICQodGhpcywgZCwgSCkpLCB0aGlzLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyID0gdGhpcy5jcmVhdGVDb250cm9sbGVyKHIuc3VidGl0bGVUcmFja0NvbnRyb2xsZXIsIEMpO1xuICAgIGNvbnN0IFcgPSByLnN1YnRpdGxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICBXICYmIEMucHVzaCh0aGlzLnN1YnRpdGl0bGVTdHJlYW1Db250cm9sbGVyID0gbmV3IFcodGhpcywgZCwgSCkpLCB0aGlzLmNyZWF0ZUNvbnRyb2xsZXIoci50aW1lbGluZUNvbnRyb2xsZXIsIGspLCBILmVtZUNvbnRyb2xsZXIgPSB0aGlzLmVtZUNvbnRyb2xsZXIgPSB0aGlzLmNyZWF0ZUNvbnRyb2xsZXIoci5lbWVDb250cm9sbGVyLCBrKSwgdGhpcy5jbWNkQ29udHJvbGxlciA9IHRoaXMuY3JlYXRlQ29udHJvbGxlcihyLmNtY2RDb250cm9sbGVyLCBrKSwgdGhpcy5sYXRlbmN5Q29udHJvbGxlciA9IHRoaXMuY3JlYXRlQ29udHJvbGxlcihtQSwgayksIHRoaXMuY29yZUNvbXBvbmVudHMgPSBrLCBDLnB1c2goYyk7XG4gICAgY29uc3QgXyA9IGMub25FcnJvck91dDtcbiAgICB0eXBlb2YgXyA9PSBcImZ1bmN0aW9uXCIgJiYgdGhpcy5vbihJLkVSUk9SLCBfLCBjKSwgdGhpcy5vbihJLk1BTklGRVNUX0xPQURFRCwgYi5vbk1hbmlmZXN0TG9hZGVkLCBiKTtcbiAgfVxuICBjcmVhdGVDb250cm9sbGVyKGUsIHQpIHtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgciA9IG5ldyBlKHRoaXMpO1xuICAgICAgcmV0dXJuIHQgJiYgdC5wdXNoKHIpLCByO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBEZWxlZ2F0ZSB0aGUgRXZlbnRFbWl0dGVyIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkgb2YgSGxzLmpzXG4gIG9uKGUsIHQsIHIgPSB0aGlzKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbihlLCB0LCByKTtcbiAgfVxuICBvbmNlKGUsIHQsIHIgPSB0aGlzKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbmNlKGUsIHQsIHIpO1xuICB9XG4gIHJlbW92ZUFsbExpc3RlbmVycyhlKSB7XG4gICAgdGhpcy5fZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk7XG4gIH1cbiAgb2ZmKGUsIHQsIHIgPSB0aGlzLCBuKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vZmYoZSwgdCwgciwgbik7XG4gIH1cbiAgbGlzdGVuZXJzKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1pdHRlci5saXN0ZW5lcnMoZSk7XG4gIH1cbiAgZW1pdChlLCB0LCByKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZW1pdChlLCB0LCByKTtcbiAgfVxuICB0cmlnZ2VyKGUsIHQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGVidWcpXG4gICAgICByZXR1cm4gdGhpcy5lbWl0KGUsIGUsIHQpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWl0KGUsIGUsIHQpO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIGlmICh0aGlzLmxvZ2dlci5lcnJvcihcIkFuIGludGVybmFsIGVycm9yIGhhcHBlbmVkIHdoaWxlIGhhbmRsaW5nIGV2ZW50IFwiICsgZSArICcuIEVycm9yIG1lc3NhZ2U6IFwiJyArIHIubWVzc2FnZSArICdcIi4gSGVyZSBpcyBhIHN0YWNrdHJhY2U6JywgciksICF0aGlzLnRyaWdnZXJpbmdFeGNlcHRpb24pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyaW5nRXhjZXB0aW9uID0gITA7XG4gICAgICAgIGNvbnN0IG4gPSBlID09PSBJLkVSUk9SO1xuICAgICAgICB0aGlzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICAgIGRldGFpbHM6IEouSU5URVJOQUxfRVhDRVBUSU9OLFxuICAgICAgICAgIGZhdGFsOiBuLFxuICAgICAgICAgIGV2ZW50OiBlLFxuICAgICAgICAgIGVycm9yOiByXG4gICAgICAgIH0pLCB0aGlzLnRyaWdnZXJpbmdFeGNlcHRpb24gPSAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGxpc3RlbmVyQ291bnQoZSkge1xuICAgIHJldHVybiB0aGlzLl9lbWl0dGVyLmxpc3RlbmVyQ291bnQoZSk7XG4gIH1cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgdGhlIGluc3RhbmNlXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhcImRlc3Ryb3lcIiksIHRoaXMudHJpZ2dlcihJLkRFU1RST1lJTkcsIHZvaWQgMCksIHRoaXMuZGV0YWNoTWVkaWEoKSwgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgdGhpcy5fYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLl91cmwgPSBudWxsLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKCh0KSA9PiB0LmRlc3Ryb3koKSksIHRoaXMubmV0d29ya0NvbnRyb2xsZXJzLmxlbmd0aCA9IDAsIHRoaXMuY29yZUNvbXBvbmVudHMuZm9yRWFjaCgodCkgPT4gdC5kZXN0cm95KCkpLCB0aGlzLmNvcmVDb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgY29uc3QgZSA9IHRoaXMuY29uZmlnO1xuICAgIGUueGhyU2V0dXAgPSBlLmZldGNoU2V0dXAgPSB2b2lkIDAsIHRoaXMudXNlckNvbmZpZyA9IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEF0dGFjaGVzIEhscy5qcyB0byBhIG1lZGlhIGVsZW1lbnRcbiAgICovXG4gIGF0dGFjaE1lZGlhKGUpIHtcbiAgICBpZiAoIWUgfHwgXCJtZWRpYVwiIGluIGUgJiYgIWUubWVkaWEpIHtcbiAgICAgIGNvbnN0IGkgPSBuZXcgRXJyb3IoYGF0dGFjaE1lZGlhIGZhaWxlZDogaW52YWxpZCBhcmd1bWVudCAoJHtlfSlgKTtcbiAgICAgIHRoaXMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLkFUVEFDSF9NRURJQV9FUlJPUixcbiAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICBlcnJvcjogaVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmxvZyhcImF0dGFjaE1lZGlhXCIpLCB0aGlzLl9tZWRpYSAmJiAodGhpcy5sb2dnZXIud2FybihcIm1lZGlhIG11c3QgYmUgZGV0YWNoZWQgYmVmb3JlIGF0dGFjaGluZ1wiKSwgdGhpcy5kZXRhY2hNZWRpYSgpKTtcbiAgICBjb25zdCB0ID0gXCJtZWRpYVwiIGluIGUsIHIgPSB0ID8gZS5tZWRpYSA6IGUsIG4gPSB0ID8gZSA6IHtcbiAgICAgIG1lZGlhOiByXG4gICAgfTtcbiAgICB0aGlzLl9tZWRpYSA9IHIsIHRoaXMudHJpZ2dlcihJLk1FRElBX0FUVEFDSElORywgbik7XG4gIH1cbiAgLyoqXG4gICAqIERldGFjaCBIbHMuanMgZnJvbSB0aGUgbWVkaWFcbiAgICovXG4gIGRldGFjaE1lZGlhKCkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhcImRldGFjaE1lZGlhXCIpLCB0aGlzLnRyaWdnZXIoSS5NRURJQV9ERVRBQ0hJTkcsIHt9KSwgdGhpcy5fbWVkaWEgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBEZXRhY2ggSFRNTE1lZGlhRWxlbWVudCwgTWVkaWFTb3VyY2UsIGFuZCBTb3VyY2VCdWZmZXJzIHdpdGhvdXQgcmVzZXQsIGZvciBhdHRhY2hpbmcgdG8gYW5vdGhlciBpbnN0YW5jZVxuICAgKi9cbiAgdHJhbnNmZXJNZWRpYSgpIHtcbiAgICB0aGlzLl9tZWRpYSA9IG51bGw7XG4gICAgY29uc3QgZSA9IHRoaXMuYnVmZmVyQ29udHJvbGxlci50cmFuc2Zlck1lZGlhKCk7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihJLk1FRElBX0RFVEFDSElORywge1xuICAgICAgdHJhbnNmZXJNZWRpYTogZVxuICAgIH0pLCBlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHNvdXJjZSBVUkwuIENhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS5cbiAgICovXG4gIGxvYWRTb3VyY2UoZSkge1xuICAgIHRoaXMuc3RvcExvYWQoKTtcbiAgICBjb25zdCB0ID0gdGhpcy5tZWRpYSwgciA9IHRoaXMuX3VybCwgbiA9IHRoaXMuX3VybCA9IGh1LmJ1aWxkQWJzb2x1dGVVUkwoc2VsZi5sb2NhdGlvbi5ocmVmLCBlLCB7XG4gICAgICBhbHdheXNOb3JtYWxpemU6ICEwXG4gICAgfSk7XG4gICAgdGhpcy5fYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLl9tYXhIZGNwTGV2ZWwgPSBudWxsLCB0aGlzLmxvZ2dlci5sb2coYGxvYWRTb3VyY2U6JHtufWApLCB0ICYmIHIgJiYgKHIgIT09IG4gfHwgdGhpcy5idWZmZXJDb250cm9sbGVyLmhhc1NvdXJjZVR5cGVzKCkpICYmICh0aGlzLmRldGFjaE1lZGlhKCksIHRoaXMuYXR0YWNoTWVkaWEodCkpLCB0aGlzLnRyaWdnZXIoSS5NQU5JRkVTVF9MT0FESU5HLCB7XG4gICAgICB1cmw6IGVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGxvYWRlZCBVUkxcbiAgICovXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgZW5vdWdoIGhhcyBiZWVuIGJ1ZmZlcmVkIHRvIHNlZWsgdG8gc3RhcnQgcG9zaXRpb24gb3IgdXNlIGBtZWRpYS5jdXJyZW50VGltZWAgdG8gZGV0ZXJtaW5lIG5leHQgbG9hZCBwb3NpdGlvblxuICAgKi9cbiAgZ2V0IGhhc0Vub3VnaFRvU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtQ29udHJvbGxlci5oYXNFbm91Z2hUb1N0YXJ0O1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YXJ0UG9zaXRpb24gc2V0IG9uIHN0YXJ0TG9hZChwb3NpdGlvbikgb3Igb24gYXV0b3N0YXJ0IHdpdGggY29uZmlnLnN0YXJ0UG9zaXRpb25cbiAgICovXG4gIGdldCBzdGFydFBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuc3RhcnRQb3NpdGlvblZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTdGFydCBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHNvdXJjZS5cbiAgICogRGVwZW5kaW5nIG9uIGRlZmF1bHQgY29uZmlnLCBjbGllbnQgc3RhcnRzIGxvYWRpbmcgYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGlzIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gLSBTZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIHN0cmVhbSBmcm9tLlxuICAgKiBEZWZhdWx0cyB0byAtMSAoTm9uZTogc3RhcnRzIGZyb20gZWFybGllc3QgcG9pbnQpXG4gICAqL1xuICBzdGFydExvYWQoZSA9IC0xLCB0KSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBzdGFydExvYWQoJHtlICsgKHQgPyBcIiwgPHNraXAgc2VlayB0byBzdGFydD5cIiA6IFwiXCIpfSlgKSwgdGhpcy5zdGFydGVkID0gITAsIHRoaXMucmVzdW1lQnVmZmVyaW5nKCk7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5sZW5ndGggJiYgKHRoaXMubmV0d29ya0NvbnRyb2xsZXJzW3JdLnN0YXJ0TG9hZChlLCB0KSwgISghdGhpcy5zdGFydGVkIHx8ICF0aGlzLm5ldHdvcmtDb250cm9sbGVycykpOyByKyspXG4gICAgICA7XG4gIH1cbiAgLyoqXG4gICAqIFN0b3AgbG9hZGluZyBvZiBhbnkgc3RyZWFtIGRhdGEuXG4gICAqL1xuICBzdG9wTG9hZCgpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coXCJzdG9wTG9hZFwiKSwgdGhpcy5zdGFydGVkID0gITE7XG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5sZW5ndGggJiYgKHRoaXMubmV0d29ya0NvbnRyb2xsZXJzW2VdLnN0b3BMb2FkKCksICEodGhpcy5zdGFydGVkIHx8ICF0aGlzLm5ldHdvcmtDb250cm9sbGVycykpOyBlKyspXG4gICAgICA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBsb2FkaW5nLCB0b2dnbGVkIHdpdGggYHN0YXJ0TG9hZCgpYCBhbmQgYHN0b3BMb2FkKClgLCBpcyBhY3RpdmUgb3Igbm90YC5cbiAgICovXG4gIGdldCBsb2FkaW5nRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0YXRlIG9mIGZyYWdtZW50IGxvYWRpbmcgdG9nZ2xlZCBieSBjYWxsaW5nIGBwYXVzZUJ1ZmZlcmluZygpYCBhbmQgYHJlc3VtZUJ1ZmZlcmluZygpYC5cbiAgICovXG4gIGdldCBidWZmZXJpbmdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYnVmZmVyaW5nRW5hYmxlZDtcbiAgfVxuICAvKipcbiAgICogUmVzdW1lcyBzdHJlYW0gY29udHJvbGxlciBzZWdtZW50IGxvYWRpbmcgYWZ0ZXIgYHBhdXNlQnVmZmVyaW5nYCBoYXMgYmVlbiBjYWxsZWQuXG4gICAqL1xuICByZXN1bWVCdWZmZXJpbmcoKSB7XG4gICAgdGhpcy5idWZmZXJpbmdFbmFibGVkIHx8ICh0aGlzLmxvZ2dlci5sb2coXCJyZXN1bWUgYnVmZmVyaW5nXCIpLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICBlLnJlc3VtZUJ1ZmZlcmluZyAmJiBlLnJlc3VtZUJ1ZmZlcmluZygpO1xuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogUHJldmVudHMgc3RyZWFtIGNvbnRyb2xsZXIgZnJvbSBsb2FkaW5nIG5ldyBzZWdtZW50cyB1bnRpbCBgcmVzdW1lQnVmZmVyaW5nYCBpcyBjYWxsZWQuXG4gICAqIFRoaXMgYWxsb3dzIGZvciBtZWRpYSBidWZmZXJpbmcgdG8gYmUgcGF1c2VkIHdpdGhvdXQgaW50ZXJ1cHRpbmcgcGxheWxpc3QgbG9hZGluZy5cbiAgICovXG4gIHBhdXNlQnVmZmVyaW5nKCkge1xuICAgIHRoaXMuYnVmZmVyaW5nRW5hYmxlZCAmJiAodGhpcy5sb2dnZXIubG9nKFwicGF1c2UgYnVmZmVyaW5nXCIpLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICBlLnBhdXNlQnVmZmVyaW5nICYmIGUucGF1c2VCdWZmZXJpbmcoKTtcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IGluRmxpZ2h0RnJhZ21lbnRzKCkge1xuICAgIGNvbnN0IGUgPSB7XG4gICAgICBbcGUuTUFJTl06IHRoaXMuc3RyZWFtQ29udHJvbGxlci5pbkZsaWdodEZyYWdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmF1ZGlvU3RyZWFtQ29udHJvbGxlciAmJiAoZVtwZS5BVURJT10gPSB0aGlzLmF1ZGlvU3RyZWFtQ29udHJvbGxlci5pbkZsaWdodEZyYWcpLCB0aGlzLnN1YnRpdGl0bGVTdHJlYW1Db250cm9sbGVyICYmIChlW3BlLlNVQlRJVExFXSA9IHRoaXMuc3VidGl0aXRsZVN0cmVhbUNvbnRyb2xsZXIuaW5GbGlnaHRGcmFnKSwgZTtcbiAgfVxuICAvKipcbiAgICogU3dhcCB0aHJvdWdoIHBvc3NpYmxlIGF1ZGlvIGNvZGVjcyBpbiB0aGUgc3RyZWFtIChmb3IgZXhhbXBsZSB0byBzd2l0Y2ggZnJvbSBzdGVyZW8gdG8gNS4xKVxuICAgKi9cbiAgc3dhcEF1ZGlvQ29kZWMoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKFwic3dhcEF1ZGlvQ29kZWNcIiksIHRoaXMuc3RyZWFtQ29udHJvbGxlci5zd2FwQXVkaW9Db2RlYygpO1xuICB9XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBtZWRpYS1lbGVtZW50IGZhaWxzLCB0aGlzIGFsbG93cyB0byBkZXRhY2ggYW5kIHRoZW4gcmUtYXR0YWNoIGl0XG4gICAqIGFzIG9uZSBjYWxsIChjb252ZW5pZW5jZSBtZXRob2QpLlxuICAgKlxuICAgKiBBdXRvbWF0aWMgcmVjb3Zlcnkgb2YgbWVkaWEtZXJyb3JzIGJ5IHRoaXMgcHJvY2VzcyBpcyBjb25maWd1cmFibGUuXG4gICAqL1xuICByZWNvdmVyTWVkaWFFcnJvcigpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coXCJyZWNvdmVyTWVkaWFFcnJvclwiKTtcbiAgICBjb25zdCBlID0gdGhpcy5fbWVkaWEsIHQgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlLmN1cnJlbnRUaW1lO1xuICAgIHRoaXMuZGV0YWNoTWVkaWEoKSwgZSAmJiAodGhpcy5hdHRhY2hNZWRpYShlKSwgdCAmJiB0aGlzLnN0YXJ0TG9hZCh0KSk7XG4gIH1cbiAgcmVtb3ZlTGV2ZWwoZSkge1xuICAgIHRoaXMubGV2ZWxDb250cm9sbGVyLnJlbW92ZUxldmVsKGUpO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIFVVSUQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2Vzc2lvbklkKCkge1xuICAgIGxldCBlID0gdGhpcy5fc2Vzc2lvbklkO1xuICAgIHJldHVybiBlIHx8IChlID0gdGhpcy5fc2Vzc2lvbklkID0gZncoKSksIGU7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGxldmVscyAodmFyaWFudHMpIHNvcnRlZCBieSBIRENQLUxFVkVMLCBSRVNPTFVUSU9OIChoZWlnaHQpLCBGUkFNRS1SQVRFLCBDT0RFQ1MsIFZJREVPLVJBTkdFLCBhbmQgQkFORFdJRFRIXG4gICAqL1xuICBnZXQgbGV2ZWxzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmxldmVsQ29udHJvbGxlci5sZXZlbHM7XG4gICAgcmV0dXJuIGUgfHwgW107XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm5zIExldmVsRGV0YWlscyBvZiBsYXN0IGxvYWRlZCBsZXZlbCAodmFyaWFudCkgb3IgYG51bGxgIHByaW9yIHRvIGxvYWRpbmcgYSBtZWRpYSBwbGF5bGlzdC5cbiAgICovXG4gIGdldCBsYXRlc3RMZXZlbERldGFpbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtQ29udHJvbGxlci5nZXRMZXZlbERldGFpbHMoKSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBMZXZlbCBvYmplY3Qgb2Ygc2VsZWN0ZWQgbGV2ZWwgKHZhcmlhbnQpIG9yIGBudWxsYCBwcmlvciB0byBzZWxlY3RpbmcgYSBsZXZlbCBvciBvbmNlIHRoZSBsZXZlbCBpcyByZW1vdmVkLlxuICAgKi9cbiAgZ2V0IGxvYWRMZXZlbE9iaigpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubG9hZExldmVsT2JqO1xuICB9XG4gIC8qKlxuICAgKiBJbmRleCBvZiBxdWFsaXR5IGxldmVsICh2YXJpYW50KSBjdXJyZW50bHkgcGxheWVkXG4gICAqL1xuICBnZXQgY3VycmVudExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuY3VycmVudExldmVsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgcXVhbGl0eSBsZXZlbCBpbmRleCBpbW1lZGlhdGVseS4gVGhpcyB3aWxsIGZsdXNoIHRoZSBjdXJyZW50IGJ1ZmZlciB0byByZXBsYWNlIHRoZSBxdWFsaXR5IGFzYXAuIFRoYXQgbWVhbnMgcGxheWJhY2sgd2lsbCBpbnRlcnJ1cHQgYXQgbGVhc3Qgc2hvcnRseSB0byByZS1idWZmZXIgYW5kIHJlLXN5bmMgZXZlbnR1YWxseS4gU2V0IHRvIC0xIGZvciBhdXRvbWF0aWMgbGV2ZWwgc2VsZWN0aW9uLlxuICAgKi9cbiAgc2V0IGN1cnJlbnRMZXZlbChlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBzZXQgY3VycmVudExldmVsOiR7ZX1gKSwgdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPSBlLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuaW1tZWRpYXRlTGV2ZWxTd2l0Y2goKTtcbiAgfVxuICAvKipcbiAgICogSW5kZXggb2YgbmV4dCBxdWFsaXR5IGxldmVsIGxvYWRlZCBhcyBzY2hlZHVsZWQgYnkgc3RyZWFtIGNvbnRyb2xsZXIuXG4gICAqL1xuICBnZXQgbmV4dExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIubmV4dExldmVsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgcXVhbGl0eSBsZXZlbCBpbmRleCBmb3IgbmV4dCBsb2FkZWQgZGF0YS5cbiAgICogVGhpcyB3aWxsIHN3aXRjaCB0aGUgdmlkZW8gcXVhbGl0eSBhc2FwLCB3aXRob3V0IGludGVycnVwdGluZyBwbGF5YmFjay5cbiAgICogTWF5IGFib3J0IGN1cnJlbnQgbG9hZGluZyBvZiBkYXRhLCBhbmQgZmx1c2ggcGFydHMgb2YgYnVmZmVyIChvdXRzaWRlIGN1cnJlbnRseSBwbGF5ZWQgZnJhZ21lbnQgcmVnaW9uKS5cbiAgICogQHBhcmFtIG5ld0xldmVsIC0gUGFzcyAtMSBmb3IgYXV0b21hdGljIGxldmVsIHNlbGVjdGlvblxuICAgKi9cbiAgc2V0IG5leHRMZXZlbChlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBzZXQgbmV4dExldmVsOiR7ZX1gKSwgdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPSBlLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIubmV4dExldmVsU3dpdGNoKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcXVhbGl0eSBsZXZlbCBvZiB0aGUgY3VycmVudGx5IG9yIGxhc3QgKG9mIG5vbmUgaXMgbG9hZGVkIGN1cnJlbnRseSkgc2VnbWVudFxuICAgKi9cbiAgZ2V0IGxvYWRMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubGV2ZWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBxdWFsaXR5IGxldmVsIGluZGV4IGZvciBuZXh0IGxvYWRlZCBkYXRhIGluIGEgY29uc2VydmF0aXZlIHdheS5cbiAgICogVGhpcyB3aWxsIHN3aXRjaCB0aGUgcXVhbGl0eSB3aXRob3V0IGZsdXNoaW5nLCBidXQgaW50ZXJydXB0IGN1cnJlbnQgbG9hZGluZy5cbiAgICogVGh1cyB0aGUgbW9tZW50IHdoZW4gdGhlIHF1YWxpdHkgc3dpdGNoIHdpbGwgYXBwZWFyIGluIGVmZmVjdCB3aWxsIG9ubHkgYmUgYWZ0ZXIgdGhlIGFscmVhZHkgZXhpc3RpbmcgYnVmZmVyLlxuICAgKiBAcGFyYW0gbmV3TGV2ZWwgLSBQYXNzIC0xIGZvciBhdXRvbWF0aWMgbGV2ZWwgc2VsZWN0aW9uXG4gICAqL1xuICBzZXQgbG9hZExldmVsKGUpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coYHNldCBsb2FkTGV2ZWw6JHtlfWApLCB0aGlzLmxldmVsQ29udHJvbGxlci5tYW51YWxMZXZlbCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIGdldCBuZXh0IHF1YWxpdHkgbGV2ZWwgbG9hZGVkXG4gICAqL1xuICBnZXQgbmV4dExvYWRMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubmV4dExvYWRMZXZlbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHF1YWxpdHkgbGV2ZWwgb2YgbmV4dCBsb2FkZWQgc2VnbWVudCBpbiBhIGZ1bGx5IFwibm9uLWRlc3RydWN0aXZlXCIgd2F5LlxuICAgKiBTYW1lIGFzIGBsb2FkTGV2ZWxgIGJ1dCB3aWxsIHdhaXQgZm9yIG5leHQgc3dpdGNoICh1bnRpbCBjdXJyZW50IGxvYWRpbmcgaXMgZG9uZSkuXG4gICAqL1xuICBzZXQgbmV4dExvYWRMZXZlbChlKSB7XG4gICAgdGhpcy5sZXZlbENvbnRyb2xsZXIubmV4dExvYWRMZXZlbCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBcImZpcnN0IGxldmVsXCI6IGxpa2UgYSBkZWZhdWx0IGxldmVsLCBpZiBub3Qgc2V0LFxuICAgKiBmYWxscyBiYWNrIHRvIGluZGV4IG9mIGZpcnN0IGxldmVsIHJlZmVyZW5jZWQgaW4gbWFuaWZlc3RcbiAgICovXG4gIGdldCBmaXJzdExldmVsKCkge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmxldmVsQ29udHJvbGxlci5maXJzdExldmVsLCB0aGlzLm1pbkF1dG9MZXZlbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgXCJmaXJzdC1sZXZlbFwiLCBzZWUgZ2V0dGVyLlxuICAgKi9cbiAgc2V0IGZpcnN0TGV2ZWwoZSkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhgc2V0IGZpcnN0TGV2ZWw6JHtlfWApLCB0aGlzLmxldmVsQ29udHJvbGxlci5maXJzdExldmVsID0gZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZXNpcmVkIHN0YXJ0IGxldmVsIGZvciB0aGUgZmlyc3QgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIGxvYWRlZC5cbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgLTEgaW5kaWNhdGVzIGF1dG9tYXRpYyBzdGFydCBsZXZlbCBzZWxlY3Rpb24uXG4gICAqIFNldHRpbmcgaGxzLm5leHRBdXRvTGV2ZWwgd2l0aG91dCBzZXR0aW5nIGEgc3RhcnRMZXZlbCB3aWxsIHJlc3VsdCBpblxuICAgKiB0aGUgbmV4dEF1dG9MZXZlbCB2YWx1ZSBiZWluZyB1c2VkIGZvciBvbmUgZnJhZ21lbnQgbG9hZC5cbiAgICovXG4gIGdldCBzdGFydExldmVsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsO1xuICAgIHJldHVybiBlID09PSAtMSAmJiB0aGlzLmFickNvbnRyb2xsZXIuZm9yY2VkQXV0b0xldmVsID4gLTEgPyB0aGlzLmFickNvbnRyb2xsZXIuZm9yY2VkQXV0b0xldmVsIDogZTtcbiAgfVxuICAvKipcbiAgICogc2V0ICBzdGFydCBsZXZlbCAobGV2ZWwgb2YgZmlyc3QgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIHBsYXllZCBiYWNrKVxuICAgKiBpZiBub3Qgb3ZlcnJpZGVkIGJ5IHVzZXIsIGZpcnN0IGxldmVsIGFwcGVhcmluZyBpbiBtYW5pZmVzdCB3aWxsIGJlIHVzZWQgYXMgc3RhcnQgbGV2ZWxcbiAgICogaWYgLTEgOiBhdXRvbWF0aWMgc3RhcnQgbGV2ZWwgc2VsZWN0aW9uLCBwbGF5YmFjayB3aWxsIHN0YXJ0IGZyb20gbGV2ZWwgbWF0Y2hpbmcgZG93bmxvYWQgYmFuZHdpZHRoXG4gICAqIChkZXRlcm1pbmVkIGZyb20gZG93bmxvYWQgb2YgZmlyc3Qgc2VnbWVudClcbiAgICovXG4gIHNldCBzdGFydExldmVsKGUpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coYHNldCBzdGFydExldmVsOiR7ZX1gKSwgZSAhPT0gLTEgJiYgKGUgPSBNYXRoLm1heChlLCB0aGlzLm1pbkF1dG9MZXZlbCkpLCB0aGlzLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsID0gZTtcbiAgfVxuICAvKipcbiAgICogV2hldGhlciBsZXZlbCBjYXBwaW5nIGlzIGVuYWJsZWQuXG4gICAqIERlZmF1bHQgdmFsdWUgaXMgc2V0IHZpYSBgY29uZmlnLmNhcExldmVsVG9QbGF5ZXJTaXplYC5cbiAgICovXG4gIGdldCBjYXBMZXZlbFRvUGxheWVyU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemU7XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbGV2ZWwgY2FwcGluZy4gSWYgZGlzYWJsZWQgYWZ0ZXIgcHJldmlvdXNseSBlbmFibGVkLCBgbmV4dExldmVsU3dpdGNoYCB3aWxsIGJlIGltbWVkaWF0ZWx5IGNhbGxlZC5cbiAgICovXG4gIHNldCBjYXBMZXZlbFRvUGxheWVyU2l6ZShlKSB7XG4gICAgY29uc3QgdCA9ICEhZTtcbiAgICB0ICE9PSB0aGlzLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSAmJiAodCA/IHRoaXMuY2FwTGV2ZWxDb250cm9sbGVyLnN0YXJ0Q2FwcGluZygpIDogKHRoaXMuY2FwTGV2ZWxDb250cm9sbGVyLnN0b3BDYXBwaW5nKCksIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIubmV4dExldmVsU3dpdGNoKCkpLCB0aGlzLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSA9IHQpO1xuICB9XG4gIC8qKlxuICAgKiBDYXBwaW5nL21heCBsZXZlbCB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IGF1dG9tYXRpYyBsZXZlbCBzZWxlY3Rpb24gYWxnb3JpdGhtIChgQUJSQ29udHJvbGxlcmApXG4gICAqL1xuICBnZXQgYXV0b0xldmVsQ2FwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b0xldmVsQ2FwcGluZztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBiYW5kd2lkdGggZXN0aW1hdGUgaW4gYml0cyBwZXIgc2Vjb25kLCB3aGVuIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBgTmFOYCBpcyByZXR1cm5lZC5cbiAgICovXG4gIGdldCBiYW5kd2lkdGhFc3RpbWF0ZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBid0VzdGltYXRvcjogZVxuICAgIH0gPSB0aGlzLmFickNvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLmdldEVzdGltYXRlKCkgOiBOYU47XG4gIH1cbiAgc2V0IGJhbmR3aWR0aEVzdGltYXRlKGUpIHtcbiAgICB0aGlzLmFickNvbnRyb2xsZXIucmVzZXRFc3RpbWF0b3IoZSk7XG4gIH1cbiAgZ2V0IGFickV3bWFEZWZhdWx0RXN0aW1hdGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYndFc3RpbWF0b3I6IGVcbiAgICB9ID0gdGhpcy5hYnJDb250cm9sbGVyO1xuICAgIHJldHVybiBlID8gZS5kZWZhdWx0RXN0aW1hdGUgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aW1lIHRvIGZpcnN0IGJ5dGUgZXN0aW1hdGVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB0dGZiRXN0aW1hdGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYndFc3RpbWF0b3I6IGVcbiAgICB9ID0gdGhpcy5hYnJDb250cm9sbGVyO1xuICAgIHJldHVybiBlID8gZS5nZXRFc3RpbWF0ZVRURkIoKSA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogQ2FwcGluZy9tYXggbGV2ZWwgdmFsdWUgdGhhdCBzaG91bGQgYmUgdXNlZCBieSBhdXRvbWF0aWMgbGV2ZWwgc2VsZWN0aW9uIGFsZ29yaXRobSAoYEFCUkNvbnRyb2xsZXJgKVxuICAgKi9cbiAgc2V0IGF1dG9MZXZlbENhcHBpbmcoZSkge1xuICAgIHRoaXMuX2F1dG9MZXZlbENhcHBpbmcgIT09IGUgJiYgKHRoaXMubG9nZ2VyLmxvZyhgc2V0IGF1dG9MZXZlbENhcHBpbmc6JHtlfWApLCB0aGlzLl9hdXRvTGV2ZWxDYXBwaW5nID0gZSwgdGhpcy5sZXZlbENvbnRyb2xsZXIuY2hlY2tNYXhBdXRvVXBkYXRlZCgpKTtcbiAgfVxuICBnZXQgbWF4SGRjcExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhIZGNwTGV2ZWw7XG4gIH1cbiAgc2V0IG1heEhkY3BMZXZlbChlKSB7XG4gICAgYWIoZSkgJiYgdGhpcy5fbWF4SGRjcExldmVsICE9PSBlICYmICh0aGlzLl9tYXhIZGNwTGV2ZWwgPSBlLCB0aGlzLmxldmVsQ29udHJvbGxlci5jaGVja01heEF1dG9VcGRhdGVkKCkpO1xuICB9XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gYXV0b21hdGljIGxldmVsIHNlbGVjdGlvbiBlbmFibGVkXG4gICAqL1xuICBnZXQgYXV0b0xldmVsRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPT09IC0xO1xuICB9XG4gIC8qKlxuICAgKiBMZXZlbCBzZXQgbWFudWFsbHkgKGlmIGFueSlcbiAgICovXG4gIGdldCBtYW51YWxMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWw7XG4gIH1cbiAgLyoqXG4gICAqIG1pbiBsZXZlbCBzZWxlY3RhYmxlIGluIGF1dG8gbW9kZSBhY2NvcmRpbmcgdG8gY29uZmlnLm1pbkF1dG9CaXRyYXRlXG4gICAqL1xuICBnZXQgbWluQXV0b0xldmVsKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtaW5BdXRvQml0cmF0ZTogdFxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSkgcmV0dXJuIDA7XG4gICAgY29uc3QgciA9IGUubGVuZ3RoO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcjsgbisrKVxuICAgICAgaWYgKGVbbl0ubWF4Qml0cmF0ZSA+PSB0KVxuICAgICAgICByZXR1cm4gbjtcbiAgICByZXR1cm4gMDtcbiAgfVxuICAvKipcbiAgICogbWF4IGxldmVsIHNlbGVjdGFibGUgaW4gYXV0byBtb2RlIGFjY29yZGluZyB0byBhdXRvTGV2ZWxDYXBwaW5nXG4gICAqL1xuICBnZXQgbWF4QXV0b0xldmVsKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIGF1dG9MZXZlbENhcHBpbmc6IHQsXG4gICAgICBtYXhIZGNwTGV2ZWw6IHJcbiAgICB9ID0gdGhpcztcbiAgICBsZXQgbjtcbiAgICBpZiAodCA9PT0gLTEgJiYgZSAhPSBudWxsICYmIGUubGVuZ3RoID8gbiA9IGUubGVuZ3RoIC0gMSA6IG4gPSB0LCByKVxuICAgICAgZm9yIChsZXQgaSA9IG47IGktLTsgKSB7XG4gICAgICAgIGNvbnN0IG8gPSBlW2ldLmF0dHJzW1wiSERDUC1MRVZFTFwiXTtcbiAgICAgICAgaWYgKG8gJiYgbyA8PSByKVxuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIGdldCBmaXJzdEF1dG9MZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5hYnJDb250cm9sbGVyLmZpcnN0QXV0b0xldmVsO1xuICB9XG4gIC8qKlxuICAgKiBuZXh0IGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgcXVhbGl0eSBsZXZlbFxuICAgKi9cbiAgZ2V0IG5leHRBdXRvTGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWJyQ29udHJvbGxlci5uZXh0QXV0b0xldmVsO1xuICB9XG4gIC8qKlxuICAgKiB0aGlzIHNldHRlciBpcyB1c2VkIHRvIGZvcmNlIG5leHQgYXV0byBsZXZlbC5cbiAgICogdGhpcyBpcyB1c2VmdWwgdG8gZm9yY2UgYSBzd2l0Y2ggZG93biBpbiBhdXRvIG1vZGU6XG4gICAqIGluIGNhc2Ugb2YgbG9hZCBlcnJvciBvbiBsZXZlbCBOLCBobHMuanMgY2FuIHNldCBuZXh0QXV0b0xldmVsIHRvIE4tMSBmb3IgZXhhbXBsZSlcbiAgICogZm9yY2VkIHZhbHVlIGlzIHZhbGlkIGZvciBvbmUgZnJhZ21lbnQuIHVwb24gc3VjY2Vzc2Z1bCBmcmFnIGxvYWRpbmcgYXQgZm9yY2VkIGxldmVsLFxuICAgKiB0aGlzIHZhbHVlIHdpbGwgYmUgcmVzZXR0ZWQgdG8gLTEgYnkgQUJSIGNvbnRyb2xsZXIuXG4gICAqL1xuICBzZXQgbmV4dEF1dG9MZXZlbChlKSB7XG4gICAgdGhpcy5hYnJDb250cm9sbGVyLm5leHRBdXRvTGV2ZWwgPSBlO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGRhdGV0aW1lIHZhbHVlIHJlbGF0aXZlIHRvIG1lZGlhLmN1cnJlbnRUaW1lIGZvciB0aGUgYWN0aXZlIGxldmVsIFByb2dyYW0gRGF0ZSBUaW1lIGlmIHByZXNlbnRcbiAgICovXG4gIGdldCBwbGF5aW5nRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmN1cnJlbnRQcm9ncmFtRGF0ZVRpbWU7XG4gIH1cbiAgZ2V0IG1haW5Gb3J3YXJkQnVmZmVySW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmdldE1haW5Gd2RCdWZmZXJJbmZvKCk7XG4gIH1cbiAgZ2V0IG1heEJ1ZmZlckxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLm1heEJ1ZmZlckxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogRmluZCBhbmQgc2VsZWN0IHRoZSBiZXN0IG1hdGNoaW5nIGF1ZGlvIHRyYWNrLCBtYWtpbmcgYSBsZXZlbCBzd2l0Y2ggd2hlbiBhIEdyb3VwIGNoYW5nZSBpcyBuZWNlc3NhcnkuXG4gICAqIFVwZGF0ZXMgYGhscy5jb25maWcuYXVkaW9QcmVmZXJlbmNlYC4gUmV0dXJucyB0aGUgc2VsZWN0ZWQgdHJhY2ssIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyB0cmFjayBpcyBmb3VuZC5cbiAgICovXG4gIHNldEF1ZGlvT3B0aW9uKGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gKCh0ID0gdGhpcy5hdWRpb1RyYWNrQ29udHJvbGxlcikgPT0gbnVsbCA/IHZvaWQgMCA6IHQuc2V0QXVkaW9PcHRpb24oZSkpIHx8IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHNlbGVjdCB0aGUgYmVzdCBtYXRjaGluZyBzdWJ0aXRsZSB0cmFjaywgbWFraW5nIGEgbGV2ZWwgc3dpdGNoIHdoZW4gYSBHcm91cCBjaGFuZ2UgaXMgbmVjZXNzYXJ5LlxuICAgKiBVcGRhdGVzIGBobHMuY29uZmlnLnN1YnRpdGxlUHJlZmVyZW5jZWAuIFJldHVybnMgdGhlIHNlbGVjdGVkIHRyYWNrLCBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgdHJhY2sgaXMgZm91bmQuXG4gICAqL1xuICBzZXRTdWJ0aXRsZU9wdGlvbihlKSB7XG4gICAgdmFyIHQ7XG4gICAgcmV0dXJuICgodCA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXIpID09IG51bGwgPyB2b2lkIDAgOiB0LnNldFN1YnRpdGxlT3B0aW9uKGUpKSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXVkaW8gdHJhY2tzIGFjcm9zcyBhbGwgbWVkaWEgZ3JvdXBzXG4gICAqL1xuICBnZXQgYWxsQXVkaW9UcmFja3MoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLmFsbEF1ZGlvVHJhY2tzIDogW107XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBzZWxlY3RhYmxlIGF1ZGlvIHRyYWNrc1xuICAgKi9cbiAgZ2V0IGF1ZGlvVHJhY2tzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmF1ZGlvVHJhY2tDb250cm9sbGVyO1xuICAgIHJldHVybiBlID8gZS5hdWRpb1RyYWNrcyA6IFtdO1xuICB9XG4gIC8qKlxuICAgKiBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgYXVkaW8gdHJhY2sgKGluZGV4IGluIGF1ZGlvIHRyYWNrIGxpc3RzKVxuICAgKi9cbiAgZ2V0IGF1ZGlvVHJhY2soKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLmF1ZGlvVHJhY2sgOiAtMTtcbiAgfVxuICAvKipcbiAgICogc2VsZWN0cyBhbiBhdWRpbyB0cmFjaywgYmFzZWQgb24gaXRzIGluZGV4IGluIGF1ZGlvIHRyYWNrIGxpc3RzXG4gICAqL1xuICBzZXQgYXVkaW9UcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7XG4gICAgdCAmJiAodC5hdWRpb1RyYWNrID0gZSk7XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBzdWJ0aXRsZSB0cmFja3MgYWNyb3NzIGFsbCBtZWRpYSBncm91cHNcbiAgICovXG4gIGdldCBhbGxTdWJ0aXRsZVRyYWNrcygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICByZXR1cm4gZSA/IGUuYWxsU3VidGl0bGVUcmFja3MgOiBbXTtcbiAgfVxuICAvKipcbiAgICogZ2V0IGFsdGVybmF0ZSBzdWJ0aXRsZSB0cmFja3MgbGlzdCBmcm9tIHBsYXlsaXN0XG4gICAqL1xuICBnZXQgc3VidGl0bGVUcmFja3MoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLnN1YnRpdGxlVHJhY2tzIDogW107XG4gIH1cbiAgLyoqXG4gICAqIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayAoaW5kZXggaW4gc3VidGl0bGUgdHJhY2sgbGlzdHMpXG4gICAqL1xuICBnZXQgc3VidGl0bGVUcmFjaygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICByZXR1cm4gZSA/IGUuc3VidGl0bGVUcmFjayA6IC0xO1xuICB9XG4gIGdldCBtZWRpYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWE7XG4gIH1cbiAgLyoqXG4gICAqIHNlbGVjdCBhbiBzdWJ0aXRsZSB0cmFjaywgYmFzZWQgb24gaXRzIGluZGV4IGluIHN1YnRpdGxlIHRyYWNrIGxpc3RzXG4gICAqL1xuICBzZXQgc3VidGl0bGVUcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7XG4gICAgdCAmJiAodC5zdWJ0aXRsZVRyYWNrID0gZSk7XG4gIH1cbiAgLyoqXG4gICAqIFdoZXRoZXIgc3VidGl0bGUgZGlzcGxheSBpcyBlbmFibGVkIG9yIG5vdFxuICAgKi9cbiAgZ2V0IHN1YnRpdGxlRGlzcGxheSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICByZXR1cm4gZSA/IGUuc3VidGl0bGVEaXNwbGF5IDogITE7XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHN1YnRpdGxlIGRpc3BsYXkgcmVuZGVyaW5nXG4gICAqL1xuICBzZXQgc3VidGl0bGVEaXNwbGF5KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICB0ICYmICh0LnN1YnRpdGxlRGlzcGxheSA9IGUpO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgbW9kZSBmb3IgTG93LUxhdGVuY3kgSExTIGxvYWRpbmdcbiAgICovXG4gIGdldCBsb3dMYXRlbmN5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubG93TGF0ZW5jeU1vZGU7XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIExvdy1MYXRlbmN5IEhMUyBwYXJ0IHBsYXlsaXN0IGFuZCBzZWdtZW50IGxvYWRpbmcsIGFuZCBzdGFydCBsaXZlIHN0cmVhbXMgYXQgcGxheWxpc3QgUEFSVC1IT0xELUJBQ0sgcmF0aGVyIHRoYW4gSE9MRC1CQUNLLlxuICAgKi9cbiAgc2V0IGxvd0xhdGVuY3lNb2RlKGUpIHtcbiAgICB0aGlzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIFBvc2l0aW9uIChpbiBzZWNvbmRzKSBvZiBsaXZlIHN5bmMgcG9pbnQgKGllIGVkZ2Ugb2YgbGl2ZSBwb3NpdGlvbiBtaW51cyBzYWZldHkgZGVsYXkgZGVmaW5lZCBieSBgYGBobHMuY29uZmlnLmxpdmVTeW5jRHVyYXRpb25gYGApXG4gICAqIEByZXR1cm5zIG51bGwgcHJpb3IgdG8gbG9hZGluZyBsaXZlIFBsYXlsaXN0XG4gICAqL1xuICBnZXQgbGl2ZVN5bmNQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5sYXRlbmN5Q29udHJvbGxlci5saXZlU3luY1Bvc2l0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgcG9zaXRpb24gKGluIHNlY29uZHMpIG9mIGxpdmUgZWRnZSAoaWUgZWRnZSBvZiBsaXZlIHBsYXlsaXN0IHBsdXMgdGltZSBzeW5jIHBsYXlsaXN0IGFkdmFuY2VkKVxuICAgKiBAcmV0dXJucyAwIGJlZm9yZSBmaXJzdCBwbGF5bGlzdCBpcyBsb2FkZWRcbiAgICovXG4gIGdldCBsYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVuY3lDb250cm9sbGVyLmxhdGVuY3k7XG4gIH1cbiAgLyoqXG4gICAqIG1heGltdW0gZGlzdGFuY2UgZnJvbSB0aGUgZWRnZSBiZWZvcmUgdGhlIHBsYXllciBzZWVrcyBmb3J3YXJkIHRvIGBgYGhscy5saXZlU3luY1Bvc2l0aW9uYGBgXG4gICAqIGNvbmZpZ3VyZWQgdXNpbmcgYGBgbGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50YGBgIChtdWx0aXBsZSBvZiB0YXJnZXQgZHVyYXRpb24pIG9yIGBgYGxpdmVNYXhMYXRlbmN5RHVyYXRpb25gYGBcbiAgICogQHJldHVybnMgMCBiZWZvcmUgZmlyc3QgcGxheWxpc3QgaXMgbG9hZGVkXG4gICAqL1xuICBnZXQgbWF4TGF0ZW5jeSgpIHtcbiAgICByZXR1cm4gdGhpcy5sYXRlbmN5Q29udHJvbGxlci5tYXhMYXRlbmN5O1xuICB9XG4gIC8qKlxuICAgKiB0YXJnZXQgZGlzdGFuY2UgZnJvbSB0aGUgZWRnZSBhcyBjYWxjdWxhdGVkIGJ5IHRoZSBsYXRlbmN5IGNvbnRyb2xsZXJcbiAgICovXG4gIGdldCB0YXJnZXRMYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVuY3lDb250cm9sbGVyLnRhcmdldExhdGVuY3k7XG4gIH1cbiAgc2V0IHRhcmdldExhdGVuY3koZSkge1xuICAgIHRoaXMubGF0ZW5jeUNvbnRyb2xsZXIudGFyZ2V0TGF0ZW5jeSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBlZGdlIG9mIHRoZSBjdXJyZW50IGxpdmUgcGxheWxpc3QgaXMgYWR2YW5jaW5nIG9yIDEgaWYgdGhlcmUgaXMgbm9uZVxuICAgKi9cbiAgZ2V0IGRyaWZ0KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVuY3lDb250cm9sbGVyLmRyaWZ0O1xuICB9XG4gIC8qKlxuICAgKiBzZXQgdG8gdHJ1ZSB3aGVuIHN0YXJ0TG9hZCBpcyBjYWxsZWQgYmVmb3JlIE1BTklGRVNUX1BBUlNFRCBldmVudFxuICAgKi9cbiAgZ2V0IGZvcmNlU3RhcnRMb2FkKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuZm9yY2VTdGFydExvYWQ7XG4gIH1cbiAgLyoqXG4gICAqIENvbnRlbnRTdGVlcmluZyBwYXRod2F5cyBnZXR0ZXJcbiAgICovXG4gIGdldCBwYXRod2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIucGF0aHdheXM7XG4gIH1cbiAgLyoqXG4gICAqIENvbnRlbnRTdGVlcmluZyBwYXRod2F5UHJpb3JpdHkgZ2V0dGVyL3NldHRlclxuICAgKi9cbiAgZ2V0IHBhdGh3YXlQcmlvcml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIucGF0aHdheVByaW9yaXR5O1xuICB9XG4gIHNldCBwYXRod2F5UHJpb3JpdHkoZSkge1xuICAgIHRoaXMubGV2ZWxDb250cm9sbGVyLnBhdGh3YXlQcmlvcml0eSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIHJldHVybnMgdHJ1ZSB3aGVuIGFsbCBTb3VyY2VCdWZmZXJzIGFyZSBidWZmZXJlZCB0byB0aGUgZW5kXG4gICAqL1xuICBnZXQgYnVmZmVyZWRUb0VuZCgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gISEoKGUgPSB0aGlzLmJ1ZmZlckNvbnRyb2xsZXIpICE9IG51bGwgJiYgZS5idWZmZXJlZFRvRW5kKTtcbiAgfVxuICAvKipcbiAgICogcmV0dXJucyBJbnRlcnN0aXRpYWxzIFByb2dyYW0gTWFuYWdlclxuICAgKi9cbiAgZ2V0IGludGVyc3RpdGlhbHNNYW5hZ2VyKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoKGUgPSB0aGlzLmludGVyc3RpdGlhbHNDb250cm9sbGVyKSA9PSBudWxsID8gdm9pZCAwIDogZS5pbnRlcnN0aXRpYWxzTWFuYWdlcikgfHwgbnVsbDtcbiAgfVxuICAvKipcbiAgICogcmV0dXJucyBtZWRpYUNhcGFiaWxpdGllcy5kZWNvZGluZ0luZm8gZm9yIGEgdmFyaWFudC9yZW5kaXRpb25cbiAgICovXG4gIGdldE1lZGlhRGVjb2RpbmdJbmZvKGUsIHQgPSB0aGlzLmFsbEF1ZGlvVHJhY2tzKSB7XG4gICAgY29uc3QgciA9ICRnKHQpO1xuICAgIHJldHVybiBOZyhlLCByLCBuYXZpZ2F0b3IubWVkaWFDYXBhYmlsaXRpZXMpO1xuICB9XG59XG5Ici5kZWZhdWx0Q29uZmlnID0gdm9pZCAwO1xuY29uc3Qgb24gPSBcImh0dHBzOi8vc2RrLWFwaS5uZXluYXIuY29tXCIsIHdBID0gXCJodHRwczovL2FwaS5hbGxvcmlnaW5zLndpbi9nZXRcIiwgYmkgPSBcImh0dHBzOi8vaS5pbWd1ci5jb20vZ3hIOGF6eS5wbmdcIjtcbnZhciBBQSA9IHtcbiAgU0RLX1ZFUlNJT046ICdcIjEuMi4xNVwiJ1xufTtcbmNvbnN0IElBID0gQUEuU0RLX1ZFUlNJT04sIGFuID0gYXN5bmMgKHMsIGUgPSB7fSkgPT4gKGUuaGVhZGVycyA9IHtcbiAgLi4uZS5oZWFkZXJzLFxuICBcIngtc2RrXCI6IFwicmVhY3RcIixcbiAgXCJ4LXNkay12ZXJzaW9uXCI6IElBXG59LCBmZXRjaChzLCBlKSk7XG5hc3luYyBmdW5jdGlvbiBfQSh7XG4gIHR5cGU6IHMsXG4gIGlkZW50aWZpZXI6IGUsXG4gIHZpZXdlckZpZDogdCxcbiAgY2xpZW50X2lkOiByXG59KSB7XG4gIHRyeSB7XG4gICAgbGV0IG4gPSBgJHtvbn0vdjIvZmFyY2FzdGVyL2Nhc3Q/dHlwZT0ke3N9JmlkZW50aWZpZXI9JHtlfSR7dCA/IGAmdmlld2VyX2ZpZD0ke3R9YCA6IFwiXCJ9JmNsaWVudF9pZD0ke3J9YDtcbiAgICBjb25zdCBvID0gYXdhaXQgKGF3YWl0IGFuKG4pKS5qc29uKCk7XG4gICAgcmV0dXJuIChvID09IG51bGwgPyB2b2lkIDAgOiBvLmNhc3QpIHx8IG51bGw7XG4gIH0gY2F0Y2ggKG4pIHtcbiAgICByZXR1cm4gY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGNhc3QgYnkgaWRlbnRpZmllclwiLCBuKSwgbnVsbDtcbiAgfVxufVxuY29uc3QgUkEgPSAoe1xuICB0eXBlOiBzLFxuICBpZGVudGlmaWVyOiBlLFxuICB2aWV3ZXJGaWQ6IHQsXG4gIGFsbG93UmVhY3Rpb25zOiByID0gITEsXG4gIHJlbmRlckVtYmVkczogbiA9ICEwLFxuICByZW5kZXJGcmFtZXM6IGkgPSAhMSxcbiAgb25MaWtlQnRuUHJlc3M6IG8sXG4gIG9uUmVjYXN0QnRuUHJlc3M6IGEsXG4gIG9uQ29tbWVudEJ0blByZXNzOiBsLFxuICBvbkZyYW1lQnRuUHJlc3M6IGMsXG4gIGNvbnRhaW5lclN0eWxlczogdSxcbiAgdGV4dFN0eWxlczogZFxufSkgPT4ge1xuICB2YXIgRjtcbiAgY29uc3Qge1xuICAgIGNsaWVudF9pZDogaFxuICB9ID0gdHMoKSwgW2YsIHBdID0gc3QudXNlU3RhdGUobnVsbCksIFt5LCBFXSA9IHN0LnVzZVN0YXRlKCEwKSwgW2IsIFJdID0gc3QudXNlU3RhdGUobnVsbCksIEEgPSAoZiA9PSBudWxsID8gdm9pZCAwIDogZi5hdXRob3IuZmlkKSA9PT0gdDtcbiAgcmV0dXJuIHN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcyAmJiBlICYmIChFKCEwKSwgUihudWxsKSwgX0Eoe1xuICAgICAgdHlwZTogcyxcbiAgICAgIGlkZW50aWZpZXI6IGUsXG4gICAgICB2aWV3ZXJGaWQ6IHQsXG4gICAgICBjbGllbnRfaWQ6IGhcbiAgICB9KS50aGVuKChNKSA9PiB7XG4gICAgICBwKE0pO1xuICAgIH0pLmNhdGNoKChNKSA9PiB7XG4gICAgICBSKE0pO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgRSghMSk7XG4gICAgfSkpO1xuICB9LCBbcywgZSwgdCwgaF0pLCB5ID8gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgcGFkZGluZzogXCIyMHB4XCJcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBcIkxvYWRpbmcuLi5cIlxuICB9KSA6ICFmIHx8IGIgPyAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgIGNoaWxkcmVuOiBcIkVycm9yOiBjb3VsZCBub3QgZmV0Y2ggY2FzdCBkYXRhXCJcbiAgfSkgOiBpICYmICFjID8gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBjaGlsZHJlbjogXCJFcnJvcjogb25GcmFtZUJ0blByZXNzIG11c3QgYmUgcHJvdmlkZWQgd2hlbiByZW5kZXJFbWJlZHMgaXMgdHJ1ZS5cIlxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChvYSwge1xuICAgIHVzZXJuYW1lOiBmLmF1dGhvci51c2VybmFtZSxcbiAgICBkaXNwbGF5TmFtZTogZi5hdXRob3IuZGlzcGxheV9uYW1lLFxuICAgIGF2YXRhckltZ1VybDogZi5hdXRob3IucGZwX3VybCxcbiAgICB0ZXh0OiBmLnRleHQsXG4gICAgaGFzaDogZi5oYXNoLFxuICAgIHJlYWN0aW9uczogZi5yZWFjdGlvbnMsXG4gICAgcmVwbGllczogZi5yZXBsaWVzLmNvdW50LFxuICAgIGVtYmVkczogZi5lbWJlZHMgPz8gW10sXG4gICAgZnJhbWVzOiBmLmZyYW1lcyA/PyBbXSxcbiAgICByZW5kZXJFbWJlZHM6IG4sXG4gICAgcmVuZGVyRnJhbWVzOiBpLFxuICAgIGNoYW5uZWw6IGYuY2hhbm5lbCA/IHtcbiAgICAgIGlkOiBmLmNoYW5uZWwuaWQsXG4gICAgICBuYW1lOiBmLmNoYW5uZWwubmFtZSxcbiAgICAgIHVybDogZi5wYXJlbnRfdXJsXG4gICAgfSA6IHZvaWQgMCxcbiAgICB2aWV3ZXJGaWQ6IHQsXG4gICAgYWxsb3dSZWFjdGlvbnM6IHIsXG4gICAgaGFzUG93ZXJCYWRnZTogZi5hdXRob3IucG93ZXJfYmFkZ2UsXG4gICAgYXBwQXZhdGFySW1nVXJsOiAoKEYgPSBmLmFwcCkgPT0gbnVsbCA/IHZvaWQgMCA6IEYucGZwX3VybCkgfHwgbnVsbCxcbiAgICBpc093blByb2ZpbGU6IEEsXG4gICAgY29udGFpbmVyU3R5bGVzOiB1LFxuICAgIHRleHRTdHlsZXM6IGQsXG4gICAgb25MaWtlQnRuUHJlc3M6IG8sXG4gICAgb25SZWNhc3RCdG5QcmVzczogYSxcbiAgICBvbkNvbW1lbnRCdG5QcmVzczogbCxcbiAgICBvbkZyYW1lQnRuUHJlc3M6IGMsXG4gICAgdGltZXN0YW1wOiBmLnRpbWVzdGFtcFxuICB9KTtcbn0sIExBID0gLyogQF9fUFVSRV9fICovIGRlKFwiYVwiKSh7XG4gIGNsYXNzZXM6IFtcInMxdW80bHg0XCJdXG59KSwgUGwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBpbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIGZmID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgZ2YgPSAocykgPT4gbmV3IFByb21pc2UoKGUpID0+IHNldFRpbWVvdXQoZSwgcykpLCBRcCA9IGFzeW5jIChzLCBlID0gMCkgPT4ge1xuICBjb25zdCB0ID0gbmV3IFVSTChzKS5ob3N0bmFtZTtcbiAgaWYgKGZmLmdldCh0KSlcbiAgICByZXR1cm4ge1xuICAgICAgb2dJbWFnZTogXCJcIixcbiAgICAgIG9nVGl0bGU6IFwiXCIsXG4gICAgICBvZ0Rlc2NyaXB0aW9uOiBcIlwiXG4gICAgfTtcbiAgaWYgKFBsLmhhcyhzKSlcbiAgICByZXR1cm4gUGwuZ2V0KHMpO1xuICBpZiAoaW8uaGFzKHMpKVxuICAgIHJldHVybiBpby5nZXQocyk7XG4gIGNvbnN0IHIgPSAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnZigxMDApO1xuICAgICAgY29uc3QgbiA9IGF3YWl0IGZldGNoKGAke3dBfT91cmw9JHtlbmNvZGVVUklDb21wb25lbnQocyl9YCwge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCJcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuLm9rKSB7XG4gICAgICAgIGlmIChuLnN0YXR1cyA9PT0gNDI5ICYmIGUgPCA1KSB7XG4gICAgICAgICAgY29uc3QgRSA9IE1hdGgucG93KDIsIGUpICogMWUzO1xuICAgICAgICAgIHJldHVybiBhd2FpdCBnZihFKSwgUXAocywgZSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGZmLnNldCh0LCAhMCksIG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIE9wZW4gR3JhcGggZGF0YTogJHtuLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpID0gYXdhaXQgbi5qc29uKCksIGEgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGkuY29udGVudHMsIFwidGV4dC9odG1sXCIpLCBsID0gYS5xdWVyeVNlbGVjdG9yKCdtZXRhW3Byb3BlcnR5PVwib2c6aW1hZ2VcIl0nKSwgYyA9IGEucXVlcnlTZWxlY3RvcignbWV0YVtwcm9wZXJ0eT1cIm9nOnRpdGxlXCJdJyksIHUgPSBhLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbcHJvcGVydHk9XCJvZzpkZXNjcmlwdGlvblwiXScpLCBkID0gYS5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIiksIGggPSBsICYmIGwuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKSB8fCBcIlwiLCBmID0gYyA/IGMuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKSB8fCBcIlwiIDogZCA/IGQuaW5uZXJUZXh0IDogXCJcIiwgcCA9IHUgJiYgdS5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpIHx8IFwiXCIsIHkgPSB7XG4gICAgICAgIG9nSW1hZ2U6IGgsXG4gICAgICAgIG9nVGl0bGU6IGYsXG4gICAgICAgIG9nRGVzY3JpcHRpb246IHBcbiAgICAgIH07XG4gICAgICByZXR1cm4gUGwuc2V0KHMsIHkpLCB5O1xuICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgT3BlbiBHcmFwaCBkYXRhXCIsIG4pLCB7XG4gICAgICAgIG9nSW1hZ2U6IFwiXCIsXG4gICAgICAgIG9nVGl0bGU6IFwiXCIsXG4gICAgICAgIG9nRGVzY3JpcHRpb246IFwiXCJcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlvLmRlbGV0ZShzKTtcbiAgICB9XG4gIH0pKCk7XG4gIHJldHVybiBpby5zZXQocywgciksIHI7XG59LCBBYyA9IFtdO1xubGV0IE1sID0gMDtcbmNvbnN0IENBID0gNSwga0EgPSAocykgPT4ge1xuICBBYy5wdXNoKHMpLCBlbSgpO1xufSwgZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChNbCA+PSBDQSB8fCBBYy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuO1xuICBNbCsrO1xuICBjb25zdCBzID0gQWMuc2hpZnQoKTtcbiAgcyAmJiBhd2FpdCBzKCksIE1sLS0sIGVtKCk7XG59LCBEQSA9ICh7XG4gIHNyYzogcyxcbiAgYWx0OiBlLFxuICBzdHlsZTogdFxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KFwiaW1nXCIsIHtcbiAgc3JjOiBzLFxuICBhbHQ6IGUsXG4gIHN0eWxlOiB7XG4gICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgIGhlaWdodDogXCJhdXRvXCIsXG4gICAgbWF4SGVpZ2h0OiBcIjE1MHB4XCIsXG4gICAgd2lkdGg6IFwiYXV0b1wiLFxuICAgIG1heFdpZHRoOiBcIjEwMCVcIixcbiAgICBvYmplY3RGaXQ6IFwiY292ZXJcIixcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkIGdyZXlcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgIG1hcmdpbjogXCI0cHggMFwiLFxuICAgIC4uLnRcbiAgfVxufSksIFBBID0gKHtcbiAgdXJsOiBzXG59KSA9PiB7XG4gIGNvbnN0IGUgPSBzdC51c2VSZWYobnVsbCk7XG4gIHJldHVybiBzdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlLmN1cnJlbnQpXG4gICAgICBpZiAoSHIuaXNTdXBwb3J0ZWQoKSAmJiBzLmVuZHNXaXRoKFwiLm0zdThcIikpIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBIcigpO1xuICAgICAgICB0LmxvYWRTb3VyY2UocyksIHQuYXR0YWNoTWVkaWEoZS5jdXJyZW50KSwgdC5vbihIci5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCAoKSA9PiB7XG4gICAgICAgICAgZS5jdXJyZW50LnBsYXkoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZS5jdXJyZW50LnNyYyA9IHMsIGUuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVkbWV0YWRhdGFcIiwgKCkgPT4ge1xuICAgICAgICAgIGUuY3VycmVudC5wbGF5KCk7XG4gICAgICAgIH0pO1xuICB9LCBbc10pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJ2aWRlb1wiLCB7XG4gICAgcmVmOiBlLFxuICAgIGNvbnRyb2xzOiAhMCxcbiAgICBtdXRlZDogITAsXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcImF1dG9cIixcbiAgICAgIG1heFdpZHRoOiBcIjEwMCVcIixcbiAgICAgIG1heEhlaWdodDogXCI0MDBweFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjEwcHhcIixcbiAgICAgIG1hcmdpbjogXCIxMHB4IDBcIixcbiAgICAgIG9iamVjdEZpdDogXCJjb250YWluXCJcbiAgICB9XG4gIH0pO1xufSwgTUEgPSAocykgPT4gL1xcLihqcGVnfGpwZ3xnaWZ8cG5nfHdlYnB8Ym1wfHN2ZykkLy50ZXN0KHMpIHx8IHMuc3RhcnRzV2l0aChcImh0dHBzOi8vaW1hZ2VkZWxpdmVyeS5uZXRcIiksIE9BID0gKHMsIGUsIHQpID0+IHtcbiAgY29uc3QgW3IsIG5dID0gc3QudXNlU3RhdGUoW10pLCBpID0gc3QudXNlQ2FsbGJhY2soYXN5bmMgKG8pID0+IChhd2FpdCBQcm9taXNlLmFsbChvLm1hcChhc3luYyAobCkgPT4ge1xuICAgIGlmIChsLnVybCkge1xuICAgICAgY29uc3QgYyA9IGwudXJsO1xuICAgICAgcmV0dXJuIE1BKGMpID8gLyogQF9fUFVSRV9fICovIHEuanN4KERBLCB7XG4gICAgICAgIHNyYzogYyxcbiAgICAgICAgYWx0OiBcIkVtYmVkZGVkIGltYWdlXCJcbiAgICAgIH0sIGMpIDogYy5lbmRzV2l0aChcIi5tM3U4XCIpIHx8IGMuZW5kc1dpdGgoXCIubXA0XCIpID8gLyogQF9fUFVSRV9fICovIHEuanN4KFBBLCB7XG4gICAgICAgIHVybDogY1xuICAgICAgfSwgYykgOiBuZXcgUHJvbWlzZSgodSkgPT4ge1xuICAgICAgICBrQShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgb2dJbWFnZTogZCxcbiAgICAgICAgICAgIG9nVGl0bGU6IGhcbiAgICAgICAgICB9ID0gYXdhaXQgUXAoYyksIGYgPSBuZXcgVVJMKGMpLmhvc3RuYW1lLnJlcGxhY2UoXCJ3d3cuXCIsIFwiXCIpO1xuICAgICAgICAgIHUoLyogQF9fUFVSRV9fICovIHEuanN4cyhMQSwge1xuICAgICAgICAgICAgaHJlZjogYyxcbiAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgICAgIHJlbDogXCJub3JlZmVycmVyXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogW2QgJiYgLyogQF9fUFVSRV9fICovIHEuanN4KFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgc3JjOiBkLFxuICAgICAgICAgICAgICBhbHQ6IGgsXG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiNTBweFwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCI1MHB4XCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0Rml0OiBcImNvdmVyXCIsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KFwicFwiLCB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGggfHwgY1xuICAgICAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicFwiLCB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImdyZXlcIixcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGZcbiAgICAgICAgICAgICAgfSldXG4gICAgICAgICAgICB9KV1cbiAgICAgICAgICB9LCBjKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChsLmNhc3RfaWQpXG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBtYXhXaWR0aDogXCI4NSVcIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFJBLCB7XG4gICAgICAgICAgdHlwZTogXCJoYXNoXCIsXG4gICAgICAgICAgaWRlbnRpZmllcjogbC5jYXN0X2lkLmhhc2gsXG4gICAgICAgICAgdmlld2VyRmlkOiB0LFxuICAgICAgICAgIGFsbG93UmVhY3Rpb25zOiBlLFxuICAgICAgICAgIHJlbmRlckVtYmVkczogITFcbiAgICAgICAgfSwgbC5jYXN0X2lkLmZpZClcbiAgICAgIH0sIGBjYXN0LSR7bC5jYXN0X2lkLmhhc2h9YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pKSkuZmlsdGVyKChsKSA9PiBsICE9PSBudWxsKSwgW2UsIHRdKTtcbiAgcmV0dXJuIHN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaShzKS50aGVuKG4pO1xuICB9LCBbcywgaV0pLCByO1xufSwgdG0gPSAoe1xuICBvbkNsaWNrOiBzXG59KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICB3aWR0aDogXCIxOFwiLFxuICBoZWlnaHQ6IFwiMTdcIixcbiAgdmlld0JveDogXCIwIDAgMTggMTdcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIG9uQ2xpY2s6IChlKSA9PiBzID8gcyhlKSA6IHZvaWQgMCxcbiAgc3R5bGU6IHtcbiAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gIH0sXG4gIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02LjIyODU3IDEyLjY4MjhINy4wMTI4NUM3LjAxMjg1IDEyLjI0OTYgNi42NjE3MiAxMS44OTg1IDYuMjI4NTcgMTEuODk4NVYxMi42ODI4Wk02LjIyODU3IDE1LjgxOTlINS40NDQzQzUuNDQ0MyAxNi4xMTM3IDUuNjA4NDggMTYuMzgyOCA1Ljg2OTcgMTYuNTE3MkM2LjEzMDkyIDE2LjY1MTcgNi40NDUzNyAxNi42Mjg4IDYuNjg0NDMgMTYuNDU4MUw2LjIyODU3IDE1LjgxOTlaTTEwLjYyMDUgMTIuNjgyOFYxMS44OTg1QzEwLjQ1NzEgMTEuODk4NSAxMC4yOTc3IDExLjk0OTYgMTAuMTY0NyAxMi4wNDQ2TDEwLjYyMDUgMTIuNjgyOFpNMS43ODQyOCAzLjI3MTQ2QzEuNzg0MjggMi41NDk1NSAyLjM2OTUgMS45NjQzMyAzLjA5MTQxIDEuOTY0MzNWMC4zOTU3NzdDMS41MDMyMSAwLjM5NTc3NyAwLjIxNTcyMyAxLjY4MzI3IDAuMjE1NzIzIDMuMjcxNDZIMS43ODQyOFpNMS43ODQyOCAxMC41OTE0VjMuMjcxNDZIMC4yMTU3MjNWMTAuNTkxNEgxLjc4NDI4Wk0zLjA5MTQgMTEuODk4NUMyLjM2OTUgMTEuODk4NSAxLjc4NDI4IDExLjMxMzMgMS43ODQyOCAxMC41OTE0SDAuMjE1NzIzQzAuMjE1NzIzIDEyLjE3OTYgMS41MDMyMSAxMy40NjcxIDMuMDkxNCAxMy40NjcxVjExLjg5ODVaTTYuMjI4NTcgMTEuODk4NUgzLjA5MTRWMTMuNDY3MUg2LjIyODU3VjExLjg5ODVaTTcuMDEyODUgMTUuODE5OVYxMi42ODI4SDUuNDQ0M1YxNS44MTk5SDcuMDEyODVaTTEwLjE2NDcgMTIuMDQ0Nkw1Ljc3MjcyIDE1LjE4MTdMNi42ODQ0MyAxNi40NTgxTDExLjA3NjQgMTMuMzIxTDEwLjE2NDcgMTIuMDQ0NlpNMTQuNTk0MSAxMS44OTg1SDEwLjYyMDVWMTMuNDY3MUgxNC41OTQxVjExLjg5ODVaTTE1LjkwMTMgMTAuNTkxNEMxNS45MDEzIDExLjMxMzMgMTUuMzE2IDExLjg5ODUgMTQuNTk0MSAxMS44OTg1VjEzLjQ2NzFDMTYuMTgyMyAxMy40NjcxIDE3LjQ2OTggMTIuMTc5NiAxNy40Njk4IDEwLjU5MTRIMTUuOTAxM1pNMTUuOTAxMyAzLjI3MTQ2VjEwLjU5MTRIMTcuNDY5OFYzLjI3MTQ2SDE1LjkwMTNaTTE0LjU5NDEgMS45NjQzM0MxNS4zMTYgMS45NjQzMyAxNS45MDEzIDIuNTQ5NTUgMTUuOTAxMyAzLjI3MTQ2SDE3LjQ2OThDMTcuNDY5OCAxLjY4MzI2IDE2LjE4MjMgMC4zOTU3NzcgMTQuNTk0MSAwLjM5NTc3N1YxLjk2NDMzWk0zLjA5MTQxIDEuOTY0MzNIMTQuNTk0MVYwLjM5NTc3N0gzLjA5MTQxVjEuOTY0MzNaXCIsXG4gICAgZmlsbDogXCIjQTBBM0FEXCJcbiAgfSlcbn0pLCBCQSA9ICh7XG4gIGZpbGw6IHMsXG4gIG9uQ2xpY2s6IGVcbn0pID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzdmdcIiwge1xuICB3aWR0aDogXCIxNlwiLFxuICBoZWlnaHQ6IFwiMTVcIixcbiAgdmlld0JveDogXCIwIDAgMTYgMTVcIixcbiAgZmlsbDogcyB8fCBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgb25DbGljazogKHQpID0+IGUgPyBlKHQpIDogdm9pZCAwLFxuICBzdHlsZToge1xuICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgfSxcbiAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNC45MjQ1IDE0LjI1MDZDMTQuNzI1OCAxNC4yNTA2IDE0LjUzNTIgMTQuMTcxNiAxNC4zOTQ2IDE0LjAzMTFDMTQuMjU0MSAxMy44OTA1IDE0LjE3NTEgMTMuNjk5OSAxNC4xNzUxIDEzLjUwMTFWMTAuNTAzNEgxMS4xNzc0QzEwLjk3ODcgMTAuNTAzNCAxMC43ODgxIDEwLjQyNDUgMTAuNjQ3NSAxMC4yODM5QzEwLjUwNyAxMC4xNDM0IDEwLjQyOCA5Ljk1Mjc5IDEwLjQyOCA5Ljc1NDAzQzEwLjQyOCA5LjU1NTI3IDEwLjUwNyA5LjM2NDY1IDEwLjY0NzUgOS4yMjQxMUMxMC43ODgxIDkuMDgzNTcgMTAuOTc4NyA5LjAwNDYxIDExLjE3NzQgOS4wMDQ2MUgxNC45MjQ1QzE1LjEyMzMgOS4wMDQ2MSAxNS4zMTM5IDkuMDgzNTcgMTUuNDU0NSA5LjIyNDExQzE1LjU5NSA5LjM2NDY1IDE1LjY3NCA5LjU1NTI3IDE1LjY3NCA5Ljc1NDAzVjEzLjUwMTFDMTUuNjc0IDEzLjY5OTkgMTUuNTk1IDEzLjg5MDUgMTUuNDU0NSAxNC4wMzExQzE1LjMxMzkgMTQuMTcxNiAxNS4xMjMzIDE0LjI1MDYgMTQuOTI0NSAxNC4yNTA2Wk01LjE4MjA3IDYuMDA2OTNIMS40MzQ5N0MxLjIzNjIxIDYuMDA2OTMgMS4wNDU1OSA1LjkyNzk3IDAuOTA1MDQ3IDUuNzg3NDNDMC43NjQ1MDMgNS42NDY4OCAwLjY4NTU0NyA1LjQ1NjI3IDAuNjg1NTQ3IDUuMjU3NTFWMS41MTA0MUMwLjY4NTU0NyAxLjMxMTY1IDAuNzY0NTAzIDEuMTIxMDMgMC45MDUwNDcgMC45ODA0ODZDMS4wNDU1OSAwLjgzOTk0MyAxLjIzNjIxIDAuNzYwOTg2IDEuNDM0OTcgMC43NjA5ODZDMS42MzM3MyAwLjc2MDk4NiAxLjgyNDM0IDAuODM5OTQzIDEuOTY0ODkgMC45ODA0ODZDMi4xMDU0MyAxLjEyMTAzIDIuMTg0MzkgMS4zMTE2NSAyLjE4NDM5IDEuNTEwNDFWNC41MDgwOUg1LjE4MjA3QzUuMzgwODMgNC41MDgwOSA1LjU3MTQ1IDQuNTg3MDQgNS43MTE5OSA0LjcyNzU5QzUuODUyNTMgNC44NjgxMyA1LjkzMTQ5IDUuMDU4NzUgNS45MzE0OSA1LjI1NzUxQzUuOTMxNDkgNS40NTYyNyA1Ljg1MjUzIDUuNjQ2ODggNS43MTE5OSA1Ljc4NzQzQzUuNTcxNDUgNS45Mjc5NyA1LjM4MDgzIDYuMDA2OTMgNS4xODIwNyA2LjAwNjkzWlwiLFxuICAgIGZpbGw6IHMgfHwgXCIjQTBBM0FEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTguMTc5MzQgMTVDNi4zMzU1NiAxNS4wMDAzIDQuNTU2MzcgMTQuMzIwOSAzLjE4MjA1IDEzLjA5MThDMS44MDc3NCAxMS44NjI3IDAuOTM0NzY2IDEwLjE3IDAuNzMwMTA2IDguMzM3NjVDMC43MTkyODEgOC4yMzkyMyAwLjcyNzk0NSA4LjEzOTY1IDAuNzU1NjA2IDguMDQ0NThDMC43ODMyNjYgNy45NDk1MSAwLjgyOTM4IDcuODYwODMgMC44OTEzMTUgNy43ODM1OEMxLjAxNjQgNy42Mjc1OCAxLjE5ODMzIDcuNTI3NjUgMS4zOTcwOSA3LjUwNTc5QzEuNTk1ODUgNy40ODM5MyAxLjc5NTE1IDcuNTQxOTEgMS45NTExNiA3LjY2N0MyLjEwNzE2IDcuNzkyMDggMi4yMDcwOCA3Ljk3NDAxIDIuMjI4OTUgOC4xNzI3N0MyLjM3NzA4IDkuNTIzNzYgMi45Nzk4MyAxMC43ODQzIDMuOTM4MzggMTEuNzQ3OEM0Ljg5NjkyIDEyLjcxMTMgNi4xNTQzOCAxMy4zMjA1IDcuNTA0NTkgMTMuNDc1NUM4Ljg1NDc5IDEzLjYzMDYgMTAuMjE3NiAxMy4zMjIzIDExLjM2OTYgMTIuNjAxMkMxMi41MjE2IDExLjg4MDEgMTMuMzk0NCAxMC43ODkgMTMuODQ1IDkuNTA2NzRDMTMuODczMSA5LjQwODE3IDEzLjkyMTEgOS4zMTY0MiAxMy45ODYgOS4yMzcxNEMxNC4wNTEgOS4xNTc4NyAxNC4xMzE2IDkuMDkyNzcgMTQuMjIyNyA5LjA0NTg2QzE0LjMxMzggOC45OTg5NSAxNC40MTM2IDguOTcxMjMgMTQuNTE1OSA4Ljk2NDQyQzE0LjYxODEgOC45NTc2MSAxNC43MjA3IDguOTcxODUgMTQuODE3MyA5LjAwNjI1QzE0LjkxMzggOS4wNDA2NiAxNS4wMDIzIDkuMDk0NTEgMTUuMDc3MiA5LjE2NDQ2QzE1LjE1MjEgOS4yMzQ0MiAxNS4yMTE4IDkuMzE4OTkgMTUuMjUyOCA5LjQxMjk2QzE1LjI5MzcgOS41MDY5MyAxNS4zMTQ5IDkuNjA4MyAxNS4zMTUxIDkuNzEwNzlDMTUuMzE1MyA5LjgxMzI5IDE1LjI5NDQgOS45MTQ3MyAxNS4yNTM5IDEwLjAwODlDMTQuNzM1OSAxMS40NzA1IDEzLjc3NzQgMTIuNzM1NSAxMi41MTAzIDEzLjYyOTRDMTEuMjQzMiAxNC41MjMzIDkuNzMwMDIgMTUuMDAyMiA4LjE3OTM0IDE1Wk0xNC44NzkyIDcuNTA1NzlDMTQuNjkzOSA3LjUwNjkxIDE0LjUxNDggNy40MzkzNyAxNC4zNzY0IDcuMzE2MkMxNC4yMzggNy4xOTMwMiAxNC4xNTAxIDcuMDIyOTUgMTQuMTI5NyA2LjgzODhDMTMuOTc1IDUuNDk0MjkgMTMuMzY5OSA0LjI0MTY5IDEyLjQxMjggMy4yODQ3NkMxMS40NTU4IDIuMzI3ODIgMTAuMjAzMSAxLjcyMjg1IDguODU4NTggMS41NjgyNEM3LjUxNDA1IDEuNDEzNjQgNi4xNTY3NiAxLjcxODUgNS4wMDc1IDIuNDMzMjRDMy44NTgyMyAzLjE0Nzk4IDIuOTg0NiA0LjIzMDU0IDIuNTI4NzIgNS41MDQ4NEMyLjUwMDYyIDUuNjAzNCAyLjQ1MjYgNS42OTUxNiAyLjM4NzYzIDUuNzc0NDNDMi4zMjI2NiA1Ljg1MzcxIDIuMjQyMTIgNS45MTg4MSAyLjE1MDk5IDUuOTY1NzJDMi4wNTk4NyA2LjAxMjYzIDEuOTYwMDggNi4wNDAzNSAxLjg1NzgxIDYuMDQ3MTZDMS43NTU1NSA2LjA1Mzk3IDEuNjUyOTcgNi4wMzk3MyAxLjU1NjQyIDYuMDA1MzJDMS40NTk4OCA1Ljk3MDkyIDEuMzcxNDEgNS45MTcwNyAxLjI5NjUxIDUuODQ3MTJDMS4yMjE2IDUuNzc3MTYgMS4xNjE4MyA1LjY5MjU4IDEuMTIwOTEgNS41OTg2MUMxLjA3OTk5IDUuNTA0NjQgMS4wNTg3OCA1LjQwMzI4IDEuMDU4NTkgNS4zMDA3OEMxLjA1ODQgNS4xOTgyOSAxLjA3OTIzIDUuMDk2ODUgMS4xMTk4IDUuMDAyNzNDMS42ODQwNiAzLjQwMjAyIDIuNzc0OTcgMi4wNDAyNSA0LjIxMzk3IDEuMTQwMjlDNS42NTI5NyAwLjI0MDMzNyA3LjM1NDg1IC0wLjE0NDUwNSA5LjA0MTA2IDAuMDQ4NzUyMkMxMC43MjczIDAuMjQyMDA5IDEyLjI5NzkgMS4wMDE5MiAxMy40OTYgMi4yMDQxMUMxNC42OTQxIDMuNDA2MyAxNS40NDg2IDQuOTc5NTggMTUuNjM2MSA2LjY2NjQ0QzE1LjY1NzEgNi44NjMwNiAxNS41OTk3IDcuMDYwMDQgMTUuNDc2MSA3LjIxNDQ1QzE1LjM1MjYgNy4zNjg4NyAxNS4xNzMgNy40NjgyIDE0Ljk3NjYgNy40OTA4TDE0Ljg3OTIgNy41MDU3OVpcIixcbiAgICBmaWxsOiBzIHx8IFwiI0EwQTNBRFwiXG4gIH0pXVxufSksIHJtID0gKHtcbiAgZmlsbDogcyxcbiAgb25DbGljazogZVxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjE3XCIsXG4gIGhlaWdodDogXCIxNVwiLFxuICB2aWV3Qm94OiBcIjAgMCAxNyAxNVwiLFxuICBmaWxsOiBzID8gXCJyZWRcIiA6IFwibm9uZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICBvbkNsaWNrOiAodCkgPT4gZSA/IGUodCkgOiB2b2lkIDAsXG4gIHN0eWxlOiB7XG4gICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICB9LFxuICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEzLjg3MTkgMi4yNTA0MkwxNC4yOTQ3IDEuNTg5ODRMMTMuODcxOSAyLjI1MDQyQzE1LjI0NjcgMy4xMzAyMiAxNS43Njc2IDUuMjIyMDYgMTQuODg1NiA3LjYxMzE3QzE0LjA0MzYgOS44OTU4MyAxMS45NTU1IDEyLjIzNzQgOC41MTU3MyAxMy4zNjQ4QzUuMDc2MDYgMTIuMjM3NCAyLjk4Nzk5IDkuODk1ODQgMi4xNDU5NiA3LjYxMzE2QzEuMjYzOTIgNS4yMjIwMyAxLjc4NDggMy4xMzAyMiAzLjE1OTUxIDIuMjUwNDJMMy4xNTk1MSAyLjI1MDQyQzQuNTg1NDIgMS4zMzc4MyA1LjY0OTk3IDEuNTI5ODMgNi4zOTk0NSAxLjkyNTAzQzcuMjEyNzIgMi4zNTM4OCA3LjczMTA4IDMuMDcxMTQgNy44NjE0MyAzLjI2ODM4TDguNTE1NzMgNC4yNTgzOEw5LjE3MDAyIDMuMjY4MzhDOS4zMDAzOCAzLjA3MTEzIDkuODE4NzMgMi4zNTM4OCAxMC42MzIgMS45MjUwM0MxMS4zODE1IDEuNTI5ODMgMTIuNDQ2IDEuMzM3ODMgMTMuODcxOSAyLjI1MDQyWlwiLFxuICAgIHN0cm9rZTogcyB8fCBcIiNBMEEzQURcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjU2ODU1XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcIm1hc2tcIiwge1xuICAgIGlkOiBcInBhdGgtMi1pbnNpZGUtMV8xODdfMTA1MVwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgICBkOiBcIk04LjU4NDQ0IDEzLjkzOTdDNy43NjEzOSAxMy42ODY0IDcuMDUzMzQgMTMuMzkzNyA2LjI5OTc2IDEyLjk4MjVDNS45NTYzMyAxMi43OTUxIDUuNjIyODUgMTIuNTg5NSA1LjMwMDMgMTIuMzY4MUM1LjE0NDE2IDEyLjI2MDkgNC45OTEwOCAxMi4xNDkzIDQuODQwNjMgMTIuMDM0M0M0Ljc4MTMyIDExLjk4ODkgNC44ODAzOCAxMi4wNjUyIDQuODIxNTYgMTIuMDE5NUM0LjgwMzg4IDEyLjAwNTggNC43ODYzIDExLjk5MTkgNC43Njg2OSAxMS45NzgxQzQuNzMzNjQgMTEuOTUwNSA0LjY5ODg0IDExLjkyMjUgNC42NjQxMyAxMS44OTQ1QzQuNTg5NDggMTEuODM0MiA0LjUxNTgyIDExLjc3MjcgNC40NDI4IDExLjcxMDVDMy45MDQ5OSAxMS4yNTIgMy40MTM4MSAxMC43Mzg5IDIuOTgwMTYgMTAuMTgwOUMzLjAxODU2IDEwLjIzMDMgMi45NzY1MSAxMC4xNzYgMi45NzA2NCAxMC4xNjgzQzIuOTU4MyAxMC4xNTIyIDIuOTQ2MDQgMTAuMTM1OSAyLjkzMzggMTAuMTE5N0MyLjkwOTM5IDEwLjA4NzQgMi44ODUyNyAxMC4wNTQ4IDIuODYxMjYgMTAuMDIyMUMyLjgwOTYxIDkuOTUxODkgMi43NTkwOCA5Ljg4MDggMi43MDkzMiA5LjgwOTJDMi42MTQ5MiA5LjY3MzQ1IDIuNTI0NDEgOS41MzUgMi40MzcxIDkuMzk0NTdDMi4yNjczIDkuMTIxNDUgMi4xMTIxMyA4LjgzOTI2IDEuOTcxNDcgOC41NTAwNkMxLjkzODQ5IDguNDgyMjggMS45MDY1NyA4LjQxMzk2IDEuODc1MzEgOC4zNDUzN0MxLjg1OTc4IDguMzExMyAxLjg0NDU5IDguMjc3MDkgMS44Mjk0OCA4LjI0Mjg0QzEuODIxOTUgOC4yMjU3NSAxLjgxNDU2IDguMjA4NjQgMS44MDcxNCA4LjE5MTUyQzEuODAxNjcgOC4xNzg4OSAxLjc2ODU2IDguMTAwNjEgMS43OTY2NCA4LjE2NzM2QzEuNzM3MjggOC4wMjYyIDEuNjgyMDUgNy44ODMyOSAxLjYzMDI5IDcuNzM5MTZDMS41Mjk4MiA3LjQ1OTQyIDEuNDQ0OTggNy4xNzQwNyAxLjM3NTc1IDYuODg1MDJDMS4zNDIxOCA2Ljc0NDkyIDEuMzEzMDEgNi42MDM3OSAxLjI4NzQ2IDYuNDYyMDJDMS4yNzU0IDYuMzk1MDIgMS4yNjQ1IDYuMzI3ODIgMS4yNTQzIDYuMjYwNTJDMS4yNDkyNSA2LjIyNzEzIDEuMjQ0NTMgNi4xOTM2OSAxLjIzOTk0IDYuMTYwMjNDMS4yNTEzNiA2LjI0MzU4IDEuMjM0OTUgNi4xMTc3MiAxLjIzMjMxIDYuMDk1MzJDMS4yMDA0MiA1LjgyNDQ0IDEuMTg1MzUgNS41NTE1OCAxLjE4NzIxIDUuMjc4ODVDMS4xODgxMSA1LjE0NjkxIDEuMTkzNzQgNS4wMTUwMSAxLjIwMzM0IDQuODgzNDNDMS4yMDc4OCA0LjgyMTI4IDEuMjEzNjggNC43NTkyMiAxLjIyMDIzIDQuNjk3MjZDMS4yMjM1IDQuNjY2NTEgMS4yMjcxMyA0LjYzNTggMS4yMzA4OSA0LjYwNTExQzEuMjMyNzggNC41ODk4MiAxLjIzNDc3IDQuNTc0NTcgMS4yMzY3OCA0LjU1OTNDMS4yMjU2MiA0LjY0NDI1IDEuMjM1NjMgNC41Njk1NiAxLjIzODIzIDQuNTUxNjNDMS4yNzQyOCA0LjMwNDE5IDEuMzI4NjEgNC4wNTk0MyAxLjQwMDk3IDMuODIwMDZDMS40MzYxNCAzLjcwMzc1IDEuNDc2MzUgMy41ODg5OSAxLjUyMDcyIDMuNDc1ODdDMS41MzEyNSAzLjQ0OSAxLjU0MjE5IDMuNDIyMjkgMS41NTMyNiAzLjM5NTY0QzEuNTE5NDEgMy40NzcxNiAxLjU1ODg5IDMuMzgzMzQgMS41NjcxNyAzLjM2NDY0QzEuNTkyMjYgMy4zMDgwMyAxLjYxODg2IDMuMjUyMDkgMS42NDY0MyAzLjE5NjY0QzEuNzUxMDEgMi45ODYyNCAxLjg3NDc2IDIuNzg1NDkgMi4wMTUzNCAyLjU5NzI0QzIuMDIzNzEgMi41ODYwMyAyLjAzMjIxIDIuNTc0OTIgMi4wNDA3MSAyLjU2MzhDMS45OTI3NSAyLjYyNjU2IDIuMDI0NDYgMi41ODQ5NiAyLjAzNDkzIDIuNTcxNjlDMi4wNTIyMyAyLjU0OTc0IDIuMDY5OTMgMi41MjgwOCAyLjA4NzczIDIuNTA2NTNDMi4xMjYzMSAyLjQ1OTg0IDIuMTY2MjkgMi40MTQzNCAyLjIwNzEzIDIuMzY5NjJDMi4yODU4NyAyLjI4MzQxIDIuMzY5MjYgMi4yMDE1MSAyLjQ1NiAyLjEyMzM5QzIuNDk3ODcgMi4wODU2OCAyLjU0MDg0IDIuMDQ5MiAyLjU4NDQzIDIuMDEzNTJDMi42MDYzMSAxLjk5NTYxIDIuNjI4NTIgMS45NzgwOCAyLjY1MDg0IDEuOTYwN0MyLjU4MTY0IDIuMDE0NjYgMi42NzE5MSAxLjk0NTU3IDIuNjg5NjIgMS45MzI2NUMyLjgzMzM4IDEuODI3NyAyLjk4NTg3IDEuNzM0OCAzLjE0MDEzIDEuNjQ2M0MzLjU0MzkzIDEuNDE0NTkgMy45MjQzNyAxLjI1NTY3IDQuMzgzMSAxLjE1MDcyQzQuNDc3MTYgMS4xMjkyMSA0LjU3MjE5IDEuMTEyMDQgNC42Njc2IDEuMDk3NzFDNC43NDQ4MyAxLjA4NjExIDQuNjE1MjcgMS4xMDM5OSA0LjY5MjE3IDEuMDk0NDRDNC43MTUxMyAxLjA5MTYgNC43MzgxNyAxLjA4OTE3IDQuNzYxMTkgMS4wODY3N0M0LjgxNDAzIDEuMDgxMjQgNC44NjcwNCAxLjA3NzM5IDQuOTIwMDcgMS4wNzQyM0M1LjEwMDg0IDEuMDYzNDggNS4yODIzNyAxLjA2ODUxIDUuNDYyNTIgMS4wODY0QzUuNDgzMzYgMS4wODg0NiA1LjUwNDE3IDEuMDkwOTIgNS41MjQ5NSAxLjA5MzM4QzUuNTk1MDggMS4xMDE2NyA1LjQ2OTQzIDEuMDg1MjYgNS41Mzg5OSAxLjA5NTIxQzUuNTc5NjUgMS4xMDEwMyA1LjYyMDE2IDEuMTA3OTUgNS42NjA1OSAxLjExNTI0QzUuNzQ2NDcgMS4xMzA3MyA1LjgzMTU5IDEuMTUwMyA1LjkxNjA0IDEuMTcyMjdDNi4wNzI4IDEuMjEzMTEgNi4yMjYyMSAxLjI2NjIxIDYuMzc1OTUgMS4zMjc4NkM2LjMxMTExIDEuMzAxMTUgNi40MTg3NyAxLjM0NzAyIDYuNDM1ODQgMS4zNTQ3N0M2LjQ2OTg3IDEuMzcwMiA2LjUwMzU2IDEuMzg2MzkgNi41MzcxNCAxLjQwMjhDNi42MDg2NSAxLjQzNzc5IDYuNjc4ODYgMS40NzU0MyA2Ljc0ODE3IDEuNTE0NjJDNi44NzY2MiAxLjU4NzIzIDcuMDAwNjIgMS42Njc1MyA3LjEyMDkyIDEuNzUyOUM3LjE0ODgyIDEuNzcyNzEgNy4xNzYzNyAxLjc5Mjk3IDcuMjAzODMgMS44MTMzOEM3LjIxNzM5IDEuODIzNDggNy4yMzA4NyAxLjgzMzcgNy4yNDQzMiAxLjg0Mzk2QzcuMjkxNTggMS44Nzk5MiA3LjE5ODggMS44MDgzOSA3LjI0NTI5IDEuODQ0ODJDNy4zMDEwOSAxLjg4ODUzIDcuMzU1NjggMS45MzM3NSA3LjQwOTQ5IDEuOTc5ODJDNy41MDY1MiAyLjA2Mjg4IDcuNTk5OTQgMi4xNTAwOCA3LjY5MDUzIDIuMjQwMTFDNy44NDAwOCAyLjM4ODc5IDcuOTgwNDQgMi41NDY3NyA4LjExMTQ5IDIuNzExOTRDOC4xMjU3MiAyLjcyOTg3IDguMTc1MzMgMi43OTQxNCA4LjExNDg1IDIuNzE1N0M4LjEyNjM2IDIuNzMwNjUgOC4xMzc3NiAyLjc0NTY4IDguMTQ5MSAyLjc2MDc1QzguMTY5NCAyLjc4NzY5IDguMTg5MzQgMi44MTQ5MSA4LjIwOTA1IDIuODQyM0M4LjIzODI1IDIuODgyODYgOC4yNjY3IDIuOTIzOTggOC4yOTQyOSAyLjk2NTY2QzguNDAzNzQgMy4xMzEgOC42Mjg2IDMuMTMxIDguNzM4MDUgMi45NjU2NkM4Ljc2NzA3IDIuOTIxODEgOC43OTcxMiAyLjg3ODY2IDguODI3ODUgMi44MzU5OEM4Ljg0NzgzIDIuODA4MjMgOC44NjgxOSAyLjc4MDc1IDguODg4NzUgMi43NTM0NEM4LjkwMjQyIDIuNzM1MjkgOC45NDkyOCAyLjY3NDc0IDguODg5MzUgMi43NTIxNEM4LjkwNDA5IDIuNzMzMTIgOC45MTkgMi43MTQyNCA4LjkzMzk5IDIuNjk1NDJDOS4wNjcxIDIuNTI4MzQgOS4yMTA3MSAyLjM2OTY4IDkuMzYyNjEgMi4yMTk1NEM5LjQ1NDExIDIuMTI5MDcgOS41NDkzIDIuMDQyMzQgOS42NDczMiAxLjk1ODk3QzkuNjk3MzcgMS45MTY0MSA5Ljc0ODQ3IDEuODc1MDcgOS44MDAxNyAxLjgzNDU2QzkuNzM4OCAxLjg4MjYzIDkuODI2OTQgMS44MTQ1NyA5Ljg0MjEzIDEuODAzMjdDOS44NzQyNyAxLjc3OTM3IDkuOTA2ODMgMS43NTYwNiA5LjkzOTYgMS43MzMwMUMxMC4wNjA4IDEuNjQ3NzMgMTAuMTg2NiAxLjU2OTE1IDEwLjMxNTkgMS40OTY4MkMxMC4zODAyIDEuNDYwODQgMTAuNDQ1NyAxLjQyNzAzIDEwLjUxMTkgMS4zOTQ2N0MxMC41NDU1IDEuMzc4MjMgMTAuNTc5NSAxLjM2MjUxIDEwLjYxMzYgMS4zNDcwNEMxMC42MzA4IDEuMzM5MjYgMTAuNjQ4MSAxLjMzMTcxIDEwLjY2NTQgMS4zMjQxN0MxMC42OTE1IDEuMzEyOTYgMTAuNjg4NSAxLjMxNDIgMTAuNjU2NCAxLjMyNzlDMTAuNjY4MSAxLjMyMzAzIDEwLjY3OTggMS4zMTgyMiAxMC42OTE2IDEuMzEzNDlDMTAuODQyMyAxLjI1MjM1IDEwLjk5NzMgMS4yMDI0NiAxMS4xNTQ4IDEuMTYyMzlDMTEuMjMzMiAxLjE0MjQ4IDExLjMxMjMgMS4xMjU5OSAxMS4zOTE4IDEuMTExNjZDMTEuNDMyMyAxLjEwNDM1IDExLjQ3MyAxLjA5ODE1IDExLjUxMzggMS4wOTIzMUMxMS40NDcxIDEuMTAxODYgMTEuNTE3MSAxLjA5MjI2IDExLjUyODEgMS4wOTA5NUMxMS41NTU5IDEuMDg3NjcgMTEuNTgzOCAxLjA4NDk5IDExLjYxMTcgMS4wODI0QzExLjc5MyAxLjA2NTUzIDExLjk3NTcgMS4wNjUxMyAxMi4xNTczIDEuMDc3MUMxMi4yMDMgMS4wODAxMSAxMi4yNDg1IDEuMDg0NDQgMTIuMjk0IDEuMDg5MjFDMTIuMzE3MiAxLjA5MTYzIDEyLjM0MDIgMS4wOTQ1IDEyLjM2MzMgMS4wOTczNEMxMi4zMDM2IDEuMDg5OTQgMTIuMzgxMyAxLjEwMDIyIDEyLjM4ODEgMS4xMDEyM0MxMi40OTIxIDEuMTE2ODUgMTIuNTk1MiAxLjEzNzg1IDEyLjY5NzUgMS4xNjE5M0MxMy4xNTg2IDEuMjcwNDggMTMuNTM3OCAxLjQ0MDM3IDEzLjk0NjQgMS42Nzc2MUMxNC4wOTA0IDEuNzYxMjkgMTQuMjMxNCAxLjg1MDcgMTQuMzY1NiAxLjk0OTVDMTQuMzc3IDEuOTU3OTEgMTQuMzg4NCAxLjk2NjQ4IDE0LjM5OTcgMS45NzUwM0MxNC40NDE5IDIuMDA2ODggMTQuMzUxIDEuOTM2OTYgMTQuMzkyNiAxLjk2OTQ1QzE0LjQxNDkgMS45ODY4MyAxNC40MzY5IDIuMDA0NjIgMTQuNDU4OCAyLjAyMjUyQzE0LjUwNTkgMi4wNjExNSAxNC41NTE5IDIuMTAxMyAxNC41OTcxIDIuMTQyMjhDMTQuNjgzNSAyLjIyMDczIDE0Ljc2NTYgMi4zMDM4OCAxNC44NDM5IDIuMzkwMzVDMTQuODgxNSAyLjQzMTc2IDE0LjkxNzggMi40NzQyNyAxNC45NTM0IDIuNTE3MzZDMTQuOTcxMiAyLjUzODkxIDE0Ljk4ODcgMi41NjA3NyAxNS4wMDYgMi41ODI3NEMxNS4wMzg0IDIuNjIzODggMTQuOTY4MiAyLjUzMzM1IDE1IDIuNTc1QzE1LjAxMTQgMi41ODk4MyAxNS4wMjI1IDIuNjA0NzkgMTUuMDMzNiAyLjYxOTc4QzE1LjE3MzYgMi44MDg3MSAxNS4yOTQ2IDMuMDExNDIgMTUuMzk4NSAzLjIyMjI0QzE1LjQyMzggMy4yNzM1NiAxNS40NDc3IDMuMzI1NTMgMTUuNDcwOSAzLjM3NzgyQzE1LjQ3NjcgMy4zOTA5NiAxNS40ODI0IDMuNDA0MTQgMTUuNDg4MSAzLjQxNzM0QzE1LjUwOTMgMy40NjY1NiAxNS40NjQgMy4zNTk0NSAxNS40ODQ1IDMuNDA5MDJDMTUuNDk3NSAzLjQ0MDEzIDE1LjUwOTkgMy40NzE0OCAxNS41MjIxIDMuNTAyODlDMTUuNTY2MSAzLjYxNjMyIDE1LjYwNDkgMy43MzE3NSAxNS42Mzk4IDMuODQ4MzNDMTUuNzExNSA0LjA4ODMyIDE1Ljc2MyA0LjMzNDE2IDE1Ljc5ODQgNC41ODIwNEMxNS44MDY0IDQuNjM4MDYgMTUuNzkwMSA0LjUxODQyIDE1Ljc5NzUgNC41NzQ2M0MxNS43OTk1IDQuNTg5OTIgMTUuODAxNCA0LjYwNTIxIDE1LjgwMzMgNC42MjA1QzE1LjgwNyA0LjY1MTIgMTUuODEwNCA0LjY4MTk3IDE1LjgxMzcgNC43MTI3M0MxNS44MjA4IDQuNzc5OTQgMTUuODI2NCA0Ljg0NzMyIDE1LjgzMTIgNC45MTQ3NEMxNS44NDA0IDUuMDQ2NTggMTUuODQ0NyA1LjE3ODc2IDE1Ljg0NTMgNS4zMTA5M0MxNS44NDY0IDUuNTg0MTggMTUuODI4NyA1Ljg1NzM3IDE1Ljc5NjEgNi4xMjg2MkMxNS43OTQxIDYuMTQ1MjkgMTUuNzkxOSA2LjE2MTkyIDE1Ljc4OTggNi4xNzg1NkMxNS43ODIyIDYuMjM4MjcgMTUuNzk4MyA2LjExNzIyIDE1Ljc5MDEgNi4xNzY5N0MxNS43ODU1IDYuMjEwNDQgMTUuNzgwNiA2LjI0Mzg5IDE1Ljc3NTUgNi4yNzczMUMxNS43NjQ0IDYuMzUwMzEgMTUuNzUyIDYuNDIzMSAxNS43Mzg4IDYuNDk1NzNDMTUuNzEyOSA2LjYzNzY5IDE1LjY4MjMgNi43Nzg4IDE1LjY0ODQgNi45MTkwNUMxNS41Nzg0IDcuMjA4NDMgMTUuNDkwOSA3LjQ5MzQ4IDE1LjM4OTcgNy43NzM0M0MxNS4zNjQ4IDcuODQyMzIgMTUuMzM4OCA3LjkxMDggMTUuMzEyMSA3Ljk3OTAyQzE1LjI5ODcgOC4wMTMzOCAxNS4yODQ5IDguMDQ3NiAxNS4yNzExIDguMDgxNzlDMTUuMjY0MSA4LjA5ODk2IDE1LjI1NyA4LjExNjA0IDE1LjI1IDguMTMzMTVDMTUuMjQ1MiA4LjE0NDU4IDE1LjI0MDUgOC4xNTU5OCAxNS4yMzU3IDguMTY3MzhDMTUuMjQ5NiA4LjEzNDUzIDE1LjI1MSA4LjEzMTE3IDE1LjIzOTkgOC4xNTczNEMxNS4xNzg2IDguMzAxMzcgMTUuMTEzMSA4LjQ0MzU1IDE1LjA0NDMgOC41ODQxNkMxNC45MDI4IDguODczNTEgMTQuNzQ1MSA5LjE1NDgzIDE0LjU3NDUgOS40Mjc5OUMxNC40ODY4IDkuNTY4NDQgMTQuMzk1IDkuNzA2MzQgMTQuMzAwMiA5Ljg0MjEzQzE0LjI1NCA5LjkwODIxIDE0LjIwNjkgOS45NzM1NSAxNC4xNTkyIDEwLjAzODVDMTQuMTM1MSAxMC4wNzExIDE0LjExMDggMTAuMTAzNiAxNC4wODY0IDEwLjEzNkMxNC4wNzQxIDEwLjE1MjIgMTQuMDYxNyAxMC4xNjg0IDE0LjA0OTQgMTAuMTg0NUMxNC4wMzE5IDEwLjIwNzMgMTQuMDMyOSAxMC4yMDYxIDE0LjA1MjIgMTAuMTgxQzE0LjA0MzkgMTAuMTkxOCAxNC4wMzU1IDEwLjIwMjUgMTQuMDI3MSAxMC4yMTMyQzEzLjgxMzUgMTAuNDg2OSAxMy41ODQ5IDEwLjc0ODggMTMuMzQ0NSAxMC45OTkyQzEzLjA5NDggMTEuMjU5NCAxMi44MzA5IDExLjUwNTggMTIuNTU2IDExLjczOTFDMTIuNDg4NCAxMS43OTY1IDEyLjQxOTkgMTEuODUyOCAxMi4zNTA5IDExLjkwODZDMTIuMzE2MiAxMS45MzY2IDEyLjI4MTIgMTEuOTY0MyAxMi4yNDYxIDExLjk5MkMxMi4yMjg1IDEyLjAwNTggMTIuMjEwOCAxMi4wMTk2IDEyLjE5MzEgMTIuMDMzM0MxMi4yMzc3IDExLjk5ODcgMTIuMTYzNiAxMi4wNTU4IDEyLjE1NiAxMi4wNjE2QzEyLjAwNSAxMi4xNzY1IDExLjg1MDggMTIuMjg3MSAxMS42OTQyIDEyLjM5NDFDMTEuMzcwNiAxMi42MTUzIDExLjAzNDggMTIuODE4NSAxMC42OTA0IDEzLjAwNTVDMTAuNTEyMiAxMy4xMDIzIDEwLjMzMTMgMTMuMTkzOSAxMC4xNDg0IDEzLjI4MTVDMTAuMDU5IDEzLjMyNDMgOS45NjkwNCAxMy4zNjU4IDkuODc4NjggMTMuNDA2NEM5LjgzMzEgMTMuNDI2OSA5Ljc4NzMzIDEzLjQ0NjkgOS43NDE1MSAxMy40NjY5QzkuNzE4NSAxMy40NzY5IDkuNjk1NDEgMTMuNDg2OCA5LjY3MjMzIDEzLjQ5NjZDOS42NDQyIDEzLjUwODYgOS42NDE0NiAxMy41MDk4IDkuNjY0MTcgMTMuNTAwMkM5LjY0ODY0IDEzLjUwNjcgOS42MzMxMyAxMy41MTMyIDkuNjE3NTggMTMuNTE5NkM5LjIzNDkgMTMuNjc4OCA4Ljg0Mzk4IDEzLjgxNzkgOC40NDc4NiAxMy45Mzk4QzguMzE0MDkgMTMuOTgwOSA4LjIzMDQgMTQuMTE3OCA4LjI2ODM5IDE0LjI1NTlDOC4zMDQ3IDE0LjM4NzggOC40NTA2NCAxNC40NzY1IDguNTg0NSAxNC40MzUzQzEwLjE1MzQgMTMuOTUyNSAxMS42MjYgMTMuMTg3MSAxMi44ODU3IDEyLjEzMUMxMy45NDI1IDExLjI0NSAxNC44MzQ5IDEwLjE0NTYgMTUuNDU0MyA4LjkxMTY1QzE1Ljk5NDIgNy44MzYwOCAxNi4zMzU3IDYuNjQ3NDQgMTYuMzU4MyA1LjQzOTY3QzE2LjM3NzQgNC40MTYyOCAxNi4xNDkgMy4zNTcwNCAxNS41NzQyIDIuNDk3ODlDMTUuMjkyOSAyLjA3NzMyIDE0LjkzNzEgMS43MTgxNiAxNC41MjA1IDEuNDMxMzRDMTMuNzk1NiAwLjkzMjI5NSAxMi45Mjk0IDAuNTkyODIyIDEyLjA0NSAwLjU1NzIxNEMxMC43NzE3IDAuNTA1OTQ5IDkuNjAxMjYgMS4xNzE1NyA4Ljc2OTcgMi4wOTY4NUM4LjU5Nzc5IDIuMjg4MTMgOC40MzYzNCAyLjQ5MTcyIDguMjk0MzEgMi43MDYyOUM4LjQ0MjIzIDIuNzA2MjkgOC41OTAxNSAyLjcwNjI5IDguNzM4MDcgMi43MDYyOUM4LjIyNDM0IDEuOTMwMjMgNy40ODI1NSAxLjI1MzM4IDYuNjI2NCAwLjg4MDQyNEM1LjkzMDUgMC41NzcyNTggNS4xODU1NSAwLjQ5MDE2NCA0LjQzNzIxIDAuNjE3MTc5QzMuOTg3NjYgMC42OTM0OCAzLjU1NTQ2IDAuODU2NTA4IDMuMTQ4NDkgMS4wNTkxNUMyLjgxOTQ1IDEuMjIyOTYgMi41MDY1MyAxLjQxODQyIDIuMjIxMTUgMS42NTAxN0MxLjQ0OTA0IDIuMjc3MTMgMC45NzMwMjYgMy4yMDk5NSAwLjc4MzczMiA0LjE3NTE5QzAuNTY1MDkgNS4yOTAwNCAwLjY4NzM3IDYuNDUzODEgMS4wMjA1MSA3LjUzMzM5QzEuNDEwODQgOC43OTgyNyAyLjA5NDA3IDkuOTU5MTYgMi45NTY0MSAxMC45NTg5QzMuOTQ3NTcgMTIuMTA4MSA1LjE5NjE0IDEzLjAzMDYgNi41NTgyIDEzLjY5MzNDNy4xNjcxMiAxMy45ODk2IDcuODAwOCAxNC4yMzYyIDguNDQ3ODggMTQuNDM1M0M4LjU4MTc0IDE0LjQ3NjUgOC43Mjc2OCAxNC4zODc4IDguNzYzOTkgMTQuMjU1OUM4LjgwMTg5IDE0LjExNzcgOC43MTgyMSAxMy45ODA5IDguNTg0NDQgMTMuOTM5N1pcIlxuICAgIH0pXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04LjU4NDQ0IDEzLjkzOTdDNy43NjEzOSAxMy42ODY0IDcuMDUzMzQgMTMuMzkzNyA2LjI5OTc2IDEyLjk4MjVDNS45NTYzMyAxMi43OTUxIDUuNjIyODUgMTIuNTg5NSA1LjMwMDMgMTIuMzY4MUM1LjE0NDE2IDEyLjI2MDkgNC45OTEwOCAxMi4xNDkzIDQuODQwNjMgMTIuMDM0M0M0Ljc4MTMyIDExLjk4ODkgNC44ODAzOCAxMi4wNjUyIDQuODIxNTYgMTIuMDE5NUM0LjgwMzg4IDEyLjAwNTggNC43ODYzIDExLjk5MTkgNC43Njg2OSAxMS45NzgxQzQuNzMzNjQgMTEuOTUwNSA0LjY5ODg0IDExLjkyMjUgNC42NjQxMyAxMS44OTQ1QzQuNTg5NDggMTEuODM0MiA0LjUxNTgyIDExLjc3MjcgNC40NDI4IDExLjcxMDVDMy45MDQ5OSAxMS4yNTIgMy40MTM4MSAxMC43Mzg5IDIuOTgwMTYgMTAuMTgwOUMzLjAxODU2IDEwLjIzMDMgMi45NzY1MSAxMC4xNzYgMi45NzA2NCAxMC4xNjgzQzIuOTU4MyAxMC4xNTIyIDIuOTQ2MDQgMTAuMTM1OSAyLjkzMzggMTAuMTE5N0MyLjkwOTM5IDEwLjA4NzQgMi44ODUyNyAxMC4wNTQ4IDIuODYxMjYgMTAuMDIyMUMyLjgwOTYxIDkuOTUxODkgMi43NTkwOCA5Ljg4MDggMi43MDkzMiA5LjgwOTJDMi42MTQ5MiA5LjY3MzQ1IDIuNTI0NDEgOS41MzUgMi40MzcxIDkuMzk0NTdDMi4yNjczIDkuMTIxNDUgMi4xMTIxMyA4LjgzOTI2IDEuOTcxNDcgOC41NTAwNkMxLjkzODQ5IDguNDgyMjggMS45MDY1NyA4LjQxMzk2IDEuODc1MzEgOC4zNDUzN0MxLjg1OTc4IDguMzExMyAxLjg0NDU5IDguMjc3MDkgMS44Mjk0OCA4LjI0Mjg0QzEuODIxOTUgOC4yMjU3NSAxLjgxNDU2IDguMjA4NjQgMS44MDcxNCA4LjE5MTUyQzEuODAxNjcgOC4xNzg4OSAxLjc2ODU2IDguMTAwNjEgMS43OTY2NCA4LjE2NzM2QzEuNzM3MjggOC4wMjYyIDEuNjgyMDUgNy44ODMyOSAxLjYzMDI5IDcuNzM5MTZDMS41Mjk4MiA3LjQ1OTQyIDEuNDQ0OTggNy4xNzQwNyAxLjM3NTc1IDYuODg1MDJDMS4zNDIxOCA2Ljc0NDkyIDEuMzEzMDEgNi42MDM3OSAxLjI4NzQ2IDYuNDYyMDJDMS4yNzU0IDYuMzk1MDIgMS4yNjQ1IDYuMzI3ODIgMS4yNTQzIDYuMjYwNTJDMS4yNDkyNSA2LjIyNzEzIDEuMjQ0NTMgNi4xOTM2OSAxLjIzOTk0IDYuMTYwMjNDMS4yNTEzNiA2LjI0MzU4IDEuMjM0OTUgNi4xMTc3MiAxLjIzMjMxIDYuMDk1MzJDMS4yMDA0MiA1LjgyNDQ0IDEuMTg1MzUgNS41NTE1OCAxLjE4NzIxIDUuMjc4ODVDMS4xODgxMSA1LjE0NjkxIDEuMTkzNzQgNS4wMTUwMSAxLjIwMzM0IDQuODgzNDNDMS4yMDc4OCA0LjgyMTI4IDEuMjEzNjggNC43NTkyMiAxLjIyMDIzIDQuNjk3MjZDMS4yMjM1IDQuNjY2NTEgMS4yMjcxMyA0LjYzNTggMS4yMzA4OSA0LjYwNTExQzEuMjMyNzggNC41ODk4MiAxLjIzNDc3IDQuNTc0NTcgMS4yMzY3OCA0LjU1OTNDMS4yMjU2MiA0LjY0NDI1IDEuMjM1NjMgNC41Njk1NiAxLjIzODIzIDQuNTUxNjNDMS4yNzQyOCA0LjMwNDE5IDEuMzI4NjEgNC4wNTk0MyAxLjQwMDk3IDMuODIwMDZDMS40MzYxNCAzLjcwMzc1IDEuNDc2MzUgMy41ODg5OSAxLjUyMDcyIDMuNDc1ODdDMS41MzEyNSAzLjQ0OSAxLjU0MjE5IDMuNDIyMjkgMS41NTMyNiAzLjM5NTY0QzEuNTE5NDEgMy40NzcxNiAxLjU1ODg5IDMuMzgzMzQgMS41NjcxNyAzLjM2NDY0QzEuNTkyMjYgMy4zMDgwMyAxLjYxODg2IDMuMjUyMDkgMS42NDY0MyAzLjE5NjY0QzEuNzUxMDEgMi45ODYyNCAxLjg3NDc2IDIuNzg1NDkgMi4wMTUzNCAyLjU5NzI0QzIuMDIzNzEgMi41ODYwMyAyLjAzMjIxIDIuNTc0OTIgMi4wNDA3MSAyLjU2MzhDMS45OTI3NSAyLjYyNjU2IDIuMDI0NDYgMi41ODQ5NiAyLjAzNDkzIDIuNTcxNjlDMi4wNTIyMyAyLjU0OTc0IDIuMDY5OTMgMi41MjgwOCAyLjA4NzczIDIuNTA2NTNDMi4xMjYzMSAyLjQ1OTg0IDIuMTY2MjkgMi40MTQzNCAyLjIwNzEzIDIuMzY5NjJDMi4yODU4NyAyLjI4MzQxIDIuMzY5MjYgMi4yMDE1MSAyLjQ1NiAyLjEyMzM5QzIuNDk3ODcgMi4wODU2OCAyLjU0MDg0IDIuMDQ5MiAyLjU4NDQzIDIuMDEzNTJDMi42MDYzMSAxLjk5NTYxIDIuNjI4NTIgMS45NzgwOCAyLjY1MDg0IDEuOTYwN0MyLjU4MTY0IDIuMDE0NjYgMi42NzE5MSAxLjk0NTU3IDIuNjg5NjIgMS45MzI2NUMyLjgzMzM4IDEuODI3NyAyLjk4NTg3IDEuNzM0OCAzLjE0MDEzIDEuNjQ2M0MzLjU0MzkzIDEuNDE0NTkgMy45MjQzNyAxLjI1NTY3IDQuMzgzMSAxLjE1MDcyQzQuNDc3MTYgMS4xMjkyMSA0LjU3MjE5IDEuMTEyMDQgNC42Njc2IDEuMDk3NzFDNC43NDQ4MyAxLjA4NjExIDQuNjE1MjcgMS4xMDM5OSA0LjY5MjE3IDEuMDk0NDRDNC43MTUxMyAxLjA5MTYgNC43MzgxNyAxLjA4OTE3IDQuNzYxMTkgMS4wODY3N0M0LjgxNDAzIDEuMDgxMjQgNC44NjcwNCAxLjA3NzM5IDQuOTIwMDcgMS4wNzQyM0M1LjEwMDg0IDEuMDYzNDggNS4yODIzNyAxLjA2ODUxIDUuNDYyNTIgMS4wODY0QzUuNDgzMzYgMS4wODg0NiA1LjUwNDE3IDEuMDkwOTIgNS41MjQ5NSAxLjA5MzM4QzUuNTk1MDggMS4xMDE2NyA1LjQ2OTQzIDEuMDg1MjYgNS41Mzg5OSAxLjA5NTIxQzUuNTc5NjUgMS4xMDEwMyA1LjYyMDE2IDEuMTA3OTUgNS42NjA1OSAxLjExNTI0QzUuNzQ2NDcgMS4xMzA3MyA1LjgzMTU5IDEuMTUwMyA1LjkxNjA0IDEuMTcyMjdDNi4wNzI4IDEuMjEzMTEgNi4yMjYyMSAxLjI2NjIxIDYuMzc1OTUgMS4zMjc4NkM2LjMxMTExIDEuMzAxMTUgNi40MTg3NyAxLjM0NzAyIDYuNDM1ODQgMS4zNTQ3N0M2LjQ2OTg3IDEuMzcwMiA2LjUwMzU2IDEuMzg2MzkgNi41MzcxNCAxLjQwMjhDNi42MDg2NSAxLjQzNzc5IDYuNjc4ODYgMS40NzU0MyA2Ljc0ODE3IDEuNTE0NjJDNi44NzY2MiAxLjU4NzIzIDcuMDAwNjIgMS42Njc1MyA3LjEyMDkyIDEuNzUyOUM3LjE0ODgyIDEuNzcyNzEgNy4xNzYzNyAxLjc5Mjk3IDcuMjAzODMgMS44MTMzOEM3LjIxNzM5IDEuODIzNDggNy4yMzA4NyAxLjgzMzcgNy4yNDQzMiAxLjg0Mzk2QzcuMjkxNTggMS44Nzk5MiA3LjE5ODggMS44MDgzOSA3LjI0NTI5IDEuODQ0ODJDNy4zMDEwOSAxLjg4ODUzIDcuMzU1NjggMS45MzM3NSA3LjQwOTQ5IDEuOTc5ODJDNy41MDY1MiAyLjA2Mjg4IDcuNTk5OTQgMi4xNTAwOCA3LjY5MDUzIDIuMjQwMTFDNy44NDAwOCAyLjM4ODc5IDcuOTgwNDQgMi41NDY3NyA4LjExMTQ5IDIuNzExOTRDOC4xMjU3MiAyLjcyOTg3IDguMTc1MzMgMi43OTQxNCA4LjExNDg1IDIuNzE1N0M4LjEyNjM2IDIuNzMwNjUgOC4xMzc3NiAyLjc0NTY4IDguMTQ5MSAyLjc2MDc1QzguMTY5NCAyLjc4NzY5IDguMTg5MzQgMi44MTQ5MSA4LjIwOTA1IDIuODQyM0M4LjIzODI1IDIuODgyODYgOC4yNjY3IDIuOTIzOTggOC4yOTQyOSAyLjk2NTY2QzguNDAzNzQgMy4xMzEgOC42Mjg2IDMuMTMxIDguNzM4MDUgMi45NjU2NkM4Ljc2NzA3IDIuOTIxODEgOC43OTcxMiAyLjg3ODY2IDguODI3ODUgMi44MzU5OEM4Ljg0NzgzIDIuODA4MjMgOC44NjgxOSAyLjc4MDc1IDguODg4NzUgMi43NTM0NEM4LjkwMjQyIDIuNzM1MjkgOC45NDkyOCAyLjY3NDc0IDguODg5MzUgMi43NTIxNEM4LjkwNDA5IDIuNzMzMTIgOC45MTkgMi43MTQyNCA4LjkzMzk5IDIuNjk1NDJDOS4wNjcxIDIuNTI4MzQgOS4yMTA3MSAyLjM2OTY4IDkuMzYyNjEgMi4yMTk1NEM5LjQ1NDExIDIuMTI5MDcgOS41NDkzIDIuMDQyMzQgOS42NDczMiAxLjk1ODk3QzkuNjk3MzcgMS45MTY0MSA5Ljc0ODQ3IDEuODc1MDcgOS44MDAxNyAxLjgzNDU2QzkuNzM4OCAxLjg4MjYzIDkuODI2OTQgMS44MTQ1NyA5Ljg0MjEzIDEuODAzMjdDOS44NzQyNyAxLjc3OTM3IDkuOTA2ODMgMS43NTYwNiA5LjkzOTYgMS43MzMwMUMxMC4wNjA4IDEuNjQ3NzMgMTAuMTg2NiAxLjU2OTE1IDEwLjMxNTkgMS40OTY4MkMxMC4zODAyIDEuNDYwODQgMTAuNDQ1NyAxLjQyNzAzIDEwLjUxMTkgMS4zOTQ2N0MxMC41NDU1IDEuMzc4MjMgMTAuNTc5NSAxLjM2MjUxIDEwLjYxMzYgMS4zNDcwNEMxMC42MzA4IDEuMzM5MjYgMTAuNjQ4MSAxLjMzMTcxIDEwLjY2NTQgMS4zMjQxN0MxMC42OTE1IDEuMzEyOTYgMTAuNjg4NSAxLjMxNDIgMTAuNjU2NCAxLjMyNzlDMTAuNjY4MSAxLjMyMzAzIDEwLjY3OTggMS4zMTgyMiAxMC42OTE2IDEuMzEzNDlDMTAuODQyMyAxLjI1MjM1IDEwLjk5NzMgMS4yMDI0NiAxMS4xNTQ4IDEuMTYyMzlDMTEuMjMzMiAxLjE0MjQ4IDExLjMxMjMgMS4xMjU5OSAxMS4zOTE4IDEuMTExNjZDMTEuNDMyMyAxLjEwNDM1IDExLjQ3MyAxLjA5ODE1IDExLjUxMzggMS4wOTIzMUMxMS40NDcxIDEuMTAxODYgMTEuNTE3MSAxLjA5MjI2IDExLjUyODEgMS4wOTA5NUMxMS41NTU5IDEuMDg3NjcgMTEuNTgzOCAxLjA4NDk5IDExLjYxMTcgMS4wODI0QzExLjc5MyAxLjA2NTUzIDExLjk3NTcgMS4wNjUxMyAxMi4xNTczIDEuMDc3MUMxMi4yMDMgMS4wODAxMSAxMi4yNDg1IDEuMDg0NDQgMTIuMjk0IDEuMDg5MjFDMTIuMzE3MiAxLjA5MTYzIDEyLjM0MDIgMS4wOTQ1IDEyLjM2MzMgMS4wOTczNEMxMi4zMDM2IDEuMDg5OTQgMTIuMzgxMyAxLjEwMDIyIDEyLjM4ODEgMS4xMDEyM0MxMi40OTIxIDEuMTE2ODUgMTIuNTk1MiAxLjEzNzg1IDEyLjY5NzUgMS4xNjE5M0MxMy4xNTg2IDEuMjcwNDggMTMuNTM3OCAxLjQ0MDM3IDEzLjk0NjQgMS42Nzc2MUMxNC4wOTA0IDEuNzYxMjkgMTQuMjMxNCAxLjg1MDcgMTQuMzY1NiAxLjk0OTVDMTQuMzc3IDEuOTU3OTEgMTQuMzg4NCAxLjk2NjQ4IDE0LjM5OTcgMS45NzUwM0MxNC40NDE5IDIuMDA2ODggMTQuMzUxIDEuOTM2OTYgMTQuMzkyNiAxLjk2OTQ1QzE0LjQxNDkgMS45ODY4MyAxNC40MzY5IDIuMDA0NjIgMTQuNDU4OCAyLjAyMjUyQzE0LjUwNTkgMi4wNjExNSAxNC41NTE5IDIuMTAxMyAxNC41OTcxIDIuMTQyMjhDMTQuNjgzNSAyLjIyMDczIDE0Ljc2NTYgMi4zMDM4OCAxNC44NDM5IDIuMzkwMzVDMTQuODgxNSAyLjQzMTc2IDE0LjkxNzggMi40NzQyNyAxNC45NTM0IDIuNTE3MzZDMTQuOTcxMiAyLjUzODkxIDE0Ljk4ODcgMi41NjA3NyAxNS4wMDYgMi41ODI3NEMxNS4wMzg0IDIuNjIzODggMTQuOTY4MiAyLjUzMzM1IDE1IDIuNTc1QzE1LjAxMTQgMi41ODk4MyAxNS4wMjI1IDIuNjA0NzkgMTUuMDMzNiAyLjYxOTc4QzE1LjE3MzYgMi44MDg3MSAxNS4yOTQ2IDMuMDExNDIgMTUuMzk4NSAzLjIyMjI0QzE1LjQyMzggMy4yNzM1NiAxNS40NDc3IDMuMzI1NTMgMTUuNDcwOSAzLjM3NzgyQzE1LjQ3NjcgMy4zOTA5NiAxNS40ODI0IDMuNDA0MTQgMTUuNDg4MSAzLjQxNzM0QzE1LjUwOTMgMy40NjY1NiAxNS40NjQgMy4zNTk0NSAxNS40ODQ1IDMuNDA5MDJDMTUuNDk3NSAzLjQ0MDEzIDE1LjUwOTkgMy40NzE0OCAxNS41MjIxIDMuNTAyODlDMTUuNTY2MSAzLjYxNjMyIDE1LjYwNDkgMy43MzE3NSAxNS42Mzk4IDMuODQ4MzNDMTUuNzExNSA0LjA4ODMyIDE1Ljc2MyA0LjMzNDE2IDE1Ljc5ODQgNC41ODIwNEMxNS44MDY0IDQuNjM4MDYgMTUuNzkwMSA0LjUxODQyIDE1Ljc5NzUgNC41NzQ2M0MxNS43OTk1IDQuNTg5OTIgMTUuODAxNCA0LjYwNTIxIDE1LjgwMzMgNC42MjA1QzE1LjgwNyA0LjY1MTIgMTUuODEwNCA0LjY4MTk3IDE1LjgxMzcgNC43MTI3M0MxNS44MjA4IDQuNzc5OTQgMTUuODI2NCA0Ljg0NzMyIDE1LjgzMTIgNC45MTQ3NEMxNS44NDA0IDUuMDQ2NTggMTUuODQ0NyA1LjE3ODc2IDE1Ljg0NTMgNS4zMTA5M0MxNS44NDY0IDUuNTg0MTggMTUuODI4NyA1Ljg1NzM3IDE1Ljc5NjEgNi4xMjg2MkMxNS43OTQxIDYuMTQ1MjkgMTUuNzkxOSA2LjE2MTkyIDE1Ljc4OTggNi4xNzg1NkMxNS43ODIyIDYuMjM4MjcgMTUuNzk4MyA2LjExNzIyIDE1Ljc5MDEgNi4xNzY5N0MxNS43ODU1IDYuMjEwNDQgMTUuNzgwNiA2LjI0Mzg5IDE1Ljc3NTUgNi4yNzczMUMxNS43NjQ0IDYuMzUwMzEgMTUuNzUyIDYuNDIzMSAxNS43Mzg4IDYuNDk1NzNDMTUuNzEyOSA2LjYzNzY5IDE1LjY4MjMgNi43Nzg4IDE1LjY0ODQgNi45MTkwNUMxNS41Nzg0IDcuMjA4NDMgMTUuNDkwOSA3LjQ5MzQ4IDE1LjM4OTcgNy43NzM0M0MxNS4zNjQ4IDcuODQyMzIgMTUuMzM4OCA3LjkxMDggMTUuMzEyMSA3Ljk3OTAyQzE1LjI5ODcgOC4wMTMzOCAxNS4yODQ5IDguMDQ3NiAxNS4yNzExIDguMDgxNzlDMTUuMjY0MSA4LjA5ODk2IDE1LjI1NyA4LjExNjA0IDE1LjI1IDguMTMzMTVDMTUuMjQ1MiA4LjE0NDU4IDE1LjI0MDUgOC4xNTU5OCAxNS4yMzU3IDguMTY3MzhDMTUuMjQ5NiA4LjEzNDUzIDE1LjI1MSA4LjEzMTE3IDE1LjIzOTkgOC4xNTczNEMxNS4xNzg2IDguMzAxMzcgMTUuMTEzMSA4LjQ0MzU1IDE1LjA0NDMgOC41ODQxNkMxNC45MDI4IDguODczNTEgMTQuNzQ1MSA5LjE1NDgzIDE0LjU3NDUgOS40Mjc5OUMxNC40ODY4IDkuNTY4NDQgMTQuMzk1IDkuNzA2MzQgMTQuMzAwMiA5Ljg0MjEzQzE0LjI1NCA5LjkwODIxIDE0LjIwNjkgOS45NzM1NSAxNC4xNTkyIDEwLjAzODVDMTQuMTM1MSAxMC4wNzExIDE0LjExMDggMTAuMTAzNiAxNC4wODY0IDEwLjEzNkMxNC4wNzQxIDEwLjE1MjIgMTQuMDYxNyAxMC4xNjg0IDE0LjA0OTQgMTAuMTg0NUMxNC4wMzE5IDEwLjIwNzMgMTQuMDMyOSAxMC4yMDYxIDE0LjA1MjIgMTAuMTgxQzE0LjA0MzkgMTAuMTkxOCAxNC4wMzU1IDEwLjIwMjUgMTQuMDI3MSAxMC4yMTMyQzEzLjgxMzUgMTAuNDg2OSAxMy41ODQ5IDEwLjc0ODggMTMuMzQ0NSAxMC45OTkyQzEzLjA5NDggMTEuMjU5NCAxMi44MzA5IDExLjUwNTggMTIuNTU2IDExLjczOTFDMTIuNDg4NCAxMS43OTY1IDEyLjQxOTkgMTEuODUyOCAxMi4zNTA5IDExLjkwODZDMTIuMzE2MiAxMS45MzY2IDEyLjI4MTIgMTEuOTY0MyAxMi4yNDYxIDExLjk5MkMxMi4yMjg1IDEyLjAwNTggMTIuMjEwOCAxMi4wMTk2IDEyLjE5MzEgMTIuMDMzM0MxMi4yMzc3IDExLjk5ODcgMTIuMTYzNiAxMi4wNTU4IDEyLjE1NiAxMi4wNjE2QzEyLjAwNSAxMi4xNzY1IDExLjg1MDggMTIuMjg3MSAxMS42OTQyIDEyLjM5NDFDMTEuMzcwNiAxMi42MTUzIDExLjAzNDggMTIuODE4NSAxMC42OTA0IDEzLjAwNTVDMTAuNTEyMiAxMy4xMDIzIDEwLjMzMTMgMTMuMTkzOSAxMC4xNDg0IDEzLjI4MTVDMTAuMDU5IDEzLjMyNDMgOS45NjkwNCAxMy4zNjU4IDkuODc4NjggMTMuNDA2NEM5LjgzMzEgMTMuNDI2OSA5Ljc4NzMzIDEzLjQ0NjkgOS43NDE1MSAxMy40NjY5QzkuNzE4NSAxMy40NzY5IDkuNjk1NDEgMTMuNDg2OCA5LjY3MjMzIDEzLjQ5NjZDOS42NDQyIDEzLjUwODYgOS42NDE0NiAxMy41MDk4IDkuNjY0MTcgMTMuNTAwMkM5LjY0ODY0IDEzLjUwNjcgOS42MzMxMyAxMy41MTMyIDkuNjE3NTggMTMuNTE5NkM5LjIzNDkgMTMuNjc4OCA4Ljg0Mzk4IDEzLjgxNzkgOC40NDc4NiAxMy45Mzk4QzguMzE0MDkgMTMuOTgwOSA4LjIzMDQgMTQuMTE3OCA4LjI2ODM5IDE0LjI1NTlDOC4zMDQ3IDE0LjM4NzggOC40NTA2NCAxNC40NzY1IDguNTg0NSAxNC40MzUzQzEwLjE1MzQgMTMuOTUyNSAxMS42MjYgMTMuMTg3MSAxMi44ODU3IDEyLjEzMUMxMy45NDI1IDExLjI0NSAxNC44MzQ5IDEwLjE0NTYgMTUuNDU0MyA4LjkxMTY1QzE1Ljk5NDIgNy44MzYwOCAxNi4zMzU3IDYuNjQ3NDQgMTYuMzU4MyA1LjQzOTY3QzE2LjM3NzQgNC40MTYyOCAxNi4xNDkgMy4zNTcwNCAxNS41NzQyIDIuNDk3ODlDMTUuMjkyOSAyLjA3NzMyIDE0LjkzNzEgMS43MTgxNiAxNC41MjA1IDEuNDMxMzRDMTMuNzk1NiAwLjkzMjI5NSAxMi45Mjk0IDAuNTkyODIyIDEyLjA0NSAwLjU1NzIxNEMxMC43NzE3IDAuNTA1OTQ5IDkuNjAxMjYgMS4xNzE1NyA4Ljc2OTcgMi4wOTY4NUM4LjU5Nzc5IDIuMjg4MTMgOC40MzYzNCAyLjQ5MTcyIDguMjk0MzEgMi43MDYyOUM4LjQ0MjIzIDIuNzA2MjkgOC41OTAxNSAyLjcwNjI5IDguNzM4MDcgMi43MDYyOUM4LjIyNDM0IDEuOTMwMjMgNy40ODI1NSAxLjI1MzM4IDYuNjI2NCAwLjg4MDQyNEM1LjkzMDUgMC41NzcyNTggNS4xODU1NSAwLjQ5MDE2NCA0LjQzNzIxIDAuNjE3MTc5QzMuOTg3NjYgMC42OTM0OCAzLjU1NTQ2IDAuODU2NTA4IDMuMTQ4NDkgMS4wNTkxNUMyLjgxOTQ1IDEuMjIyOTYgMi41MDY1MyAxLjQxODQyIDIuMjIxMTUgMS42NTAxN0MxLjQ0OTA0IDIuMjc3MTMgMC45NzMwMjYgMy4yMDk5NSAwLjc4MzczMiA0LjE3NTE5QzAuNTY1MDkgNS4yOTAwNCAwLjY4NzM3IDYuNDUzODEgMS4wMjA1MSA3LjUzMzM5QzEuNDEwODQgOC43OTgyNyAyLjA5NDA3IDkuOTU5MTYgMi45NTY0MSAxMC45NTg5QzMuOTQ3NTcgMTIuMTA4MSA1LjE5NjE0IDEzLjAzMDYgNi41NTgyIDEzLjY5MzNDNy4xNjcxMiAxMy45ODk2IDcuODAwOCAxNC4yMzYyIDguNDQ3ODggMTQuNDM1M0M4LjU4MTc0IDE0LjQ3NjUgOC43Mjc2OCAxNC4zODc4IDguNzYzOTkgMTQuMjU1OUM4LjgwMTg5IDE0LjExNzcgOC43MTgyMSAxMy45ODA5IDguNTg0NDQgMTMuOTM5N1pcIixcbiAgICBzdHJva2U6IHMgfHwgXCIjQTBBM0FEXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMy4xMzcxMVwiLFxuICAgIG1hc2s6IFwidXJsKCNwYXRoLTItaW5zaWRlLTFfMTg3XzEwNTEpXCJcbiAgfSldXG59KTtcbmZ1bmN0aW9uIHNtKHtcbiAgb25DbGljazogcyxcbiAgc2l6ZTogZSA9IDI0XG59KSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgZm9jdXNhYmxlOiBcImZhbHNlXCIsXG4gICAgcm9sZTogXCJpbWdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNlwiLFxuICAgIHdpZHRoOiBlLFxuICAgIGhlaWdodDogZSxcbiAgICBmaWxsOiBcIiM0QTRBNEFcIixcbiAgICBzdHlsZToge1xuICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgdmVydGljYWxBbGlnbjogXCJ0ZXh0LWJvdHRvbVwiLFxuICAgICAgb3ZlcmZsb3c6IFwidmlzaWJsZVwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIHBhZGRpbmc6IFwiNHB4XCJcbiAgICB9LFxuICAgIG9uQ2xpY2s6IHMsXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgICAgZDogXCJNMy43MiAzLjcyYS43NS43NSAwIDAgMSAxLjA2IDBMOCA2Ljk0bDMuMjItMy4yMmEuNzQ5Ljc0OSAwIDAgMSAxLjI3NS4zMjYuNzQ5Ljc0OSAwIDAgMS0uMjE1LjczNEw5LjA2IDhsMy4yMiAzLjIyYS43NDkuNzQ5IDAgMCAxLS4zMjYgMS4yNzUuNzQ5Ljc0OSAwIDAgMS0uNzM0LS4yMTVMOCA5LjA2bC0zLjIyIDMuMjJhLjc1MS43NTEgMCAwIDEtMS4wNDItLjAxOC43NTEuNzUxIDAgMCAxLS4wMTgtMS4wNDJMNi45NCA4IDMuNzIgNC43OGEuNzUuNzUgMCAwIDEgMC0xLjA2WlwiXG4gICAgfSlcbiAgfSk7XG59XG5jb25zdCBGQSA9ICgpID0+IElyLCBOQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShGQSgpKSh7XG4gIGNsYXNzZXM6IFtcInJlY3Q3ZTVcIl1cbn0pLCBVQSA9ICgpID0+IElyLCAkQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShVQSgpKSh7XG4gIGNsYXNzZXM6IFtcInAxM21xbnR0XCJdXG59KSwgR0EgPSAoKSA9PiBJciwgVkEgPSAvKiBAX19QVVJFX18gKi8gZGUoR0EoKSkoe1xuICBjbGFzc2VzOiBbXCJwMXI0N2R6MlwiXVxufSksIGpBID0gKCkgPT4gSXIsIEtBID0gLyogQF9fUFVSRV9fICovIGRlKGpBKCkpKHtcbiAgY2xhc3NlczogW1wiY25vanBxdlwiXVxufSksIEhBID0gKHtcbiAgaGFzaDogcyxcbiAgcmVhY3Rpb25zOiBlLFxuICBvbkNvbW1lbnQ6IHQsXG4gIG9uUmVjYXN0OiByLFxuICBvbkxpa2U6IG4sXG4gIGlzTGlrZWQ6IGlcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaWVudF9pZDogbyxcbiAgICB1c2VyOiBhLFxuICAgIGlzQXV0aGVudGljYXRlZDogbFxuICB9ID0gdHMoKSwgW2MsIHVdID0gc3QudXNlU3RhdGUoITEpLCBbZCwgaF0gPSBzdC51c2VTdGF0ZSh7XG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDBcbiAgfSksIFtmLCBwXSA9IHN0LnVzZVN0YXRlKG51bGwpLCBbeSwgRV0gPSBzdC51c2VTdGF0ZShpKSwgW2IsIFJdID0gc3QudXNlU3RhdGUoITEpLCBBID0gc3QudXNlUmVmKG51bGwpLCBGID0gc3QudXNlUmVmKHtcbiAgICBjb21tZW50OiBudWxsLFxuICAgIHJlY2FzdDogbnVsbCxcbiAgICBsaWtlOiBudWxsXG4gIH0pO1xuICBmdCgoKSA9PiB7XG4gICAgRShlLmxpa2VzLnNvbWUoKEgpID0+IEguZmlkID09PSAoYSA9PSBudWxsID8gdm9pZCAwIDogYS5maWQpKSksIFIoZS5yZWNhc3RzLnNvbWUoKEgpID0+IEguZmlkID09PSAoYSA9PSBudWxsID8gdm9pZCAwIDogYS5maWQpKSk7XG4gIH0sIFtlLCBhXSksIGZ0KCgpID0+IHtcbiAgICBjb25zdCBIID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oam4uTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUik7XG4gICAgaWYgKEgpXG4gICAgICB0cnkge1xuICAgICAgICBwKEpTT04ucGFyc2UoSCkuc2lnbmVyX3V1aWQpO1xuICAgICAgfSBjYXRjaCAoSykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcGFyc2luZyBKU09OIGZyb20gbG9jYWwgc3RvcmFnZTpcIiwgSyksIHAobnVsbCk7XG4gICAgICB9XG4gICAgZWxzZVxuICAgICAgY29uc29sZS53YXJuKFwiTm8gTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUiBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlLlwiKTtcbiAgfSwgW2xdKSwgZnQoKCkgPT4ge1xuICAgIChmIHx8IGwpICYmIGMgJiYgdSghMSk7XG4gIH0sIFtmLCBsLCBjXSk7XG4gIGNvbnN0IE0gPSBhc3luYyAoSCwgSykgPT4ge1xuICAgIGlmIChmKVxuICAgICAgc3dpdGNoIChLKSB7XG4gICAgICAgIGNhc2UgXCJjb21tZW50XCI6XG4gICAgICAgICAgaWYgKHQpXG4gICAgICAgICAgICB0KCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tbWVudCBoYW5kbGVyIGZ1bmN0aW9uIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmVjYXN0XCI6XG4gICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICBSKHIoKSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjYXN0IGhhbmRsZXIgZnVuY3Rpb24gcHJvdmlkZWRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJsaWtlXCI6XG4gICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICBFKG4oKSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbGlrZSBoYW5kbGVyIGZ1bmN0aW9uIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNvbnN0IGogPSBGLmN1cnJlbnRbS107XG4gICAgaWYgKGopIHtcbiAgICAgIGNvbnN0IEMgPSBqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBrID0gQS5jdXJyZW50O1xuICAgICAgaWYgKGspIHtcbiAgICAgICAgY29uc3QgJCA9IGsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGgoe1xuICAgICAgICAgIHRvcDogQy50b3AgLSAkLmhlaWdodCAtIDEwLFxuICAgICAgICAgIGxlZnQ6IEMubGVmdCArIEMud2lkdGggLyAyIC0gJC53aWR0aCAvIDJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4cyhOQSwge1xuICAgIGNoaWxkcmVuOiBbYyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKCRBLCB7XG4gICAgICByZWY6IEEsXG4gICAgICBzdHlsZToge1xuICAgICAgICB0b3A6IGQudG9wLFxuICAgICAgICBsZWZ0OiBkLmxlZnRcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChWQSwge1xuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KHBTLCB7XG4gICAgICAgICAgdmFyaWFudDogZ3MuTkVZTkFSXG4gICAgICAgIH0pXG4gICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KEtBLCB7XG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goc20sIHtcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB1KCExKSxcbiAgICAgICAgICBzaXplOiAxNlxuICAgICAgICB9KVxuICAgICAgfSldXG4gICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJciwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIlxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKElyLCB7XG4gICAgICAgIHNwYWNpbmdWZXJ0aWNhbDogXCIxNXB4XCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgZ2FwOiBcIjQycHhcIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgICAgICAgcmVmOiAoSCkgPT4gRi5jdXJyZW50LmNvbW1lbnQgPSBILFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3godG0sIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IChIKSA9PiBNKEgsIFwiY29tbWVudFwiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgICAgICAgIHJlZjogKEgpID0+IEYuY3VycmVudC5yZWNhc3QgPSBILFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goQkEsIHtcbiAgICAgICAgICAgIGZpbGw6IGIgPyBcImdyZWVuXCIgOiB2b2lkIDAsXG4gICAgICAgICAgICBvbkNsaWNrOiAoSCkgPT4gTShILCBcInJlY2FzdFwiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgICAgICAgIHJlZjogKEgpID0+IEYuY3VycmVudC5saWtlID0gSCxcbiAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KHJtLCB7XG4gICAgICAgICAgICBmaWxsOiB5ID8gXCJyZWRcIiA6IHZvaWQgMCxcbiAgICAgICAgICAgIG9uQ2xpY2s6IChIKSA9PiBNKEgsIFwibGlrZVwiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXVxuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59O1xuZnVuY3Rpb24gcUEoe1xuICBvbkNsaWNrOiBzXG59KSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICAgIHN0eWxlOiB7XG4gICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgfSxcbiAgICB3aWR0aDogXCIxNlwiLFxuICAgIGhlaWdodDogXCIxNVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDE2IDE1XCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBvbkNsaWNrOiAoZSkgPT4gcyA/IHMoZSkgOiB2b2lkIDAsXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgICAgZDogXCJNMTUuMjAwMyA3LjQ5MDYzQzE0Ljc1MDQgNy40OTA2MyAxNC40NTA0IDcuNzkwNTcgMTQuNDUwNCA4LjI0MDQ4VjEyLjczOTZDMTQuNDUwNCAxMy4xODk1IDE0LjE1MDUgMTMuNDg5NCAxMy43MDA2IDEzLjQ4OTRIMy4yMDI2OEMyLjc1Mjc3IDEzLjQ4OTQgMi40NTI4MyAxMy4xODk1IDIuNDUyODMgMTIuNzM5NlY4LjI0MDQ4QzIuNDUyODMgNy43OTA1NyAyLjE1Mjg5IDcuNDkwNjMgMS43MDI5OCA3LjQ5MDYzQzEuMjUzMDcgNy40OTA2MyAwLjk1MzEyNSA3Ljc5MDU3IDAuOTUzMTI1IDguMjQwNDhWMTIuNzM5NkMwLjk1MzEyNSAxNC4wMTQzIDEuOTI3OTMgMTQuOTg5MSAzLjIwMjY4IDE0Ljk4OTFIMTMuNzAwNkMxNC45NzUzIDE0Ljk4OTEgMTUuOTUwMSAxNC4wMTQzIDE1Ljk1MDEgMTIuNzM5NlY4LjI0MDQ4QzE1Ljk1MDEgNy43OTA1NyAxNS42NTAyIDcuNDkwNjMgMTUuMjAwMyA3LjQ5MDYzWk01Ljk3NzEzIDQuMjY2MjdMNy43MDE3OCAyLjU0MTYxVjkuNzQwMThDNy43MDE3OCAxMC4xOTAxIDguMDAxNzIgMTAuNDkgOC40NTE2MyAxMC40OUM4LjkwMTU1IDEwLjQ5IDkuMjAxNDkgMTAuMTkwMSA5LjIwMTQ5IDkuNzQwMThWMi41NDE2MUwxMC45MjYxIDQuMjY2MjdDMTEuMjI2MSA0LjU2NjIxIDExLjY3NiA0LjU2NjIxIDExLjk3NTkgNC4yNjYyN0MxMi4yNzU5IDMuOTY2MzMgMTIuMjc1OSAzLjUxNjQyIDExLjk3NTkgMy4yMTY0OEw4Ljk3NjUzIDAuMjE3MDczQzguOTAxNTUgMC4xNDIwODggOC44MjY1NiAwLjA2NzEwMzEgOC43NTE1NyAwLjA2NzEwMzFDOC42MDE2IC0wLjAwNzg4MjAyIDguMzc2NjUgLTAuMDA3ODgyMDIgOC4xNTE2OSAwLjA2NzEwMzFDOC4wNzY3MSAwLjA2NzEwMzEgOC4wMDE3MiAwLjE0MjA4OCA3LjkyNjc0IDAuMjE3MDczTDQuOTI3MzQgMy4yMTY0OEM0LjYyNzM5IDMuNTE2NDIgNC42MjczOSAzLjk2NjMzIDQuOTI3MzQgNC4yNjYyN0M1LjIyNzI4IDQuNTY2MjEgNS42NzcxOSA0LjU2NjIxIDUuOTc3MTMgNC4yNjYyN1pcIixcbiAgICAgIGZpbGw6IFwiI0EwQTNBRFwiXG4gICAgfSlcbiAgfSk7XG59XG5jb25zdCBJYyA9ICh7XG4gIHVybDogc1xufSkgPT4ge1xuICBjb25zdCBbZSwgdF0gPSBzdC51c2VTdGF0ZSghMSksIHIgPSBhc3luYyAobikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzKSwgdCghMCksIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0KCExKTtcbiAgICAgIH0sIDJlMyk7XG4gICAgfSBjYXRjaCAoaSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjb3B5IHRoZSB0ZXh0IHRvIGNsaXBib2FyZDpcIiwgaSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBjaGlsZHJlbjogZSA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInN2Z1wiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICBmaWxsOiBcImdyZWVuXCJcbiAgICAgIH0sXG4gICAgICB3aWR0aDogXCIxNlwiLFxuICAgICAgaGVpZ2h0OiBcIjE1XCIsXG4gICAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNVwiLFxuICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICAgICAgZDogXCJNNS45OTk2NyAxMi44MTM2TDEuNzE5NjcgOC41MzM2NEwwLjU1OTY3MyA5LjY5MzY0TDUuOTk5NjcgMTUuMTMzNkwxNi40Mzk3IDQuNjkzNjRMMTUuMjc5NyAzLjUzMzY0TDUuOTk5NjcgMTIuODEzNlpcIlxuICAgICAgfSlcbiAgICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChxQSwge1xuICAgICAgb25DbGljazogclxuICAgIH0pXG4gIH0pO1xufSwgV0EgPSAoKSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwic3ZnXCIsIHtcbiAgd2lkdGg6IFwiMTBcIixcbiAgaGVpZ2h0OiBcIjEwXCIsXG4gIHZpZXdCb3g6IFwiMCAwIDEwIDEwXCIsXG4gIGZpbGw6IFwibm9uZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuODU4NTUgMC41NTU2NjRIOC4zMTI4MU04LjMxMjgxIDAuNTU1NjY0VjIuNzM3NTRNOC4zMTI4MSAwLjU1NTY2NEw0LjMxNDQ1IDQuMTExMjJcIixcbiAgICBzdHJva2U6IFwiI0ZGRkZGRlwiLFxuICAgIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICAgIFwic3Ryb2tlLWxpbmVqb2luXCI6IFwicm91bmRcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgXCJmaWxsLXJ1bGVcIjogXCJldmVub2RkXCIsXG4gICAgXCJjbGlwLXJ1bGVcIjogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMy4zMTQ0NSAxSDEuMzE0NDVDMC43NjIxNjggMSAwLjMxNDQ1MyAxLjQ0NzcyIDAuMzE0NDUzIDJWOEMwLjMxNDQ1MyA4LjU1MjI4IDAuNzYyMTY4IDkgMS4zMTQ0NSA5SDcuMzE0NDVDNy44NjY3NCA5IDguMzE0NDUgOC41NTIyOCA4LjMxNDQ1IDhWNkg3LjMxNDQ1VjhIMS4zMTQ0NVYySDMuMzE0NDVWMVpcIixcbiAgICBmaWxsOiBcIiNGRkZGRkZcIlxuICB9KV1cbn0pLCB6QSA9ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjEwXCIsXG4gIGhlaWdodDogXCIxNFwiLFxuICB2aWV3Qm94OiBcIjAgMCAxMCAxNFwiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuMDE0NTEgMTIuNTE4N0w0Ljk2ODMzIDEyLjUxNzRMNC45MzkxNCAxMi41MjJDNC45MzExMyAxMi41MTYgNC45MjQwMiAxMi41MDg3IDQuOTE4MDggMTIuNTAwNUw0LjUxMjMxIDEyLjc5MjZMNC45MTgwOCAxMi41MDA1QzQuOTA0OSAxMi40ODIyIDQuODk4MjQgMTIuNDYgNC44OTkxMyAxMi40Mzc1TDQuODk5NTMgMTIuNDI3NVYxMi40MTc2VjguODExOTRWOC4zMTE5NEg0LjM5OTUzSDEuODg3NkgxLjg4NzUzQzEuNzYxODggOC4zMTE5NiAxLjYzODUzIDguMjc4MjUgMS41MzAzNiA4LjIxNDMzQzEuNDIyMTggOC4xNTA0IDEuMzMzMTUgOC4wNTg2MiAxLjI3MjU2IDcuOTQ4NTRDMS4yMTE5NiA3LjgzODQ3IDEuMTgyMDMgNy43MTQxNSAxLjE4NTg4IDcuNTg4NTZDMS4xODk3MyA3LjQ2MzAxIDEuMjI3MiA3LjM0MDc5IDEuMjk0MzggNy4yMzQ2NkMxLjI5NDQgNy4yMzQ2MyAxLjI5NDQyIDcuMjM0NTkgMS4yOTQ0NCA3LjIzNDU2TDQuOTAwMDEgMS41NDM3N0w0LjkwNTY3IDEuNTM0ODNMNC45MTA5NSAxLjUyNTY3QzQuOTIyMjcgMS41MDYwMSA0LjkzOTg4IDEuNDkwNzQgNC45NjA5NCAxLjQ4MjMyQzQuOTgyIDEuNDczODkgNS4wMDUyOCAxLjQ3MjgxIDUuMDI3MDMgMS40NzkyNEw1LjAyOTEyIDEuNDc5ODVDNS4wNTA3NyAxLjQ4NjE0IDUuMDY5NjkgMS40OTk1IDUuMDgyODYgMS41MTc4QzUuMDk2MDMgMS41MzYwOSA1LjEwMjcgMS41NTgyNyA1LjEwMTggMS41ODA3OUw1LjEwMTQxIDEuNTkwNzNWMS42MDA2N1Y1LjIwNjMxVjUuNzA2MzFINS42MDE0MUg4LjExMzMzSDguMTEzNEM4LjIzOTA1IDUuNzA2MjkgOC4zNjI0IDUuNzQgOC40NzA1OCA1LjgwMzkyQzguNTc4NzUgNS44Njc4NCA4LjY2Nzc4IDUuOTU5NjMgOC43MjgzOCA2LjA2OTcxQzguNzg4OTcgNi4xNzk3OCA4LjgxODkxIDYuMzA0MSA4LjgxNTA2IDYuNDI5NjlDOC44MTEyMSA2LjU1NTI4IDguNzczNzEgNi42Nzc1MyA4LjcwNjQ5IDYuNzgzNjlMNS4xMDIzMiAxMi40NzIzQzUuMTAyMTkgMTIuNDcyNSA1LjEwMjA1IDEyLjQ3MjcgNS4xMDE5MSAxMi40NzI5QzUuMDkyNTUgMTIuNDg3MyA1LjA3OTY5IDEyLjQ5OSA1LjA2NDUyIDEyLjUwN0M1LjA0OTE0IDEyLjUxNTIgNS4wMzE5MSAxMi41MTkyIDUuMDE0NTEgMTIuNTE4N1pcIixcbiAgICBzdHJva2U6IFwiI0ZGRkZGRlwiXG4gIH0pXG59KSwgWUEgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJidXR0b25cIikoe1xuICBjbGFzc2VzOiBbXCJmMWhtY3JyZlwiXVxufSksIFpBID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiZjFraTRpbDZcIl1cbn0pLCBYQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImJnbnowdWRcIl1cbn0pLCBKQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImltZ1wiKSh7XG4gIGNsYXNzZXM6IFtcImYxZ2JnZXQ5XCJdXG59KSwgUUEgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJmNHJ3ZTRpXCJdXG59KSwgZUkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJmMXFlbGxnd1wiXVxufSksIHRJID0gLyogQF9fUFVSRV9fICovIGRlKFwiaW5wdXRcIikoe1xuICBjbGFzc2VzOiBbXCJpMWhneHdoaVwiXVxufSksIHJJID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiczFhaGNmYXhcIl1cbn0pLCBzSSA9ICgpID0+IHtcbiAgY29uc3QgcyA9IGJ0KG51bGwpO1xuICByZXR1cm4gZnQoKCkgPT4ge1xuICAgIGlmIChzLmN1cnJlbnQpIHtcbiAgICAgIGxldCBlID0gMDtcbiAgICAgIGNvbnN0IHQgPSAoKSA9PiB7XG4gICAgICAgIGUgKz0gNiwgcy5jdXJyZW50ICYmIChzLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke2V9ZGVnKWApLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpO1xuICAgIH1cbiAgfSwgW10pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICAgIHJlZjogcyxcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS41XCIsXG4gICAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGNsYXNzTmFtZTogXCJzaXplLTYgdGV4dC13aGl0ZVwiLFxuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogXCIyNHB4XCIsXG4gICAgICBoZWlnaHQ6IFwiMjRweFwiXG4gICAgfSxcbiAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiLFxuICAgICAgZDogXCJNMTYuMDIzIDkuMzQ4aDQuOTkydi0uMDAxTTIuOTg1IDE5LjY0NHYtNC45OTJtMCAwaDQuOTkybS00Ljk5MyAwIDMuMTgxIDMuMTgzYTguMjUgOC4yNSAwIDAgMCAxMy44MDMtMy43TTQuMDMxIDkuODY1YTguMjUgOC4yNSAwIDAgMSAxMy44MDMtMy43bDMuMTgxIDMuMTgybTAtNC45OTF2NC45OVwiXG4gICAgfSlcbiAgfSk7XG59O1xuZnVuY3Rpb24gbkkoe1xuICBudW1iZXI6IHMsXG4gIHRleHQ6IGUsXG4gIGFjdGlvblR5cGU6IHQsXG4gIHRhcmdldDogcixcbiAgZnJhbWVVcmw6IG4sXG4gIGhhbmRsZU9uQ2xpY2s6IGlcbn0pIHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWUEsIHtcbiAgICBvbkNsaWNrOiAoKSA9PiBpKHMpLFxuICAgIGNoaWxkcmVuOiBbZSwgKHQgPT09IFwibGlua1wiIHx8IHQgPT09IFwicG9zdF9yZWRpcmVjdFwiIHx8IHQgPT09IFwibWludFwiKSAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goV0EsIHt9KSwgdCA9PT0gXCJ0eFwiICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeCh6QSwge30pXVxuICB9KTtcbn1cbmZ1bmN0aW9uIGlJKHtcbiAgZnJhbWU6IHMsXG4gIG9uRnJhbWVCdG5QcmVzczogZVxufSkge1xuICB2YXIgaDtcbiAgY29uc3QgW3QsIHJdID0gcWUocyksIFtuLCBpXSA9IHFlKFwiXCIpLCBbbywgYV0gPSBxZSghMSksIGwgPSAoKSA9PiB7XG4gICAgY29uc3QgZiA9IHQuYnV0dG9ucy5tYXAoKHApID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChuSSwge1xuICAgICAgbnVtYmVyOiBwLmluZGV4LFxuICAgICAgdGV4dDogcC50aXRsZSxcbiAgICAgIGFjdGlvblR5cGU6IHAuYWN0aW9uX3R5cGUsXG4gICAgICB0YXJnZXQ6IHAudGFyZ2V0LFxuICAgICAgZnJhbWVVcmw6IHMuZnJhbWVzX3VybCxcbiAgICAgIGhhbmRsZU9uQ2xpY2s6ICh5KSA9PiB7XG4gICAgICAgIGEoITApLCBlKHksIHQsIHIsIG4pLmZpbmFsbHkoKCkgPT4gYSghMSkpO1xuICAgICAgfVxuICAgIH0sIHAuaW5kZXgpKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFhBLCB7XG4gICAgICBjaGlsZHJlbjogZlxuICAgIH0pO1xuICB9LCBjID0gKGYpID0+IHtcbiAgICBpKGYpO1xuICB9LCB1ID0gKGYpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwoZikuaG9zdG5hbWUucmVwbGFjZShcInd3dy5cIiwgXCJcIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH0sIGQgPSAoKSA9PiB7XG4gICAgc3dpdGNoICh0LmltYWdlX2FzcGVjdF9yYXRpbykge1xuICAgICAgY2FzZSBcIjE6MVwiOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFzcGVjdFJhdGlvOiBcIjEgLyAxXCJcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgXCIxLjkxOjFcIjpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhc3BlY3RSYXRpbzogXCIxLjkxIC8gMVwiXG4gICAgICAgIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFzcGVjdFJhdGlvOiBcIjEuOTEgLyAxXCJcbiAgICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHEuRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWkEsIHtcbiAgICAgIGNoaWxkcmVuOiBbbyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3gockksIHtcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChzSSwge30pXG4gICAgICB9KSwgdC5mcmFtZXNfdXJsICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocS5GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImFcIiwge1xuICAgICAgICAgIGhyZWY6IHQuZnJhbWVzX3VybCxcbiAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgICAgICAgcmVsOiBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIixcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KEpBLCB7XG4gICAgICAgICAgICBzcmM6IHQuaW1hZ2UsXG4gICAgICAgICAgICBhbHQ6IGBGcmFtZSBpbWFnZSBmb3IgJHt0LmZyYW1lc191cmx9YCxcbiAgICAgICAgICAgIHN0eWxlOiBkKClcbiAgICAgICAgICB9KVxuICAgICAgICB9KSwgKChoID0gdC5pbnB1dCkgPT0gbnVsbCA/IHZvaWQgMCA6IGgudGV4dCkgJiYgLyogQF9fUFVSRV9fICovIHEuanN4KHRJLCB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHQuaW5wdXQudGV4dCxcbiAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICBvbkNoYW5nZTogKGYpID0+IGMoZi50YXJnZXQudmFsdWUpXG4gICAgICAgIH0pLCBsKCldXG4gICAgICB9KV1cbiAgICB9KSwgdC5mcmFtZXNfdXJsICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChRQSwge1xuICAgICAgY2hpbGRyZW46IHUodC5mcmFtZXNfdXJsKVxuICAgIH0pXVxuICB9KTtcbn1cbmNvbnN0IG9JID0gKHtcbiAgZnJhbWU6IHMsXG4gIG9uRnJhbWVCdG5QcmVzczogZVxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KGVJLCB7XG4gIGNoaWxkcmVuOiBzID8gLyogQF9fUFVSRV9fICovIHEuanN4KGlJLCB7XG4gICAgZnJhbWU6IHMsXG4gICAgb25GcmFtZUJ0blByZXNzOiBlXG4gIH0pIDogLyogQF9fUFVSRV9fICovIHEuanN4KHEuRnJhZ21lbnQsIHt9KVxufSksIGFJID0gKHtcbiAgdXJsOiBzLFxuICBvbkZyYW1lQnRuUHJlc3M6IGUsXG4gIGluaXRpYWxGcmFtZTogdFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgY2xpZW50X2lkOiByLFxuICAgIHNob3dUb2FzdDogblxuICB9ID0gdHMoKSwgW2ldID0gZHUoam4uTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUiwgbnVsbCksIFtvLCBhXSA9IHFlKG51bGwpLCBbbCwgY10gPSBxZSh0IHx8IG51bGwpLCBbdSwgZF0gPSBxZShudWxsKTtcbiAgZnQoKCkgPT4ge1xuICAgIGkgPyBhKGkuc2lnbmVyX3V1aWQpIDogY29uc29sZS53YXJuKFwiTm8gTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUiBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlLlwiKTtcbiAgfSwgW2ldKSwgZnQoKCkgPT4ge1xuICAgIHQgfHwgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHkgPSBhd2FpdCBsSShgJHtvbn0vdjIvZmFyY2FzdGVyL2ZyYW1lL2NyYXdsP3VybD0ke3N9JmNsaWVudF9pZD0ke3J9YCwge1xuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIlxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHkub2spIHtcbiAgICAgICAgICBjb25zdCBiID0gKGF3YWl0IHkuanNvbigpKS5mcmFtZTtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYikubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZnJhbWUgZGF0YSBhdmFpbGFibGVcIik7XG4gICAgICAgICAgYyhiKSwgZChudWxsKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7eS5zdGF0dXN9YCk7XG4gICAgICB9IGNhdGNoICh5KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFuIGVycm9yIG9jY3VycmVkOiAke3l9YCksIGQoYEZhaWxlZCB0byBmZXRjaDogJHt5Lm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfSwgW3MsIG4sIHRdKTtcbiAgY29uc3QgaCA9IChwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBwICE9IFwib2JqZWN0XCIgfHwgcCA9PT0gbnVsbCkgcmV0dXJuICExO1xuICAgIGNvbnN0IHkgPSBbXCJ2ZXJzaW9uXCIsIFwiaW1hZ2VcIiwgXCJidXR0b25zXCIsIFwiZnJhbWVzX3VybFwiXTtcbiAgICBmb3IgKGNvbnN0IEUgb2YgeSlcbiAgICAgIGlmICghKEUgaW4gcCkpIHJldHVybiAhMTtcbiAgICByZXR1cm4gISghQXJyYXkuaXNBcnJheShwLmJ1dHRvbnMpIHx8IHAuYnV0dG9ucy5zb21lKChFKSA9PiB0eXBlb2YgRS5pbmRleCAhPSBcIm51bWJlclwiKSk7XG4gIH0sIGYgPSBhc3luYyAocCwgeSwgRSwgYikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBSID0gYXdhaXQgZShwLCB5LCBFLCBiKTtcbiAgICAgIGlmICghaChSKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBmcmFtZSBkYXRhIHJlY2VpdmVkXCIpO1xuICAgICAgRShSKTtcbiAgICB9IGNhdGNoIChSKSB7XG4gICAgICBuKHhnLkVycm9yLCBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgYnV0dG9uIHByZXNzOiAke1J9YCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdSA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGNvbG9yOiBcInJlZFwiLFxuICAgICAgcGFkZGluZzogXCIxMHB4XCIsXG4gICAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHJlZFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiXG4gICAgfSxcbiAgICBjaGlsZHJlbjogdVxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChvSSwge1xuICAgIGZyYW1lOiBsLFxuICAgIG9uRnJhbWVCdG5QcmVzczogZlxuICB9KTtcbn07XG5mdW5jdGlvbiBsSShzLCBlLCB0ID0gOGUzKSB7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW2FuKHMsIGUpLCBuZXcgUHJvbWlzZSgociwgbikgPT4gc2V0VGltZW91dCgoKSA9PiBuKG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZWQgb3V0XCIpKSwgdCkpXSk7XG59XG5mdW5jdGlvbiBwZihzKSB7XG4gIGNvbnN0IGUgPSBNYXRoLm1pbihzLCAxZTkpO1xuICByZXR1cm4gZSA+PSAxZTkgPyBNYXRoLmZsb29yKGUgLyAxZTgpIC8gMTAgKyBcIkJcIiA6IGUgPj0gMWU2ID8gTWF0aC5mbG9vcihlIC8gMWU1KSAvIDEwICsgXCJNXCIgOiBlID49IDFlMyA/IE1hdGguZmxvb3IoZSAvIDEwMCkgLyAxMCArIFwiS1wiIDogZS50b1N0cmluZygpO1xufVxuZnVuY3Rpb24gY0kocykge1xuICBpZiAoIXMpXG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogVGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvciBlbXB0eS5cIiksIFwiSW52YWxpZCB0aW1lc3RhbXBcIjtcbiAgY29uc3QgZSA9IG5ldyBEYXRlKHMpO1xuICBpZiAoaXNOYU4oZS5nZXRUaW1lKCkpKVxuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEludmFsaWQgdGltZXN0YW1wIHByb3ZpZGVkOlwiLCBzKSwgXCJJbnZhbGlkIHRpbWVzdGFtcFwiO1xuICBjb25zdCB0ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksIG4gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh2b2lkIDAsIHtcbiAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIGhvdXIxMjogITBcbiAgfSkuZm9ybWF0KGUpLnJlcGxhY2UoXCIgXCIsIFwiXCIpLCBpID0gdC50b0RhdGVTdHJpbmcoKSA9PT0gZS50b0RhdGVTdHJpbmcoKSwgbyA9IG5ldyBEYXRlKHQuc2V0RGF0ZSh0LmdldERhdGUoKSAtIDEpKS50b0RhdGVTdHJpbmcoKSA9PT0gZS50b0RhdGVTdHJpbmcoKTtcbiAgaWYgKGkpXG4gICAgcmV0dXJuIGAke259LCB0b2RheWA7XG4gIGlmIChvKVxuICAgIHJldHVybiBgJHtufSwgeWVzdGVyZGF5YDtcbiAgY29uc3QgYSA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXSwgbCA9IGUuZ2V0RGF0ZSgpLCBjID0gYVtlLmdldE1vbnRoKCldLCB1ID0gZS5nZXRGdWxsWWVhcigpLCBoID0gYCR7Y30gJHsoKGYpID0+IHtcbiAgICBpZiAoZiA+IDMgJiYgZiA8IDIxKSByZXR1cm4gYCR7Zn10aGA7XG4gICAgY29uc3QgcCA9IFtcInN0XCIsIFwibmRcIiwgXCJyZFwiXSwgeSA9IGYgJSAxMDtcbiAgICByZXR1cm4gYCR7Zn0ke3BbeSAtIDFdIHx8IFwidGhcIn1gO1xuICB9KShsKX0gJHt1fWA7XG4gIHJldHVybiBgJHtufSwgJHtofWA7XG59XG5jb25zdCB1SSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInN4cXZ4dnFcIl1cbn0pLCBkSSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImFcIikoe1xuICBjbGFzc2VzOiBbXCJzM2thbW92XCJdXG59KSwgaEkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJtMXdydnZoa1wiXVxufSksIGZJID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widDFsY2FxMjdcIl1cbn0pLCBnSSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInVndHAxd2hcIl1cbn0pLCBwSSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImwxZHFwbjRlXCJdXG59KSwgbUkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJsMWJqbnYydFwiXVxufSksIG1mID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiZTE1eWYxMjNcIl1cbn0pLCB5SSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInJ4cmE5NGdcIl1cbn0pLCB5ZiA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInMxd2hncXJzXCJdXG59KSwgdkkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJwXCIpKHtcbiAgY2xhc3NlczogW1wiZHo4bWFyZlwiXVxufSksIG9hID0gc3QubWVtbygoe1xuICB1c2VybmFtZTogcyxcbiAgZGlzcGxheU5hbWU6IGUsXG4gIGF2YXRhckltZ1VybDogdCxcbiAgdGV4dDogciA9IFwiXCIsXG4gIGhhc2g6IG4sXG4gIHJlYWN0aW9uczogaSxcbiAgcmVwbGllczogbyxcbiAgZW1iZWRzOiBhID0gW10sXG4gIGZyYW1lczogbCA9IFtdLFxuICBjaGFubmVsOiBjLFxuICB2aWV3ZXJGaWQ6IHUsXG4gIGhhc1Bvd2VyQmFkZ2U6IGQsXG4gIGlzRW1iZWQ6IGggPSAhMCxcbiAgYWxsb3dSZWFjdGlvbnM6IGYsXG4gIHJlbmRlckVtYmVkczogcCxcbiAgcmVuZGVyRnJhbWVzOiB5LFxuICBvbkxpa2VCdG5QcmVzczogRSxcbiAgb25SZWNhc3RCdG5QcmVzczogYixcbiAgb25Db21tZW50QnRuUHJlc3M6IFIsXG4gIG9uRnJhbWVCdG5QcmVzczogQSxcbiAgZGlyZWN0X3JlcGxpZXM6IEYsXG4gIGNvbnRhaW5lclN0eWxlczogTSxcbiAgdGV4dFN0eWxlczogSCxcbiAgdGltZXN0YW1wOiBLLFxuICBhcHBBdmF0YXJJbWdVcmw6IGpcbn0pID0+IHtcbiAgY29uc3QgW0MsIGtdID0gcWUoaS5saWtlc19jb3VudCksIFskLCBXXSA9IHFlKGkubGlrZXMuc29tZSgoVikgPT4gVi5maWQgPT09IHUpKSwgXyA9IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtSSwge1xuICAgIGNoaWxkcmVuOiBFUyhyLCBhKVxuICB9KSwgZyA9IChhID09IG51bGwgPyB2b2lkIDAgOiBhLmxlbmd0aCkgPT09IDEsIHggPSBacigoKSA9PiBsLm1hcCgoVikgPT4gVi5mcmFtZXNfdXJsKSwgW2xdKSwgdyA9IFpyKCgpID0+IGEuZmlsdGVyKChWKSA9PiAheC5pbmNsdWRlcyhWLnVybCkpLCBbYSwgeF0pLCBEID0gdXQoKFYpID0+IHtcbiAgICBWLmN1cnJlbnRUYXJnZXQuc3JjID0gYmk7XG4gIH0sIFtdKTtcbiAgZnQoKCkgPT4ge1xuICAgIFcoaS5saWtlcy5zb21lKChWKSA9PiBWLmZpZCA9PT0gdSkpO1xuICB9LCBbaS5saWtlcywgdV0pO1xuICBjb25zdCBPID0gdXQoKCkgPT4gRSAmJiBFKCkgPyAoaygoTCkgPT4gTCArIDEpLCBXKCEkKSwgITApIDogITEsIFtFXSksIFUgPSBPQSh3LCBmLCB1KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeCh1SSwge1xuICAgIHN0eWxlOiB7XG4gICAgICAuLi5NLFxuICAgICAgYm9yZGVyV2lkdGg6IGggPyBcIjFweFwiIDogXCIwXCJcbiAgICB9LFxuICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFByLCB7XG4gICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChJciwge1xuICAgICAgICBzcGFjaW5nUmlnaHQ6IFwiMTBweFwiLFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFlvLCB7XG4gICAgICAgICAgc3JjOiB0ICYmIHQubGVuZ3RoID4gMCA/IHQgOiBiaSxcbiAgICAgICAgICB3aWR0aDogXCIyMHB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjIwcHhcIixcbiAgICAgICAgICBvbkVycm9yOiBELFxuICAgICAgICAgIGxvYWRpbmc6IFwibGF6eVwiLFxuICAgICAgICAgIGFsdDogYCR7ZSA/PyBcIlNrZWxldG9uXCJ9IEF2YXRhcmBcbiAgICAgICAgfSlcbiAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKGhJLCB7XG4gICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhQciwge1xuICAgICAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3hzKFByLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeCh2SSwge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogZVxuICAgICAgICAgICAgfSksIFwiIFwiLCBqICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJciwge1xuICAgICAgICAgICAgICBzcGFjaW5nTGVmdDogXCI1cHhcIixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMnB4XCIsXG4gICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogXCIwLjVweFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYm9yZGVyLXdoaXRlIHJvdW5kZWQtZnVsbFwiLFxuICAgICAgICAgICAgICAgIHNyYzogaixcbiAgICAgICAgICAgICAgICB3aWR0aDogXCIxOFwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCIxOFwiLFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChWKSA9PiB7XG4gICAgICAgICAgICAgICAgICBWLmN1cnJlbnRUYXJnZXQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXVxuICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFByLCB7XG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3hzKGdJLCB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbXCJAXCIsIHMsIFwiIMK3XCJdXG4gICAgICAgICAgICB9KSwgXCIgXCIsIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChmSSwge1xuICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM5OTk5OTlcIixcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIxNHB4XCIsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJXb3JrIFNhbnNcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjaGlsZHJlbjogY0koSylcbiAgICAgICAgICAgIH0pXVxuICAgICAgICAgIH0pXVxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KElyLCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIG1hcmdpblRvcDogXCIxMHB4XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3gocEksIHtcbiAgICAgICAgICAgIHN0eWxlOiBILFxuICAgICAgICAgICAgY2hpbGRyZW46IF9cbiAgICAgICAgICB9KVxuICAgICAgICB9KSwgcCAmJiB3ICYmIHcubGVuZ3RoID4gMCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtZiwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW46IGcgPyBcIjRweCAwXCIgOiBcIjBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW46IFUubWFwKChWLCBMKSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFZcbiAgICAgICAgICB9LCBMKSlcbiAgICAgICAgfSkgOiAvKiBAX19QVVJFX18gKi8gcS5qc3gocS5GcmFnbWVudCwge30pLCB5ICYmIGwgJiYgbC5sZW5ndGggPiAwID8gLyogQF9fUFVSRV9fICovIHEuanN4KG1mLCB7XG4gICAgICAgICAgY2hpbGRyZW46IGwubWFwKChWKSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goYUksIHtcbiAgICAgICAgICAgIHVybDogVi5mcmFtZXNfdXJsLFxuICAgICAgICAgICAgaW5pdGlhbEZyYW1lOiBWLFxuICAgICAgICAgICAgb25GcmFtZUJ0blByZXNzOiBBXG4gICAgICAgICAgfSwgVi5mcmFtZXNfdXJsKSlcbiAgICAgICAgfSkgOiBudWxsLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHlJLCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBmID8gXCJzcGFjZS1iZXR3ZWVuXCIgOiBcImZsZXgtZW5kXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbZiAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goSEEsIHtcbiAgICAgICAgICAgIGhhc2g6IG4sXG4gICAgICAgICAgICByZWFjdGlvbnM6IGksXG4gICAgICAgICAgICBvbkNvbW1lbnQ6IFIsXG4gICAgICAgICAgICBvblJlY2FzdDogYixcbiAgICAgICAgICAgIG9uTGlrZTogTyxcbiAgICAgICAgICAgIGlzTGlrZWQ6ICRcbiAgICAgICAgICB9KSwgZiAmJiBzICYmIG4gJiYgLyogQF9fUFVSRV9fICovIHEuanN4KEljLCB7XG4gICAgICAgICAgICB1cmw6IGBodHRwczovL2ZhcmNhc3Rlci54eXovJHtzfS8ke24uc2xpY2UoMCwgMTApfWBcbiAgICAgICAgICB9KV1cbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoeWYsIHtcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IGYgPyBcIlwiIDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICAgICAgICBtYXJnaW5Ub3A6IFwiMTBweFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoeWYsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBmID8gXCJcIiA6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICAgICAgICBnYXA6IDZcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJkaXZcIiwge1xuICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgZ2FwOiBcIjRweFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM5OTk5OTlcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeCh0bSwge30pLCBvXVxuICAgICAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogXCIwcHggMTBweFwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGdhcDogXCI0cHhcIixcbiAgICAgICAgICAgICAgICBjb2xvcjogXCIjOTk5OTk5XCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3gocm0sIHt9KSwgXCIgXCIsIENdXG4gICAgICAgICAgICB9KSwgYyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHEuRnJhZ21lbnQsIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge30pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKGRJLCB7XG4gICAgICAgICAgICAgICAgaHJlZjogYGh0dHBzOi8vZmFyY2FzdGVyLnh5ei9+L2NoYW5uZWwvJHtjLmlkfWAsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXCIvXCIsIGMuaWRdXG4gICAgICAgICAgICAgIH0pXVxuICAgICAgICAgICAgfSldXG4gICAgICAgICAgfSksICFmICYmIHMgJiYgbiAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goSWMsIHtcbiAgICAgICAgICAgIHVybDogYGh0dHBzOi8vZmFyY2FzdGVyLnh5ei8ke3N9LyR7bi5zbGljZSgwLCAxMCl9YFxuICAgICAgICAgIH0pXVxuICAgICAgICB9KV1cbiAgICAgIH0pXVxuICAgIH0pXG4gIH0pO1xufSksIEVJID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiczFtNm9iMWFcIl1cbn0pLCB2ZiA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInIxZXNldmM3XCJdXG59KSwgRWYgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJ2eGIxZjAwXCJdXG59KSwgeEkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJodHYwcXo3XCJdXG59KSwgeGYgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJyemtzeTJcIl1cbn0pO1xuZnVuY3Rpb24gU0kocykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KEVJLCB7XG4gICAgY2hpbGRyZW46IHMuY2FzdHMubWFwKChlLCB0KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHZmLCB7XG4gICAgICBjaGlsZHJlbjogW3QgIT09IDAgJiYgLyogQF9fUFVSRV9fICovIHEuanN4KEVmLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgbGVmdDogXCI0MnB4XCJcbiAgICAgICAgfVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoeGYsIHtcbiAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3gob2EsIHtcbiAgICAgICAgICBpc0VtYmVkOiAhMSxcbiAgICAgICAgICAuLi5lXG4gICAgICAgIH0pLCB0ID09PSAwICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeCh4SSwge30pLCBlLmRpcmVjdF9yZXBsaWVzICYmIGUuZGlyZWN0X3JlcGxpZXMubGVuZ3RoID4gMCAmJiBlLmRpcmVjdF9yZXBsaWVzLm1hcCgociwgbikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyh2Ziwge1xuICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KEVmLCB7XG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICBsZWZ0OiBcIjQycHhcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goeGYsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3gob2EsIHtcbiAgICAgICAgICAgICAgaXNFbWJlZDogITEsXG4gICAgICAgICAgICAgIC4uLnJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSldXG4gICAgICAgIH0sIG4pKV1cbiAgICAgIH0pXVxuICAgIH0sIHQpKVxuICB9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGJJKHtcbiAgdHlwZTogcyxcbiAgaWRlbnRpZmllcjogZSxcbiAgcmVwbHlEZXB0aDogdCA9IDIsXG4gIGluY2x1ZGVDaHJvbm9sb2dpY2FsUGFyZW50Q2FzdHM6IHIgPSAhMSxcbiAgbGltaXQ6IG4gPSAyMCxcbiAgdmlld2VyRmlkOiBpLFxuICBjbGllbnRJZDogb1xufSkge1xuICB0cnkge1xuICAgIGxldCBhID0gYCR7b259L3YyL2ZhcmNhc3Rlci9jYXN0L2NvbnZlcnNhdGlvbj9pZGVudGlmaWVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfSZ0eXBlPSR7c30mcmVwbHlfZGVwdGg9JHt0fSZpbmNsdWRlX2Nocm9ub2xvZ2ljYWxfcGFyZW50X2Nhc3RzPSR7cn0mbGltaXQ9JHtufSZjbGllbnRfaWQ9JHtvfWA7XG4gICAgcmV0dXJuIGkgJiYgKGEgKz0gYCZ2aWV3ZXJfZmlkPSR7aX1gKSwgYXdhaXQgKGF3YWl0IGFuKGEsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgYWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgfVxuICAgIH0pKS5qc29uKCkgfHwgbnVsbDtcbiAgfSBjYXRjaCAoYSkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgY29udmVyc2F0aW9uXCIsIGEpLCBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBubShzKSB7XG4gIHJldHVybiB7XG4gICAgdXNlcm5hbWU6IHMuYXV0aG9yLnVzZXJuYW1lLFxuICAgIGRpc3BsYXlOYW1lOiBzLmF1dGhvci5kaXNwbGF5X25hbWUsXG4gICAgYXZhdGFySW1nVXJsOiBzLmF1dGhvci5wZnBfdXJsLFxuICAgIHRleHQ6IHMudGV4dCxcbiAgICBoYXNoOiBzLmhhc2gsXG4gICAgcmVhY3Rpb25zOiBzLnJlYWN0aW9ucyxcbiAgICByZXBsaWVzOiBzLnJlcGxpZXMuY291bnQsXG4gICAgZW1iZWRzOiBzLmVtYmVkcyxcbiAgICBmcmFtZXM6IHMuZnJhbWVzLFxuICAgIHJlbmRlckVtYmVkczogcy5yZW5kZXJFbWJlZHMsXG4gICAgY2hhbm5lbDogcy5jaGFubmVsLFxuICAgIHZpZXdlckZpZDogMixcbiAgICBoYXNQb3dlckJhZGdlOiBzLmF1dGhvci5wb3dlcl9iYWRnZSxcbiAgICBhcHBBdmF0YXJJbWdVcmw6IHMuYXBwLnBmcF91cmwsXG4gICAgaXNPd25Qcm9maWxlOiAhMSxcbiAgICBhbGxvd1JlYWN0aW9uczogITAsXG4gICAgcmVuZGVyRnJhbWVzOiAhMSxcbiAgICBkaXJlY3RfcmVwbGllczogcy5kaXJlY3RfcmVwbGllcyA/IHMuZGlyZWN0X3JlcGxpZXMubWFwKG5tKSA6IFtdLFxuICAgIHRpbWVzdGFtcDogcy50aW1lc3RhbXBcbiAgfTtcbn1cbmZ1bmN0aW9uIFRJKHMpIHtcbiAgY29uc3QgZSA9IFtdO1xuICByZXR1cm4gcy5jYXN0ICYmIGUucHVzaChubShzLmNhc3QpKSwgZTtcbn1cbmNvbnN0IG1SID0gKHtcbiAgdHlwZTogcyxcbiAgaWRlbnRpZmllcjogZSxcbiAgcmVwbHlEZXB0aDogdCA9IDIsXG4gIGluY2x1ZGVDaHJvbm9sb2dpY2FsUGFyZW50Q2FzdHM6IHIgPSAhMSxcbiAgbGltaXQ6IG4gPSAyMCxcbiAgdmlld2VyRmlkOiBpXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IG9cbiAgfSA9IHRzKCksIFthLCBsXSA9IHN0LnVzZVN0YXRlKG51bGwpLCBbYywgdV0gPSBzdC51c2VTdGF0ZSghMCksIFtkLCBoXSA9IHN0LnVzZVN0YXRlKG51bGwpO1xuICByZXR1cm4gc3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICB1KCEwKSwgaChudWxsKSwgYkkoe1xuICAgICAgdHlwZTogcyxcbiAgICAgIGlkZW50aWZpZXI6IGUsXG4gICAgICByZXBseURlcHRoOiB0LFxuICAgICAgaW5jbHVkZUNocm9ub2xvZ2ljYWxQYXJlbnRDYXN0czogcixcbiAgICAgIGxpbWl0OiBuLFxuICAgICAgdmlld2VyRmlkOiBpLFxuICAgICAgY2xpZW50SWQ6IG9cbiAgICB9KS50aGVuKChmKSA9PiB7XG4gICAgICBsKGYpO1xuICAgIH0pLmNhdGNoKChmKSA9PiB7XG4gICAgICBoKGYpO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdSghMSk7XG4gICAgfSk7XG4gIH0sIFtzLCBlLCB0LCByLCBuLCBpLCBvXSksIGMgPyAvKiBAX19QVVJFX18gKi8gcS5qc3gocS5GcmFnbWVudCwge1xuICAgIGNoaWxkcmVuOiBcIiBcIlxuICB9KSA6IGQgPyAvKiBAX19QVVJFX18gKi8gcS5qc3gocS5GcmFnbWVudCwge1xuICAgIGNoaWxkcmVuOiBcIiBcIlxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChTSSwge1xuICAgIGNhc3RzOiBUSShhLmNvbnZlcnNhdGlvbilcbiAgfSk7XG59O1xudmFyIE9sID0geyBleHBvcnRzOiB7fSB9LCBCbCA9IHt9O1xuLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xudmFyIFNmO1xuZnVuY3Rpb24gd0koKSB7XG4gIGlmIChTZikgcmV0dXJuIEJsO1xuICBTZiA9IDE7XG4gIHZhciBzID0gc3Q7XG4gIGZ1bmN0aW9uIGUoZCwgaCkge1xuICAgIHJldHVybiBkID09PSBoICYmIChkICE9PSAwIHx8IDEgLyBkID09PSAxIC8gaCkgfHwgZCAhPT0gZCAmJiBoICE9PSBoO1xuICB9XG4gIHZhciB0ID0gdHlwZW9mIE9iamVjdC5pcyA9PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuaXMgOiBlLCByID0gcy51c2VTdGF0ZSwgbiA9IHMudXNlRWZmZWN0LCBpID0gcy51c2VMYXlvdXRFZmZlY3QsIG8gPSBzLnVzZURlYnVnVmFsdWU7XG4gIGZ1bmN0aW9uIGEoZCwgaCkge1xuICAgIHZhciBmID0gaCgpLCBwID0gcih7IGluc3Q6IHsgdmFsdWU6IGYsIGdldFNuYXBzaG90OiBoIH0gfSksIHkgPSBwWzBdLmluc3QsIEUgPSBwWzFdO1xuICAgIHJldHVybiBpKFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHkudmFsdWUgPSBmLCB5LmdldFNuYXBzaG90ID0gaCwgbCh5KSAmJiBFKHsgaW5zdDogeSB9KTtcbiAgICAgIH0sXG4gICAgICBbZCwgZiwgaF1cbiAgICApLCBuKFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBsKHkpICYmIEUoeyBpbnN0OiB5IH0pLCBkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGwoeSkgJiYgRSh7IGluc3Q6IHkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIFtkXVxuICAgICksIG8oZiksIGY7XG4gIH1cbiAgZnVuY3Rpb24gbChkKSB7XG4gICAgdmFyIGggPSBkLmdldFNuYXBzaG90O1xuICAgIGQgPSBkLnZhbHVlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgZiA9IGgoKTtcbiAgICAgIHJldHVybiAhdChkLCBmKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYyhkLCBoKSB7XG4gICAgcmV0dXJuIGgoKTtcbiAgfVxuICB2YXIgdSA9IHR5cGVvZiB3aW5kb3cgPiBcInVcIiB8fCB0eXBlb2Ygd2luZG93LmRvY3VtZW50ID4gXCJ1XCIgfHwgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ID4gXCJ1XCIgPyBjIDogYTtcbiAgcmV0dXJuIEJsLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gcy51c2VTeW5jRXh0ZXJuYWxTdG9yZSAhPT0gdm9pZCAwID8gcy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA6IHUsIEJsO1xufVxudmFyIGJmO1xuZnVuY3Rpb24gQUkoKSB7XG4gIHJldHVybiBiZiB8fCAoYmYgPSAxLCBPbC5leHBvcnRzID0gd0koKSksIE9sLmV4cG9ydHM7XG59XG52YXIgaW0gPSBBSSgpO1xuY29uc3Qgb20gPSAwLCBhbSA9IDEsIGxtID0gMiwgVGYgPSAzO1xudmFyIHdmID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIF9jKHMsIGUpIHtcbiAgdmFyIHQsIHI7XG4gIGlmIChzID09PSBlKSByZXR1cm4gITA7XG4gIGlmIChzICYmIGUgJiYgKHQgPSBzLmNvbnN0cnVjdG9yKSA9PT0gZS5jb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0ID09PSBEYXRlKSByZXR1cm4gcy5nZXRUaW1lKCkgPT09IGUuZ2V0VGltZSgpO1xuICAgIGlmICh0ID09PSBSZWdFeHApIHJldHVybiBzLnRvU3RyaW5nKCkgPT09IGUudG9TdHJpbmcoKTtcbiAgICBpZiAodCA9PT0gQXJyYXkpIHtcbiAgICAgIGlmICgociA9IHMubGVuZ3RoKSA9PT0gZS5sZW5ndGgpXG4gICAgICAgIGZvciAoOyByLS0gJiYgX2Moc1tyXSwgZVtyXSk7ICkgO1xuICAgICAgcmV0dXJuIHIgPT09IC0xO1xuICAgIH1cbiAgICBpZiAoIXQgfHwgdHlwZW9mIHMgPT0gXCJvYmplY3RcIikge1xuICAgICAgciA9IDA7XG4gICAgICBmb3IgKHQgaW4gcylcbiAgICAgICAgaWYgKHdmLmNhbGwocywgdCkgJiYgKytyICYmICF3Zi5jYWxsKGUsIHQpIHx8ICEodCBpbiBlKSB8fCAhX2Moc1t0XSwgZVt0XSkpIHJldHVybiAhMTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IHI7XG4gICAgfVxuICB9XG4gIHJldHVybiBzICE9PSBzICYmIGUgIT09IGU7XG59XG5jb25zdCBxciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBDcyA9ICgpID0+IHtcbn0sIHF0ID0gKFxuICAvKiNfX05PSU5MSU5FX18qL1xuICBDcygpXG4pLCBSYyA9IE9iamVjdCwgJGUgPSAocykgPT4gcyA9PT0gcXQsIE1yID0gKHMpID0+IHR5cGVvZiBzID09IFwiZnVuY3Rpb25cIiwgQnMgPSAocywgZSkgPT4gKHtcbiAgLi4ucyxcbiAgLi4uZVxufSksIGNtID0gKHMpID0+IE1yKHMudGhlbiksIEZsID0ge30sIG9vID0ge30sIEZ1ID0gXCJ1bmRlZmluZWRcIiwgUGkgPSB0eXBlb2Ygd2luZG93ICE9IEZ1LCBMYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBGdSwgSUkgPSBQaSAmJiBcIkRlbm9cIiBpbiB3aW5kb3csIF9JID0gKCkgPT4gUGkgJiYgdHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT0gRnUsIF9zID0gKHMsIGUpID0+IHtcbiAgY29uc3QgdCA9IHFyLmdldChzKTtcbiAgcmV0dXJuIFtcbiAgICAvLyBHZXR0ZXJcbiAgICAoKSA9PiAhJGUoZSkgJiYgcy5nZXQoZSkgfHwgRmwsXG4gICAgLy8gU2V0dGVyXG4gICAgKHIpID0+IHtcbiAgICAgIGlmICghJGUoZSkpIHtcbiAgICAgICAgY29uc3QgbiA9IHMuZ2V0KGUpO1xuICAgICAgICBlIGluIG9vIHx8IChvb1tlXSA9IG4pLCB0WzVdKGUsIEJzKG4sIHIpLCBuIHx8IEZsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIFN1YnNjcmliZXJcbiAgICB0WzZdLFxuICAgIC8vIEdldCBzZXJ2ZXIgY2FjaGUgc25hcHNob3RcbiAgICAoKSA9PiAhJGUoZSkgJiYgZSBpbiBvbyA/IG9vW2VdIDogISRlKGUpICYmIHMuZ2V0KGUpIHx8IEZsXG4gIF07XG59O1xubGV0IENjID0gITA7XG5jb25zdCBSSSA9ICgpID0+IENjLCBba2MsIERjXSA9IFBpICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyID8gW1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lci5iaW5kKHdpbmRvdyksXG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyLmJpbmQod2luZG93KVxuXSA6IFtcbiAgQ3MsXG4gIENzXG5dLCBMSSA9ICgpID0+IHtcbiAgY29uc3QgcyA9IExjICYmIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZTtcbiAgcmV0dXJuICRlKHMpIHx8IHMgIT09IFwiaGlkZGVuXCI7XG59LCBDSSA9IChzKSA9PiAoTGMgJiYgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgcyksIGtjKFwiZm9jdXNcIiwgcyksICgpID0+IHtcbiAgTGMgJiYgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgcyksIERjKFwiZm9jdXNcIiwgcyk7XG59KSwga0kgPSAocykgPT4ge1xuICBjb25zdCBlID0gKCkgPT4ge1xuICAgIENjID0gITAsIHMoKTtcbiAgfSwgdCA9ICgpID0+IHtcbiAgICBDYyA9ICExO1xuICB9O1xuICByZXR1cm4ga2MoXCJvbmxpbmVcIiwgZSksIGtjKFwib2ZmbGluZVwiLCB0KSwgKCkgPT4ge1xuICAgIERjKFwib25saW5lXCIsIGUpLCBEYyhcIm9mZmxpbmVcIiwgdCk7XG4gIH07XG59LCBESSA9IHtcbiAgaXNPbmxpbmU6IFJJLFxuICBpc1Zpc2libGU6IExJXG59LCBQSSA9IHtcbiAgaW5pdEZvY3VzOiBDSSxcbiAgaW5pdFJlY29ubmVjdDoga0lcbn0sIEFmID0gIXN0LnVzZUlkLCBUaSA9ICFQaSB8fCBJSSwgTUkgPSAocykgPT4gX0koKSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocykgOiBzZXRUaW1lb3V0KHMsIDEpLCBTbyA9IFRpID8gZnQgOiBFbSwgTmwgPSB0eXBlb2YgbmF2aWdhdG9yIDwgXCJ1XCIgJiYgbmF2aWdhdG9yLmNvbm5lY3Rpb24sIElmID0gIVRpICYmIE5sICYmIChbXG4gIFwic2xvdy0yZ1wiLFxuICBcIjJnXCJcbl0uaW5jbHVkZXMoTmwuZWZmZWN0aXZlVHlwZSkgfHwgTmwuc2F2ZURhdGEpLCBhbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBPSSA9IChzKSA9PiBSYy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKSwgVWwgPSAocywgZSkgPT4gcyA9PT0gYFtvYmplY3QgJHtlfV1gO1xubGV0IEJJID0gMDtcbmNvbnN0IFBjID0gKHMpID0+IHtcbiAgY29uc3QgZSA9IHR5cGVvZiBzLCB0ID0gT0kocyksIHIgPSBVbCh0LCBcIkRhdGVcIiksIG4gPSBVbCh0LCBcIlJlZ0V4cFwiKSwgaSA9IFVsKHQsIFwiT2JqZWN0XCIpO1xuICBsZXQgbywgYTtcbiAgaWYgKFJjKHMpID09PSBzICYmICFyICYmICFuKSB7XG4gICAgaWYgKG8gPSBhby5nZXQocyksIG8pIHJldHVybiBvO1xuICAgIGlmIChvID0gKytCSSArIFwiflwiLCBhby5zZXQocywgbyksIEFycmF5LmlzQXJyYXkocykpIHtcbiAgICAgIGZvciAobyA9IFwiQFwiLCBhID0gMDsgYSA8IHMubGVuZ3RoOyBhKyspXG4gICAgICAgIG8gKz0gUGMoc1thXSkgKyBcIixcIjtcbiAgICAgIGFvLnNldChzLCBvKTtcbiAgICB9XG4gICAgaWYgKGkpIHtcbiAgICAgIG8gPSBcIiNcIjtcbiAgICAgIGNvbnN0IGwgPSBSYy5rZXlzKHMpLnNvcnQoKTtcbiAgICAgIGZvciAoOyAhJGUoYSA9IGwucG9wKCkpOyApXG4gICAgICAgICRlKHNbYV0pIHx8IChvICs9IGEgKyBcIjpcIiArIFBjKHNbYV0pICsgXCIsXCIpO1xuICAgICAgYW8uc2V0KHMsIG8pO1xuICAgIH1cbiAgfSBlbHNlXG4gICAgbyA9IHIgPyBzLnRvSlNPTigpIDogZSA9PSBcInN5bWJvbFwiID8gcy50b1N0cmluZygpIDogZSA9PSBcInN0cmluZ1wiID8gSlNPTi5zdHJpbmdpZnkocykgOiBcIlwiICsgcztcbiAgcmV0dXJuIG87XG59LCB3aSA9IChzKSA9PiB7XG4gIGlmIChNcihzKSlcbiAgICB0cnkge1xuICAgICAgcyA9IHMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHMgPSBcIlwiO1xuICAgIH1cbiAgY29uc3QgZSA9IHM7XG4gIHJldHVybiBzID0gdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiA/IHMgOiAoQXJyYXkuaXNBcnJheShzKSA/IHMubGVuZ3RoIDogcykgPyBQYyhzKSA6IFwiXCIsIFtcbiAgICBzLFxuICAgIGVcbiAgXTtcbn07XG5sZXQgRkkgPSAwO1xuY29uc3QgTWMgPSAoKSA9PiArK0ZJO1xuYXN5bmMgZnVuY3Rpb24gdW0oLi4ucykge1xuICBjb25zdCBbZSwgdCwgciwgbl0gPSBzLCBpID0gQnMoe1xuICAgIHBvcHVsYXRlQ2FjaGU6ICEwLFxuICAgIHRocm93T25FcnJvcjogITBcbiAgfSwgdHlwZW9mIG4gPT0gXCJib29sZWFuXCIgPyB7XG4gICAgcmV2YWxpZGF0ZTogblxuICB9IDogbiB8fCB7fSk7XG4gIGxldCBvID0gaS5wb3B1bGF0ZUNhY2hlO1xuICBjb25zdCBhID0gaS5yb2xsYmFja09uRXJyb3I7XG4gIGxldCBsID0gaS5vcHRpbWlzdGljRGF0YTtcbiAgY29uc3QgYyA9IChoKSA9PiB0eXBlb2YgYSA9PSBcImZ1bmN0aW9uXCIgPyBhKGgpIDogYSAhPT0gITEsIHUgPSBpLnRocm93T25FcnJvcjtcbiAgaWYgKE1yKHQpKSB7XG4gICAgY29uc3QgaCA9IHQsIGYgPSBbXSwgcCA9IGUua2V5cygpO1xuICAgIGZvciAoY29uc3QgeSBvZiBwKVxuICAgICAgLy8gU2tpcCB0aGUgc3BlY2lhbCB1c2VTV1JJbmZpbml0ZSBhbmQgdXNlU1dSU3Vic2NyaXB0aW9uIGtleXMuXG4gICAgICAhL15cXCQoaW5mfHN1YilcXCQvLnRlc3QoeSkgJiYgaChlLmdldCh5KS5faykgJiYgZi5wdXNoKHkpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmLm1hcChkKSk7XG4gIH1cbiAgcmV0dXJuIGQodCk7XG4gIGFzeW5jIGZ1bmN0aW9uIGQoaCkge1xuICAgIGNvbnN0IFtmXSA9IHdpKGgpO1xuICAgIGlmICghZikgcmV0dXJuO1xuICAgIGNvbnN0IFtwLCB5XSA9IF9zKGUsIGYpLCBbRSwgYiwgUiwgQV0gPSBxci5nZXQoZSksIEYgPSAoKSA9PiB7XG4gICAgICBjb25zdCBnID0gRVtmXTtcbiAgICAgIHJldHVybiAoTXIoaS5yZXZhbGlkYXRlKSA/IGkucmV2YWxpZGF0ZShwKCkuZGF0YSwgaCkgOiBpLnJldmFsaWRhdGUgIT09ICExKSAmJiAoZGVsZXRlIFJbZl0sIGRlbGV0ZSBBW2ZdLCBnICYmIGdbMF0pID8gZ1swXShsbSkudGhlbigoKSA9PiBwKCkuZGF0YSkgOiBwKCkuZGF0YTtcbiAgICB9O1xuICAgIGlmIChzLmxlbmd0aCA8IDMpXG4gICAgICByZXR1cm4gRigpO1xuICAgIGxldCBNID0gciwgSCwgSyA9ICExO1xuICAgIGNvbnN0IGogPSBNYygpO1xuICAgIGJbZl0gPSBbXG4gICAgICBqLFxuICAgICAgMFxuICAgIF07XG4gICAgY29uc3QgQyA9ICEkZShsKSwgayA9IHAoKSwgJCA9IGsuZGF0YSwgVyA9IGsuX2MsIF8gPSAkZShXKSA/ICQgOiBXO1xuICAgIGlmIChDICYmIChsID0gTXIobCkgPyBsKF8sICQpIDogbCwgeSh7XG4gICAgICBkYXRhOiBsLFxuICAgICAgX2M6IF9cbiAgICB9KSksIE1yKE0pKVxuICAgICAgdHJ5IHtcbiAgICAgICAgTSA9IE0oXyk7XG4gICAgICB9IGNhdGNoIChnKSB7XG4gICAgICAgIEggPSBnLCBLID0gITA7XG4gICAgICB9XG4gICAgaWYgKE0gJiYgY20oTSkpXG4gICAgICBpZiAoTSA9IGF3YWl0IE0uY2F0Y2goKGcpID0+IHtcbiAgICAgICAgSCA9IGcsIEsgPSAhMDtcbiAgICAgIH0pLCBqICE9PSBiW2ZdWzBdKSB7XG4gICAgICAgIGlmIChLKSB0aHJvdyBIO1xuICAgICAgICByZXR1cm4gTTtcbiAgICAgIH0gZWxzZSBLICYmIEMgJiYgYyhIKSAmJiAobyA9ICEwLCB5KHtcbiAgICAgICAgZGF0YTogXyxcbiAgICAgICAgX2M6IHF0XG4gICAgICB9KSk7XG4gICAgaWYgKG8gJiYgIUspXG4gICAgICBpZiAoTXIobykpIHtcbiAgICAgICAgY29uc3QgZyA9IG8oTSwgXyk7XG4gICAgICAgIHkoe1xuICAgICAgICAgIGRhdGE6IGcsXG4gICAgICAgICAgZXJyb3I6IHF0LFxuICAgICAgICAgIF9jOiBxdFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB5KHtcbiAgICAgICAgICBkYXRhOiBNLFxuICAgICAgICAgIGVycm9yOiBxdCxcbiAgICAgICAgICBfYzogcXRcbiAgICAgICAgfSk7XG4gICAgaWYgKGJbZl1bMV0gPSBNYygpLCBQcm9taXNlLnJlc29sdmUoRigpKS50aGVuKCgpID0+IHtcbiAgICAgIHkoe1xuICAgICAgICBfYzogcXRcbiAgICAgIH0pO1xuICAgIH0pLCBLKSB7XG4gICAgICBpZiAodSkgdGhyb3cgSDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIE07XG4gIH1cbn1cbmNvbnN0IF9mID0gKHMsIGUpID0+IHtcbiAgZm9yIChjb25zdCB0IGluIHMpXG4gICAgc1t0XVswXSAmJiBzW3RdWzBdKGUpO1xufSwgTkkgPSAocywgZSkgPT4ge1xuICBpZiAoIXFyLmhhcyhzKSkge1xuICAgIGNvbnN0IHQgPSBCcyhQSSwgZSksIHIgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgbiA9IHVtLmJpbmQocXQsIHMpO1xuICAgIGxldCBpID0gQ3M7XG4gICAgY29uc3QgbyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCBhID0gKHUsIGQpID0+IHtcbiAgICAgIGNvbnN0IGggPSBvW3VdIHx8IFtdO1xuICAgICAgcmV0dXJuIG9bdV0gPSBoLCBoLnB1c2goZCksICgpID0+IGguc3BsaWNlKGguaW5kZXhPZihkKSwgMSk7XG4gICAgfSwgbCA9ICh1LCBkLCBoKSA9PiB7XG4gICAgICBzLnNldCh1LCBkKTtcbiAgICAgIGNvbnN0IGYgPSBvW3VdO1xuICAgICAgaWYgKGYpXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBmKVxuICAgICAgICAgIHAoZCwgaCk7XG4gICAgfSwgYyA9ICgpID0+IHtcbiAgICAgIGlmICghcXIuaGFzKHMpICYmIChxci5zZXQocywgW1xuICAgICAgICByLFxuICAgICAgICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICBuLFxuICAgICAgICBsLFxuICAgICAgICBhXG4gICAgICBdKSwgIVRpKSkge1xuICAgICAgICBjb25zdCB1ID0gdC5pbml0Rm9jdXMoc2V0VGltZW91dC5iaW5kKHF0LCBfZi5iaW5kKHF0LCByLCBvbSkpKSwgZCA9IHQuaW5pdFJlY29ubmVjdChzZXRUaW1lb3V0LmJpbmQocXQsIF9mLmJpbmQocXQsIHIsIGFtKSkpO1xuICAgICAgICBpID0gKCkgPT4ge1xuICAgICAgICAgIHUgJiYgdSgpLCBkICYmIGQoKSwgcXIuZGVsZXRlKHMpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGMoKSwgW1xuICAgICAgcyxcbiAgICAgIG4sXG4gICAgICBjLFxuICAgICAgaVxuICAgIF07XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBzLFxuICAgIHFyLmdldChzKVs0XVxuICBdO1xufSwgVUkgPSAocywgZSwgdCwgciwgbikgPT4ge1xuICBjb25zdCBpID0gdC5lcnJvclJldHJ5Q291bnQsIG8gPSBuLnJldHJ5Q291bnQsIGEgPSB+figoTWF0aC5yYW5kb20oKSArIDAuNSkgKiAoMSA8PCAobyA8IDggPyBvIDogOCkpKSAqIHQuZXJyb3JSZXRyeUludGVydmFsO1xuICAhJGUoaSkgJiYgbyA+IGkgfHwgc2V0VGltZW91dChyLCBhLCBuKTtcbn0sICRJID0gX2MsIFtOdSwgR0ldID0gTkkoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSksIFZJID0gQnMoXG4gIHtcbiAgICAvLyBldmVudHNcbiAgICBvbkxvYWRpbmdTbG93OiBDcyxcbiAgICBvblN1Y2Nlc3M6IENzLFxuICAgIG9uRXJyb3I6IENzLFxuICAgIG9uRXJyb3JSZXRyeTogVUksXG4gICAgb25EaXNjYXJkZWQ6IENzLFxuICAgIC8vIHN3aXRjaGVzXG4gICAgcmV2YWxpZGF0ZU9uRm9jdXM6ICEwLFxuICAgIHJldmFsaWRhdGVPblJlY29ubmVjdDogITAsXG4gICAgcmV2YWxpZGF0ZUlmU3RhbGU6ICEwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogITAsXG4gICAgLy8gdGltZW91dHNcbiAgICBlcnJvclJldHJ5SW50ZXJ2YWw6IElmID8gMWU0IDogNWUzLFxuICAgIGZvY3VzVGhyb3R0bGVJbnRlcnZhbDogNSAqIDFlMyxcbiAgICBkZWR1cGluZ0ludGVydmFsOiAyICogMWUzLFxuICAgIGxvYWRpbmdUaW1lb3V0OiBJZiA/IDVlMyA6IDNlMyxcbiAgICAvLyBwcm92aWRlcnNcbiAgICBjb21wYXJlOiAkSSxcbiAgICBpc1BhdXNlZDogKCkgPT4gITEsXG4gICAgY2FjaGU6IE51LFxuICAgIG11dGF0ZTogR0ksXG4gICAgZmFsbGJhY2s6IHt9XG4gIH0sXG4gIC8vIHVzZSB3ZWIgcHJlc2V0IGJ5IGRlZmF1bHRcbiAgRElcbiksIGpJID0gKHMsIGUpID0+IHtcbiAgY29uc3QgdCA9IEJzKHMsIGUpO1xuICBpZiAoZSkge1xuICAgIGNvbnN0IHsgdXNlOiByLCBmYWxsYmFjazogbiB9ID0gcywgeyB1c2U6IGksIGZhbGxiYWNrOiBvIH0gPSBlO1xuICAgIHIgJiYgaSAmJiAodC51c2UgPSByLmNvbmNhdChpKSksIG4gJiYgbyAmJiAodC5mYWxsYmFjayA9IEJzKG4sIG8pKTtcbiAgfVxuICByZXR1cm4gdDtcbn0sIEtJID0gYWEoe30pLCBkbSA9IFwiJGluZiRcIiwgaG0gPSBQaSAmJiB3aW5kb3cuX19TV1JfREVWVE9PTFNfVVNFX18sIEhJID0gaG0gPyB3aW5kb3cuX19TV1JfREVWVE9PTFNfVVNFX18gOiBbXSwgcUkgPSAoKSA9PiB7XG4gIGhtICYmICh3aW5kb3cuX19TV1JfREVWVE9PTFNfUkVBQ1RfXyA9IHN0KTtcbn0sIGZtID0gKHMpID0+IE1yKHNbMV0pID8gW1xuICBzWzBdLFxuICBzWzFdLFxuICBzWzJdIHx8IHt9XG5dIDogW1xuICBzWzBdLFxuICBudWxsLFxuICAoc1sxXSA9PT0gbnVsbCA/IHNbMl0gOiBzWzFdKSB8fCB7fVxuXSwgV0kgPSAoKSA9PiB7XG4gIGNvbnN0IHMgPSBBaShLSSk7XG4gIHJldHVybiBacigoKSA9PiBCcyhWSSwgcyksIFtcbiAgICBzXG4gIF0pO1xufSwgekkgPSAocykgPT4gKGUsIHQsIHIpID0+IHMoZSwgdCAmJiAoKC4uLmkpID0+IHtcbiAgY29uc3QgW29dID0gd2koZSksIFssICwgLCBhXSA9IHFyLmdldChOdSk7XG4gIGlmIChvLnN0YXJ0c1dpdGgoZG0pKVxuICAgIHJldHVybiB0KC4uLmkpO1xuICBjb25zdCBsID0gYVtvXTtcbiAgcmV0dXJuICRlKGwpID8gdCguLi5pKSA6IChkZWxldGUgYVtvXSwgbCk7XG59KSwgciksIFlJID0gSEkuY29uY2F0KHpJKSwgWkkgPSAocykgPT4gZnVuY3Rpb24oLi4udCkge1xuICBjb25zdCByID0gV0koKSwgW24sIGksIG9dID0gZm0odCksIGEgPSBqSShyLCBvKTtcbiAgbGV0IGwgPSBzO1xuICBjb25zdCB7IHVzZTogYyB9ID0gYSwgdSA9IChjIHx8IFtdKS5jb25jYXQoWUkpO1xuICBmb3IgKGxldCBkID0gdS5sZW5ndGg7IGQtLTsgKVxuICAgIGwgPSB1W2RdKGwpO1xuICByZXR1cm4gbChuLCBpIHx8IGEuZmV0Y2hlciB8fCBudWxsLCBhKTtcbn0sIFhJID0gKHMsIGUsIHQpID0+IHtcbiAgY29uc3QgciA9IGVbc10gfHwgKGVbc10gPSBbXSk7XG4gIHJldHVybiByLnB1c2godCksICgpID0+IHtcbiAgICBjb25zdCBuID0gci5pbmRleE9mKHQpO1xuICAgIG4gPj0gMCAmJiAocltuXSA9IHJbci5sZW5ndGggLSAxXSwgci5wb3AoKSk7XG4gIH07XG59LCBKSSA9IChzLCBlKSA9PiAoLi4udCkgPT4ge1xuICBjb25zdCBbciwgbiwgaV0gPSBmbSh0KSwgbyA9IChpLnVzZSB8fCBbXSkuY29uY2F0KGUpO1xuICByZXR1cm4gcyhyLCBuLCB7XG4gICAgLi4uaSxcbiAgICB1c2U6IG9cbiAgfSk7XG59O1xucUkoKTtcbmNvbnN0ICRsID0gc3QudXNlIHx8IC8vIFRoaXMgZXh0cmEgZ2VuZXJpYyBpcyB0byBhdm9pZCBUeXBlU2NyaXB0IG1peGluZyB1cCB0aGUgZ2VuZXJpYyBhbmQgSlNYIHN5dGF4XG4vLyBhbmQgZW1pdHRpbmcgYW4gZXJyb3IuXG4vLyBXZSBhc3N1bWUgdGhhdCB0aGlzIGlzIG9ubHkgZm9yIHRoZSBgdXNlKHRoZW5hYmxlKWAgY2FzZSwgbm90IGB1c2UoY29udGV4dClgLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvYWVkMDBkYWNmYjc5ZDE3YzUzMjE4NDA0YzUyYjFjN2FhNTljNGE4OS9wYWNrYWdlcy9yZWFjdC1zZXJ2ZXIvc3JjL1JlYWN0Rml6elRoZW5hYmxlLmpzI0w0NVxuKChzKSA9PiB7XG4gIHN3aXRjaCAocy5zdGF0dXMpIHtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgdGhyb3cgcztcbiAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgIHRocm93IHMucmVhc29uO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBzLnN0YXR1cyA9IFwicGVuZGluZ1wiLCBzLnRoZW4oKGUpID0+IHtcbiAgICAgICAgcy5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiLCBzLnZhbHVlID0gZTtcbiAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgIHMuc3RhdHVzID0gXCJyZWplY3RlZFwiLCBzLnJlYXNvbiA9IGU7XG4gICAgICB9KSwgcztcbiAgfVxufSksIEdsID0ge1xuICBkZWR1cGU6ICEwXG59LCBSZiA9IFByb21pc2UucmVzb2x2ZShxdCksIFFJID0gKHMsIGUsIHQpID0+IHtcbiAgY29uc3QgeyBjYWNoZTogciwgY29tcGFyZTogbiwgc3VzcGVuc2U6IGksIGZhbGxiYWNrRGF0YTogbywgcmV2YWxpZGF0ZU9uTW91bnQ6IGEsIHJldmFsaWRhdGVJZlN0YWxlOiBsLCByZWZyZXNoSW50ZXJ2YWw6IGMsIHJlZnJlc2hXaGVuSGlkZGVuOiB1LCByZWZyZXNoV2hlbk9mZmxpbmU6IGQsIGtlZXBQcmV2aW91c0RhdGE6IGggfSA9IHQsIFtmLCBwLCB5LCBFXSA9IHFyLmdldChyKSwgW2IsIFJdID0gd2kocyksIEEgPSBidCghMSksIEYgPSBidCghMSksIE0gPSBidChiKSwgSCA9IGJ0KGUpLCBLID0gYnQodCksIGogPSAoKSA9PiBLLmN1cnJlbnQsIEMgPSAoKSA9PiBqKCkuaXNWaXNpYmxlKCkgJiYgaigpLmlzT25saW5lKCksIFtrLCAkLCBXLCBfXSA9IF9zKHIsIGIpLCBnID0gYnQoe30pLmN1cnJlbnQsIHggPSAkZShvKSA/ICRlKHQuZmFsbGJhY2spID8gcXQgOiB0LmZhbGxiYWNrW2JdIDogbywgdyA9IChfZSwgeGUpID0+IHtcbiAgICBmb3IgKGNvbnN0IEJlIGluIGcpIHtcbiAgICAgIGNvbnN0IHllID0gQmU7XG4gICAgICBpZiAoeWUgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgIGlmICghbihfZVt5ZV0sIHhlW3llXSkgJiYgKCEkZShfZVt5ZV0pIHx8ICFuKE4sIHhlW3llXSkpKVxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0gZWxzZSBpZiAoeGVbeWVdICE9PSBfZVt5ZV0pXG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgcmV0dXJuICEwO1xuICB9LCBEID0gWnIoKCkgPT4ge1xuICAgIGNvbnN0IF9lID0gIWIgfHwgIWUgPyAhMSA6ICRlKGEpID8gaigpLmlzUGF1c2VkKCkgfHwgaSA/ICExIDogbCAhPT0gITEgOiBhLCB4ZSA9ICh3ZSkgPT4ge1xuICAgICAgY29uc3QgTmUgPSBCcyh3ZSk7XG4gICAgICByZXR1cm4gZGVsZXRlIE5lLl9rLCBfZSA/IHtcbiAgICAgICAgaXNWYWxpZGF0aW5nOiAhMCxcbiAgICAgICAgaXNMb2FkaW5nOiAhMCxcbiAgICAgICAgLi4uTmVcbiAgICAgIH0gOiBOZTtcbiAgICB9LCBCZSA9IGsoKSwgeWUgPSBfKCksIGJlID0geGUoQmUpLCBGZSA9IEJlID09PSB5ZSA/IGJlIDogeGUoeWUpO1xuICAgIGxldCBYZSA9IGJlO1xuICAgIHJldHVybiBbXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdlID0geGUoaygpKTtcbiAgICAgICAgcmV0dXJuIHcod2UsIFhlKSA/IChYZS5kYXRhID0gd2UuZGF0YSwgWGUuaXNMb2FkaW5nID0gd2UuaXNMb2FkaW5nLCBYZS5pc1ZhbGlkYXRpbmcgPSB3ZS5pc1ZhbGlkYXRpbmcsIFhlLmVycm9yID0gd2UuZXJyb3IsIFhlKSA6IChYZSA9IHdlLCB3ZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gRmVcbiAgICBdO1xuICB9LCBbXG4gICAgcixcbiAgICBiXG4gIF0pLCBPID0gaW0udXNlU3luY0V4dGVybmFsU3RvcmUodXQoXG4gICAgKF9lKSA9PiBXKGIsICh4ZSwgQmUpID0+IHtcbiAgICAgIHcoQmUsIHhlKSB8fCBfZSgpO1xuICAgIH0pLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICByLFxuICAgICAgYlxuICAgIF1cbiAgKSwgRFswXSwgRFsxXSksIFUgPSAhQS5jdXJyZW50LCBWID0gZltiXSAmJiBmW2JdLmxlbmd0aCA+IDAsIEwgPSBPLmRhdGEsIG0gPSAkZShMKSA/IHggJiYgY20oeCkgPyAkbCh4KSA6IHggOiBMLCB2ID0gTy5lcnJvciwgUCA9IGJ0KG0pLCBOID0gaCA/ICRlKEwpID8gJGUoUC5jdXJyZW50KSA/IG0gOiBQLmN1cnJlbnQgOiBMIDogbSwgWSA9IFYgJiYgISRlKHYpID8gITEgOiBVICYmICEkZShhKSA/IGEgOiBqKCkuaXNQYXVzZWQoKSA/ICExIDogaSA/ICRlKG0pID8gITEgOiBsIDogJGUobSkgfHwgbCwgZWUgPSAhIShiICYmIGUgJiYgVSAmJiBZKSwgaWUgPSAkZShPLmlzVmFsaWRhdGluZykgPyBlZSA6IE8uaXNWYWxpZGF0aW5nLCBsZSA9ICRlKE8uaXNMb2FkaW5nKSA/IGVlIDogTy5pc0xvYWRpbmcsIFRlID0gdXQoXG4gICAgYXN5bmMgKF9lKSA9PiB7XG4gICAgICBjb25zdCB4ZSA9IEguY3VycmVudDtcbiAgICAgIGlmICghYiB8fCAheGUgfHwgRi5jdXJyZW50IHx8IGooKS5pc1BhdXNlZCgpKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBsZXQgQmUsIHllLCBiZSA9ICEwO1xuICAgICAgY29uc3QgRmUgPSBfZSB8fCB7fSwgWGUgPSAheVtiXSB8fCAhRmUuZGVkdXBlLCB3ZSA9ICgpID0+IEFmID8gIUYuY3VycmVudCAmJiBiID09PSBNLmN1cnJlbnQgJiYgQS5jdXJyZW50IDogYiA9PT0gTS5jdXJyZW50LCBOZSA9IHtcbiAgICAgICAgaXNWYWxpZGF0aW5nOiAhMSxcbiAgICAgICAgaXNMb2FkaW5nOiAhMVxuICAgICAgfSwgZHQgPSAoKSA9PiB7XG4gICAgICAgICQoTmUpO1xuICAgICAgfSwgSmUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ID0geVtiXTtcbiAgICAgICAgaXQgJiYgaXRbMV0gPT09IHllICYmIGRlbGV0ZSB5W2JdO1xuICAgICAgfSwgUWUgPSB7XG4gICAgICAgIGlzVmFsaWRhdGluZzogITBcbiAgICAgIH07XG4gICAgICAkZShrKCkuZGF0YSkgJiYgKFFlLmlzTG9hZGluZyA9ICEwKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChYZSAmJiAoJChRZSksIHQubG9hZGluZ1RpbWVvdXQgJiYgJGUoaygpLmRhdGEpICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGJlICYmIHdlKCkgJiYgaigpLm9uTG9hZGluZ1Nsb3coYiwgdCk7XG4gICAgICAgIH0sIHQubG9hZGluZ1RpbWVvdXQpLCB5W2JdID0gW1xuICAgICAgICAgIHhlKFIpLFxuICAgICAgICAgIE1jKClcbiAgICAgICAgXSksIFtCZSwgeWVdID0geVtiXSwgQmUgPSBhd2FpdCBCZSwgWGUgJiYgc2V0VGltZW91dChKZSwgdC5kZWR1cGluZ0ludGVydmFsKSwgIXlbYl0gfHwgeVtiXVsxXSAhPT0geWUpXG4gICAgICAgICAgcmV0dXJuIFhlICYmIHdlKCkgJiYgaigpLm9uRGlzY2FyZGVkKGIpLCAhMTtcbiAgICAgICAgTmUuZXJyb3IgPSBxdDtcbiAgICAgICAgY29uc3QgaXQgPSBwW2JdO1xuICAgICAgICBpZiAoISRlKGl0KSAmJiAvLyBjYXNlIDFcbiAgICAgICAgKHllIDw9IGl0WzBdIHx8IC8vIGNhc2UgMlxuICAgICAgICB5ZSA8PSBpdFsxXSB8fCAvLyBjYXNlIDNcbiAgICAgICAgaXRbMV0gPT09IDApKVxuICAgICAgICAgIHJldHVybiBkdCgpLCBYZSAmJiB3ZSgpICYmIGooKS5vbkRpc2NhcmRlZChiKSwgITE7XG4gICAgICAgIGNvbnN0IGplID0gaygpLmRhdGE7XG4gICAgICAgIE5lLmRhdGEgPSBuKGplLCBCZSkgPyBqZSA6IEJlLCBYZSAmJiB3ZSgpICYmIGooKS5vblN1Y2Nlc3MoQmUsIGIsIHQpO1xuICAgICAgfSBjYXRjaCAoaXQpIHtcbiAgICAgICAgSmUoKTtcbiAgICAgICAgY29uc3QgamUgPSBqKCksIHsgc2hvdWxkUmV0cnlPbkVycm9yOiBCIH0gPSBqZTtcbiAgICAgICAgamUuaXNQYXVzZWQoKSB8fCAoTmUuZXJyb3IgPSBpdCwgWGUgJiYgd2UoKSAmJiAoamUub25FcnJvcihpdCwgYiwgamUpLCAoQiA9PT0gITAgfHwgTXIoQikgJiYgQihpdCkpICYmICghaigpLnJldmFsaWRhdGVPbkZvY3VzIHx8ICFqKCkucmV2YWxpZGF0ZU9uUmVjb25uZWN0IHx8IEMoKSkgJiYgamUub25FcnJvclJldHJ5KGl0LCBiLCBqZSwgKFMpID0+IHtcbiAgICAgICAgICBjb25zdCBUID0gZltiXTtcbiAgICAgICAgICBUICYmIFRbMF0gJiYgVFswXShUZiwgUyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICByZXRyeUNvdW50OiAoRmUucmV0cnlDb3VudCB8fCAwKSArIDEsXG4gICAgICAgICAgZGVkdXBlOiAhMFxuICAgICAgICB9KSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJlID0gITEsIGR0KCksICEwO1xuICAgIH0sXG4gICAgLy8gYHNldFN0YXRlYCBpcyBpbW11dGFibGUsIGFuZCBgZXZlbnRzQ2FsbGJhY2tgLCBgZm5BcmdgLCBhbmRcbiAgICAvLyBga2V5VmFsaWRhdGluZ2AgYXJlIGRlcGVuZGluZyBvbiBga2V5YCwgc28gd2UgY2FuIGV4Y2x1ZGUgdGhlbSBmcm9tXG4gICAgLy8gdGhlIGRlcHMgYXJyYXkuXG4gICAgLy9cbiAgICAvLyBGSVhNRTpcbiAgICAvLyBgZm5gIGFuZCBgY29uZmlnYCBtaWdodCBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgbGlmZWN5Y2xlLFxuICAgIC8vIGJ1dCB0aGV5IG1pZ2h0IGJlIGNoYW5nZWQgZXZlcnkgcmVuZGVyIGxpa2UgdGhpcy5cbiAgICAvLyBgdXNlU1dSKCdrZXknLCAoKSA9PiBmZXRjaCgnL2FwaS8nKSwgeyBzdXNwZW5zZTogdHJ1ZSB9KWBcbiAgICAvLyBTbyB3ZSBvbWl0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgZGVwcyBhcnJheVxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0IG1pZ2h0IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICBiLFxuICAgICAgclxuICAgIF1cbiAgKSwgRGUgPSB1dChcbiAgICAvLyBVc2UgY2FsbGJhY2sgdG8gbWFrZSBzdXJlIGBrZXlSZWYuY3VycmVudGAgcmV0dXJucyBsYXRlc3QgcmVzdWx0IGV2ZXJ5IHRpbWVcbiAgICAoLi4uX2UpID0+IHVtKHIsIE0uY3VycmVudCwgLi4uX2UpLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXVxuICApO1xuICBpZiAoU28oKCkgPT4ge1xuICAgIEguY3VycmVudCA9IGUsIEsuY3VycmVudCA9IHQsICRlKEwpIHx8IChQLmN1cnJlbnQgPSBMKTtcbiAgfSksIFNvKCgpID0+IHtcbiAgICBpZiAoIWIpIHJldHVybjtcbiAgICBjb25zdCBfZSA9IFRlLmJpbmQocXQsIEdsKTtcbiAgICBsZXQgeGUgPSAwO1xuICAgIGooKS5yZXZhbGlkYXRlT25Gb2N1cyAmJiAoeGUgPSBEYXRlLm5vdygpICsgaigpLmZvY3VzVGhyb3R0bGVJbnRlcnZhbCk7XG4gICAgY29uc3QgeWUgPSBYSShiLCBmLCAoYmUsIEZlID0ge30pID0+IHtcbiAgICAgIGlmIChiZSA9PSBvbSkge1xuICAgICAgICBjb25zdCBYZSA9IERhdGUubm93KCk7XG4gICAgICAgIGooKS5yZXZhbGlkYXRlT25Gb2N1cyAmJiBYZSA+IHhlICYmIEMoKSAmJiAoeGUgPSBYZSArIGooKS5mb2N1c1Rocm90dGxlSW50ZXJ2YWwsIF9lKCkpO1xuICAgICAgfSBlbHNlIGlmIChiZSA9PSBhbSlcbiAgICAgICAgaigpLnJldmFsaWRhdGVPblJlY29ubmVjdCAmJiBDKCkgJiYgX2UoKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoYmUgPT0gbG0pXG4gICAgICAgICAgcmV0dXJuIFRlKCk7XG4gICAgICAgIGlmIChiZSA9PSBUZilcbiAgICAgICAgICByZXR1cm4gVGUoRmUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBGLmN1cnJlbnQgPSAhMSwgTS5jdXJyZW50ID0gYiwgQS5jdXJyZW50ID0gITAsICQoe1xuICAgICAgX2s6IFJcbiAgICB9KSwgWSAmJiAoeVtiXSB8fCAoJGUobSkgfHwgVGkgPyBfZSgpIDogTUkoX2UpKSksICgpID0+IHtcbiAgICAgIEYuY3VycmVudCA9ICEwLCB5ZSgpO1xuICAgIH07XG4gIH0sIFtcbiAgICBiXG4gIF0pLCBTbygoKSA9PiB7XG4gICAgbGV0IF9lO1xuICAgIGZ1bmN0aW9uIHhlKCkge1xuICAgICAgY29uc3QgeWUgPSBNcihjKSA/IGMoaygpLmRhdGEpIDogYztcbiAgICAgIHllICYmIF9lICE9PSAtMSAmJiAoX2UgPSBzZXRUaW1lb3V0KEJlLCB5ZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBCZSgpIHtcbiAgICAgICFrKCkuZXJyb3IgJiYgKHUgfHwgaigpLmlzVmlzaWJsZSgpKSAmJiAoZCB8fCBqKCkuaXNPbmxpbmUoKSkgPyBUZShHbCkudGhlbih4ZSkgOiB4ZSgpO1xuICAgIH1cbiAgICByZXR1cm4geGUoKSwgKCkgPT4ge1xuICAgICAgX2UgJiYgKGNsZWFyVGltZW91dChfZSksIF9lID0gLTEpO1xuICAgIH07XG4gIH0sIFtcbiAgICBjLFxuICAgIHUsXG4gICAgZCxcbiAgICBiXG4gIF0pLCB4bShOKSwgaSkge1xuICAgIGNvbnN0IF9lID0gYiAmJiAkZShtKTtcbiAgICBpZiAoIUFmICYmIFRpICYmIF9lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFsbGJhY2sgZGF0YSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFN1c3BlbnNlIGluIFNTUi5cIik7XG4gICAgX2UgJiYgKEguY3VycmVudCA9IGUsIEsuY3VycmVudCA9IHQsIEYuY3VycmVudCA9ICExKTtcbiAgICBjb25zdCB4ZSA9IEVbYl0sIEJlID0gISRlKHhlKSAmJiBfZSA/IERlKHhlKSA6IFJmO1xuICAgIGlmICgkbChCZSksICEkZSh2KSAmJiBfZSlcbiAgICAgIHRocm93IHY7XG4gICAgY29uc3QgeWUgPSBfZSA/IFRlKEdsKSA6IFJmO1xuICAgICEkZShOKSAmJiBfZSAmJiAoeWUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIiwgeWUudmFsdWUgPSAhMCksICRsKHllKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG11dGF0ZTogRGUsXG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICByZXR1cm4gZy5kYXRhID0gITAsIE47XG4gICAgfSxcbiAgICBnZXQgZXJyb3IoKSB7XG4gICAgICByZXR1cm4gZy5lcnJvciA9ICEwLCB2O1xuICAgIH0sXG4gICAgZ2V0IGlzVmFsaWRhdGluZygpIHtcbiAgICAgIHJldHVybiBnLmlzVmFsaWRhdGluZyA9ICEwLCBpZTtcbiAgICB9LFxuICAgIGdldCBpc0xvYWRpbmcoKSB7XG4gICAgICByZXR1cm4gZy5pc0xvYWRpbmcgPSAhMCwgbGU7XG4gICAgfVxuICB9O1xufSwgZV8gPSBaSShRSSksIHRfID0gKCkgPT4ge1xufSwgcl8gPSAoXG4gIC8qI19fTk9JTkxJTkVfXyovXG4gIHRfKClcbiksIE9jID0gT2JqZWN0LCBMZiA9IChzKSA9PiBzID09PSByXywgc18gPSAocykgPT4gdHlwZW9mIHMgPT0gXCJmdW5jdGlvblwiLCBsbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBuXyA9IChzKSA9PiBPYy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKSwgVmwgPSAocywgZSkgPT4gcyA9PT0gYFtvYmplY3QgJHtlfV1gO1xubGV0IGlfID0gMDtcbmNvbnN0IEJjID0gKHMpID0+IHtcbiAgY29uc3QgZSA9IHR5cGVvZiBzLCB0ID0gbl8ocyksIHIgPSBWbCh0LCBcIkRhdGVcIiksIG4gPSBWbCh0LCBcIlJlZ0V4cFwiKSwgaSA9IFZsKHQsIFwiT2JqZWN0XCIpO1xuICBsZXQgbywgYTtcbiAgaWYgKE9jKHMpID09PSBzICYmICFyICYmICFuKSB7XG4gICAgaWYgKG8gPSBsby5nZXQocyksIG8pIHJldHVybiBvO1xuICAgIGlmIChvID0gKytpXyArIFwiflwiLCBsby5zZXQocywgbyksIEFycmF5LmlzQXJyYXkocykpIHtcbiAgICAgIGZvciAobyA9IFwiQFwiLCBhID0gMDsgYSA8IHMubGVuZ3RoOyBhKyspXG4gICAgICAgIG8gKz0gQmMoc1thXSkgKyBcIixcIjtcbiAgICAgIGxvLnNldChzLCBvKTtcbiAgICB9XG4gICAgaWYgKGkpIHtcbiAgICAgIG8gPSBcIiNcIjtcbiAgICAgIGNvbnN0IGwgPSBPYy5rZXlzKHMpLnNvcnQoKTtcbiAgICAgIGZvciAoOyAhTGYoYSA9IGwucG9wKCkpOyApXG4gICAgICAgIExmKHNbYV0pIHx8IChvICs9IGEgKyBcIjpcIiArIEJjKHNbYV0pICsgXCIsXCIpO1xuICAgICAgbG8uc2V0KHMsIG8pO1xuICAgIH1cbiAgfSBlbHNlXG4gICAgbyA9IHIgPyBzLnRvSlNPTigpIDogZSA9PSBcInN5bWJvbFwiID8gcy50b1N0cmluZygpIDogZSA9PSBcInN0cmluZ1wiID8gSlNPTi5zdHJpbmdpZnkocykgOiBcIlwiICsgcztcbiAgcmV0dXJuIG87XG59LCBvXyA9IChzKSA9PiB7XG4gIGlmIChzXyhzKSlcbiAgICB0cnkge1xuICAgICAgcyA9IHMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHMgPSBcIlwiO1xuICAgIH1cbiAgY29uc3QgZSA9IHM7XG4gIHJldHVybiBzID0gdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiA/IHMgOiAoQXJyYXkuaXNBcnJheShzKSA/IHMubGVuZ3RoIDogcykgPyBCYyhzKSA6IFwiXCIsIFtcbiAgICBzLFxuICAgIGVcbiAgXTtcbn0sIGFfID0gKHMpID0+IG9fKHMgPyBzKDAsIG51bGwpIDogbnVsbClbMF0sIGpsID0gUHJvbWlzZS5yZXNvbHZlKCksIGxfID0gKHMpID0+IChlLCB0LCByKSA9PiB7XG4gIGNvbnN0IG4gPSBidCghMSksIHsgY2FjaGU6IGksIGluaXRpYWxTaXplOiBvID0gMSwgcmV2YWxpZGF0ZUFsbDogYSA9ICExLCBwZXJzaXN0U2l6ZTogbCA9ICExLCByZXZhbGlkYXRlRmlyc3RQYWdlOiBjID0gITAsIHJldmFsaWRhdGVPbk1vdW50OiB1ID0gITEsIHBhcmFsbGVsOiBkID0gITEgfSA9IHIsIFssICwgLCBoXSA9IHFyLmdldChOdSk7XG4gIGxldCBmO1xuICB0cnkge1xuICAgIGYgPSBhXyhlKSwgZiAmJiAoZiA9IGRtICsgZik7XG4gIH0gY2F0Y2gge1xuICB9XG4gIGNvbnN0IFtwLCB5LCBFXSA9IF9zKGksIGYpLCBiID0gdXQoKCkgPT4gJGUocCgpLl9sKSA/IG8gOiBwKCkuX2wsIFtcbiAgICBpLFxuICAgIGYsXG4gICAgb1xuICBdKTtcbiAgaW0udXNlU3luY0V4dGVybmFsU3RvcmUodXQoXG4gICAgKGopID0+IGYgPyBFKGYsICgpID0+IHtcbiAgICAgIGooKTtcbiAgICB9KSA6ICgpID0+IHtcbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICBpLFxuICAgICAgZlxuICAgIF1cbiAgKSwgYiwgYik7XG4gIGNvbnN0IFIgPSB1dCgoKSA9PiB7XG4gICAgY29uc3QgaiA9IHAoKS5fbDtcbiAgICByZXR1cm4gJGUoaikgPyBvIDogajtcbiAgfSwgW1xuICAgIGYsXG4gICAgb1xuICBdKSwgQSA9IGJ0KFIoKSk7XG4gIFNvKCgpID0+IHtcbiAgICBpZiAoIW4uY3VycmVudCkge1xuICAgICAgbi5jdXJyZW50ID0gITA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGYgJiYgeSh7XG4gICAgICBfbDogbCA/IEEuY3VycmVudCA6IFIoKVxuICAgIH0pO1xuICB9LCBbXG4gICAgZixcbiAgICBpXG4gIF0pO1xuICBjb25zdCBGID0gdSAmJiAhbi5jdXJyZW50LCBNID0gcyhmLCBhc3luYyAoaikgPT4ge1xuICAgIGNvbnN0IEMgPSBwKCkuX2ksIGsgPSBwKCkuX3I7XG4gICAgeSh7XG4gICAgICBfcjogcXRcbiAgICB9KTtcbiAgICBjb25zdCAkID0gW10sIFcgPSBSKCksIFtfXSA9IF9zKGksIGopLCBnID0gXygpLmRhdGEsIHggPSBbXTtcbiAgICBsZXQgdyA9IG51bGw7XG4gICAgZm9yIChsZXQgRCA9IDA7IEQgPCBXOyArK0QpIHtcbiAgICAgIGNvbnN0IFtPLCBVXSA9IHdpKGUoRCwgZCA/IG51bGwgOiB3KSk7XG4gICAgICBpZiAoIU8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgY29uc3QgW1YsIExdID0gX3MoaSwgTyk7XG4gICAgICBsZXQgbSA9IFYoKS5kYXRhO1xuICAgICAgY29uc3QgdiA9IGEgfHwgQyB8fCAkZShtKSB8fCBjICYmICFEICYmICEkZShnKSB8fCBGIHx8IGcgJiYgISRlKGdbRF0pICYmICFyLmNvbXBhcmUoZ1tEXSwgbSk7XG4gICAgICBpZiAodCAmJiAodHlwZW9mIGsgPT0gXCJmdW5jdGlvblwiID8gayhtLCBVKSA6IHYpKSB7XG4gICAgICAgIGNvbnN0IFAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCEoTyBpbiBoKSlcbiAgICAgICAgICAgIG0gPSBhd2FpdCB0KFUpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgWSA9IGhbT107XG4gICAgICAgICAgICBkZWxldGUgaFtPXSwgbSA9IGF3YWl0IFk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEwoe1xuICAgICAgICAgICAgZGF0YTogbSxcbiAgICAgICAgICAgIF9rOiBVXG4gICAgICAgICAgfSksICRbRF0gPSBtO1xuICAgICAgICB9O1xuICAgICAgICBkID8geC5wdXNoKFApIDogYXdhaXQgUCgpO1xuICAgICAgfSBlbHNlXG4gICAgICAgICRbRF0gPSBtO1xuICAgICAgZCB8fCAodyA9IG0pO1xuICAgIH1cbiAgICByZXR1cm4gZCAmJiBhd2FpdCBQcm9taXNlLmFsbCh4Lm1hcCgoRCkgPT4gRCgpKSksIHkoe1xuICAgICAgX2k6IHF0XG4gICAgfSksICQ7XG4gIH0sIHIpLCBIID0gdXQoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICBmdW5jdGlvbihqLCBDKSB7XG4gICAgICBjb25zdCBrID0gdHlwZW9mIEMgPT0gXCJib29sZWFuXCIgPyB7XG4gICAgICAgIHJldmFsaWRhdGU6IENcbiAgICAgIH0gOiBDIHx8IHt9LCAkID0gay5yZXZhbGlkYXRlICE9PSAhMTtcbiAgICAgIHJldHVybiBmID8gKCQgJiYgKCRlKGopID8geSh7XG4gICAgICAgIF9pOiAhMCxcbiAgICAgICAgX3I6IGsucmV2YWxpZGF0ZVxuICAgICAgfSkgOiB5KHtcbiAgICAgICAgX2k6ICExLFxuICAgICAgICBfcjogay5yZXZhbGlkYXRlXG4gICAgICB9KSksIGFyZ3VtZW50cy5sZW5ndGggPyBNLm11dGF0ZShqLCB7XG4gICAgICAgIC4uLmssXG4gICAgICAgIHJldmFsaWRhdGU6ICRcbiAgICAgIH0pIDogTS5tdXRhdGUoKSkgOiBqbDtcbiAgICB9LFxuICAgIC8vIHN3ci5tdXRhdGUgaXMgYWx3YXlzIHRoZSBzYW1lIHJlZmVyZW5jZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICBmLFxuICAgICAgaVxuICAgIF1cbiAgKSwgSyA9IHV0KFxuICAgIChqKSA9PiB7XG4gICAgICBpZiAoIWYpIHJldHVybiBqbDtcbiAgICAgIGNvbnN0IFssIENdID0gX3MoaSwgZik7XG4gICAgICBsZXQgaztcbiAgICAgIGlmIChNcihqKSA/IGsgPSBqKFIoKSkgOiB0eXBlb2YgaiA9PSBcIm51bWJlclwiICYmIChrID0gaiksIHR5cGVvZiBrICE9IFwibnVtYmVyXCIpIHJldHVybiBqbDtcbiAgICAgIEMoe1xuICAgICAgICBfbDoga1xuICAgICAgfSksIEEuY3VycmVudCA9IGs7XG4gICAgICBjb25zdCAkID0gW10sIFtXXSA9IF9zKGksIGYpO1xuICAgICAgbGV0IF8gPSBudWxsO1xuICAgICAgZm9yIChsZXQgZyA9IDA7IGcgPCBrOyArK2cpIHtcbiAgICAgICAgY29uc3QgW3hdID0gd2koZShnLCBfKSksIFt3XSA9IF9zKGksIHgpLCBEID0geCA/IHcoKS5kYXRhIDogcXQ7XG4gICAgICAgIGlmICgkZShEKSlcbiAgICAgICAgICByZXR1cm4gSChXKCkuZGF0YSk7XG4gICAgICAgICQucHVzaChEKSwgXyA9IEQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gSCgkKTtcbiAgICB9LFxuICAgIC8vIGV4Y2x1ZGUgZ2V0S2V5IGZyb20gdGhlIGRlcGVuZGVuY2llcywgd2hpY2ggaXNuJ3QgYWxsb3dlZCB0byBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlY3ljbGVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW1xuICAgICAgZixcbiAgICAgIGksXG4gICAgICBILFxuICAgICAgUlxuICAgIF1cbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBzaXplOiBSKCksXG4gICAgc2V0U2l6ZTogSyxcbiAgICBtdXRhdGU6IEgsXG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICByZXR1cm4gTS5kYXRhO1xuICAgIH0sXG4gICAgZ2V0IGVycm9yKCkge1xuICAgICAgcmV0dXJuIE0uZXJyb3I7XG4gICAgfSxcbiAgICBnZXQgaXNWYWxpZGF0aW5nKCkge1xuICAgICAgcmV0dXJuIE0uaXNWYWxpZGF0aW5nO1xuICAgIH0sXG4gICAgZ2V0IGlzTG9hZGluZygpIHtcbiAgICAgIHJldHVybiBNLmlzTG9hZGluZztcbiAgICB9XG4gIH07XG59LCBjXyA9IEpJKGVfLCBsXyksIHVfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wic2Zta3FjclwiXVxufSksIGRfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiaHJsZHRpb1wiXVxufSksIGhfID0gTWYoKHtcbiAgY2FzdHM6IHMsXG4gIGN1cnNvcjogZVxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KHVfLCB7XG4gIGNoaWxkcmVuOiBzLm1hcCgodCwgcikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhzdC5GcmFnbWVudCwge1xuICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KG9hLCB7XG4gICAgICBpc0VtYmVkOiAhMSxcbiAgICAgIC4uLnRcbiAgICB9KSwgciA8IHMubGVuZ3RoIC0gMSAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goZF8sIHt9KV1cbiAgfSwgdC5oYXNoKSlcbn0pKTtcbmZ1bmN0aW9uIGZfKHMpIHtcbiAgcmV0dXJuIHMgPyBzLm1hcCgoZSkgPT4ge1xuICAgIHZhciByLCBuLCBpLCBvLCBhO1xuICAgIGNvbnN0IHQgPSBlICE9IG51bGwgJiYgZS5yZXBsaWVzICYmIHR5cGVvZiBlLnJlcGxpZXMgPT0gXCJvYmplY3RcIiA/IE51bWJlcihlLnJlcGxpZXMuY291bnQpIHx8IDAgOiBOdW1iZXIoZSA9PSBudWxsID8gdm9pZCAwIDogZS5yZXBsaWVzKSB8fCAwO1xuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogKChyID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS5hdXRob3IpID09IG51bGwgPyB2b2lkIDAgOiByLnVzZXJuYW1lKSA/PyBcIlwiLFxuICAgICAgZGlzcGxheU5hbWU6ICgobiA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXV0aG9yKSA9PSBudWxsID8gdm9pZCAwIDogbi5kaXNwbGF5X25hbWUpID8/IFwiXCIsXG4gICAgICBhdmF0YXJJbWdVcmw6ICgoaSA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXV0aG9yKSA9PSBudWxsID8gdm9pZCAwIDogaS5wZnBfdXJsKSA/PyBcIlwiLFxuICAgICAgdGV4dDogKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUudGV4dCkgPz8gXCJcIixcbiAgICAgIGhhc2g6IChlID09IG51bGwgPyB2b2lkIDAgOiBlLmhhc2gpID8/IFwiXCIsXG4gICAgICByZWFjdGlvbnM6IChlID09IG51bGwgPyB2b2lkIDAgOiBlLnJlYWN0aW9ucykgPz8gW10sXG4gICAgICByZXBsaWVzOiB0LFxuICAgICAgZW1iZWRzOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5lbWJlZHMpID8/IFtdLFxuICAgICAgZnJhbWVzOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5mcmFtZXMpID8/IFtdLFxuICAgICAgcmVuZGVyRW1iZWRzOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5yZW5kZXJFbWJlZHMpID8/ICEwLFxuICAgICAgY2hhbm5lbDogKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuY2hhbm5lbCkgPz8gXCJcIixcbiAgICAgIHZpZXdlckZpZDogMixcbiAgICAgIGhhc1Bvd2VyQmFkZ2U6ICgobyA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXV0aG9yKSA9PSBudWxsID8gdm9pZCAwIDogby5wb3dlcl9iYWRnZSkgPz8gITEsXG4gICAgICBhcHBBdmF0YXJJbWdVcmw6ICgoYSA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXBwKSA9PSBudWxsID8gdm9pZCAwIDogYS5wZnBfdXJsKSA/PyBcIlwiLFxuICAgICAgaXNPd25Qcm9maWxlOiAhMSxcbiAgICAgIGFsbG93UmVhY3Rpb25zOiAhMCxcbiAgICAgIHJlbmRlckZyYW1lczogITEsXG4gICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wID8/IFwiXCJcbiAgICB9O1xuICB9KSA6IFtdO1xufVxuY29uc3QgZ18gPSAocykgPT4gYW4ocykudGhlbihhc3luYyAoZSkgPT4gYXdhaXQgZS5qc29uKCkpLCBwXyA9IChzLCBlLCB0LCByLCBuKSA9PiB7XG4gIGlmIChlICYmICghZS5jYXN0cyB8fCAhZS5jYXN0cy5sZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgbGV0IGkgPSBgJHtvbn0vdjIvZmFyY2FzdGVyL2ZlZWQke3QgPyBcIlwiIDogXCI/XCJ9YDtcbiAgY29uc3QgbyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgdCAmJiAoaSArPSBgJHt0fT9gKSwgbiAmJiAoaSArPSBgY2xpZW50X2lkPSR7bn1gKSwgZSAmJiAoaSArPSBgJmN1cnNvcj0ke2UubmV4dC5jdXJzb3J9YCk7XG4gIGNvbnN0IGEgPSAobCwgYykgPT4ge1xuICAgIGMgIT0gbnVsbCAmJiAhaS5pbmNsdWRlcyhgJHtsfT1gKSAmJiBvLmFwcGVuZChsLCBTdHJpbmcoYykpO1xuICB9O1xuICBpZiAocikge1xuICAgIE9iamVjdC5lbnRyaWVzKHIpLmZvckVhY2goKFtjLCB1XSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGMucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgYShkLCB1KTtcbiAgICB9KTtcbiAgICBjb25zdCBsID0gby50b1N0cmluZygpO1xuICAgIGwgJiYgKGkgKz0gaS5pbmNsdWRlcyhcIj9cIikgPyBgJiR7bH1gIDogYD8ke2x9YCk7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKHIpLmxlbmd0aCA+IDEpXG4gICAgcmV0dXJuIGk7XG59LCB5UiA9ICh7XG4gIHBhdGg6IHMsXG4gIC4uLmVcbn0pID0+IHtcbiAgdmFyIGY7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IHRcbiAgfSA9IHRzKCksIHIgPSBidChudWxsKSwgW24sIGldID0gcWUoITEpLCBvID0gYnQobnVsbCksIHtcbiAgICBkYXRhOiBhLFxuICAgIGVycm9yOiBsLFxuICAgIHNpemU6IGMsXG4gICAgc2V0U2l6ZTogdSxcbiAgICBpc1ZhbGlkYXRpbmc6IGRcbiAgfSA9IGNfKChwLCB5KSA9PiBwXyhwLCB5LCBzLCBlLCB0KSwgZ18pLCBoID0gWnIoKCkgPT4ge1xuICAgIGlmICghYSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHAgPSBhLmZsYXRNYXAoKEUpID0+IChFID09IG51bGwgPyB2b2lkIDAgOiBFLmNhc3RzKSA/PyBbXSksIHkgPSBBcnJheS5mcm9tKG5ldyBTZXQocC5tYXAoKEUpID0+IEUuaGFzaCkpKS5tYXAoKEUpID0+IHAuZmluZCgoYikgPT4gYi5oYXNoID09PSBFKSk7XG4gICAgcmV0dXJuIGZfKHkpO1xuICB9LCBbYV0pO1xuICByZXR1cm4gZnQoKCkgPT4gKG8uY3VycmVudCAmJiBvLmN1cnJlbnQuZGlzY29ubmVjdCgpLCBvLmN1cnJlbnQgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKHApID0+IHtcbiAgICB2YXIgRSwgYjtcbiAgICBjb25zdCBbeV0gPSBwO1xuICAgIHkuaXNJbnRlcnNlY3RpbmcgJiYgIW4gJiYgIWQgJiYgYSAmJiAoKGIgPSAoRSA9IGFbYS5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IEUubmV4dCkgIT0gbnVsbCAmJiBiLmN1cnNvcikgJiYgKGkoITApLCB1KGMgKyAxKS50aGVuKCgpID0+IGkoITEpKSk7XG4gIH0sIHtcbiAgICByb290TWFyZ2luOiBcIjEwMHB4XCJcbiAgfSksIHIuY3VycmVudCAmJiBvLmN1cnJlbnQub2JzZXJ2ZShyLmN1cnJlbnQpLCAoKSA9PiB7XG4gICAgby5jdXJyZW50ICYmIG8uY3VycmVudC5kaXNjb25uZWN0KCk7XG4gIH0pLCBbci5jdXJyZW50LCBuLCBkLCBhLCBjXSksIGwgPyAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgIGNoaWxkcmVuOiBcIkVycm9yIGZldGNoaW5nIGZlZWQgZGF0YVwiXG4gIH0pIDogLyogQF9fUFVSRV9fICovIHEuanN4cyhcImRpdlwiLCB7XG4gICAgY2hpbGRyZW46IFtoLmxlbmd0aCAhPT0gMCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChoXywge1xuICAgICAgY2FzdHM6IGgsXG4gICAgICBjdXJzb3I6IFwiXCJcbiAgICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgICBjaGlsZHJlbjogKGYgPSBhID09IG51bGwgPyB2b2lkIDAgOiBhWzBdKSA9PSBudWxsID8gdm9pZCAwIDogZi5tZXNzYWdlXG4gICAgfSksIGQgJiYgLyogQF9fUFVSRV9fICovIHEuanN4cyhcImRpdlwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiMTBweFwiXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwic3BhblwiLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgYW5pbWF0aW9uOiBcImJsaW5rIDEuNXMgaW5maW5pdGVcIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1wiTG9hZGluZ1wiLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiZG90c1wiLFxuICAgICAgICAgIGNoaWxkcmVuOiBcIi4uLlwiXG4gICAgICAgIH0pXVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInN0eWxlXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgYmxpbmsge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIHsgb3BhY2l0eTogMTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwJSB7IG9wYWNpdHk6IDA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAlIHsgb3BhY2l0eTogMTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICB9KV1cbiAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogclxuICAgIH0pXVxuICB9KTtcbn0sIG1fID0gLyogQF9fUFVSRV9fICovIGRlKFwiYnV0dG9uXCIpKHtcbiAgY2xhc3NlczogW1wiYjFicXVnOHJcIl1cbn0pLCB5XyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImJ1dHRvblwiKSh7XG4gIGNsYXNzZXM6IFtcImIxbXJhNDV3XCJdXG59KSwgQ2YgPSBcImh0dHBzOi8vZmFyY2FzdGVyLnh5elwiLCBnbSA9IC8oXnxcXHMpXFwvXFx3Ky9nLCBwbSA9IC9AXFx3Ky9nLCBtbSA9IC8oKGh0dHBzPzpcXC9cXC8pPyhbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSkoXFwvW15cXHNdKik/KS9nLCBrZiA9IG5ldyBSZWdFeHAoYCgke2dtLnNvdXJjZX0pfCgke3BtLnNvdXJjZX0pfCgke21tLnNvdXJjZX0pYCwgXCJnXCIpLCB2XyA9IChzKSA9PiBnbS50ZXN0KHMpID8gYCR7Q2Z9L34vY2hhbm5lbCR7cy50cmltKCl9YCA6IHBtLnRlc3QocykgPyBgJHtDZn0vJHtzLnN1YnN0cmluZygxKX1gIDogbW0udGVzdChzKSA/IHMuc3RhcnRzV2l0aChcImh0dHBcIikgPyBzIDogYGh0dHA6Ly8ke3N9YCA6IFwiXCIsIEVfID0gLyogQF9fUFVSRV9fICovIGRlKFwiYVwiKSh7XG4gIGNsYXNzZXM6IFtcInNieTl3YTJcIl1cbn0pLCB4XyA9IChzKSA9PiB7XG4gIGlmICghcykgcmV0dXJuIFtdO1xuICBjb25zdCBlID0gW107XG4gIGxldCB0ID0gMCwgcjtcbiAgZm9yICg7IChyID0ga2YuZXhlYyhzKSkgIT09IG51bGw7ICkge1xuICAgIGNvbnN0IG4gPSByLmluZGV4O1xuICAgIHQgPCBuICYmIGUucHVzaChzLnNsaWNlKHQsIG4pKTtcbiAgICBjb25zdCBpID0gdl8oclswXSksIG8gPSByWzBdLnRyaW0oKS5zdGFydHNXaXRoKFwiL1wiKTtcbiAgICBlLnB1c2goLyogQF9fUFVSRV9fICovIHEuanN4KFwic3BhblwiLCB7XG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KEVfLCB7XG4gICAgICAgIGhyZWY6IGksXG4gICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgc3R5bGU6IG8gPyB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMy41XG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgY2hpbGRyZW46IHJbMF1cbiAgICAgIH0sIG4pXG4gICAgfSkpLCB0ID0ga2YubGFzdEluZGV4O1xuICB9XG4gIHJldHVybiB0IDwgcy5sZW5ndGggJiYgZS5wdXNoKHMuc2xpY2UodCkpLCBlO1xufSwgU18gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJzZGFobTU4XCJdXG59KSwgYl8gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJtemlxeXhwXCJdXG59KSwgVF8gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJ1ejd0cG1mXCJdXG59KSwgd18gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJkMXJ4bHdhY1wiXVxufSksIEFfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widWdjNnlxcFwiXVxufSksIERmID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wicG9yamY5YVwiXVxufSksIElfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widHR0N3g5eFwiXVxufSksIFBmID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiYjF3YmU5bzZcIl1cbn0pLCBfXyA9IE1mKCh7XG4gIGZpZDogcyxcbiAgdXNlcm5hbWU6IGUsXG4gIGRpc3BsYXlOYW1lOiB0LFxuICBhdmF0YXJJbWdVcmw6IHIsXG4gIGJpbzogbixcbiAgZm9sbG93ZXJzOiBpLFxuICBmb2xsb3dpbmc6IG8sXG4gIGhhc1Bvd2VyQmFkZ2U6IGEsXG4gIGlzRm9sbG93aW5nOiBsLFxuICBpc093blByb2ZpbGU6IGMsXG4gIG9uQ2FzdDogdSxcbiAgY29udGFpbmVyU3R5bGVzOiBkXG59KSA9PiB7XG4gIGNvbnN0IGggPSB4XyhuKSwgZiA9IFpyKCgpID0+IHBmKG8pLCBbb10pLCBwID0gWnIoKCkgPT4gcGYoaSksIFtpXSksIHkgPSAoKSA9PiB7XG4gICAgd2luZG93Lm9wZW4oXCJodHRwczovL2ZhcmNhc3Rlci54eXovfi9zZXR0aW5nc1wiLCBcIl9ibGFua1wiKTtcbiAgfSwgRSA9IHtcbiAgICBjb2xvcjogZCA9PSBudWxsID8gdm9pZCAwIDogZC5jb2xvclxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4cyhTXywge1xuICAgIHN0eWxlOiBkLFxuICAgIGNoaWxkcmVuOiBbYyAmJiB1ICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoUHIsIHtcbiAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICBzcGFjaW5nQm90dG9tOiBcIjIwcHhcIixcbiAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhBXywge1xuICAgICAgICBjaGlsZHJlbjogW1wiQFwiLCBlXVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtXywge1xuICAgICAgICBvbkNsaWNrOiB1LFxuICAgICAgICBjaGlsZHJlbjogXCJDYXN0XCJcbiAgICAgIH0pXVxuICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goUHIsIHtcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKGJfLCB7XG4gICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhQciwge1xuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgZmxleEdyb3c6IDEsXG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdhcDogXCIxMHB4XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KElyLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFlvLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgc3JjOiByID8/IGJpLFxuICAgICAgICAgICAgICBsb2FkaW5nOiBcImxhenlcIixcbiAgICAgICAgICAgICAgYWx0OiBgJHt0ID8/IFwiU2tlbGV0b25cIn0gQXZhdGFyYFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFByLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KHdfLCB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiB0IHx8IGAhJHtzfWBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoUHIsIHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoVF8sIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtcIkBcIiwgZV1cbiAgICAgICAgICAgIH0pLCBsICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJXywge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogXCJGb2xsb3dzIHlvdVwiXG4gICAgICAgICAgICB9KV1cbiAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFByLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogYyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goeV8sIHtcbiAgICAgICAgICAgICAgb25DbGljazogeSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFwiRWRpdCBQcm9maWxlXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pLCAoaCA9PSBudWxsID8gdm9pZCAwIDogaC5sZW5ndGgpICE9PSAwID8gLyogQF9fUFVSRV9fICovIHEuanN4KFBmLCB7XG4gICAgICAgICAgY2hpbGRyZW46IGhcbiAgICAgICAgfSkgOiAvKiBAX19QVVJFX18gKi8gcS5qc3goUGYsIHtcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgcGFkZGluZzogXCIyNnB4IDBweFwiXG4gICAgICAgICAgfVxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhQciwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhEZiwge1xuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdHJvbmdcIiwge1xuICAgICAgICAgICAgICBzdHlsZTogRSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IGZcbiAgICAgICAgICAgIH0pLCBcIiBcIiwgXCJGb2xsb3dpbmdcIl1cbiAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhEZiwge1xuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdHJvbmdcIiwge1xuICAgICAgICAgICAgICBzdHlsZTogRSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IHBcbiAgICAgICAgICAgIH0pLCBcIiBcIiwgXCJGb2xsb3dlcnNcIl1cbiAgICAgICAgICB9KSwgZSAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goSXIsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiYXV0b1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJYywge1xuICAgICAgICAgICAgICB1cmw6IGBodHRwczovL2ZhcmNhc3Rlci54eXovJHtlfWBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pXVxuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59KTtcbmFzeW5jIGZ1bmN0aW9uIFJfKHtcbiAgZmlkOiBzLFxuICB2aWV3ZXJGaWQ6IGUsXG4gIGNsaWVudElkOiB0XG59KSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIGxldCBuID0gYCR7b259L3YyL2ZhcmNhc3Rlci91c2VyL2J1bGs/Y2xpZW50X2lkPSR7dH0mZmlkcz0ke3N9YDtcbiAgICBlICYmIChuICs9IGAmdmlld2VyX2ZpZD0ke2V9YCk7XG4gICAgY29uc3QgbyA9IGF3YWl0IChhd2FpdCBhbihuKSkuanNvbigpO1xuICAgIHJldHVybiAoKHIgPSBvID09IG51bGwgPyB2b2lkIDAgOiBvLnVzZXJzKSA9PSBudWxsID8gdm9pZCAwIDogclswXSkgPz8gbnVsbDtcbiAgfSBjYXRjaCAobikge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgdXNlciBieSBmaWRcIiwgbiksIG51bGw7XG4gIH1cbn1cbmNvbnN0IHZSID0gKHtcbiAgZmlkOiBzLFxuICB2aWV3ZXJGaWQ6IGUsXG4gIGNvbnRhaW5lclN0eWxlczogdFxufSkgPT4ge1xuICB2YXIgaDtcbiAgY29uc3Qge1xuICAgIGNsaWVudF9pZDogclxuICB9ID0gdHMoKSwgW24sIGldID0gcWUobnVsbCksIFtvLCBhXSA9IHFlKCEwKSwgW2wsIGNdID0gcWUobnVsbCksIHUgPSAobiA9PSBudWxsID8gdm9pZCAwIDogbi5maWQpID09PSBlO1xuICBmdCgoKSA9PiB7XG4gICAgcyAmJiAoYSghMCksIGMobnVsbCksIFJfKHtcbiAgICAgIGZpZDogcyxcbiAgICAgIHZpZXdlckZpZDogZSxcbiAgICAgIGNsaWVudElkOiByXG4gICAgfSkudGhlbigoZikgPT4ge1xuICAgICAgaShmKTtcbiAgICB9KS5jYXRjaCgoZikgPT4ge1xuICAgICAgYyhmKTtcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGEoITEpO1xuICAgIH0pKTtcbiAgfSwgW3MsIGVdKTtcbiAgY29uc3QgZCA9IHV0KCgpID0+IHtcbiAgfSwgW10pO1xuICByZXR1cm4gbyA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHBhZGRpbmc6IFwiMjBweFwiXG4gICAgfSxcbiAgICBjaGlsZHJlbjogXCJMb2FkaW5nLi4uXCJcbiAgfSkgOiAhbiB8fCBsID8gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBjaGlsZHJlbjogXCJFcnJvciBmZXRjaGluZyB1c2VyIGRhdGFcIlxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChfXywge1xuICAgIGZpZDogcyxcbiAgICB1c2VybmFtZTogbi51c2VybmFtZSxcbiAgICBkaXNwbGF5TmFtZTogbi5kaXNwbGF5X25hbWUsXG4gICAgYXZhdGFySW1nVXJsOiBuLnBmcF91cmwsXG4gICAgYmlvOiBuLnByb2ZpbGUuYmlvLnRleHQsXG4gICAgZm9sbG93ZXJzOiBuLmZvbGxvd2VyX2NvdW50LFxuICAgIGZvbGxvd2luZzogbi5mb2xsb3dpbmdfY291bnQsXG4gICAgaGFzUG93ZXJCYWRnZTogbi5wb3dlcl9iYWRnZSxcbiAgICBpc093blByb2ZpbGU6IHUsXG4gICAgaXNGb2xsb3dpbmc6IChoID0gbi52aWV3ZXJfY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IGguZm9sbG93ZWRfYnksXG4gICAgb25DYXN0OiBkLFxuICAgIGNvbnRhaW5lclN0eWxlczogdFxuICB9KTtcbn0sIExfID0gLyogQF9fUFVSRV9fICovIGRlKFwidWxcIikoe1xuICBjbGFzc2VzOiBbXCJkMTJyeDRvbVwiXVxufSksIENfID0gLyogQF9fUFVSRV9fICovIGRlKFwibGlcIikoe1xuICBjbGFzc2VzOiBbXCJscnBtNmxwXCJdXG59KSwga18gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJpbWdcIikoe1xuICBjbGFzc2VzOiBbXCJhMWU5aGczYlwiXVxufSksIERfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widTFhcWF5MWlcIl1cbn0pLCBQXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImQxbTBuanFcIl1cbn0pLCBNXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInUxbHZsYnVvXCJdXG59KSwgT18gPSAoe1xuICB1c2VyczogcyxcbiAgb25TZWxlY3Q6IGUsXG4gIGN1c3RvbVN0eWxlczogdCA9IHt9XG59KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goTF8sIHtcbiAgc3R5bGU6IHtcbiAgICAuLi50ID09IG51bGwgPyB2b2lkIDAgOiB0LmRyb3Bkb3duXG4gIH0sXG4gIGNoaWxkcmVuOiBzLm1hcCgocikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhDXywge1xuICAgIHN0eWxlOiB7XG4gICAgICAuLi50ID09IG51bGwgPyB2b2lkIDAgOiB0Lmxpc3RJdGVtXG4gICAgfSxcbiAgICBvbkNsaWNrOiAoKSA9PiBlKHIpLFxuICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KGtfLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICAuLi50ID09IG51bGwgPyB2b2lkIDAgOiB0LmF2YXRhclxuICAgICAgfSxcbiAgICAgIHNyYzogci5wZnBfdXJsLFxuICAgICAgYWx0OiByLnVzZXJuYW1lXG4gICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoRF8sIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIC4uLnQudXNlckluZm9cbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChQXywge1xuICAgICAgICBjaGlsZHJlbjogci5kaXNwbGF5X25hbWVcbiAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKE1fLCB7XG4gICAgICAgIGNoaWxkcmVuOiBbXCJAXCIsIHIudXNlcm5hbWVdXG4gICAgICB9KV1cbiAgICB9KV1cbiAgfSwgci5maWQpKVxufSksIEJfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiYzlobTIwdFwiXVxufSksIEZfID0gLyogQF9fUFVSRV9fICovIGRlKFwiaW5wdXRcIikoe1xuICBjbGFzc2VzOiBbXCJpODBzZDhoXCJdXG59KTtcbmFzeW5jIGZ1bmN0aW9uIE5fKHtcbiAgcTogcyxcbiAgdmlld2VyRmlkOiBlLFxuICBjbGllbnRfaWQ6IHRcbn0pIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgbGV0IG4gPSBgJHtvbn0vdjIvZmFyY2FzdGVyL3VzZXIvc2VhcmNoP3E9JHtzfSZsaW1pdD01JHtlID8gYCZ2aWV3ZXJfZmlkPSR7ZX1gIDogXCJcIn0mY2xpZW50X2lkPSR7dH1gO1xuICAgIGNvbnN0IG8gPSBhd2FpdCAoYXdhaXQgYW4obikpLmpzb24oKTtcbiAgICByZXR1cm4gKChyID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5yZXN1bHQpID09IG51bGwgPyB2b2lkIDAgOiByLnVzZXJzKSB8fCBbXTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmNvbnN0IEVSID0gKHtcbiAgdmFsdWU6IHMsXG4gIG9uQ2hhbmdlOiBlLFxuICBzdHlsZTogdCA9IHt9LFxuICBwbGFjZWhvbGRlcjogciA9IFwiRW50ZXIgdXNlcm5hbWVcIixcbiAgZGlzYWJsZWQ6IG4gPSAhMSxcbiAgdmlld2VyRmlkOiBpLFxuICBjdXN0b21TdHlsZXM6IG8gPSB7fSxcbiAgbGltaXQ6IGEgPSBudWxsXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IGxcbiAgfSA9IHRzKCksIFtjLCB1XSA9IHFlKFwiXCIpLCBbZCwgaF0gPSBxZSghMSksIFtmLCBwXSA9IHFlKFtdKSwgeSA9IGJ0KG51bGwpO1xuICBmdCgoKSA9PiB7XG4gICAgY29uc3QgTSA9IChzID09IG51bGwgPyB2b2lkIDAgOiBzLnNwbGl0KFwiLFwiKSkgfHwgW107XG4gICAgaWYgKCFNW00ubGVuZ3RoIC0gMV0pIHtcbiAgICAgIHUoXCJcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHUoTVtNLmxlbmd0aCAtIDFdLnRyaW0oKSk7XG4gIH0sIFtzXSksIGZ0KCgpID0+IHtcbiAgICBjICE9PSBcIlwiICYmICEvXlxcZCskLy50ZXN0KGMpID8gRShjKSA6IGgoITEpO1xuICB9LCBbY10pO1xuICBjb25zdCBFID0gYXN5bmMgKE0pID0+IHtcbiAgICBjb25zdCBIID0gYXdhaXQgTl8oe1xuICAgICAgcTogTSxcbiAgICAgIHZpZXdlckZpZDogaSxcbiAgICAgIGNsaWVudF9pZDogbFxuICAgIH0pO1xuICAgIEggJiYgKHAoSCksIGgoITApKTtcbiAgfSwgYiA9IChNKSA9PiB7XG4gICAgY29uc3QgSCA9IE0udGFyZ2V0LnZhbHVlO1xuICAgIGUoSCk7XG4gIH0sIFIgPSAoTSkgPT4ge1xuICAgIGxldCBIID0gcy5zcGxpdChcIixcIik7XG4gICAgYSAhPT0gbnVsbCAmJiBILmxlbmd0aCA+PSBhID8gSFtILmxlbmd0aCAtIDFdID0gTS5maWQudG9TdHJpbmcoKSA6IEgucHVzaChNLmZpZC50b1N0cmluZygpKTtcbiAgICBjb25zdCBLID0gSC5qb2luKFwiLFwiKTtcbiAgICBlKEspLCB1KFwiXCIpLCBoKCExKTtcbiAgfSwgQSA9ICgpID0+IHtcbiAgICBjICYmIGlzTmFOKE51bWJlcihjKSkgJiYgaCghMCk7XG4gIH0sIEYgPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiBoKCExKSwgMjAwKTtcbiAgfTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoQl8sIHtcbiAgICBzdHlsZTogdCxcbiAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChGXywge1xuICAgICAgcmVmOiB5LFxuICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICB2YWx1ZTogcyxcbiAgICAgIG9uQ2hhbmdlOiBiLFxuICAgICAgb25Gb2N1czogQSxcbiAgICAgIG9uQmx1cjogRixcbiAgICAgIHBsYWNlaG9sZGVyOiByLFxuICAgICAgZGlzYWJsZWQ6IG5cbiAgICB9KSwgZCAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goT18sIHtcbiAgICAgIHVzZXJzOiBmLFxuICAgICAgb25TZWxlY3Q6IFIsXG4gICAgICBjdXN0b21TdHlsZXM6IG9cbiAgICB9KV1cbiAgfSk7XG59LCBVXyA9ICh7XG4gIGNvbG9yOiBzID0gXCIjODU1RENEXCJcbn0pID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzdmdcIiwge1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB3aWR0aDogXCIyNFwiLFxuICBoZWlnaHQ6IFwiMjRcIixcbiAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHN0cm9rZTogcyxcbiAgXCJzdHJva2Utd2lkdGhcIjogXCIyXCIsXG4gIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICBcInN0cm9rZS1saW5lam9pblwiOiBcInJvdW5kXCIsXG4gIGNsYXNzTmFtZTogXCJsdWNpZGUgbHVjaWRlLXNlYXJjaFwiLFxuICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImNpcmNsZVwiLCB7XG4gICAgY3g6IFwiMTFcIixcbiAgICBjeTogXCIxMVwiLFxuICAgIHI6IFwiOFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0yMSAyMS00LjMtNC4zXCJcbiAgfSldXG59KSwgJF8gPSAoe1xuICBjb2xvcjogcyA9IFwiIzg1NURDRFwiXG59KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB3aWR0aDogXCIyNFwiLFxuICBoZWlnaHQ6IFwiMjRcIixcbiAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHN0cm9rZTogcyxcbiAgXCJzdHJva2Utd2lkdGhcIjogXCIyXCIsXG4gIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICBcInN0cm9rZS1saW5lam9pblwiOiBcInJvdW5kXCIsXG4gIGNsYXNzTmFtZTogXCJsdWNpZGUgbHVjaWRlLWxvYWRlci1jaXJjbGVcIixcbiAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIxIDEyYTkgOSAwIDEgMS02LjIxOS04LjU2XCJcbiAgfSlcbn0pLCBHXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImlnN2tjdWNcIl1cbn0pLCBWXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImlucHV0XCIpKHtcbiAgY2xhc3NlczogW1wic2g3ejdrNlwiXVxufSksIGpfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiczE0YWkyMDNcIl1cbn0pLCBLXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImlmMThuZDZcIl1cbn0pLCBIXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInNkODMzbGJcIl1cbn0pLCBxXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInVnbzU4Nm1cIl1cbn0pLCBXXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInVrd3R5MWRcIl1cbn0pLCB6XyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInU3N29sbXlcIl1cbn0pLCBZXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInMxeHZreHd3XCJdXG59KSwgWl8gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJzMWY2YjFqYVwiXVxufSksIFhfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widWRpdWZkOFwiXVxufSksIEpfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiZjFiOGEyaDBcIl1cbn0pLCBRXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImwxeXEyNmowXCJdXG59KSwgZVIgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJsaVwiKSh7XG4gIGNsYXNzZXM6IFtcInMxOG1rNDdrXCJdXG59KSwgeFIgPSAoe1xuICB3aWR0aDogcyxcbiAgaGVpZ2h0OiBlLFxuICBzZWxlY3RlZFVzZXJzOiB0LFxuICBvblNlbGVjdFVzZXJzOiByLFxuICAuLi5uXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IGlcbiAgfSA9IHRzKCksIHtcbiAgICB1c2VyOiBvLFxuICAgIGlzQXV0aGVudGljYXRlZDogYVxuICB9ID0gRWcoKSwgW2wsIGNdID0gcWUoXCJcIiksIFt1LCBkXSA9IHFlKFtdKSwgW2gsIGZdID0gcWUoITEpLCBwID0gYnQobnVsbCk7XG4gIGZ0KCgpID0+IHtcbiAgICBmdW5jdGlvbiBNKEgpIHtcbiAgICAgIHAuY3VycmVudCAmJiAhcC5jdXJyZW50LmNvbnRhaW5zKEgudGFyZ2V0KSAmJiAoZChbXSksIGMoXCJcIikpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBNKSwgKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBNKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IGIgPSB1dCgoKE0sIEgpID0+IHtcbiAgICBsZXQgSztcbiAgICByZXR1cm4gKC4uLmopID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChLKSwgSyA9IHNldFRpbWVvdXQoKCkgPT4gTSguLi5qKSwgSCk7XG4gICAgfTtcbiAgfSkoYXN5bmMgKE0sIEgpID0+IHtcbiAgICB2YXIgSztcbiAgICBpZiAoIU0pIHtcbiAgICAgIGQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmKCEwKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgQyA9IGF3YWl0IChhd2FpdCBhbihIKSkuanNvbigpO1xuICAgICAgZCgoKEsgPSBDID09IG51bGwgPyB2b2lkIDAgOiBDLnJlc3VsdCkgPT0gbnVsbCA/IHZvaWQgMCA6IEsudXNlcnMpIHx8IFtdKTtcbiAgICB9IGNhdGNoIChqKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZGF0YTpcIiwgaik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGYoITEpO1xuICAgIH1cbiAgfSwgNTAwKSwgW10pLCBSID0gKE0pID0+IHtcbiAgICBjb25zdCBIID0gYCR7b259L3YyL2ZhcmNhc3Rlci91c2VyL3NlYXJjaD9xPSR7TS50YXJnZXQudmFsdWV9JmNsaWVudF9pZD0ke2l9JHthID8gYCZ2aWV3ZXJfZmlkPSR7byA9PSBudWxsID8gdm9pZCAwIDogby5maWR9YCA6IFwiXCJ9KWA7XG4gICAgYyhNLnRhcmdldC52YWx1ZSksIGIoTS50YXJnZXQudmFsdWUsIEgpO1xuICB9LCBBID0gKE0pID0+IHtcbiAgICB0LnNvbWUoKEgpID0+IEgudXNlcm5hbWUgPT09IE0udXNlcm5hbWUpIHx8IChyKFsuLi50LCBNXSksIGMoXCJcIiksIGQoW10pKTtcbiAgfSwgRiA9IChNKSA9PiB7XG4gICAgcih0LmZpbHRlcigoSCkgPT4gSC51c2VybmFtZSAhPT0gTSkpO1xuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4cyhHXywge1xuICAgIHJlZjogcCxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IHNcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhLXywge1xuICAgICAgY2hpbGRyZW46IFt0Lm1hcCgoTSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhIXywge1xuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChZbywge1xuICAgICAgICAgIHNyYzogTS5wZnBfdXJsID8/IGJpLFxuICAgICAgICAgIGFsdDogYCR7TS51c2VybmFtZX0gQXZhdGFyYCxcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IFwiMjRweFwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjI0cHhcIixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1MCVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInNwYW5cIiwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjhweFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlbjogTS5kaXNwbGF5X25hbWVcbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChzbSwge1xuICAgICAgICAgIHNpemU6IDIwLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IEYoTS51c2VybmFtZSlcbiAgICAgICAgfSldXG4gICAgICB9LCBNLnVzZXJuYW1lKSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWV8sIHtcbiAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goWl8sIHtcbiAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFVfLCB7XG4gICAgICAgICAgICBjb2xvcjogXCIjODU1RENEXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFZfLCB7XG4gICAgICAgICAgLi4ubixcbiAgICAgICAgICB2YWx1ZTogbCxcbiAgICAgICAgICBvbkNoYW5nZTogUixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogXCJUeXBlIHRvIHNlYXJjaCB1c2Vyc1wiLFxuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogcyB8fCBcIjEwMCVcIixcbiAgICAgICAgICAgIGhlaWdodDogZSB8fCBcIjQwcHhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSldXG4gICAgICB9KV1cbiAgICB9KSwgaCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChRXywge1xuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeCgkXywge1xuICAgICAgICBjb2xvcjogXCIjODU1RENEXCJcbiAgICAgIH0pXG4gICAgfSkgOiB1Lmxlbmd0aCAhPT0gMCAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goal8sIHtcbiAgICAgIGNoaWxkcmVuOiB1Lm1hcCgoTSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhlUiwge1xuICAgICAgICBvbkNsaWNrOiAoKSA9PiBBKE0pLFxuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChZbywge1xuICAgICAgICAgIHNyYzogTS5wZnBfdXJsID8/IGJpLFxuICAgICAgICAgIGFsdDogYCR7TS51c2VybmFtZX0gQXZhdGFyYCxcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IFwiNDBweFwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjQwcHhcIixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1MCVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocV8sIHtcbiAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChXXywge1xuICAgICAgICAgICAgY2hpbGRyZW46IE0uZGlzcGxheV9uYW1lXG4gICAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWF8sIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyh6Xywge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogW1wiQFwiLCBNLnVzZXJuYW1lXVxuICAgICAgICAgICAgfSksIE0udmlld2VyX2NvbnRleHQgJiYgKE0udmlld2VyX2NvbnRleHQuZm9sbG93aW5nIHx8IE0udmlld2VyX2NvbnRleHQuZm9sbG93ZWRfYnkpICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChKXywge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogTS52aWV3ZXJfY29udGV4dC5mb2xsb3dpbmcgJiYgTS52aWV3ZXJfY29udGV4dC5mb2xsb3dlZF9ieSA/IFwiRm9sbG93aW5nIGVhY2ggb3RoZXJcIiA6IE0udmlld2VyX2NvbnRleHQuZm9sbG93aW5nID8gXCJGb2xsb3dpbmdcIiA6IE0udmlld2VyX2NvbnRleHQuZm9sbG93ZWRfYnkgPyBcIkZvbGxvd3MgeW91XCIgOiBudWxsXG4gICAgICAgICAgICB9KV1cbiAgICAgICAgICB9KV1cbiAgICAgICAgfSldXG4gICAgICB9LCBNLnVzZXJuYW1lKSlcbiAgICB9KV1cbiAgfSk7XG59O1xuZXhwb3J0IHtcbiAgb2EgYXMgQ2FzdENhcmQsXG4gIGRSIGFzIE1pbmlBcHBQcm92aWRlcixcbiAgcFMgYXMgTmV5bmFyQXV0aEJ1dHRvbixcbiAgeFIgYXMgTmV5bmFyQXV0b0NvbXBsZXRlVXNlcixcbiAgUkEgYXMgTmV5bmFyQ2FzdENhcmQsXG4gIGZSIGFzIE5leW5hckNvbnRleHRQcm92aWRlcixcbiAgbVIgYXMgTmV5bmFyQ29udmVyc2F0aW9uTGlzdCxcbiAgeVIgYXMgTmV5bmFyRmVlZExpc3QsXG4gIGFJIGFzIE5leW5hckZyYW1lQ2FyZCxcbiAgdlIgYXMgTmV5bmFyUHJvZmlsZUNhcmQsXG4gIEVSIGFzIE5leW5hclVzZXJEcm9wZG93bixcbiAgZ3MgYXMgU0lXTl92YXJpYW50LFxuICB5ZyBhcyBUaGVtZSxcbiAgZHUgYXMgdXNlTG9jYWxTdG9yYWdlLFxuICBoUiBhcyB1c2VNaW5pQXBwLFxuICB0cyBhcyB1c2VOZXluYXJDb250ZXh0XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs": /*!******************************************************************!*\ !*** ./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs ***! \******************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ styled: () => (/* binding */ styled)\n/* harmony export */ });\n/* harmony import */ var _chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chunk-L25ZX2YK.mjs */ \"(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @emotion/is-prop-valid */ \"(app-pages-browser)/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\n\n\n\n\n\n\n/**\n * @pigment-css/react v0.0.30\n *\n * @license MIT\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n \nfunction getVariantClasses(_a, variants) {\n var _b = _a, { ownerState = {} } = _b, componentProps = (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__objRest)(_b, [\"ownerState\"]);\n const variantClasses = variants.filter(\n ({ props: variantProps }) => typeof variantProps === \"function\" ? variantProps((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadProps)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)({}, componentProps), ownerState), { ownerState })) : Object.entries(variantProps).every(([propKey, propValue]) => {\n return ownerState[propKey] === propValue || componentProps[propKey] === propValue;\n })\n ).map(({ className }) => className);\n return variantClasses;\n}\nfunction isHtmlTag(tag) {\n return typeof tag === \"string\" && // 96 is one less than the char code\n // for \"a\" so this is checking that\n // it's a lowercase character\n tag.charCodeAt(0) > 96;\n}\nvar slotShouldForwardProp = (key) => key !== \"as\" && key !== \"ownerState\";\nvar rootShouldForwardProp = (key) => slotShouldForwardProp(key) && key !== \"classes\";\nfunction styled(tag, componentMeta = {}) {\n const { name, slot, shouldForwardProp } = componentMeta;\n let finalShouldForwardProp = shouldForwardProp;\n if (!shouldForwardProp) {\n if (isHtmlTag(tag)) {\n finalShouldForwardProp = _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n } else if (slot === \"Root\" || slot === \"root\") {\n finalShouldForwardProp = rootShouldForwardProp;\n } else {\n finalShouldForwardProp = slotShouldForwardProp;\n }\n }\n let shouldUseAs = !finalShouldForwardProp(\"as\");\n if (typeof tag !== \"string\" && tag.__styled_by_pigment_css) {\n shouldUseAs = false;\n }\n function scopedStyledWithOptions(options = {}) {\n const { displayName, classes = [], vars: cssVars = {}, variants = [] } = options;\n const StyledComponent = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function StyledComponent2(inProps, ref) {\n const _a = inProps, { className, sx, style, ownerState } = _a, props = (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__objRest)(_a, [\"className\", \"sx\", \"style\", \"ownerState\"]);\n const Component = shouldUseAs && inProps.as || tag;\n const varStyles = Object.entries(cssVars).reduce(\n (acc, [cssVariable, [variableFunction, isUnitLess]]) => {\n const value = variableFunction(inProps);\n if (typeof value === \"undefined\") {\n return acc;\n }\n if (typeof value === \"string\" || isUnitLess) {\n acc[`--${cssVariable}`] = value;\n } else {\n acc[`--${cssVariable}`] = `${value}px`;\n }\n return acc;\n },\n {}\n );\n const finalClassName = (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(classes, className, getVariantClasses(inProps, variants));\n if (inProps.as && !shouldForwardProp) {\n if (!isHtmlTag(Component)) {\n if (slot === \"Root\" || slot === \"root\") {\n finalShouldForwardProp = rootShouldForwardProp;\n } else {\n finalShouldForwardProp = slotShouldForwardProp;\n }\n }\n }\n const newProps = {};\n for (const key in props) {\n if (shouldUseAs && key === \"as\") {\n continue;\n }\n if (finalShouldForwardProp(key) || !shouldUseAs && key === \"as\") {\n newProps[key] = props[key];\n }\n }\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\n Component,\n (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadProps)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)({}, newProps), Component.__styled_by_pigment_css && { ownerState }), {\n ref,\n className: finalClassName,\n style: (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)({}, varStyles), style)\n })\n );\n });\n let componentName = displayName;\n if (!componentName && name) {\n componentName = `${name}${slot ? `-${slot}` : \"\"}`;\n }\n StyledComponent.displayName = `Styled(${componentName})`;\n StyledComponent.__styled_by_pigment_css = true;\n return StyledComponent;\n }\n return scopedStyledWithOptions;\n}\n\n\n//# sourceMappingURL=chunk-AFZBAV6Q.mjs.map\n//# sourceMappingURL=chunk-AFZBAV6Q.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcGlnbWVudC1jc3MvcmVhY3QvYnVpbGQvY2h1bmstQUZaQkFWNlEubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFnRjtBQUNqRDtBQUNQO0FBQ3lCO0FBQ1Q7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0IsdUJBQXVCLDhEQUFTO0FBQ25FO0FBQ0EsT0FBTyxxQkFBcUIsdURBQXVELGtFQUFhLENBQUMsbUVBQWMsQ0FBQyxtRUFBYyxHQUFHLGtDQUFrQyxZQUFZO0FBQy9LO0FBQ0EsS0FBSztBQUNMLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxVQUFVLGdDQUFnQztBQUMxQztBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsOERBQVc7QUFDMUMsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLFlBQVksNkNBQTZDLGtCQUFrQjtBQUMzRSw0QkFBNEIsNkNBQWdCO0FBQzVDLDRCQUE0QixtQ0FBbUMsY0FBYyw4REFBUztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFlBQVk7QUFDakMsWUFBWTtBQUNaLHFCQUFxQixZQUFZLFFBQVEsTUFBTTtBQUMvQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw2QkFBNkIsZ0RBQUk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsc0RBQUc7QUFDaEM7QUFDQSxRQUFRLGtFQUFhLENBQUMsbUVBQWMsQ0FBQyxtRUFBYyxHQUFHLG9EQUFvRCxZQUFZO0FBQ3RIO0FBQ0E7QUFDQSxpQkFBaUIsbUVBQWMsQ0FBQyxtRUFBYyxHQUFHO0FBQ2pELFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EseUJBQXlCLEtBQUssRUFBRSxXQUFXLEtBQUssT0FBTztBQUN2RDtBQUNBLDRDQUE0QyxjQUFjO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtCO0FBQ2xCO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHBpZ21lbnQtY3NzL3JlYWN0L2J1aWxkL2NodW5rLUFGWkJBVjZRLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX29ialJlc3QsIF9fc3ByZWFkUHJvcHMsIF9fc3ByZWFkVmFsdWVzIH0gZnJvbSAnLi9jaHVuay1MMjVaWDJZSy5tanMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgaXNQcm9wVmFsaWQgZnJvbSAnQGVtb3Rpb24vaXMtcHJvcC12YWxpZCc7XG5pbXBvcnQgeyBqc3ggfSBmcm9tICdyZWFjdC9qc3gtcnVudGltZSc7XG5cbi8qKlxuICAqIEBwaWdtZW50LWNzcy9yZWFjdCB2MC4wLjMwXG4gICpcbiAgKiBAbGljZW5zZSBNSVRcbiAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gICovXG4gXG5mdW5jdGlvbiBnZXRWYXJpYW50Q2xhc3NlcyhfYSwgdmFyaWFudHMpIHtcbiAgdmFyIF9iID0gX2EsIHsgb3duZXJTdGF0ZSA9IHt9IH0gPSBfYiwgY29tcG9uZW50UHJvcHMgPSBfX29ialJlc3QoX2IsIFtcIm93bmVyU3RhdGVcIl0pO1xuICBjb25zdCB2YXJpYW50Q2xhc3NlcyA9IHZhcmlhbnRzLmZpbHRlcihcbiAgICAoeyBwcm9wczogdmFyaWFudFByb3BzIH0pID0+IHR5cGVvZiB2YXJpYW50UHJvcHMgPT09IFwiZnVuY3Rpb25cIiA/IHZhcmlhbnRQcm9wcyhfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBjb21wb25lbnRQcm9wcyksIG93bmVyU3RhdGUpLCB7IG93bmVyU3RhdGUgfSkpIDogT2JqZWN0LmVudHJpZXModmFyaWFudFByb3BzKS5ldmVyeSgoW3Byb3BLZXksIHByb3BWYWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBvd25lclN0YXRlW3Byb3BLZXldID09PSBwcm9wVmFsdWUgfHwgY29tcG9uZW50UHJvcHNbcHJvcEtleV0gPT09IHByb3BWYWx1ZTtcbiAgICB9KVxuICApLm1hcCgoeyBjbGFzc05hbWUgfSkgPT4gY2xhc3NOYW1lKTtcbiAgcmV0dXJuIHZhcmlhbnRDbGFzc2VzO1xufVxuZnVuY3Rpb24gaXNIdG1sVGFnKHRhZykge1xuICByZXR1cm4gdHlwZW9mIHRhZyA9PT0gXCJzdHJpbmdcIiAmJiAvLyA5NiBpcyBvbmUgbGVzcyB0aGFuIHRoZSBjaGFyIGNvZGVcbiAgLy8gZm9yIFwiYVwiIHNvIHRoaXMgaXMgY2hlY2tpbmcgdGhhdFxuICAvLyBpdCdzIGEgbG93ZXJjYXNlIGNoYXJhY3RlclxuICB0YWcuY2hhckNvZGVBdCgwKSA+IDk2O1xufVxudmFyIHNsb3RTaG91bGRGb3J3YXJkUHJvcCA9IChrZXkpID0+IGtleSAhPT0gXCJhc1wiICYmIGtleSAhPT0gXCJvd25lclN0YXRlXCI7XG52YXIgcm9vdFNob3VsZEZvcndhcmRQcm9wID0gKGtleSkgPT4gc2xvdFNob3VsZEZvcndhcmRQcm9wKGtleSkgJiYga2V5ICE9PSBcImNsYXNzZXNcIjtcbmZ1bmN0aW9uIHN0eWxlZCh0YWcsIGNvbXBvbmVudE1ldGEgPSB7fSkge1xuICBjb25zdCB7IG5hbWUsIHNsb3QsIHNob3VsZEZvcndhcmRQcm9wIH0gPSBjb21wb25lbnRNZXRhO1xuICBsZXQgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHNob3VsZEZvcndhcmRQcm9wO1xuICBpZiAoIXNob3VsZEZvcndhcmRQcm9wKSB7XG4gICAgaWYgKGlzSHRtbFRhZyh0YWcpKSB7XG4gICAgICBmaW5hbFNob3VsZEZvcndhcmRQcm9wID0gaXNQcm9wVmFsaWQ7XG4gICAgfSBlbHNlIGlmIChzbG90ID09PSBcIlJvb3RcIiB8fCBzbG90ID09PSBcInJvb3RcIikge1xuICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHJvb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHNsb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICB9XG4gIH1cbiAgbGV0IHNob3VsZFVzZUFzID0gIWZpbmFsU2hvdWxkRm9yd2FyZFByb3AoXCJhc1wiKTtcbiAgaWYgKHR5cGVvZiB0YWcgIT09IFwic3RyaW5nXCIgJiYgdGFnLl9fc3R5bGVkX2J5X3BpZ21lbnRfY3NzKSB7XG4gICAgc2hvdWxkVXNlQXMgPSBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiBzY29wZWRTdHlsZWRXaXRoT3B0aW9ucyhvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGRpc3BsYXlOYW1lLCBjbGFzc2VzID0gW10sIHZhcnM6IGNzc1ZhcnMgPSB7fSwgdmFyaWFudHMgPSBbXSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBTdHlsZWRDb21wb25lbnQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFN0eWxlZENvbXBvbmVudDIoaW5Qcm9wcywgcmVmKSB7XG4gICAgICBjb25zdCBfYSA9IGluUHJvcHMsIHsgY2xhc3NOYW1lLCBzeCwgc3R5bGUsIG93bmVyU3RhdGUgfSA9IF9hLCBwcm9wcyA9IF9fb2JqUmVzdChfYSwgW1wiY2xhc3NOYW1lXCIsIFwic3hcIiwgXCJzdHlsZVwiLCBcIm93bmVyU3RhdGVcIl0pO1xuICAgICAgY29uc3QgQ29tcG9uZW50ID0gc2hvdWxkVXNlQXMgJiYgaW5Qcm9wcy5hcyB8fCB0YWc7XG4gICAgICBjb25zdCB2YXJTdHlsZXMgPSBPYmplY3QuZW50cmllcyhjc3NWYXJzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIFtjc3NWYXJpYWJsZSwgW3ZhcmlhYmxlRnVuY3Rpb24sIGlzVW5pdExlc3NdXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVGdW5jdGlvbihpblByb3BzKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IGlzVW5pdExlc3MpIHtcbiAgICAgICAgICAgIGFjY1tgLS0ke2Nzc1ZhcmlhYmxlfWBdID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1tgLS0ke2Nzc1ZhcmlhYmxlfWBdID0gYCR7dmFsdWV9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZpbmFsQ2xhc3NOYW1lID0gY2xzeChjbGFzc2VzLCBjbGFzc05hbWUsIGdldFZhcmlhbnRDbGFzc2VzKGluUHJvcHMsIHZhcmlhbnRzKSk7XG4gICAgICBpZiAoaW5Qcm9wcy5hcyAmJiAhc2hvdWxkRm9yd2FyZFByb3ApIHtcbiAgICAgICAgaWYgKCFpc0h0bWxUYWcoQ29tcG9uZW50KSkge1xuICAgICAgICAgIGlmIChzbG90ID09PSBcIlJvb3RcIiB8fCBzbG90ID09PSBcInJvb3RcIikge1xuICAgICAgICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHJvb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHNsb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1Byb3BzID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAoc2hvdWxkVXNlQXMgJiYga2V5ID09PSBcImFzXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluYWxTaG91bGRGb3J3YXJkUHJvcChrZXkpIHx8ICFzaG91bGRVc2VBcyAmJiBrZXkgPT09IFwiYXNcIikge1xuICAgICAgICAgIG5ld1Byb3BzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBuZXdQcm9wcyksIENvbXBvbmVudC5fX3N0eWxlZF9ieV9waWdtZW50X2NzcyAmJiB7IG93bmVyU3RhdGUgfSksIHtcbiAgICAgICAgICByZWYsXG4gICAgICAgICAgY2xhc3NOYW1lOiBmaW5hbENsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogX19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sIHZhclN0eWxlcyksIHN0eWxlKVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBsZXQgY29tcG9uZW50TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIGlmICghY29tcG9uZW50TmFtZSAmJiBuYW1lKSB7XG4gICAgICBjb21wb25lbnROYW1lID0gYCR7bmFtZX0ke3Nsb3QgPyBgLSR7c2xvdH1gIDogXCJcIn1gO1xuICAgIH1cbiAgICBTdHlsZWRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBgU3R5bGVkKCR7Y29tcG9uZW50TmFtZX0pYDtcbiAgICBTdHlsZWRDb21wb25lbnQuX19zdHlsZWRfYnlfcGlnbWVudF9jc3MgPSB0cnVlO1xuICAgIHJldHVybiBTdHlsZWRDb21wb25lbnQ7XG4gIH1cbiAgcmV0dXJuIHNjb3BlZFN0eWxlZFdpdGhPcHRpb25zO1xufVxuXG5leHBvcnQgeyBzdHlsZWQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUFGWkJBVjZRLm1qcy5tYXBcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUFGWkJBVjZRLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs": /*!******************************************************************!*\ !*** ./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs ***! \******************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ __objRest: () => (/* binding */ __objRest),\n/* harmony export */ __spreadProps: () => (/* binding */ __spreadProps),\n/* harmony export */ __spreadValues: () => (/* binding */ __spreadValues)\n/* harmony export */ });\n/**\n * @pigment-css/react v0.0.30\n *\n * @license MIT\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n \nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n\n//# sourceMappingURL=chunk-L25ZX2YK.mjs.map\n//# sourceMappingURL=chunk-L25ZX2YK.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcGlnbWVudC1jc3MvcmVhY3QvYnVpbGQvY2h1bmstTDI1WlgyWUsubWpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEUsNkRBQTZEO0FBQzNJO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVvRDtBQUNwRDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BwaWdtZW50LWNzcy9yZWFjdC9idWlsZC9jaHVuay1MMjVaWDJZSy5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gICogQHBpZ21lbnQtY3NzL3JlYWN0IHYwLjAuMzBcbiAgKlxuICAqIEBsaWNlbnNlIE1JVFxuICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAgKi9cbiBcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19kZWZQcm9wcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xudmFyIF9fZ2V0T3duUHJvcERlc2NzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX3NwcmVhZFByb3BzID0gKGEsIGIpID0+IF9fZGVmUHJvcHMoYSwgX19nZXRPd25Qcm9wRGVzY3MoYikpO1xudmFyIF9fb2JqUmVzdCA9IChzb3VyY2UsIGV4Y2x1ZGUpID0+IHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoc291cmNlLCBwcm9wKSAmJiBleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwKVxuICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICBpZiAoc291cmNlICE9IG51bGwgJiYgX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoc291cmNlKSkge1xuICAgICAgaWYgKGV4Y2x1ZGUuaW5kZXhPZihwcm9wKSA8IDAgJiYgX19wcm9wSXNFbnVtLmNhbGwoc291cmNlLCBwcm9wKSlcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbmV4cG9ydCB7IF9fb2JqUmVzdCwgX19zcHJlYWRQcm9wcywgX19zcHJlYWRWYWx1ZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUwyNVpYMllLLm1qcy5tYXBcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUwyNVpYMllLLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-avatar/dist/index.mjs": /*!************************************************************!*\ !*** ./node_modules/@radix-ui/react-avatar/dist/index.mjs ***! \************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Avatar: () => (/* binding */ Avatar),\n/* harmony export */ AvatarFallback: () => (/* binding */ AvatarFallback),\n/* harmony export */ AvatarImage: () => (/* binding */ AvatarImage),\n/* harmony export */ Fallback: () => (/* binding */ Fallback),\n/* harmony export */ Image: () => (/* binding */ Image),\n/* harmony export */ Root: () => (/* binding */ Root),\n/* harmony export */ createAvatarScope: () => (/* binding */ createAvatarScope)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var _radix_ui_react_context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @radix-ui/react-context */ \"(app-pages-browser)/./node_modules/@radix-ui/react-context/dist/index.mjs\");\n/* harmony import */ var _radix_ui_react_use_callback_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ \"(app-pages-browser)/./node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs\");\n/* harmony import */ var _radix_ui_react_use_layout_effect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @radix-ui/react-use-layout-effect */ \"(app-pages-browser)/./node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs\");\n/* harmony import */ var _radix_ui_react_primitive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @radix-ui/react-primitive */ \"(app-pages-browser)/./node_modules/@radix-ui/react-primitive/dist/index.mjs\");\n/* harmony import */ var _radix_ui_react_use_is_hydrated__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @radix-ui/react-use-is-hydrated */ \"(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/dist/index.mjs\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\n/* __next_internal_client_entry_do_not_use__ Avatar,AvatarFallback,AvatarImage,Fallback,Image,Root,createAvatarScope auto */ var _s = $RefreshSig$(), _s1 = $RefreshSig$(), _s2 = $RefreshSig$(), _s3 = $RefreshSig$();\n// src/avatar.tsx\n\n\n\n\n\n\n\nvar AVATAR_NAME = \"Avatar\";\nvar [createAvatarContext, createAvatarScope] = (0,_radix_ui_react_context__WEBPACK_IMPORTED_MODULE_2__.createContextScope)(AVATAR_NAME);\nvar [AvatarProvider, useAvatarContext] = createAvatarContext(AVATAR_NAME);\nvar Avatar = /*#__PURE__*/ _s(react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(_c = _s((props, forwardedRef)=>{\n _s();\n const { __scopeAvatar, ...avatarProps } = props;\n const [imageLoadingStatus, setImageLoadingStatus] = react__WEBPACK_IMPORTED_MODULE_0__.useState(\"idle\");\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(AvatarProvider, {\n scope: __scopeAvatar,\n imageLoadingStatus,\n onImageLoadingStatusChange: setImageLoadingStatus,\n children: /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_radix_ui_react_primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive.span, {\n ...avatarProps,\n ref: forwardedRef\n })\n });\n}, \"LArj5vvXGSJ1qfdOqtP5F0s7/3k=\")), \"LArj5vvXGSJ1qfdOqtP5F0s7/3k=\");\n_c1 = Avatar;\nAvatar.displayName = AVATAR_NAME;\nvar IMAGE_NAME = \"AvatarImage\";\nvar AvatarImage = /*#__PURE__*/ _s1(react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(_c2 = _s1((props, forwardedRef)=>{\n _s1();\n const { __scopeAvatar, src, onLoadingStatusChange = ()=>{}, ...imageProps } = props;\n const context = useAvatarContext(IMAGE_NAME, __scopeAvatar);\n const imageLoadingStatus = useImageLoadingStatus(src, imageProps);\n const handleLoadingStatusChange = (0,_radix_ui_react_use_callback_ref__WEBPACK_IMPORTED_MODULE_4__.useCallbackRef)({\n \"AvatarImage.useCallbackRef[handleLoadingStatusChange]\": (status)=>{\n onLoadingStatusChange(status);\n context.onImageLoadingStatusChange(status);\n }\n }[\"AvatarImage.useCallbackRef[handleLoadingStatusChange]\"]);\n (0,_radix_ui_react_use_layout_effect__WEBPACK_IMPORTED_MODULE_5__.useLayoutEffect)({\n \"AvatarImage.useLayoutEffect\": ()=>{\n if (imageLoadingStatus !== \"idle\") {\n handleLoadingStatusChange(imageLoadingStatus);\n }\n }\n }[\"AvatarImage.useLayoutEffect\"], [\n imageLoadingStatus,\n handleLoadingStatusChange\n ]);\n return imageLoadingStatus === \"loaded\" ? /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_radix_ui_react_primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive.img, {\n ...imageProps,\n ref: forwardedRef,\n src\n }) : null;\n}, \"pLqDpzOvi4to5gZ7rBbQ5hdybXk=\", false, function() {\n return [\n useAvatarContext,\n useImageLoadingStatus,\n _radix_ui_react_use_callback_ref__WEBPACK_IMPORTED_MODULE_4__.useCallbackRef\n ];\n})), \"pLqDpzOvi4to5gZ7rBbQ5hdybXk=\", false, function() {\n return [\n useAvatarContext,\n useImageLoadingStatus,\n _radix_ui_react_use_callback_ref__WEBPACK_IMPORTED_MODULE_4__.useCallbackRef\n ];\n});\n_c3 = AvatarImage;\nAvatarImage.displayName = IMAGE_NAME;\nvar FALLBACK_NAME = \"AvatarFallback\";\nvar AvatarFallback = /*#__PURE__*/ _s2(react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(_c4 = _s2((props, forwardedRef)=>{\n _s2();\n const { __scopeAvatar, delayMs, ...fallbackProps } = props;\n const context = useAvatarContext(FALLBACK_NAME, __scopeAvatar);\n const [canRender, setCanRender] = react__WEBPACK_IMPORTED_MODULE_0__.useState(delayMs === void 0);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"AvatarFallback.useEffect\": ()=>{\n if (delayMs !== void 0) {\n const timerId = window.setTimeout({\n \"AvatarFallback.useEffect.timerId\": ()=>setCanRender(true)\n }[\"AvatarFallback.useEffect.timerId\"], delayMs);\n return ({\n \"AvatarFallback.useEffect\": ()=>window.clearTimeout(timerId)\n })[\"AvatarFallback.useEffect\"];\n }\n }\n }[\"AvatarFallback.useEffect\"], [\n delayMs\n ]);\n return canRender && context.imageLoadingStatus !== \"loaded\" ? /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_radix_ui_react_primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive.span, {\n ...fallbackProps,\n ref: forwardedRef\n }) : null;\n}, \"IfNhTzYfBBOb8/Nn5G9fJj5kYTk=\", false, function() {\n return [\n useAvatarContext\n ];\n})), \"IfNhTzYfBBOb8/Nn5G9fJj5kYTk=\", false, function() {\n return [\n useAvatarContext\n ];\n});\n_c5 = AvatarFallback;\nAvatarFallback.displayName = FALLBACK_NAME;\nfunction resolveLoadingStatus(image, src) {\n if (!image) {\n return \"idle\";\n }\n if (!src) {\n return \"error\";\n }\n if (image.src !== src) {\n image.src = src;\n }\n return image.complete && image.naturalWidth > 0 ? \"loaded\" : \"loading\";\n}\nfunction useImageLoadingStatus(src, param) {\n let { referrerPolicy, crossOrigin } = param;\n _s3();\n const isHydrated = (0,_radix_ui_react_use_is_hydrated__WEBPACK_IMPORTED_MODULE_6__.useIsHydrated)();\n const imageRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const image = (()=>{\n if (!isHydrated) return null;\n if (!imageRef.current) {\n imageRef.current = new window.Image();\n }\n return imageRef.current;\n })();\n const [loadingStatus, setLoadingStatus] = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n \"useImageLoadingStatus.useState\": ()=>resolveLoadingStatus(image, src)\n }[\"useImageLoadingStatus.useState\"]);\n (0,_radix_ui_react_use_layout_effect__WEBPACK_IMPORTED_MODULE_5__.useLayoutEffect)({\n \"useImageLoadingStatus.useLayoutEffect\": ()=>{\n setLoadingStatus(resolveLoadingStatus(image, src));\n }\n }[\"useImageLoadingStatus.useLayoutEffect\"], [\n image,\n src\n ]);\n (0,_radix_ui_react_use_layout_effect__WEBPACK_IMPORTED_MODULE_5__.useLayoutEffect)({\n \"useImageLoadingStatus.useLayoutEffect\": ()=>{\n const updateStatus = {\n \"useImageLoadingStatus.useLayoutEffect.updateStatus\": (status)=>({\n \"useImageLoadingStatus.useLayoutEffect.updateStatus\": ()=>{\n setLoadingStatus(status);\n }\n })[\"useImageLoadingStatus.useLayoutEffect.updateStatus\"]\n }[\"useImageLoadingStatus.useLayoutEffect.updateStatus\"];\n if (!image) return;\n const handleLoad = updateStatus(\"loaded\");\n const handleError = updateStatus(\"error\");\n image.addEventListener(\"load\", handleLoad);\n image.addEventListener(\"error\", handleError);\n if (referrerPolicy) {\n image.referrerPolicy = referrerPolicy;\n }\n if (typeof crossOrigin === \"string\") {\n image.crossOrigin = crossOrigin;\n }\n return ({\n \"useImageLoadingStatus.useLayoutEffect\": ()=>{\n image.removeEventListener(\"load\", handleLoad);\n image.removeEventListener(\"error\", handleError);\n }\n })[\"useImageLoadingStatus.useLayoutEffect\"];\n }\n }[\"useImageLoadingStatus.useLayoutEffect\"], [\n image,\n crossOrigin,\n referrerPolicy\n ]);\n return loadingStatus;\n}\n_s3(useImageLoadingStatus, \"fZEI7eZCDqTrGSJ1GemOA0/EJNg=\", false, function() {\n return [\n _radix_ui_react_use_is_hydrated__WEBPACK_IMPORTED_MODULE_6__.useIsHydrated\n ];\n});\nvar Root = Avatar;\nvar Image = AvatarImage;\nvar Fallback = AvatarFallback;\n //# sourceMappingURL=index.mjs.map\nvar _c, _c1, _c2, _c3, _c4, _c5;\n$RefreshReg$(_c, \"Avatar$React.forwardRef\");\n$RefreshReg$(_c1, \"Avatar\");\n$RefreshReg$(_c2, \"AvatarImage$React.forwardRef\");\n$RefreshReg$(_c3, \"AvatarImage\");\n$RefreshReg$(_c4, \"AvatarFallback$React.forwardRef\");\n$RefreshReg$(_c5, \"AvatarFallback\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtYXZhdGFyL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUI7QUFDWTtBQUNKO0FBQ0M7QUFDTjtBQUNJO0FBb0N0QjtBQTVCUixJQUFNLGNBQWM7QUFHcEIsSUFBTSxDQUFDLHFCQUFxQixpQkFBaUIsSUFBSSwyRUFBa0IsQ0FBQyxXQUFXO0FBUy9FLElBQU0sQ0FBQyxnQkFBZ0IsZ0JBQWdCLElBQUksb0JBQXdDLFdBQVc7QUFNOUYsSUFBTSx1QkFBZSx5REFDbkIsQ0FBQyxPQUFpQzs7SUFDaEMsTUFBTSxFQUFFLGVBQWUsR0FBRyxZQUFZLElBQUk7SUFDMUMsTUFBTSxDQUFDLG9CQUFvQixxQkFBcUIsSUFBVSw0Q0FBNkIsTUFBTTtJQUM3RixPQUNFLHVFQUFDO1FBQ0MsT0FBTztRQUNQO1FBQ0EsNEJBQTRCO1FBRTVCLGlGQUFDLGdFQUFTLENBQUMsTUFBVjtZQUFnQixHQUFHO1lBQWEsS0FBSztRQUFBLENBQWM7SUFBQTtBQUcxRDs7QUFHRixPQUFPLGNBQWM7QUFNckIsSUFBTSxhQUFhO0FBUW5CLElBQU0sZ0NBQW9CLHdEQUN4QixDQUFDLE9BQXNDOztJQUNyQyxNQUFNLEVBQUUsZUFBZSxLQUFLLHdCQUF3QixLQUFPLENBQUQsRUFBSSxHQUFHLFdBQVcsSUFBSTtJQUNoRixNQUFNLDJCQUEyQixZQUFZLGFBQWE7SUFDMUQsTUFBTSwyQ0FBMkMsS0FBSyxVQUFVO0lBQ2hFLE1BQU0sNEJBQTRCLGdGQUFjO2lFQUFDLENBQUM7WUFDaEQsc0JBQXNCLE1BQU07WUFDNUIsUUFBUSwyQkFBMkIsTUFBTTtRQUMzQyxDQUFDOztJQUVELGtGQUFlO3VDQUFDO1lBQ2QsSUFBSSx1QkFBdUIsUUFBUTtnQkFDakMsMEJBQTBCLGtCQUFrQjtZQUM5QztRQUNGO3NDQUFHO1FBQUM7UUFBb0IseUJBQXlCO0tBQUM7SUFFbEQsT0FBTyx1QkFBdUIsV0FDNUIsdUVBQUMsZ0VBQVMsQ0FBQyxLQUFWO1FBQWUsR0FBRztRQUFZLEtBQUs7UUFBYztJQUFBLENBQVUsSUFDMUQ7QUFDTjs7Ozs7Ozs7UUFoQmtCO1FBQ1c7UUFDTyw0RUFBYzs7OztBQWlCcEQsWUFBWSxjQUFjO0FBTTFCLElBQU0sZ0JBQWdCO0FBT3RCLElBQU0sbUNBQXVCLHdEQUMzQixDQUFDLE9BQXlDOztJQUN4QyxNQUFNLEVBQUUsZUFBZSxTQUFTLEdBQUcsY0FBYyxJQUFJO0lBQ3JELE1BQU0sMkJBQTJCLGVBQWUsYUFBYTtJQUM3RCxNQUFNLENBQUMsV0FBVyxZQUFZLElBQVUsNENBQVMsWUFBWSxNQUFTO0lBRWhFO29DQUFVO1lBQ2QsSUFBSSxZQUFZLFFBQVc7Z0JBQ3pCLE1BQU0sVUFBVSxPQUFPO3dEQUFXLElBQU0sYUFBYSxJQUFJO3VEQUFHLE9BQU87Z0JBQ25FO2dEQUFPLElBQU0sT0FBTyxhQUFhLE9BQU87O1lBQzFDO1FBQ0Y7bUNBQUc7UUFBQyxPQUFPO0tBQUM7SUFFWixPQUFPLGFBQWEsUUFBUSx1QkFBdUIsV0FDakQsdUVBQUMsZ0VBQVMsQ0FBQyxNQUFWO1FBQWdCLEdBQUc7UUFBZSxLQUFLO0lBQUEsQ0FBYyxJQUNwRDtBQUNOOzs7Ozs7UUFia0I7Ozs7QUFnQnBCLGVBQWUsY0FBYztBQUk3QixTQUFTLHFCQUFxQixPQUFnQyxLQUFrQztJQUM5RixJQUFJLENBQUMsT0FBTztRQUNWLE9BQU87SUFDVDtJQUNBLElBQUksQ0FBQyxLQUFLO1FBQ1IsT0FBTztJQUNUO0lBQ0EsSUFBSSxNQUFNLFFBQVEsS0FBSztRQUNyQixNQUFNLE1BQU07SUFDZDtJQUNBLE9BQU8sTUFBTSxZQUFZLE1BQU0sZUFBZSxJQUFJLFdBQVc7QUFDL0Q7QUFFQSwrQkFDRSxVQUM4QjtVQUE1QixnQkFBZ0IsWUFBWSxHQUM5QixDQURBOztJQUVBLE1BQU0sYUFBYSw4RUFBYTtJQUNoQyxNQUFNLFdBQWlCLDBDQUFnQyxJQUFJO0lBQzNELE1BQU0sY0FBZTtRQUNuQixJQUFJLENBQUMsV0FBWSxRQUFPO1FBQ3hCLElBQUksQ0FBQyxTQUFTLFNBQVM7WUFDckIsU0FBUyxVQUFVLElBQUksT0FBTyxNQUFNO1FBQ3RDO1FBQ0EsT0FBTyxTQUFTO0tBQ2xCLEdBQUc7SUFFSCxNQUFNLENBQUMsZUFBZSxnQkFBZ0IsSUFBVTswQ0FBNkIsSUFDM0UscUJBQXFCLE9BQU8sR0FBRzs7SUFHakMsa0ZBQWU7aURBQUM7WUFDZCxpQkFBaUIscUJBQXFCLE9BQU8sR0FBRyxDQUFDO1FBQ25EO2dEQUFHO1FBQUM7UUFBTyxHQUFHO0tBQUM7SUFFZixrRkFBZTtpREFBQztZQUNkLE1BQU07c0VBQWUsQ0FBQzs4RUFBK0I7NEJBQ25ELGlCQUFpQixNQUFNO3dCQUN6Qjs7O1lBRUEsSUFBSSxDQUFDLE1BQU87WUFFWixNQUFNLGFBQWEsYUFBYSxRQUFRO1lBQ3hDLE1BQU0sY0FBYyxhQUFhLE9BQU87WUFDeEMsTUFBTSxpQkFBaUIsUUFBUSxVQUFVO1lBQ3pDLE1BQU0saUJBQWlCLFNBQVMsV0FBVztZQUMzQyxJQUFJLGdCQUFnQjtnQkFDbEIsTUFBTSxpQkFBaUI7WUFDekI7WUFDQSxJQUFJLE9BQU8sZ0JBQWdCLFVBQVU7Z0JBQ25DLE1BQU0sY0FBYztZQUN0QjtZQUVBO3lEQUFPO29CQUNMLE1BQU0sb0JBQW9CLFFBQVEsVUFBVTtvQkFDNUMsTUFBTSxvQkFBb0IsU0FBUyxXQUFXO2dCQUNoRDs7UUFDRjtnREFBRztRQUFDO1FBQU87UUFBYSxjQUFjO0tBQUM7SUFFdkMsT0FBTztBQUNUO0lBL0NTOztRQUlZLDBFQUFhOzs7QUE2Q2xDLElBQU0sT0FBTztBQUNiLElBQU0sUUFBUTtBQUNkLElBQU0sV0FBVyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvc3JjL2F2YXRhci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LWNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZic7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3QnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZSc7XG5pbXBvcnQgeyB1c2VJc0h5ZHJhdGVkIH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXVzZS1pcy1oeWRyYXRlZCc7XG5cbmltcG9ydCB0eXBlIHsgU2NvcGUgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtY29udGV4dCc7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEF2YXRhclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5jb25zdCBBVkFUQVJfTkFNRSA9ICdBdmF0YXInO1xuXG50eXBlIFNjb3BlZFByb3BzPFA+ID0gUCAmIHsgX19zY29wZUF2YXRhcj86IFNjb3BlIH07XG5jb25zdCBbY3JlYXRlQXZhdGFyQ29udGV4dCwgY3JlYXRlQXZhdGFyU2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKEFWQVRBUl9OQU1FKTtcblxudHlwZSBJbWFnZUxvYWRpbmdTdGF0dXMgPSAnaWRsZScgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8ICdlcnJvcic7XG5cbnR5cGUgQXZhdGFyQ29udGV4dFZhbHVlID0ge1xuICBpbWFnZUxvYWRpbmdTdGF0dXM6IEltYWdlTG9hZGluZ1N0YXR1cztcbiAgb25JbWFnZUxvYWRpbmdTdGF0dXNDaGFuZ2Uoc3RhdHVzOiBJbWFnZUxvYWRpbmdTdGF0dXMpOiB2b2lkO1xufTtcblxuY29uc3QgW0F2YXRhclByb3ZpZGVyLCB1c2VBdmF0YXJDb250ZXh0XSA9IGNyZWF0ZUF2YXRhckNvbnRleHQ8QXZhdGFyQ29udGV4dFZhbHVlPihBVkFUQVJfTkFNRSk7XG5cbnR5cGUgQXZhdGFyRWxlbWVudCA9IFJlYWN0LkNvbXBvbmVudFJlZjx0eXBlb2YgUHJpbWl0aXZlLnNwYW4+O1xudHlwZSBQcmltaXRpdmVTcGFuUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wc1dpdGhvdXRSZWY8dHlwZW9mIFByaW1pdGl2ZS5zcGFuPjtcbmludGVyZmFjZSBBdmF0YXJQcm9wcyBleHRlbmRzIFByaW1pdGl2ZVNwYW5Qcm9wcyB7fVxuXG5jb25zdCBBdmF0YXIgPSBSZWFjdC5mb3J3YXJkUmVmPEF2YXRhckVsZW1lbnQsIEF2YXRhclByb3BzPihcbiAgKHByb3BzOiBTY29wZWRQcm9wczxBdmF0YXJQcm9wcz4sIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZUF2YXRhciwgLi4uYXZhdGFyUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtpbWFnZUxvYWRpbmdTdGF0dXMsIHNldEltYWdlTG9hZGluZ1N0YXR1c10gPSBSZWFjdC51c2VTdGF0ZTxJbWFnZUxvYWRpbmdTdGF0dXM+KCdpZGxlJyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxBdmF0YXJQcm92aWRlclxuICAgICAgICBzY29wZT17X19zY29wZUF2YXRhcn1cbiAgICAgICAgaW1hZ2VMb2FkaW5nU3RhdHVzPXtpbWFnZUxvYWRpbmdTdGF0dXN9XG4gICAgICAgIG9uSW1hZ2VMb2FkaW5nU3RhdHVzQ2hhbmdlPXtzZXRJbWFnZUxvYWRpbmdTdGF0dXN9XG4gICAgICA+XG4gICAgICAgIDxQcmltaXRpdmUuc3BhbiB7Li4uYXZhdGFyUHJvcHN9IHJlZj17Zm9yd2FyZGVkUmVmfSAvPlxuICAgICAgPC9BdmF0YXJQcm92aWRlcj5cbiAgICApO1xuICB9XG4pO1xuXG5BdmF0YXIuZGlzcGxheU5hbWUgPSBBVkFUQVJfTkFNRTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQXZhdGFySW1hZ2VcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuY29uc3QgSU1BR0VfTkFNRSA9ICdBdmF0YXJJbWFnZSc7XG5cbnR5cGUgQXZhdGFySW1hZ2VFbGVtZW50ID0gUmVhY3QuQ29tcG9uZW50UmVmPHR5cGVvZiBQcmltaXRpdmUuaW1nPjtcbnR5cGUgUHJpbWl0aXZlSW1hZ2VQcm9wcyA9IFJlYWN0LkNvbXBvbmVudFByb3BzV2l0aG91dFJlZjx0eXBlb2YgUHJpbWl0aXZlLmltZz47XG5pbnRlcmZhY2UgQXZhdGFySW1hZ2VQcm9wcyBleHRlbmRzIFByaW1pdGl2ZUltYWdlUHJvcHMge1xuICBvbkxvYWRpbmdTdGF0dXNDaGFuZ2U/OiAoc3RhdHVzOiBJbWFnZUxvYWRpbmdTdGF0dXMpID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF2YXRhckltYWdlID0gUmVhY3QuZm9yd2FyZFJlZjxBdmF0YXJJbWFnZUVsZW1lbnQsIEF2YXRhckltYWdlUHJvcHM+KFxuICAocHJvcHM6IFNjb3BlZFByb3BzPEF2YXRhckltYWdlUHJvcHM+LCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVBdmF0YXIsIHNyYywgb25Mb2FkaW5nU3RhdHVzQ2hhbmdlID0gKCkgPT4ge30sIC4uLmltYWdlUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VBdmF0YXJDb250ZXh0KElNQUdFX05BTUUsIF9fc2NvcGVBdmF0YXIpO1xuICAgIGNvbnN0IGltYWdlTG9hZGluZ1N0YXR1cyA9IHVzZUltYWdlTG9hZGluZ1N0YXR1cyhzcmMsIGltYWdlUHJvcHMpO1xuICAgIGNvbnN0IGhhbmRsZUxvYWRpbmdTdGF0dXNDaGFuZ2UgPSB1c2VDYWxsYmFja1JlZigoc3RhdHVzOiBJbWFnZUxvYWRpbmdTdGF0dXMpID0+IHtcbiAgICAgIG9uTG9hZGluZ1N0YXR1c0NoYW5nZShzdGF0dXMpO1xuICAgICAgY29udGV4dC5vbkltYWdlTG9hZGluZ1N0YXR1c0NoYW5nZShzdGF0dXMpO1xuICAgIH0pO1xuXG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChpbWFnZUxvYWRpbmdTdGF0dXMgIT09ICdpZGxlJykge1xuICAgICAgICBoYW5kbGVMb2FkaW5nU3RhdHVzQ2hhbmdlKGltYWdlTG9hZGluZ1N0YXR1cyk7XG4gICAgICB9XG4gICAgfSwgW2ltYWdlTG9hZGluZ1N0YXR1cywgaGFuZGxlTG9hZGluZ1N0YXR1c0NoYW5nZV0pO1xuXG4gICAgcmV0dXJuIGltYWdlTG9hZGluZ1N0YXR1cyA9PT0gJ2xvYWRlZCcgPyAoXG4gICAgICA8UHJpbWl0aXZlLmltZyB7Li4uaW1hZ2VQcm9wc30gcmVmPXtmb3J3YXJkZWRSZWZ9IHNyYz17c3JjfSAvPlxuICAgICkgOiBudWxsO1xuICB9XG4pO1xuXG5BdmF0YXJJbWFnZS5kaXNwbGF5TmFtZSA9IElNQUdFX05BTUU7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEF2YXRhckZhbGxiYWNrXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmNvbnN0IEZBTExCQUNLX05BTUUgPSAnQXZhdGFyRmFsbGJhY2snO1xuXG50eXBlIEF2YXRhckZhbGxiYWNrRWxlbWVudCA9IFJlYWN0LkNvbXBvbmVudFJlZjx0eXBlb2YgUHJpbWl0aXZlLnNwYW4+O1xuaW50ZXJmYWNlIEF2YXRhckZhbGxiYWNrUHJvcHMgZXh0ZW5kcyBQcmltaXRpdmVTcGFuUHJvcHMge1xuICBkZWxheU1zPzogbnVtYmVyO1xufVxuXG5jb25zdCBBdmF0YXJGYWxsYmFjayA9IFJlYWN0LmZvcndhcmRSZWY8QXZhdGFyRmFsbGJhY2tFbGVtZW50LCBBdmF0YXJGYWxsYmFja1Byb3BzPihcbiAgKHByb3BzOiBTY29wZWRQcm9wczxBdmF0YXJGYWxsYmFja1Byb3BzPiwgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlQXZhdGFyLCBkZWxheU1zLCAuLi5mYWxsYmFja1Byb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQXZhdGFyQ29udGV4dChGQUxMQkFDS19OQU1FLCBfX3Njb3BlQXZhdGFyKTtcbiAgICBjb25zdCBbY2FuUmVuZGVyLCBzZXRDYW5SZW5kZXJdID0gUmVhY3QudXNlU3RhdGUoZGVsYXlNcyA9PT0gdW5kZWZpbmVkKTtcblxuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoZGVsYXlNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBzZXRDYW5SZW5kZXIodHJ1ZSksIGRlbGF5TXMpO1xuICAgICAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIH1cbiAgICB9LCBbZGVsYXlNc10pO1xuXG4gICAgcmV0dXJuIGNhblJlbmRlciAmJiBjb250ZXh0LmltYWdlTG9hZGluZ1N0YXR1cyAhPT0gJ2xvYWRlZCcgPyAoXG4gICAgICA8UHJpbWl0aXZlLnNwYW4gey4uLmZhbGxiYWNrUHJvcHN9IHJlZj17Zm9yd2FyZGVkUmVmfSAvPlxuICAgICkgOiBudWxsO1xuICB9XG4pO1xuXG5BdmF0YXJGYWxsYmFjay5kaXNwbGF5TmFtZSA9IEZBTExCQUNLX05BTUU7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZnVuY3Rpb24gcmVzb2x2ZUxvYWRpbmdTdGF0dXMoaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsLCBzcmM/OiBzdHJpbmcpOiBJbWFnZUxvYWRpbmdTdGF0dXMge1xuICBpZiAoIWltYWdlKSB7XG4gICAgcmV0dXJuICdpZGxlJztcbiAgfVxuICBpZiAoIXNyYykge1xuICAgIHJldHVybiAnZXJyb3InO1xuICB9XG4gIGlmIChpbWFnZS5zcmMgIT09IHNyYykge1xuICAgIGltYWdlLnNyYyA9IHNyYztcbiAgfVxuICByZXR1cm4gaW1hZ2UuY29tcGxldGUgJiYgaW1hZ2UubmF0dXJhbFdpZHRoID4gMCA/ICdsb2FkZWQnIDogJ2xvYWRpbmcnO1xufVxuXG5mdW5jdGlvbiB1c2VJbWFnZUxvYWRpbmdTdGF0dXMoXG4gIHNyYzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB7IHJlZmVycmVyUG9saWN5LCBjcm9zc09yaWdpbiB9OiBBdmF0YXJJbWFnZVByb3BzXG4pIHtcbiAgY29uc3QgaXNIeWRyYXRlZCA9IHVzZUlzSHlkcmF0ZWQoKTtcbiAgY29uc3QgaW1hZ2VSZWYgPSBSZWFjdC51c2VSZWY8SFRNTEltYWdlRWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBpbWFnZSA9ICgoKSA9PiB7XG4gICAgaWYgKCFpc0h5ZHJhdGVkKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIWltYWdlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGltYWdlUmVmLmN1cnJlbnQgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgfVxuICAgIHJldHVybiBpbWFnZVJlZi5jdXJyZW50O1xuICB9KSgpO1xuXG4gIGNvbnN0IFtsb2FkaW5nU3RhdHVzLCBzZXRMb2FkaW5nU3RhdHVzXSA9IFJlYWN0LnVzZVN0YXRlPEltYWdlTG9hZGluZ1N0YXR1cz4oKCkgPT5cbiAgICByZXNvbHZlTG9hZGluZ1N0YXR1cyhpbWFnZSwgc3JjKVxuICApO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgc2V0TG9hZGluZ1N0YXR1cyhyZXNvbHZlTG9hZGluZ1N0YXR1cyhpbWFnZSwgc3JjKSk7XG4gIH0sIFtpbWFnZSwgc3JjXSk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVTdGF0dXMgPSAoc3RhdHVzOiBJbWFnZUxvYWRpbmdTdGF0dXMpID0+ICgpID0+IHtcbiAgICAgIHNldExvYWRpbmdTdGF0dXMoc3RhdHVzKTtcbiAgICB9O1xuXG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaGFuZGxlTG9hZCA9IHVwZGF0ZVN0YXR1cygnbG9hZGVkJyk7XG4gICAgY29uc3QgaGFuZGxlRXJyb3IgPSB1cGRhdGVTdGF0dXMoJ2Vycm9yJyk7XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGhhbmRsZUxvYWQpO1xuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlRXJyb3IpO1xuICAgIGlmIChyZWZlcnJlclBvbGljeSkge1xuICAgICAgaW1hZ2UucmVmZXJyZXJQb2xpY3kgPSByZWZlcnJlclBvbGljeTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjcm9zc09yaWdpbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBoYW5kbGVMb2FkKTtcbiAgICAgIGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlRXJyb3IpO1xuICAgIH07XG4gIH0sIFtpbWFnZSwgY3Jvc3NPcmlnaW4sIHJlZmVycmVyUG9saWN5XSk7XG5cbiAgcmV0dXJuIGxvYWRpbmdTdGF0dXM7XG59XG5cbmNvbnN0IFJvb3QgPSBBdmF0YXI7XG5jb25zdCBJbWFnZSA9IEF2YXRhckltYWdlO1xuY29uc3QgRmFsbGJhY2sgPSBBdmF0YXJGYWxsYmFjaztcblxuZXhwb3J0IHtcbiAgY3JlYXRlQXZhdGFyU2NvcGUsXG4gIC8vXG4gIEF2YXRhcixcbiAgQXZhdGFySW1hZ2UsXG4gIEF2YXRhckZhbGxiYWNrLFxuICAvL1xuICBSb290LFxuICBJbWFnZSxcbiAgRmFsbGJhY2ssXG59O1xuZXhwb3J0IHR5cGUgeyBBdmF0YXJQcm9wcywgQXZhdGFySW1hZ2VQcm9wcywgQXZhdGFyRmFsbGJhY2tQcm9wcyB9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-avatar/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-compose-refs/dist/index.mjs": /*!******************************************************************!*\ !*** ./node_modules/@radix-ui/react-compose-refs/dist/index.mjs ***! \******************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ composeRefs: () => (/* binding */ composeRefs),\n/* harmony export */ useComposedRefs: () => (/* binding */ useComposedRefs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n// packages/react/compose-refs/src/compose-refs.tsx\n\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\nfunction composeRefs(...refs) {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\nfunction useComposedRefs(...refs) {\n return react__WEBPACK_IMPORTED_MODULE_0__.useCallback(composeRefs(...refs), refs);\n}\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQytCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDhDQUFpQjtBQUMxQjtBQUlFO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmcy9kaXN0L2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwYWNrYWdlcy9yZWFjdC9jb21wb3NlLXJlZnMvc3JjL2NvbXBvc2UtcmVmcy50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gc2V0UmVmKHJlZiwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiByZWYodmFsdWUpO1xuICB9IGVsc2UgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHZvaWQgMCkge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbXBvc2VSZWZzKC4uLnJlZnMpIHtcbiAgcmV0dXJuIChub2RlKSA9PiB7XG4gICAgbGV0IGhhc0NsZWFudXAgPSBmYWxzZTtcbiAgICBjb25zdCBjbGVhbnVwcyA9IHJlZnMubWFwKChyZWYpID0+IHtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSBzZXRSZWYocmVmLCBub2RlKTtcbiAgICAgIGlmICghaGFzQ2xlYW51cCAmJiB0eXBlb2YgY2xlYW51cCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaGFzQ2xlYW51cCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9KTtcbiAgICBpZiAoaGFzQ2xlYW51cCkge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGVhbnVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBjbGVhbnVwc1tpXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFJlZihyZWZzW2ldLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdXNlQ29tcG9zZWRSZWZzKC4uLnJlZnMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNhbGxiYWNrKGNvbXBvc2VSZWZzKC4uLnJlZnMpLCByZWZzKTtcbn1cbmV4cG9ydCB7XG4gIGNvbXBvc2VSZWZzLFxuICB1c2VDb21wb3NlZFJlZnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-compose-refs/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-context/dist/index.mjs": /*!*************************************************************!*\ !*** ./node_modules/@radix-ui/react-context/dist/index.mjs ***! \*************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createContext: () => (/* binding */ createContext2),\n/* harmony export */ createContextScope: () => (/* binding */ createContextScope)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\n// packages/react/context/src/create-context.tsx\n\n\nfunction createContext2(rootComponentName, defaultContext) {\n const Context = react__WEBPACK_IMPORTED_MODULE_0__.createContext(defaultContext);\n const Provider = (props) => {\n const { children, ...context } = props;\n const value = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(() => context, Object.values(context));\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(Context.Provider, { value, children });\n };\n Provider.displayName = rootComponentName + \"Provider\";\n function useContext2(consumerName) {\n const context = react__WEBPACK_IMPORTED_MODULE_0__.useContext(Context);\n if (context) return context;\n if (defaultContext !== void 0) return defaultContext;\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n return [Provider, useContext2];\n}\nfunction createContextScope(scopeName, createContextScopeDeps = []) {\n let defaultContexts = [];\n function createContext3(rootComponentName, defaultContext) {\n const BaseContext = react__WEBPACK_IMPORTED_MODULE_0__.createContext(defaultContext);\n const index = defaultContexts.length;\n defaultContexts = [...defaultContexts, defaultContext];\n const Provider = (props) => {\n const { scope, children, ...context } = props;\n const Context = scope?.[scopeName]?.[index] || BaseContext;\n const value = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(() => context, Object.values(context));\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(Context.Provider, { value, children });\n };\n Provider.displayName = rootComponentName + \"Provider\";\n function useContext2(consumerName, scope) {\n const Context = scope?.[scopeName]?.[index] || BaseContext;\n const context = react__WEBPACK_IMPORTED_MODULE_0__.useContext(Context);\n if (context) return context;\n if (defaultContext !== void 0) return defaultContext;\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n return [Provider, useContext2];\n }\n const createScope = () => {\n const scopeContexts = defaultContexts.map((defaultContext) => {\n return react__WEBPACK_IMPORTED_MODULE_0__.createContext(defaultContext);\n });\n return function useScope(scope) {\n const contexts = scope?.[scopeName] || scopeContexts;\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(\n () => ({ [`__scope${scopeName}`]: { ...scope, [scopeName]: contexts } }),\n [scope, contexts]\n );\n };\n };\n createScope.scopeName = scopeName;\n return [createContext3, composeContextScopes(createScope, ...createContextScopeDeps)];\n}\nfunction composeContextScopes(...scopes) {\n const baseScope = scopes[0];\n if (scopes.length === 1) return baseScope;\n const createScope = () => {\n const scopeHooks = scopes.map((createScope2) => ({\n useScope: createScope2(),\n scopeName: createScope2.scopeName\n }));\n return function useComposedScopes(overrideScopes) {\n const nextScopes = scopeHooks.reduce((nextScopes2, { useScope, scopeName }) => {\n const scopeProps = useScope(overrideScopes);\n const currentScope = scopeProps[`__scope${scopeName}`];\n return { ...nextScopes2, ...currentScope };\n }, {});\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(() => ({ [`__scope${baseScope.scopeName}`]: nextScopes }), [nextScopes]);\n };\n };\n createScope.scopeName = baseScope.scopeName;\n return createScope;\n}\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29udGV4dC9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDK0I7QUFDUztBQUN4QztBQUNBLGtCQUFrQixnREFBbUI7QUFDckM7QUFDQSxZQUFZLHVCQUF1QjtBQUNuQyxrQkFBa0IsMENBQWE7QUFDL0IsMkJBQTJCLHNEQUFHLHFCQUFxQixpQkFBaUI7QUFDcEU7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDZDQUFnQjtBQUNwQztBQUNBO0FBQ0EseUJBQXlCLGFBQWEsMkJBQTJCLGtCQUFrQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0RBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLGNBQWMsOEJBQThCO0FBQzVDO0FBQ0Esb0JBQW9CLDBDQUFhO0FBQ2pDLDZCQUE2QixzREFBRyxxQkFBcUIsaUJBQWlCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDZDQUFnQjtBQUN0QztBQUNBO0FBQ0EsMkJBQTJCLGFBQWEsMkJBQTJCLGtCQUFrQjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnREFBbUI7QUFDaEMsS0FBSztBQUNMO0FBQ0E7QUFDQSxhQUFhLDBDQUFhO0FBQzFCLGlCQUFpQixXQUFXLFVBQVUsTUFBTSxtQ0FBbUM7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDJEQUEyRCxxQkFBcUI7QUFDaEY7QUFDQSxrREFBa0QsVUFBVTtBQUM1RCxpQkFBaUI7QUFDakIsT0FBTyxJQUFJO0FBQ1gsYUFBYSwwQ0FBYSxVQUFVLFdBQVcsb0JBQW9CLGdCQUFnQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUU7QUFDRiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29udGV4dC9kaXN0L2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwYWNrYWdlcy9yZWFjdC9jb250ZXh0L3NyYy9jcmVhdGUtY29udGV4dC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0Mihyb290Q29tcG9uZW50TmFtZSwgZGVmYXVsdENvbnRleHQpIHtcbiAgY29uc3QgQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdENvbnRleHQpO1xuICBjb25zdCBQcm92aWRlciA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIC4uLmNvbnRleHQgfSA9IHByb3BzO1xuICAgIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb250ZXh0LCBPYmplY3QudmFsdWVzKGNvbnRleHQpKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbiB9KTtcbiAgfTtcbiAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSByb290Q29tcG9uZW50TmFtZSArIFwiUHJvdmlkZXJcIjtcbiAgZnVuY3Rpb24gdXNlQ29udGV4dDIoY29uc3VtZXJOYW1lKSB7XG4gICAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgIGlmIChkZWZhdWx0Q29udGV4dCAhPT0gdm9pZCAwKSByZXR1cm4gZGVmYXVsdENvbnRleHQ7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcXGAke2NvbnN1bWVyTmFtZX1cXGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcXGAke3Jvb3RDb21wb25lbnROYW1lfVxcYGApO1xuICB9XG4gIHJldHVybiBbUHJvdmlkZXIsIHVzZUNvbnRleHQyXTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRTY29wZShzY29wZU5hbWUsIGNyZWF0ZUNvbnRleHRTY29wZURlcHMgPSBbXSkge1xuICBsZXQgZGVmYXVsdENvbnRleHRzID0gW107XG4gIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQzKHJvb3RDb21wb25lbnROYW1lLCBkZWZhdWx0Q29udGV4dCkge1xuICAgIGNvbnN0IEJhc2VDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChkZWZhdWx0Q29udGV4dCk7XG4gICAgY29uc3QgaW5kZXggPSBkZWZhdWx0Q29udGV4dHMubGVuZ3RoO1xuICAgIGRlZmF1bHRDb250ZXh0cyA9IFsuLi5kZWZhdWx0Q29udGV4dHMsIGRlZmF1bHRDb250ZXh0XTtcbiAgICBjb25zdCBQcm92aWRlciA9IChwcm9wcykgPT4ge1xuICAgICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4sIC4uLmNvbnRleHQgfSA9IHByb3BzO1xuICAgICAgY29uc3QgQ29udGV4dCA9IHNjb3BlPy5bc2NvcGVOYW1lXT8uW2luZGV4XSB8fCBCYXNlQ29udGV4dDtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb250ZXh0LCBPYmplY3QudmFsdWVzKGNvbnRleHQpKTtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuIH0pO1xuICAgIH07XG4gICAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSByb290Q29tcG9uZW50TmFtZSArIFwiUHJvdmlkZXJcIjtcbiAgICBmdW5jdGlvbiB1c2VDb250ZXh0Mihjb25zdW1lck5hbWUsIHNjb3BlKSB7XG4gICAgICBjb25zdCBDb250ZXh0ID0gc2NvcGU/LltzY29wZU5hbWVdPy5baW5kZXhdIHx8IEJhc2VDb250ZXh0O1xuICAgICAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gICAgICBpZiAoY29udGV4dCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgICBpZiAoZGVmYXVsdENvbnRleHQgIT09IHZvaWQgMCkgcmV0dXJuIGRlZmF1bHRDb250ZXh0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGAke2NvbnN1bWVyTmFtZX1cXGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcXGAke3Jvb3RDb21wb25lbnROYW1lfVxcYGApO1xuICAgIH1cbiAgICByZXR1cm4gW1Byb3ZpZGVyLCB1c2VDb250ZXh0Ml07XG4gIH1cbiAgY29uc3QgY3JlYXRlU2NvcGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2NvcGVDb250ZXh0cyA9IGRlZmF1bHRDb250ZXh0cy5tYXAoKGRlZmF1bHRDb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlQ29udGV4dChkZWZhdWx0Q29udGV4dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVzZVNjb3BlKHNjb3BlKSB7XG4gICAgICBjb25zdCBjb250ZXh0cyA9IHNjb3BlPy5bc2NvcGVOYW1lXSB8fCBzY29wZUNvbnRleHRzO1xuICAgICAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oXG4gICAgICAgICgpID0+ICh7IFtgX19zY29wZSR7c2NvcGVOYW1lfWBdOiB7IC4uLnNjb3BlLCBbc2NvcGVOYW1lXTogY29udGV4dHMgfSB9KSxcbiAgICAgICAgW3Njb3BlLCBjb250ZXh0c11cbiAgICAgICk7XG4gICAgfTtcbiAgfTtcbiAgY3JlYXRlU2NvcGUuc2NvcGVOYW1lID0gc2NvcGVOYW1lO1xuICByZXR1cm4gW2NyZWF0ZUNvbnRleHQzLCBjb21wb3NlQ29udGV4dFNjb3BlcyhjcmVhdGVTY29wZSwgLi4uY3JlYXRlQ29udGV4dFNjb3BlRGVwcyldO1xufVxuZnVuY3Rpb24gY29tcG9zZUNvbnRleHRTY29wZXMoLi4uc2NvcGVzKSB7XG4gIGNvbnN0IGJhc2VTY29wZSA9IHNjb3Blc1swXTtcbiAgaWYgKHNjb3Blcy5sZW5ndGggPT09IDEpIHJldHVybiBiYXNlU2NvcGU7XG4gIGNvbnN0IGNyZWF0ZVNjb3BlID0gKCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlSG9va3MgPSBzY29wZXMubWFwKChjcmVhdGVTY29wZTIpID0+ICh7XG4gICAgICB1c2VTY29wZTogY3JlYXRlU2NvcGUyKCksXG4gICAgICBzY29wZU5hbWU6IGNyZWF0ZVNjb3BlMi5zY29wZU5hbWVcbiAgICB9KSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVzZUNvbXBvc2VkU2NvcGVzKG92ZXJyaWRlU2NvcGVzKSB7XG4gICAgICBjb25zdCBuZXh0U2NvcGVzID0gc2NvcGVIb29rcy5yZWR1Y2UoKG5leHRTY29wZXMyLCB7IHVzZVNjb3BlLCBzY29wZU5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBzY29wZVByb3BzID0gdXNlU2NvcGUob3ZlcnJpZGVTY29wZXMpO1xuICAgICAgICBjb25zdCBjdXJyZW50U2NvcGUgPSBzY29wZVByb3BzW2BfX3Njb3BlJHtzY29wZU5hbWV9YF07XG4gICAgICAgIHJldHVybiB7IC4uLm5leHRTY29wZXMyLCAuLi5jdXJyZW50U2NvcGUgfTtcbiAgICAgIH0sIHt9KTtcbiAgICAgIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7IFtgX19zY29wZSR7YmFzZVNjb3BlLnNjb3BlTmFtZX1gXTogbmV4dFNjb3BlcyB9KSwgW25leHRTY29wZXNdKTtcbiAgICB9O1xuICB9O1xuICBjcmVhdGVTY29wZS5zY29wZU5hbWUgPSBiYXNlU2NvcGUuc2NvcGVOYW1lO1xuICByZXR1cm4gY3JlYXRlU2NvcGU7XG59XG5leHBvcnQge1xuICBjcmVhdGVDb250ZXh0MiBhcyBjcmVhdGVDb250ZXh0LFxuICBjcmVhdGVDb250ZXh0U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-context/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-primitive/dist/index.mjs": /*!***************************************************************!*\ !*** ./node_modules/@radix-ui/react-primitive/dist/index.mjs ***! \***************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Primitive: () => (/* binding */ Primitive),\n/* harmony export */ Root: () => (/* binding */ Root),\n/* harmony export */ dispatchDiscreteCustomEvent: () => (/* binding */ dispatchDiscreteCustomEvent)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react-dom/index.js\");\n/* harmony import */ var _radix_ui_react_slot__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @radix-ui/react-slot */ \"(app-pages-browser)/./node_modules/@radix-ui/react-slot/dist/index.mjs\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\n// src/primitive.tsx\n\n\n\n\nvar NODES = [\n \"a\",\n \"button\",\n \"div\",\n \"form\",\n \"h2\",\n \"h3\",\n \"img\",\n \"input\",\n \"label\",\n \"li\",\n \"nav\",\n \"ol\",\n \"p\",\n \"select\",\n \"span\",\n \"svg\",\n \"ul\"\n];\nvar Primitive = NODES.reduce((primitive, node) => {\n const Slot = (0,_radix_ui_react_slot__WEBPACK_IMPORTED_MODULE_3__.createSlot)(`Primitive.${node}`);\n const Node = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef((props, forwardedRef) => {\n const { asChild, ...primitiveProps } = props;\n const Comp = asChild ? Slot : node;\n if (typeof window !== \"undefined\") {\n window[Symbol.for(\"radix-ui\")] = true;\n }\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(Comp, { ...primitiveProps, ref: forwardedRef });\n });\n Node.displayName = `Primitive.${node}`;\n return { ...primitive, [node]: Node };\n}, {});\nfunction dispatchDiscreteCustomEvent(target, event) {\n if (target) react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync(() => target.dispatchEvent(event));\n}\nvar Root = Primitive;\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUMrQjtBQUNPO0FBQ1k7QUFDVjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnRUFBVSxjQUFjLEtBQUs7QUFDNUMsZUFBZSw2Q0FBZ0I7QUFDL0IsWUFBWSw2QkFBNkI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0RBQUcsU0FBUyxzQ0FBc0M7QUFDN0UsR0FBRztBQUNILGtDQUFrQyxLQUFLO0FBQ3ZDLFdBQVc7QUFDWCxDQUFDLElBQUk7QUFDTDtBQUNBLGNBQWMsZ0RBQWtCO0FBQ2hDO0FBQ0E7QUFLRTtBQUNGIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wcmltaXRpdmUvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL3ByaW1pdGl2ZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgY3JlYXRlU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgTk9ERVMgPSBbXG4gIFwiYVwiLFxuICBcImJ1dHRvblwiLFxuICBcImRpdlwiLFxuICBcImZvcm1cIixcbiAgXCJoMlwiLFxuICBcImgzXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJsYWJlbFwiLFxuICBcImxpXCIsXG4gIFwibmF2XCIsXG4gIFwib2xcIixcbiAgXCJwXCIsXG4gIFwic2VsZWN0XCIsXG4gIFwic3BhblwiLFxuICBcInN2Z1wiLFxuICBcInVsXCJcbl07XG52YXIgUHJpbWl0aXZlID0gTk9ERVMucmVkdWNlKChwcmltaXRpdmUsIG5vZGUpID0+IHtcbiAgY29uc3QgU2xvdCA9IGNyZWF0ZVNsb3QoYFByaW1pdGl2ZS4ke25vZGV9YCk7XG4gIGNvbnN0IE5vZGUgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBhc0NoaWxkLCAuLi5wcmltaXRpdmVQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgQ29tcCA9IGFzQ2hpbGQgPyBTbG90IDogbm9kZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93W1N5bWJvbC5mb3IoXCJyYWRpeC11aVwiKV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb21wLCB7IC4uLnByaW1pdGl2ZVByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfSk7XG4gIE5vZGUuZGlzcGxheU5hbWUgPSBgUHJpbWl0aXZlLiR7bm9kZX1gO1xuICByZXR1cm4geyAuLi5wcmltaXRpdmUsIFtub2RlXTogTm9kZSB9O1xufSwge30pO1xuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50KHRhcmdldCwgZXZlbnQpIHtcbiAgaWYgKHRhcmdldCkgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KSk7XG59XG52YXIgUm9vdCA9IFByaW1pdGl2ZTtcbmV4cG9ydCB7XG4gIFByaW1pdGl2ZSxcbiAgUm9vdCxcbiAgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-primitive/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-slot/dist/index.mjs": /*!**********************************************************!*\ !*** ./node_modules/@radix-ui/react-slot/dist/index.mjs ***! \**********************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Root: () => (/* binding */ Slot),\n/* harmony export */ Slot: () => (/* binding */ Slot),\n/* harmony export */ Slottable: () => (/* binding */ Slottable),\n/* harmony export */ createSlot: () => (/* binding */ createSlot),\n/* harmony export */ createSlottable: () => (/* binding */ createSlottable)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var _radix_ui_react_compose_refs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @radix-ui/react-compose-refs */ \"(app-pages-browser)/./node_modules/@radix-ui/react-compose-refs/dist/index.mjs\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\n// src/slot.tsx\n\n\n\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);\n const Slot2 = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = react__WEBPACK_IMPORTED_MODULE_0__.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n if (slottable) {\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n if (react__WEBPACK_IMPORTED_MODULE_0__.Children.count(newElement) > 1) return react__WEBPACK_IMPORTED_MODULE_0__.Children.only(null);\n return react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(newElement) ? newElement.props.children : null;\n } else {\n return child;\n }\n });\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(newElement) ? react__WEBPACK_IMPORTED_MODULE_0__.cloneElement(newElement, void 0, newChildren) : null });\n }\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children });\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlotClone(ownerName) {\n const SlotClone = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n if (react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props2 = mergeProps(slotProps, children.props);\n if (children.type !== react__WEBPACK_IMPORTED_MODULE_0__.Fragment) {\n props2.ref = forwardedRef ? (0,_radix_ui_react_compose_refs__WEBPACK_IMPORTED_MODULE_2__.composeRefs)(forwardedRef, childrenRef) : childrenRef;\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.cloneElement(children, props2);\n }\n return react__WEBPACK_IMPORTED_MODULE_0__.Children.count(children) > 1 ? react__WEBPACK_IMPORTED_MODULE_0__.Children.only(null) : null;\n });\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\nvar SLOTTABLE_IDENTIFIER = Symbol(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = ({ children }) => {\n return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.Fragment, { children });\n };\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nfunction isSlottable(child) {\n return react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3Qtc2xvdC9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQytCO0FBQzRCO0FBQ0k7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDZDQUFnQjtBQUNoQyxZQUFZLHlCQUF5QjtBQUNyQywwQkFBMEIsMkNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMkNBQWMsK0JBQStCLDJDQUFjO0FBQ3pFLGlCQUFpQixpREFBb0I7QUFDckMsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsNkJBQTZCLHNEQUFHLGNBQWMsMkNBQTJDLGlEQUFvQixlQUFlLCtDQUFrQiwwQ0FBMEM7QUFDeEw7QUFDQSwyQkFBMkIsc0RBQUcsY0FBYywyQ0FBMkM7QUFDdkYsR0FBRztBQUNILHlCQUF5QixVQUFVO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNkNBQWdCO0FBQ3BDLFlBQVkseUJBQXlCO0FBQ3JDLFFBQVEsaURBQW9CO0FBQzVCO0FBQ0E7QUFDQSw0QkFBNEIsMkNBQWM7QUFDMUMsb0NBQW9DLHlFQUFXO0FBQy9DO0FBQ0EsYUFBYSwrQ0FBa0I7QUFDL0I7QUFDQSxXQUFXLDJDQUFjLHVCQUF1QiwyQ0FBYztBQUM5RCxHQUFHO0FBQ0gsNkJBQTZCLFVBQVU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDLDJCQUEyQixzREFBRyxDQUFDLHVEQUFTLElBQUksVUFBVTtBQUN0RDtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlEQUFvQjtBQUM3QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTixrQ0FBa0M7QUFDbEMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0U7QUFDRiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3Qtc2xvdC9kaXN0L2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvc2xvdC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgRnJhZ21lbnQyLCBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBjcmVhdGVTbG90KG93bmVyTmFtZSkge1xuICBjb25zdCBTbG90Q2xvbmUgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlU2xvdENsb25lKG93bmVyTmFtZSk7XG4gIGNvbnN0IFNsb3QyID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNsb3RQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY2hpbGRyZW5BcnJheSA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuICAgIGNvbnN0IHNsb3R0YWJsZSA9IGNoaWxkcmVuQXJyYXkuZmluZChpc1Nsb3R0YWJsZSk7XG4gICAgaWYgKHNsb3R0YWJsZSkge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHNsb3R0YWJsZS5wcm9wcy5jaGlsZHJlbjtcbiAgICAgIGNvbnN0IG5ld0NoaWxkcmVuID0gY2hpbGRyZW5BcnJheS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgIGlmIChjaGlsZCA9PT0gc2xvdHRhYmxlKSB7XG4gICAgICAgICAgaWYgKFJlYWN0LkNoaWxkcmVuLmNvdW50KG5ld0VsZW1lbnQpID4gMSkgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm9ubHkobnVsbCk7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmlzVmFsaWRFbGVtZW50KG5ld0VsZW1lbnQpID8gbmV3RWxlbWVudC5wcm9wcy5jaGlsZHJlbiA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFNsb3RDbG9uZSwgeyAuLi5zbG90UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmLCBjaGlsZHJlbjogUmVhY3QuaXNWYWxpZEVsZW1lbnQobmV3RWxlbWVudCkgPyBSZWFjdC5jbG9uZUVsZW1lbnQobmV3RWxlbWVudCwgdm9pZCAwLCBuZXdDaGlsZHJlbikgOiBudWxsIH0pO1xuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90Q2xvbmUsIHsgLi4uc2xvdFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiwgY2hpbGRyZW4gfSk7XG4gIH0pO1xuICBTbG90Mi5kaXNwbGF5TmFtZSA9IGAke293bmVyTmFtZX0uU2xvdGA7XG4gIHJldHVybiBTbG90Mjtcbn1cbnZhciBTbG90ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVNsb3QoXCJTbG90XCIpO1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RDbG9uZShvd25lck5hbWUpIHtcbiAgY29uc3QgU2xvdENsb25lID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNsb3RQcm9wcyB9ID0gcHJvcHM7XG4gICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW5SZWYgPSBnZXRFbGVtZW50UmVmKGNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IHByb3BzMiA9IG1lcmdlUHJvcHMoc2xvdFByb3BzLCBjaGlsZHJlbi5wcm9wcyk7XG4gICAgICBpZiAoY2hpbGRyZW4udHlwZSAhPT0gUmVhY3QuRnJhZ21lbnQpIHtcbiAgICAgICAgcHJvcHMyLnJlZiA9IGZvcndhcmRlZFJlZiA/IGNvbXBvc2VSZWZzKGZvcndhcmRlZFJlZiwgY2hpbGRyZW5SZWYpIDogY2hpbGRyZW5SZWY7XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBwcm9wczIpO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID4gMSA/IFJlYWN0LkNoaWxkcmVuLm9ubHkobnVsbCkgOiBudWxsO1xuICB9KTtcbiAgU2xvdENsb25lLmRpc3BsYXlOYW1lID0gYCR7b3duZXJOYW1lfS5TbG90Q2xvbmVgO1xuICByZXR1cm4gU2xvdENsb25lO1xufVxudmFyIFNMT1RUQUJMRV9JREVOVElGSUVSID0gU3ltYm9sKFwicmFkaXguc2xvdHRhYmxlXCIpO1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGNyZWF0ZVNsb3R0YWJsZShvd25lck5hbWUpIHtcbiAgY29uc3QgU2xvdHRhYmxlMiA9ICh7IGNoaWxkcmVuIH0pID0+IHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChGcmFnbWVudDIsIHsgY2hpbGRyZW4gfSk7XG4gIH07XG4gIFNsb3R0YWJsZTIuZGlzcGxheU5hbWUgPSBgJHtvd25lck5hbWV9LlNsb3R0YWJsZWA7XG4gIFNsb3R0YWJsZTIuX19yYWRpeElkID0gU0xPVFRBQkxFX0lERU5USUZJRVI7XG4gIHJldHVybiBTbG90dGFibGUyO1xufVxudmFyIFNsb3R0YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTbG90dGFibGUoXCJTbG90dGFibGVcIik7XG5mdW5jdGlvbiBpc1Nsb3R0YWJsZShjaGlsZCkge1xuICByZXR1cm4gUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIHR5cGVvZiBjaGlsZC50eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgXCJfX3JhZGl4SWRcIiBpbiBjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUuX19yYWRpeElkID09PSBTTE9UVEFCTEVfSURFTlRJRklFUjtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoc2xvdFByb3BzLCBjaGlsZFByb3BzKSB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcHMgPSB7IC4uLmNoaWxkUHJvcHMgfTtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBjaGlsZFByb3BzKSB7XG4gICAgY29uc3Qgc2xvdFByb3BWYWx1ZSA9IHNsb3RQcm9wc1twcm9wTmFtZV07XG4gICAgY29uc3QgY2hpbGRQcm9wVmFsdWUgPSBjaGlsZFByb3BzW3Byb3BOYW1lXTtcbiAgICBjb25zdCBpc0hhbmRsZXIgPSAvXm9uW0EtWl0vLnRlc3QocHJvcE5hbWUpO1xuICAgIGlmIChpc0hhbmRsZXIpIHtcbiAgICAgIGlmIChzbG90UHJvcFZhbHVlICYmIGNoaWxkUHJvcFZhbHVlKSB7XG4gICAgICAgIG92ZXJyaWRlUHJvcHNbcHJvcE5hbWVdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZFByb3BWYWx1ZSguLi5hcmdzKTtcbiAgICAgICAgICBzbG90UHJvcFZhbHVlKC4uLmFyZ3MpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHNsb3RQcm9wVmFsdWUpIHtcbiAgICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSBzbG90UHJvcFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcE5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSB7IC4uLnNsb3RQcm9wVmFsdWUsIC4uLmNoaWxkUHJvcFZhbHVlIH07XG4gICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJjbGFzc05hbWVcIikge1xuICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSBbc2xvdFByb3BWYWx1ZSwgY2hpbGRQcm9wVmFsdWVdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgLi4uc2xvdFByb3BzLCAuLi5vdmVycmlkZVByb3BzIH07XG59XG5mdW5jdGlvbiBnZXRFbGVtZW50UmVmKGVsZW1lbnQpIHtcbiAgbGV0IGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudC5wcm9wcywgXCJyZWZcIik/LmdldDtcbiAgbGV0IG1heVdhcm4gPSBnZXR0ZXIgJiYgXCJpc1JlYWN0V2FybmluZ1wiIGluIGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmc7XG4gIGlmIChtYXlXYXJuKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucmVmO1xuICB9XG4gIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudCwgXCJyZWZcIik/LmdldDtcbiAgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWY7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQucHJvcHMucmVmIHx8IGVsZW1lbnQucmVmO1xufVxuZXhwb3J0IHtcbiAgU2xvdCBhcyBSb290LFxuICBTbG90LFxuICBTbG90dGFibGUsXG4gIGNyZWF0ZVNsb3QsXG4gIGNyZWF0ZVNsb3R0YWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-slot/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs": /*!**********************************************************************!*\ !*** ./node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs ***! \**********************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCallbackRef: () => (/* binding */ useCallbackRef)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n// packages/react/use-callback-ref/src/use-callback-ref.tsx\n\nfunction useCallbackRef(callback) {\n const callbackRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(callback);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {\n callbackRef.current = callback;\n });\n return react__WEBPACK_IMPORTED_MODULE_0__.useMemo(() => (...args) => callbackRef.current?.(...args), []);\n}\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZi9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQytCO0FBQy9CO0FBQ0Esc0JBQXNCLHlDQUFZO0FBQ2xDLEVBQUUsNENBQWU7QUFDakI7QUFDQSxHQUFHO0FBQ0gsU0FBUywwQ0FBYTtBQUN0QjtBQUdFO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWYvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWNhbGxiYWNrLXJlZi9zcmMvdXNlLWNhbGxiYWNrLXJlZi50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gdXNlQ2FsbGJhY2tSZWYoY2FsbGJhY2spIHtcbiAgY29uc3QgY2FsbGJhY2tSZWYgPSBSZWFjdC51c2VSZWYoY2FsbGJhY2spO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNhbGxiYWNrUmVmLmN1cnJlbnQgPSBjYWxsYmFjaztcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICguLi5hcmdzKSA9PiBjYWxsYmFja1JlZi5jdXJyZW50Py4oLi4uYXJncyksIFtdKTtcbn1cbmV4cG9ydCB7XG4gIHVzZUNhbGxiYWNrUmVmXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/dist/index.mjs": /*!*********************************************************************!*\ !*** ./node_modules/@radix-ui/react-use-is-hydrated/dist/index.mjs ***! \*********************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useIsHydrated: () => (/* binding */ useIsHydrated)\n/* harmony export */ });\n/* harmony import */ var use_sync_external_store_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! use-sync-external-store/shim */ \"(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/shim/index.js\");\n// src/use-is-hydrated.tsx\n\nfunction useIsHydrated() {\n return (0,use_sync_external_store_shim__WEBPACK_IMPORTED_MODULE_0__.useSyncExternalStore)(\n subscribe,\n () => true,\n () => false\n );\n}\nfunction subscribe() {\n return () => {\n };\n}\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWlzLWh5ZHJhdGVkL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDb0U7QUFDcEU7QUFDQSxTQUFTLGtGQUFvQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHRTtBQUNGIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtaXMtaHlkcmF0ZWQvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL3VzZS1pcy1oeWRyYXRlZC50c3hcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlIH0gZnJvbSBcInVzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW1cIjtcbmZ1bmN0aW9uIHVzZUlzSHlkcmF0ZWQoKSB7XG4gIHJldHVybiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBzdWJzY3JpYmUsXG4gICAgKCkgPT4gdHJ1ZSxcbiAgICAoKSA9PiBmYWxzZVxuICApO1xufVxuZnVuY3Rpb24gc3Vic2NyaWJlKCkge1xuICByZXR1cm4gKCkgPT4ge1xuICB9O1xufVxuZXhwb3J0IHtcbiAgdXNlSXNIeWRyYXRlZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js": /*!*******************************************************************************************************************************************!*\ !*** ./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js ***! \*******************************************************************************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n true &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWlzLWh5ZHJhdGVkL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7QUFDYixLQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxZQUFZO0FBQ3BFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxZQUFZO0FBQ3BFO0FBQ0EsMERBQTBELFlBQVk7QUFDdEUsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsbUZBQU87QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDRCQUE0QjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWlzLWh5ZHJhdGVkL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAgIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUkMihzdWJzY3JpYmUsIGdldFNuYXBzaG90KSB7XG4gICAgICBkaWRXYXJuT2xkMThBbHBoYSB8fFxuICAgICAgICB2b2lkIDAgPT09IFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiB8fFxuICAgICAgICAoKGRpZFdhcm5PbGQxOEFscGhhID0gITApLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiWW91IGFyZSB1c2luZyBhbiBvdXRkYXRlZCwgcHJlLXJlbGVhc2UgYWxwaGEgb2YgUmVhY3QgMTggdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHVzZVN5bmNFeHRlcm5hbFN0b3JlLiBUaGUgdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUgc2hpbSB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gVXBncmFkZSB0byBhIG5ld2VyIHByZS1yZWxlYXNlLlwiXG4gICAgICAgICkpO1xuICAgICAgdmFyIHZhbHVlID0gZ2V0U25hcHNob3QoKTtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gZ2V0U25hcHNob3QoKTtcbiAgICAgICAgb2JqZWN0SXModmFsdWUsIGNhY2hlZFZhbHVlKSB8fFxuICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSAhMCkpO1xuICAgICAgfVxuICAgICAgY2FjaGVkVmFsdWUgPSB1c2VTdGF0ZSh7XG4gICAgICAgIGluc3Q6IHsgdmFsdWU6IHZhbHVlLCBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QgfVxuICAgICAgfSk7XG4gICAgICB2YXIgaW5zdCA9IGNhY2hlZFZhbHVlWzBdLmluc3QsXG4gICAgICAgIGZvcmNlVXBkYXRlID0gY2FjaGVkVmFsdWVbMV07XG4gICAgICB1c2VMYXlvdXRFZmZlY3QoXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90O1xuICAgICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBbc3Vic2NyaWJlLCB2YWx1ZSwgZ2V0U25hcHNob3RdXG4gICAgICApO1xuICAgICAgdXNlRWZmZWN0KFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSAmJiBmb3JjZVVwZGF0ZSh7IGluc3Q6IGluc3QgfSk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgW3N1YnNjcmliZV1cbiAgICAgICk7XG4gICAgICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gICAgICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICAgICAgaW5zdCA9IGluc3QudmFsdWU7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICAgICAgcmV0dXJuICFvYmplY3RJcyhpbnN0LCBuZXh0VmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQxKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgICAgIHJldHVybiBnZXRTbmFwc2hvdCgpO1xuICAgIH1cbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ICYmXG4gICAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KEVycm9yKCkpO1xuICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgICAgIG9iamVjdElzID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgT2JqZWN0LmlzID8gT2JqZWN0LmlzIDogaXMsXG4gICAgICB1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlLFxuICAgICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0ID0gUmVhY3QudXNlTGF5b3V0RWZmZWN0LFxuICAgICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWUsXG4gICAgICBkaWRXYXJuT2xkMThBbHBoYSA9ICExLFxuICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSAhMSxcbiAgICAgIHNoaW0gPVxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93IHx8XG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50XG4gICAgICAgICAgPyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQxXG4gICAgICAgICAgOiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyO1xuICAgIGV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPVxuICAgICAgdm9pZCAwICE9PSBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZSA/IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlIDogc2hpbTtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/shim/index.js": /*!*********************************************************************************************************!*\ !*** ./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/shim/index.js ***! \*********************************************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\n\nif (false) {} else {\n module.exports = __webpack_require__(/*! ../cjs/use-sync-external-store-shim.development.js */ \"(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWlzLWh5ZHJhdGVkL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQyxDQUFDO0FBQ0YsRUFBRSx5UEFBOEU7QUFDaEYiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1pcy1oeWRyYXRlZC9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store/shim/index.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs": /*!***********************************************************************!*\ !*** ./node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs ***! \***********************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLayoutEffect: () => (/* binding */ useLayoutEffect2)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n// packages/react/use-layout-effect/src/use-layout-effect.tsx\n\nvar useLayoutEffect2 = globalThis?.document ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : () => {\n};\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3QvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUMrQjtBQUMvQiw4Q0FBOEMsa0RBQXFCO0FBQ25FO0FBR0U7QUFDRiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3QvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWxheW91dC1lZmZlY3Qvc3JjL3VzZS1sYXlvdXQtZWZmZWN0LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgdXNlTGF5b3V0RWZmZWN0MiA9IGdsb2JhbFRoaXM/LmRvY3VtZW50ID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogKCkgPT4ge1xufTtcbmV4cG9ydCB7XG4gIHVzZUxheW91dEVmZmVjdDIgYXMgdXNlTGF5b3V0RWZmZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/base64-js/index.js": /*!*****************************************!*\ !*** ./node_modules/base64-js/index.js ***! \*****************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosa0JBQWtCO0FBQ2xCLG1CQUFtQjtBQUNuQixxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxTQUFTO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkMsVUFBVTtBQUNyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/base64-js/index.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/buffer/index.js": /*!**************************************!*\ !*** ./node_modules/buffer/index.js ***! \**************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n\n\nconst base64 = __webpack_require__(/*! base64-js */ \"(app-pages-browser)/./node_modules/base64-js/index.js\")\nconst ieee754 = __webpack_require__(/*! ieee754 */ \"(app-pages-browser)/./node_modules/ieee754/index.js\")\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRVk7O0FBRVosZUFBZSxtQkFBTyxDQUFDLHdFQUFXO0FBQ2xDLGdCQUFnQixtQkFBTyxDQUFDLG9FQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWM7QUFDZCxrQkFBa0I7QUFDbEIseUJBQXlCOztBQUV6QjtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxFQUFFO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGVBQWU7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQSxzQkFBc0IsZUFBZTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsU0FBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG5jb25zdCBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5jb25zdCBjdXN0b21JbnNwZWN0U3ltYm9sID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbFsnZm9yJ10gPT09ICdmdW5jdGlvbicpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgPyBTeW1ib2xbJ2ZvciddKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgOiBudWxsXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuY29uc3QgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBjb25zdCBwcm90byA9IHsgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGNvbnN0IGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlci5wcm90b3R5cGUsIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlciwgVWludDhBcnJheSlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgbGV0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgY29uc3QgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlWaWV3IChhcnJheVZpZXcpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYXJyYXlWaWV3LCBVaW50OEFycmF5KSkge1xuICAgIGNvbnN0IGNvcHkgPSBuZXcgVWludDhBcnJheShhcnJheVZpZXcpXG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpXG4gIH1cbiAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KVxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgbGV0IGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICBjb25zdCBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIGNvbnN0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICBsZXQgeCA9IGEubGVuZ3RoXG4gIGxldCB5ID0gYi5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIGxldCBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChwb3MgKyBidWYubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBwb3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICB9XG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICBjb25zdCBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGNvbnN0IG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2VyY2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIGNvbnN0IGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIGxldCBzdHIgPSAnJ1xuICBjb25zdCBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuaWYgKGN1c3RvbUluc3BlY3RTeW1ib2wpIHtcbiAgQnVmZmVyLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IEJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICBsZXQgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgbGV0IHkgPSBlbmQgLSBzdGFydFxuICBjb25zdCBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIGNvbnN0IHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIGNvbnN0IHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFt2YWxdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICBsZXQgaW5kZXhTaXplID0gMVxuICBsZXQgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICBsZXQgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICBsZXQgaVxuICBpZiAoZGlyKSB7XG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICBjb25zdCByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgbGV0IGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIGNvbnN0IHJlcyA9IFtdXG5cbiAgbGV0IGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIGxldCBjb2RlUG9pbnQgPSBudWxsXG4gICAgbGV0IGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRilcbiAgICAgID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERilcbiAgICAgICAgICA/IDNcbiAgICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKVxuICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICBsZXQgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG5jb25zdCBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgY29uc3QgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBsZXQgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgbGV0IG91dCA9ICcnXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2ldXVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgbGV0IHJlcyA9ICcnXG4gIC8vIElmIGJ5dGVzLmxlbmd0aCBpcyBvZGQsIHRoZSBsYXN0IDggYml0cyBtdXN0IGJlIGlnbm9yZWQgKHNhbWUgYXMgbm9kZS5qcylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgY29uc3QgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICBsZXQgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IGxvID0gZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNFxuXG4gIGNvbnN0IGhpID0gdGhpc1srK29mZnNldF0gK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIGxhc3QgKiAyICoqIDI0XG5cbiAgcmV0dXJuIEJpZ0ludChsbykgKyAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgaGkgPSBmaXJzdCAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdXG5cbiAgY29uc3QgbG8gPSB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3RcblxuICByZXR1cm4gKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQobG8pXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXRdXG4gIGxldCBtdWwgPSAxXG4gIGxldCBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoXG4gIGxldCBtdWwgPSAxXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0TEUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDRdICtcbiAgICB0aGlzW29mZnNldCArIDVdICogMiAqKiA4ICtcbiAgICB0aGlzW29mZnNldCArIDZdICogMiAqKiAxNiArXG4gICAgKGxhc3QgPDwgMjQpIC8vIE92ZXJmbG93XG5cbiAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArXG4gICAgQmlnSW50KGZpcnN0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgdmFsID0gKGZpcnN0IDw8IDI0KSArIC8vIE92ZXJmbG93XG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQodGhpc1srK29mZnNldF0gKiAyICoqIDI0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICBsYXN0KVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50TEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIGxldCBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiB3cnRCaWdVSW50NjRMRSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBtaW4sIG1heCkge1xuICBjaGVja0ludEJJKHZhbHVlLCBtaW4sIG1heCwgYnVmLCBvZmZzZXQsIDcpXG5cbiAgbGV0IGxvID0gTnVtYmVyKHZhbHVlICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICByZXR1cm4gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NEJFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyA3XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNl0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDVdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA0XSA9IGxvXG4gIGxldCBoaSA9IE51bWJlcih2YWx1ZSA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0ICsgM10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDJdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQgKyAxXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0XSA9IGhpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgQmlnSW50KDApLCBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gMFxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnSW50NjRMRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoJzB4ODAwMDAwMDAwMDAwMDAwMCcpLCBCaWdJbnQoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NEJFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgY29uc3QgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdmFsID0gTnVtYmVyKHZhbClcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICBsZXQgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBDVVNUT00gRVJST1JTXG4vLyA9PT09PT09PT09PT09XG5cbi8vIFNpbXBsaWZpZWQgdmVyc2lvbnMgZnJvbSBOb2RlLCBjaGFuZ2VkIGZvciBCdWZmZXItb25seSB1c2FnZVxuY29uc3QgZXJyb3JzID0ge31cbmZ1bmN0aW9uIEUgKHN5bSwgZ2V0TWVzc2FnZSwgQmFzZSkge1xuICBlcnJvcnNbc3ltXSA9IGNsYXNzIE5vZGVFcnJvciBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgIHN1cGVyKClcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgICB2YWx1ZTogZ2V0TWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KVxuXG4gICAgICAvLyBBZGQgdGhlIGVycm9yIGNvZGUgdG8gdGhlIG5hbWUgdG8gaW5jbHVkZSBpdCBpbiB0aGUgc3RhY2sgdHJhY2UuXG4gICAgICB0aGlzLm5hbWUgPSBgJHt0aGlzLm5hbWV9IFske3N5bX1dYFxuICAgICAgLy8gQWNjZXNzIHRoZSBzdGFjayB0byBnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGVycm9yIGNvZGVcbiAgICAgIC8vIGZyb20gdGhlIG5hbWUuXG4gICAgICB0aGlzLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAvLyBSZXNldCB0aGUgbmFtZSB0byB0aGUgYWN0dWFsIG5hbWUuXG4gICAgICBkZWxldGUgdGhpcy5uYW1lXG4gICAgfVxuXG4gICAgZ2V0IGNvZGUgKCkge1xuICAgICAgcmV0dXJuIHN5bVxuICAgIH1cblxuICAgIHNldCBjb2RlICh2YWx1ZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2RlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtzeW19XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgIH1cbiAgfVxufVxuXG5FKCdFUlJfQlVGRkVSX09VVF9PRl9CT1VORFMnLFxuICBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gYCR7bmFtZX0gaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzYFxuICAgIH1cblxuICAgIHJldHVybiAnQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kcydcbiAgfSwgUmFuZ2VFcnJvcilcbkUoJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgZnVuY3Rpb24gKG5hbWUsIGFjdHVhbCkge1xuICAgIHJldHVybiBgVGhlIFwiJHtuYW1lfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWBcbiAgfSwgVHlwZUVycm9yKVxuRSgnRVJSX09VVF9PRl9SQU5HRScsXG4gIGZ1bmN0aW9uIChzdHIsIHJhbmdlLCBpbnB1dCkge1xuICAgIGxldCBtc2cgPSBgVGhlIHZhbHVlIG9mIFwiJHtzdHJ9XCIgaXMgb3V0IG9mIHJhbmdlLmBcbiAgICBsZXQgcmVjZWl2ZWQgPSBpbnB1dFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCBpbnB1dCA8IC0oQmlnSW50KDIpICoqIEJpZ0ludCgzMikpKSB7XG4gICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHJlY2VpdmVkKVxuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gJ24nXG4gICAgfVxuICAgIG1zZyArPSBgIEl0IG11c3QgYmUgJHtyYW5nZX0uIFJlY2VpdmVkICR7cmVjZWl2ZWR9YFxuICAgIHJldHVybiBtc2dcbiAgfSwgUmFuZ2VFcnJvcilcblxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yICh2YWwpIHtcbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gdmFsLmxlbmd0aFxuICBjb25zdCBzdGFydCA9IHZhbFswXSA9PT0gJy0nID8gMSA6IDBcbiAgZm9yICg7IGkgPj0gc3RhcnQgKyA0OyBpIC09IDMpIHtcbiAgICByZXMgPSBgXyR7dmFsLnNsaWNlKGkgLSAzLCBpKX0ke3Jlc31gXG4gIH1cbiAgcmV0dXJuIGAke3ZhbC5zbGljZSgwLCBpKX0ke3Jlc31gXG59XG5cbi8vIENIRUNLIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNoZWNrQm91bmRzIChidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBpZiAoYnVmW29mZnNldF0gPT09IHVuZGVmaW5lZCB8fCBidWZbb2Zmc2V0ICsgYnl0ZUxlbmd0aF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgYnVmLmxlbmd0aCAtIChieXRlTGVuZ3RoICsgMSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tJbnRCSSAodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHtcbiAgICBjb25zdCBuID0gdHlwZW9mIG1pbiA9PT0gJ2JpZ2ludCcgPyAnbicgOiAnJ1xuICAgIGxldCByYW5nZVxuICAgIGlmIChieXRlTGVuZ3RoID4gMykge1xuICAgICAgaWYgKG1pbiA9PT0gMCB8fCBtaW4gPT09IEJpZ0ludCgwKSkge1xuICAgICAgICByYW5nZSA9IGA+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkeyhieXRlTGVuZ3RoICsgMSkgKiA4fSR7bn1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9IGA+PSAtKDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn0pIGFuZCA8IDIgKiogYCArXG4gICAgICAgICAgICAgICAgYCR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlID0gYD49ICR7bWlufSR7bn0gYW5kIDw9ICR7bWF4fSR7bn1gXG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSgndmFsdWUnLCByYW5nZSwgdmFsdWUpXG4gIH1cbiAgY2hlY2tCb3VuZHMoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyICh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvdW5kc0Vycm9yICh2YWx1ZSwgbGVuZ3RoLCB0eXBlKSB7XG4gIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUpIHtcbiAgICB2YWxpZGF0ZU51bWJlcih2YWx1ZSwgdHlwZSlcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JywgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuXG4gIGlmIChsZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKVxuICB9XG5cbiAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgJ29mZnNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPj0gJHt0eXBlID8gMSA6IDB9IGFuZCA8PSAke2xlbmd0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxuY29uc3QgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIGxldCBjb2RlUG9pbnRcbiAgY29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICBsZXQgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIGxldCBjLCBoaSwgbG9cbiAgY29uc3QgYnl0ZUFycmF5ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxuY29uc3QgaGV4U2xpY2VMb29rdXBUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWYnXG4gIGNvbnN0IHRhYmxlID0gbmV3IEFycmF5KDI1NilcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgY29uc3QgaTE2ID0gaSAqIDE2XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICB0YWJsZVtpMTYgKyBqXSA9IGFscGhhYmV0W2ldICsgYWxwaGFiZXRbal1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhYmxlXG59KSgpXG5cbi8vIFJldHVybiBub3QgZnVuY3Rpb24gd2l0aCBFcnJvciBpZiBCaWdJbnQgbm90IHN1cHBvcnRlZFxuZnVuY3Rpb24gZGVmaW5lQmlnSW50TWV0aG9kIChmbikge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyBCdWZmZXJCaWdJbnROb3REZWZpbmVkIDogZm5cbn1cblxuZnVuY3Rpb24gQnVmZmVyQmlnSW50Tm90RGVmaW5lZCAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignQmlnSW50IG5vdCBzdXBwb3J0ZWQnKVxufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/buffer/index.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/class-variance-authority/dist/index.mjs": /*!**************************************************************!*\ !*** ./node_modules/class-variance-authority/dist/index.mjs ***! \**************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ cva: () => (/* binding */ cva),\n/* harmony export */ cx: () => (/* binding */ cx)\n/* harmony export */ });\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ \nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nconst cx = clsx__WEBPACK_IMPORTED_MODULE_0__.clsx;\nconst cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9jbGFzcy12YXJpYW5jZS1hdXRob3JpdHkvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBZ0M7QUFDaEMsK0RBQStELE1BQU07QUFDOUQsV0FBVyxzQ0FBSTtBQUNmO0FBQ1A7QUFDQTtBQUNBLGdCQUFnQiw0QkFBNEI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJO0FBQ2I7QUFDQSxrQkFBa0Isb0VBQW9FO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9jbGFzcy12YXJpYW5jZS1hdXRob3JpdHkvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAyMiBKb2UgQmVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlXG4gKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVFxuICogV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGVcbiAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyXG4gKiB0aGUgTGljZW5zZS5cbiAqLyBpbXBvcnQgeyBjbHN4IH0gZnJvbSBcImNsc3hcIjtcbmNvbnN0IGZhbHN5VG9TdHJpbmcgPSAodmFsdWUpPT50eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gYCR7dmFsdWV9YCA6IHZhbHVlID09PSAwID8gXCIwXCIgOiB2YWx1ZTtcbmV4cG9ydCBjb25zdCBjeCA9IGNsc3g7XG5leHBvcnQgY29uc3QgY3ZhID0gKGJhc2UsIGNvbmZpZyk9Pihwcm9wcyk9PntcbiAgICAgICAgdmFyIF9jb25maWdfY29tcG91bmRWYXJpYW50cztcbiAgICAgICAgaWYgKChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcudmFyaWFudHMpID09IG51bGwpIHJldHVybiBjeChiYXNlLCBwcm9wcyA9PT0gbnVsbCB8fCBwcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvcHMuY2xhc3MsIHByb3BzID09PSBudWxsIHx8IHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9wcy5jbGFzc05hbWUpO1xuICAgICAgICBjb25zdCB7IHZhcmlhbnRzLCBkZWZhdWx0VmFyaWFudHMgfSA9IGNvbmZpZztcbiAgICAgICAgY29uc3QgZ2V0VmFyaWFudENsYXNzTmFtZXMgPSBPYmplY3Qua2V5cyh2YXJpYW50cykubWFwKCh2YXJpYW50KT0+e1xuICAgICAgICAgICAgY29uc3QgdmFyaWFudFByb3AgPSBwcm9wcyA9PT0gbnVsbCB8fCBwcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvcHNbdmFyaWFudF07XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFyaWFudFByb3AgPSBkZWZhdWx0VmFyaWFudHMgPT09IG51bGwgfHwgZGVmYXVsdFZhcmlhbnRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0VmFyaWFudHNbdmFyaWFudF07XG4gICAgICAgICAgICBpZiAodmFyaWFudFByb3AgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFudEtleSA9IGZhbHN5VG9TdHJpbmcodmFyaWFudFByb3ApIHx8IGZhbHN5VG9TdHJpbmcoZGVmYXVsdFZhcmlhbnRQcm9wKTtcbiAgICAgICAgICAgIHJldHVybiB2YXJpYW50c1t2YXJpYW50XVt2YXJpYW50S2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb3BzV2l0aG91dFVuZGVmaW5lZCA9IHByb3BzICYmIE9iamVjdC5lbnRyaWVzKHByb3BzKS5yZWR1Y2UoKGFjYywgcGFyYW0pPT57XG4gICAgICAgICAgICBsZXQgW2tleSwgdmFsdWVdID0gcGFyYW07XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBjb25zdCBnZXRDb21wb3VuZFZhcmlhbnRDbGFzc05hbWVzID0gY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9jb25maWdfY29tcG91bmRWYXJpYW50cyA9IGNvbmZpZy5jb21wb3VuZFZhcmlhbnRzKSA9PT0gbnVsbCB8fCBfY29uZmlnX2NvbXBvdW5kVmFyaWFudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb25maWdfY29tcG91bmRWYXJpYW50cy5yZWR1Y2UoKGFjYywgcGFyYW0pPT57XG4gICAgICAgICAgICBsZXQgeyBjbGFzczogY3ZDbGFzcywgY2xhc3NOYW1lOiBjdkNsYXNzTmFtZSwgLi4uY29tcG91bmRWYXJpYW50T3B0aW9ucyB9ID0gcGFyYW07XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29tcG91bmRWYXJpYW50T3B0aW9ucykuZXZlcnkoKHBhcmFtKT0+e1xuICAgICAgICAgICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBwYXJhbTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5pbmNsdWRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRWYXJpYW50cyxcbiAgICAgICAgICAgICAgICAgICAgLi4ucHJvcHNXaXRob3V0VW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfVtrZXldKSA6ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRWYXJpYW50cyxcbiAgICAgICAgICAgICAgICAgICAgLi4ucHJvcHNXaXRob3V0VW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSlba2V5XSA9PT0gdmFsdWU7XG4gICAgICAgICAgICB9KSA/IFtcbiAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgY3ZDbGFzcyxcbiAgICAgICAgICAgICAgICBjdkNsYXNzTmFtZVxuICAgICAgICAgICAgXSA6IGFjYztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICByZXR1cm4gY3goYmFzZSwgZ2V0VmFyaWFudENsYXNzTmFtZXMsIGdldENvbXBvdW5kVmFyaWFudENsYXNzTmFtZXMsIHByb3BzID09PSBudWxsIHx8IHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9wcy5jbGFzcywgcHJvcHMgPT09IG51bGwgfHwgcHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb3BzLmNsYXNzTmFtZSk7XG4gICAgfTtcblxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/class-variance-authority/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs": /*!*****************************************!*\ !*** ./node_modules/clsx/dist/clsx.mjs ***! \*****************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clsx: () => (/* binding */ clsx),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (clsx);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxjQUFjLGFBQWEsK0NBQStDLGdEQUFnRCxlQUFlLFFBQVEsSUFBSSwwQ0FBMEMseUNBQXlDLFNBQWdCLGdCQUFnQix3Q0FBd0MsSUFBSSxtREFBbUQsU0FBUyxpRUFBZSxJQUFJIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKX1lbHNlIGZvcihmIGluIGUpZVtmXSYmKG4mJihuKz1cIiBcIiksbis9Zik7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiLG89YXJndW1lbnRzLmxlbmd0aDtmPG87ZisrKShlPWFyZ3VtZW50c1tmXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/ieee754/index.js": /*!***************************************!*\ !*** ./node_modules/ieee754/index.js ***! \***************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { eval(__webpack_require__.ts("/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXOztBQUVwQjtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVc7O0FBRXBCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBLFNBQVMsVUFBVTs7QUFFbkI7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ieee754/index.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/Icon.js": /*!****************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/Icon.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Icon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _defaultAttributes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultAttributes.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/defaultAttributes.js\");\n/* harmony import */ var _shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared/src/utils.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \n\n\nconst Icon = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(_c = (param, ref)=>{\n let { color = \"currentColor\", size = 24, strokeWidth = 2, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest } = param;\n return /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"svg\", {\n ref,\n ..._defaultAttributes_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: (0,_shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeClasses)(\"lucide\", className),\n ...rest\n }, [\n ...iconNode.map((param)=>{\n let [tag, attrs] = param;\n return /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(tag, attrs);\n }),\n ...Array.isArray(children) ? children : [\n children\n ]\n ]);\n});\n_c1 = Icon;\n //# sourceMappingURL=Icon.js.map\nvar _c, _c1;\n$RefreshReg$(_c, \"Icon$forwardRef\");\n$RefreshReg$(_c1, \"Icon\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vSWNvbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLENBQU0sU0FBTyx3RUFDWCxRQVdFLEdBQ0c7UUFYSCxFQUNFLEtBQVEsbUJBQ1IsSUFBTyxPQUNQLFdBQWMsTUFDZCxxQkFDQSxTQUFZLE9BQ1osVUFDQSxVQUNBLEdBQUc7SUFJRSwyRUFDTCxNQUNBO1FBQ0U7UUFDQSxHQUFHO1FBQ0gsS0FBTztRQUNQLE1BQVE7UUFDUixNQUFRO1FBQ1IsWUFBYSxxQkFBdUIsUUFBTyxFQUFXLFlBQUksSUFBTSxVQUFPLENBQUksSUFBSTtRQUMvRSxVQUFXLG1FQUFhLFdBQVUsU0FBUztRQUMzQyxHQUFHO0lBQ0wsR0FDQTtXQUNLLENBQVMsWUFBSTtnQkFBQyxDQUFDLENBQUssS0FBSyxLQUFNO2lDQUFBLHFEQUFjLEdBQUssT0FBSyxDQUFDOztXQUN2RCxLQUFNLFNBQVEsUUFBUSxDQUFJLGNBQVc7WUFBQyxRQUFRO1NBQUE7S0FDcEQ7QUFFSiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvc3JjL0ljb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBkZWZhdWx0QXR0cmlidXRlcyBmcm9tICcuL2RlZmF1bHRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IEljb25Ob2RlLCBMdWNpZGVQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgbWVyZ2VDbGFzc2VzIH0gZnJvbSAnQGx1Y2lkZS9zaGFyZWQnO1xuXG5pbnRlcmZhY2UgSWNvbkNvbXBvbmVudFByb3BzIGV4dGVuZHMgTHVjaWRlUHJvcHMge1xuICBpY29uTm9kZTogSWNvbk5vZGU7XG59XG5cbi8qKlxuICogTHVjaWRlIGljb24gY29tcG9uZW50XG4gKlxuICogQGNvbXBvbmVudCBJY29uXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy5jb2xvciAtIFRoZSBjb2xvciBvZiB0aGUgaWNvblxuICogQHBhcmFtIHtudW1iZXJ9IHByb3BzLnNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgaWNvblxuICogQHBhcmFtIHtudW1iZXJ9IHByb3BzLnN0cm9rZVdpZHRoIC0gVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgaWNvblxuICogQHBhcmFtIHtib29sZWFufSBwcm9wcy5hYnNvbHV0ZVN0cm9rZVdpZHRoIC0gV2hldGhlciB0byB1c2UgYWJzb2x1dGUgc3Ryb2tlIHdpZHRoXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHMuY2xhc3NOYW1lIC0gVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGljb25cbiAqIEBwYXJhbSB7SWNvbk5vZGV9IHByb3BzLmNoaWxkcmVuIC0gVGhlIGNoaWxkcmVuIG9mIHRoZSBpY29uXG4gKiBAcGFyYW0ge0ljb25Ob2RlfSBwcm9wcy5pY29uTm9kZSAtIFRoZSBpY29uIG5vZGUgb2YgdGhlIGljb25cbiAqXG4gKiBAcmV0dXJucyB7Rm9yd2FyZFJlZkV4b3RpY0NvbXBvbmVudH0gTHVjaWRlSWNvblxuICovXG5jb25zdCBJY29uID0gZm9yd2FyZFJlZjxTVkdTVkdFbGVtZW50LCBJY29uQ29tcG9uZW50UHJvcHM+KFxuICAoXG4gICAge1xuICAgICAgY29sb3IgPSAnY3VycmVudENvbG9yJyxcbiAgICAgIHNpemUgPSAyNCxcbiAgICAgIHN0cm9rZVdpZHRoID0gMixcbiAgICAgIGFic29sdXRlU3Ryb2tlV2lkdGgsXG4gICAgICBjbGFzc05hbWUgPSAnJyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgaWNvbk5vZGUsXG4gICAgICAuLi5yZXN0XG4gICAgfSxcbiAgICByZWYsXG4gICkgPT4ge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgJ3N2ZycsXG4gICAgICB7XG4gICAgICAgIHJlZixcbiAgICAgICAgLi4uZGVmYXVsdEF0dHJpYnV0ZXMsXG4gICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICBoZWlnaHQ6IHNpemUsXG4gICAgICAgIHN0cm9rZTogY29sb3IsXG4gICAgICAgIHN0cm9rZVdpZHRoOiBhYnNvbHV0ZVN0cm9rZVdpZHRoID8gKE51bWJlcihzdHJva2VXaWR0aCkgKiAyNCkgLyBOdW1iZXIoc2l6ZSkgOiBzdHJva2VXaWR0aCxcbiAgICAgICAgY2xhc3NOYW1lOiBtZXJnZUNsYXNzZXMoJ2x1Y2lkZScsIGNsYXNzTmFtZSksXG4gICAgICAgIC4uLnJlc3QsXG4gICAgICB9LFxuICAgICAgW1xuICAgICAgICAuLi5pY29uTm9kZS5tYXAoKFt0YWcsIGF0dHJzXSkgPT4gY3JlYXRlRWxlbWVudCh0YWcsIGF0dHJzKSksXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogW2NoaWxkcmVuXSksXG4gICAgICBdLFxuICAgICk7XG4gIH0sXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBJY29uO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/Icon.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js": /*!****************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/createLucideIcon.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createLucideIcon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared/src/utils.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js\");\n/* harmony import */ var _Icon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Icon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/Icon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \n\n\nconst createLucideIcon = (iconName, iconNode)=>{\n const Component = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)((param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_Icon_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n ref,\n iconNode,\n className: (0,_shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeClasses)(\"lucide-\".concat((0,_shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.toKebabCase)(iconName)), className),\n ...props\n });\n });\n Component.displayName = \"\".concat(iconName);\n return Component;\n};\n //# sourceMappingURL=createLucideIcon.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vY3JlYXRlTHVjaWRlSWNvbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBV00sdUJBQW1CLEdBQUMsVUFBa0IsUUFBdUI7SUFDakUsTUFBTSxDQUFZLG1GQUFpRTtZQUF6QixFQUFFLENBQVcsV0FBRyxRQUFTOzZCQUNqRixvREFBYSxDQUFDLGdEQUFNO1lBQ2xCO1lBQ0E7WUFDQSxXQUFXLGtFQUFhLFdBQStCLE9BQXJCLGlFQUFXLENBQUMsUUFBUSxDQUFDLEdBQUksU0FBUztZQUNwRSxHQUFHO1FBQUEsQ0FDSjs7SUFHTyx3QkFBYyxDQUFHLEVBQVEsT0FBUixRQUFRO0lBRTVCO0FBQ1QiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L3NyYy9jcmVhdGVMdWNpZGVJY29uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtZXJnZUNsYXNzZXMsIHRvS2ViYWJDYXNlIH0gZnJvbSAnQGx1Y2lkZS9zaGFyZWQnO1xuaW1wb3J0IHsgSWNvbk5vZGUsIEx1Y2lkZVByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24nO1xuXG4vKipcbiAqIENyZWF0ZSBhIEx1Y2lkZSBpY29uIGNvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IGljb25OYW1lXG4gKiBAcGFyYW0ge2FycmF5fSBpY29uTm9kZVxuICogQHJldHVybnMge0ZvcndhcmRSZWZFeG90aWNDb21wb25lbnR9IEx1Y2lkZUljb25cbiAqL1xuY29uc3QgY3JlYXRlTHVjaWRlSWNvbiA9IChpY29uTmFtZTogc3RyaW5nLCBpY29uTm9kZTogSWNvbk5vZGUpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gZm9yd2FyZFJlZjxTVkdTVkdFbGVtZW50LCBMdWNpZGVQcm9wcz4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+XG4gICAgY3JlYXRlRWxlbWVudChJY29uLCB7XG4gICAgICByZWYsXG4gICAgICBpY29uTm9kZSxcbiAgICAgIGNsYXNzTmFtZTogbWVyZ2VDbGFzc2VzKGBsdWNpZGUtJHt0b0tlYmFiQ2FzZShpY29uTmFtZSl9YCwgY2xhc3NOYW1lKSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLFxuICApO1xuXG4gIENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGAke2ljb25OYW1lfWA7XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUx1Y2lkZUljb247XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/defaultAttributes.js": /*!*****************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/defaultAttributes.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ defaultAttributes)\n/* harmony export */ });\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ var defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n //# sourceMappingURL=defaultAttributes.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vZGVmYXVsdEF0dHJpYnV0ZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsQ0FBZTtJQUNiLEtBQU87SUFDUCxLQUFPO0lBQ1AsTUFBUTtJQUNSLE9BQVM7SUFDVCxJQUFNO0lBQ04sTUFBUTtJQUNSLFdBQWE7SUFDYixhQUFlO0lBQ2YsY0FBZ0I7QUFDbEIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L3NyYy9kZWZhdWx0QXR0cmlidXRlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIHhtbG5zOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICB3aWR0aDogMjQsXG4gIGhlaWdodDogMjQsXG4gIHZpZXdCb3g6ICcwIDAgMjQgMjQnLFxuICBmaWxsOiAnbm9uZScsXG4gIHN0cm9rZTogJ2N1cnJlbnRDb2xvcicsXG4gIHN0cm9rZVdpZHRoOiAyLFxuICBzdHJva2VMaW5lY2FwOiAncm91bmQnLFxuICBzdHJva2VMaW5lam9pbjogJ3JvdW5kJyxcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/defaultAttributes.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js": /*!***********************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/clock.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Clock)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Clock = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Clock\", [\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"12\",\n r: \"10\",\n key: \"1mglay\"\n }\n ],\n [\n \"polyline\",\n {\n points: \"12 6 12 12 16 14\",\n key: \"68esgv\"\n }\n ]\n]);\n //# sourceMappingURL=clock.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY2xvY2suanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxjQUFRLGdFQUFnQixDQUFDLE9BQVM7SUFDdEM7UUFBQyxRQUFVO1FBQUE7WUFBRSxFQUFJO1lBQU0sQ0FBSSxRQUFNO1lBQUEsQ0FBRztZQUFNLEdBQUs7UUFBQSxDQUFVO0tBQUE7SUFDekQ7UUFBQyxVQUFZO1FBQUE7WUFBRSxRQUFRLENBQW9CO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtDQUMzRCIsInNvdXJjZXMiOlsiL2hvbWUvc3JjL2ljb25zL2Nsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgQ2xvY2tcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOFkybHlZMnhsSUdONFBTSXhNaUlnWTNrOUlqRXlJaUJ5UFNJeE1DSWdMejRLSUNBOGNHOXNlV3hwYm1VZ2NHOXBiblJ6UFNJeE1pQTJJREV5SURFeUlERTJJREUwSWlBdlBnbzhMM04yWno0SykgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvY2xvY2tcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBDbG9jayA9IGNyZWF0ZUx1Y2lkZUljb24oJ0Nsb2NrJywgW1xuICBbJ2NpcmNsZScsIHsgY3g6ICcxMicsIGN5OiAnMTInLCByOiAnMTAnLCBrZXk6ICcxbWdsYXknIH1dLFxuICBbJ3BvbHlsaW5lJywgeyBwb2ludHM6ICcxMiA2IDEyIDEyIDE2IDE0Jywga2V5OiAnNjhlc2d2JyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBDbG9jaztcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/coins.js": /*!***********************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/coins.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Coins)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Coins = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Coins\", [\n [\n \"circle\",\n {\n cx: \"8\",\n cy: \"8\",\n r: \"6\",\n key: \"3yglwk\"\n }\n ],\n [\n \"path\",\n {\n d: \"M18.09 10.37A6 6 0 1 1 10.34 18\",\n key: \"t5s6rm\"\n }\n ],\n [\n \"path\",\n {\n d: \"M7 6h1v4\",\n key: \"1obek4\"\n }\n ],\n [\n \"path\",\n {\n d: \"m16.71 13.88.7.71-2.82 2.82\",\n key: \"1rbuyh\"\n }\n ]\n]);\n //# sourceMappingURL=coins.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY29pbnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxjQUFRLGdFQUFnQixDQUFDLE9BQVM7SUFDdEM7UUFBQyxRQUFVO1FBQUE7WUFBRSxFQUFJO1lBQUssQ0FBSSxPQUFLO1lBQUEsQ0FBRztZQUFLLEdBQUs7UUFBQSxDQUFVO0tBQUE7SUFDdEQ7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQW1DO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtJQUNoRTtRQUFDLE1BQVE7UUFBQTtZQUFFLEdBQUcsQ0FBWTtZQUFBLEtBQUs7UUFBQSxDQUFVO0tBQUE7SUFDekM7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQStCO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtDQUM3RCIsInNvdXJjZXMiOlsiL2hvbWUvc3JjL2ljb25zL2NvaW5zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgQ29pbnNcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOFkybHlZMnhsSUdONFBTSTRJaUJqZVQwaU9DSWdjajBpTmlJZ0x6NEtJQ0E4Y0dGMGFDQmtQU0pOTVRndU1Ea2dNVEF1TXpkQk5pQTJJREFnTVNBeElERXdMak0wSURFNElpQXZQZ29nSUR4d1lYUm9JR1E5SWswM0lEWm9NWFkwSWlBdlBnb2dJRHh3WVhSb0lHUTlJbTB4Tmk0M01TQXhNeTQ0T0M0M0xqY3hMVEl1T0RJZ01pNDRNaUlnTHo0S1BDOXpkbWMrQ2c9PSkgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvY29pbnNcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBDb2lucyA9IGNyZWF0ZUx1Y2lkZUljb24oJ0NvaW5zJywgW1xuICBbJ2NpcmNsZScsIHsgY3g6ICc4JywgY3k6ICc4JywgcjogJzYnLCBrZXk6ICczeWdsd2snIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdNMTguMDkgMTAuMzdBNiA2IDAgMSAxIDEwLjM0IDE4Jywga2V5OiAndDVzNnJtJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTcgNmgxdjQnLCBrZXk6ICcxb2JlazQnIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdtMTYuNzEgMTMuODguNy43MS0yLjgyIDIuODInLCBrZXk6ICcxcmJ1eWgnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IENvaW5zO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/coins.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/history.js": /*!*************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/history.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ History)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst History = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"History\", [\n [\n \"path\",\n {\n d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\",\n key: \"1357e3\"\n }\n ],\n [\n \"path\",\n {\n d: \"M3 3v5h5\",\n key: \"1xhq8a\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 7v5l4 2\",\n key: \"1fdv2h\"\n }\n ]\n]);\n //# sourceMappingURL=history.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvaGlzdG9yeS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLGdCQUFVLGdFQUFnQixDQUFDLFNBQVc7SUFDMUM7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQXFEO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtJQUNsRjtRQUFDLE1BQVE7UUFBQTtZQUFFLEdBQUcsQ0FBWTtZQUFBLEtBQUs7UUFBQSxDQUFVO0tBQUE7SUFDekM7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQWU7WUFBQSxLQUFLO1FBQUEsQ0FBVTtLQUFBO0NBQzdDIiwic291cmNlcyI6WyIvaG9tZS9zcmMvaWNvbnMvaGlzdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIEhpc3RvcnlcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk15QXhNbUU1SURrZ01DQXhJREFnT1MwNUlEa3VOelVnT1M0M05TQXdJREFnTUMwMkxqYzBJREl1TnpSTU15QTRJaUF2UGdvZ0lEeHdZWFJvSUdROUlrMHpJRE4yTldnMUlpQXZQZ29nSUR4d1lYUm9JR1E5SWsweE1pQTNkalZzTkNBeUlpQXZQZ284TDNOMlp6NEspIC0gaHR0cHM6Ly9sdWNpZGUuZGV2L2ljb25zL2hpc3RvcnlcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBIaXN0b3J5ID0gY3JlYXRlTHVjaWRlSWNvbignSGlzdG9yeScsIFtcbiAgWydwYXRoJywgeyBkOiAnTTMgMTJhOSA5IDAgMSAwIDktOSA5Ljc1IDkuNzUgMCAwIDAtNi43NCAyLjc0TDMgOCcsIGtleTogJzEzNTdlMycgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00zIDN2NWg1Jywga2V5OiAnMXhocThhJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTEyIDd2NWw0IDInLCBrZXk6ICcxZmR2MmgnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IEhpc3Rvcnk7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/history.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/house.js": /*!***********************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/house.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ House)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst House = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"House\", [\n [\n \"path\",\n {\n d: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\",\n key: \"5wwlr5\"\n }\n ],\n [\n \"path\",\n {\n d: \"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\n key: \"1d0kgt\"\n }\n ]\n]);\n //# sourceMappingURL=house.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvaG91c2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxjQUFRLGdFQUFnQixDQUFDLE9BQVM7SUFDdEM7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQThDO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtJQUMzRTtRQUNFO1FBQ0E7WUFDRSxDQUFHO1lBQ0gsR0FBSztRQUNQO0tBQ0Y7Q0FDRCIsInNvdXJjZXMiOlsiL2hvbWUvc3JjL2ljb25zL2hvdXNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgSG91c2VcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk1UVWdNakYyTFRoaE1TQXhJREFnTUNBd0xURXRNV2d0TkdFeElERWdNQ0F3SURBdE1TQXhkamdpSUM4K0NpQWdQSEJoZEdnZ1pEMGlUVE1nTVRCaE1pQXlJREFnTUNBeElDNDNNRGt0TVM0MU1qaHNOeTAxTGprNU9XRXlJRElnTUNBd0lERWdNaTQxT0RJZ01HdzNJRFV1T1RrNVFUSWdNaUF3SURBZ01TQXlNU0F4TUhZNVlUSWdNaUF3SURBZ01TMHlJREpJTldFeUlESWdNQ0F3SURFdE1pMHllaUlnTHo0S1BDOXpkbWMrQ2c9PSkgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvaG91c2VcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBIb3VzZSA9IGNyZWF0ZUx1Y2lkZUljb24oJ0hvdXNlJywgW1xuICBbJ3BhdGgnLCB7IGQ6ICdNMTUgMjF2LThhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjgnLCBrZXk6ICc1d3dscjUnIH1dLFxuICBbXG4gICAgJ3BhdGgnLFxuICAgIHtcbiAgICAgIGQ6ICdNMyAxMGEyIDIgMCAwIDEgLjcwOS0xLjUyOGw3LTUuOTk5YTIgMiAwIDAgMSAyLjU4MiAwbDcgNS45OTlBMiAyIDAgMCAxIDIxIDEwdjlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6JyxcbiAgICAgIGtleTogJzFkMGtndCcsXG4gICAgfSxcbiAgXSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBIb3VzZTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/house.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/map-pin.js": /*!*************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/map-pin.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ MapPin)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst MapPin = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"MapPin\", [\n [\n \"path\",\n {\n d: \"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\n key: \"1r0f0z\"\n }\n ],\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"10\",\n r: \"3\",\n key: \"ilqhr7\"\n }\n ]\n]);\n //# sourceMappingURL=map-pin.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLGVBQVMsZ0VBQWdCLENBQUMsUUFBVTtJQUN4QztRQUNFO1FBQ0E7WUFDRSxDQUFHO1lBQ0gsR0FBSztRQUNQO0tBQ0Y7SUFDQTtRQUFDLFFBQVU7UUFBQTtZQUFFLEVBQUk7WUFBTSxDQUFJLFFBQU07WUFBQSxDQUFHO1lBQUssR0FBSztRQUFBLENBQVU7S0FBQTtDQUN6RCIsInNvdXJjZXMiOlsiL2hvbWUvc3JjL2ljb25zL21hcC1waW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbic7XG5cbi8qKlxuICogQGNvbXBvbmVudCBAbmFtZSBNYXBQaW5cbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk1qQWdNVEJqTUNBMExqazVNeTAxTGpVek9TQXhNQzR4T1RNdE55NHpPVGtnTVRFdU56azVZVEVnTVNBd0lEQWdNUzB4TGpJd01pQXdRemt1TlRNNUlESXdMakU1TXlBMElERTBMams1TXlBMElERXdZVGdnT0NBd0lEQWdNU0F4TmlBd0lpQXZQZ29nSUR4amFYSmpiR1VnWTNnOUlqRXlJaUJqZVQwaU1UQWlJSEk5SWpNaUlDOCtDand2YzNablBnbz0pIC0gaHR0cHM6Ly9sdWNpZGUuZGV2L2ljb25zL21hcC1waW5cbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBNYXBQaW4gPSBjcmVhdGVMdWNpZGVJY29uKCdNYXBQaW4nLCBbXG4gIFtcbiAgICAncGF0aCcsXG4gICAge1xuICAgICAgZDogJ00yMCAxMGMwIDQuOTkzLTUuNTM5IDEwLjE5My03LjM5OSAxMS43OTlhMSAxIDAgMCAxLTEuMjAyIDBDOS41MzkgMjAuMTkzIDQgMTQuOTkzIDQgMTBhOCA4IDAgMCAxIDE2IDAnLFxuICAgICAga2V5OiAnMXIwZjB6JyxcbiAgICB9LFxuICBdLFxuICBbJ2NpcmNsZScsIHsgY3g6ICcxMicsIGN5OiAnMTAnLCByOiAnMycsIGtleTogJ2lscWhyNycgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgTWFwUGluO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/map-pin.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trending-up.js": /*!*****************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/trending-up.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TrendingUp)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst TrendingUp = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"TrendingUp\", [\n [\n \"polyline\",\n {\n points: \"22 7 13.5 15.5 8.5 10.5 2 17\",\n key: \"126l90\"\n }\n ],\n [\n \"polyline\",\n {\n points: \"16 7 22 7 22 13\",\n key: \"kwv8wd\"\n }\n ]\n]);\n //# sourceMappingURL=trending-up.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvdHJlbmRpbmctdXAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxtQkFBYSxnRUFBZ0IsQ0FBQyxZQUFjO0lBQ2hEO1FBQUMsVUFBWTtRQUFBO1lBQUUsUUFBUSxDQUFnQztZQUFBLEtBQUs7UUFBQSxDQUFVO0tBQUE7SUFDdEU7UUFBQyxVQUFZO1FBQUE7WUFBRSxRQUFRLENBQW1CO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtDQUMxRCIsInNvdXJjZXMiOlsiL2hvbWUvc3JjL2ljb25zL3RyZW5kaW5nLXVwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgVHJlbmRpbmdVcFxuICogQGRlc2NyaXB0aW9uIEx1Y2lkZSBTVkcgaWNvbiBjb21wb25lbnQsIHJlbmRlcnMgU1ZHIEVsZW1lbnQgd2l0aCBjaGlsZHJlbi5cbiAqXG4gKiBAcHJldmlldyAhW2ltZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlBZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWdvZ0lIZHBaSFJvUFNJeU5DSUtJQ0JvWldsbmFIUTlJakkwSWdvZ0lIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSUtJQ0JtYVd4c1BTSnViMjVsSWdvZ0lITjBjbTlyWlQwaUl6QXdNQ0lnYzNSNWJHVTlJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN0lHSnZjbVJsY2kxeVlXUnBkWE02SURKd2VDSUtJQ0J6ZEhKdmEyVXRkMmxrZEdnOUlqSWlDaUFnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lnb2dJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaUNqNEtJQ0E4Y0c5c2VXeHBibVVnY0c5cGJuUnpQU0l5TWlBM0lERXpMalVnTVRVdU5TQTRMalVnTVRBdU5TQXlJREUzSWlBdlBnb2dJRHh3YjJ4NWJHbHVaU0J3YjJsdWRITTlJakUySURjZ01qSWdOeUF5TWlBeE15SWdMejRLUEM5emRtYytDZz09KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy90cmVuZGluZy11cFxuICogQHNlZSBodHRwczovL2x1Y2lkZS5kZXYvZ3VpZGUvcGFja2FnZXMvbHVjaWRlLXJlYWN0IC0gRG9jdW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIEx1Y2lkZSBpY29ucyBwcm9wcyBhbmQgYW55IHZhbGlkIFNWRyBhdHRyaWJ1dGVcbiAqIEByZXR1cm5zIHtKU1guRWxlbWVudH0gSlNYIEVsZW1lbnRcbiAqXG4gKi9cbmNvbnN0IFRyZW5kaW5nVXAgPSBjcmVhdGVMdWNpZGVJY29uKCdUcmVuZGluZ1VwJywgW1xuICBbJ3BvbHlsaW5lJywgeyBwb2ludHM6ICcyMiA3IDEzLjUgMTUuNSA4LjUgMTAuNSAyIDE3Jywga2V5OiAnMTI2bDkwJyB9XSxcbiAgWydwb2x5bGluZScsIHsgcG9pbnRzOiAnMTYgNyAyMiA3IDIyIDEzJywga2V5OiAna3d2OHdkJyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBUcmVuZGluZ1VwO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trending-up.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trophy.js": /*!************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/trophy.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Trophy)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Trophy = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Trophy\", [\n [\n \"path\",\n {\n d: \"M6 9H4.5a2.5 2.5 0 0 1 0-5H6\",\n key: \"17hqa7\"\n }\n ],\n [\n \"path\",\n {\n d: \"M18 9h1.5a2.5 2.5 0 0 0 0-5H18\",\n key: \"lmptdp\"\n }\n ],\n [\n \"path\",\n {\n d: \"M4 22h16\",\n key: \"57wxv0\"\n }\n ],\n [\n \"path\",\n {\n d: \"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22\",\n key: \"1nw9bq\"\n }\n ],\n [\n \"path\",\n {\n d: \"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22\",\n key: \"1np0yb\"\n }\n ],\n [\n \"path\",\n {\n d: \"M18 2H6v7a6 6 0 0 0 12 0V2Z\",\n key: \"u46fv3\"\n }\n ]\n]);\n //# sourceMappingURL=trophy.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvdHJvcGh5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sZUFBUyxnRUFBZ0IsQ0FBQyxRQUFVO0lBQ3hDO1FBQUMsTUFBUTtRQUFBO1lBQUUsR0FBRyxDQUFnQztZQUFBLEtBQUs7UUFBQSxDQUFVO0tBQUE7SUFDN0Q7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQWtDO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtJQUMvRDtRQUFDLE1BQVE7UUFBQTtZQUFFLEdBQUcsQ0FBWTtZQUFBLEtBQUs7UUFBQSxDQUFVO0tBQUE7SUFDekM7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQThEO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtJQUMzRjtRQUFDLE1BQVE7UUFBQTtZQUFFLEdBQUcsQ0FBK0Q7WUFBQSxLQUFLO1FBQUEsQ0FBVTtLQUFBO0lBQzVGO1FBQUMsTUFBUTtRQUFBO1lBQUUsR0FBRyxDQUErQjtZQUFBLEtBQUs7UUFBQSxDQUFVO0tBQUE7Q0FDN0QiLCJzb3VyY2VzIjpbIi9ob21lL3NyYy9pY29ucy90cm9waHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbic7XG5cbi8qKlxuICogQGNvbXBvbmVudCBAbmFtZSBUcm9waHlcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk5pQTVTRFF1TldFeUxqVWdNaTQxSURBZ01DQXhJREF0TlVnMklpQXZQZ29nSUR4d1lYUm9JR1E5SWsweE9DQTVhREV1TldFeUxqVWdNaTQxSURBZ01DQXdJREF0TlVneE9DSWdMejRLSUNBOGNHRjBhQ0JrUFNKTk5DQXlNbWd4TmlJZ0x6NEtJQ0E4Y0dGMGFDQmtQU0pOTVRBZ01UUXVOalpXTVRkak1DQXVOVFV0TGpRM0xqazRMUzQ1TnlBeExqSXhRemN1T0RVZ01UZ3VOelVnTnlBeU1DNHlOQ0EzSURJeUlpQXZQZ29nSUR4d1lYUm9JR1E5SWsweE5DQXhOQzQyTmxZeE4yTXdJQzQxTlM0ME55NDVPQzQ1TnlBeExqSXhRekUyTGpFMUlERTRMamMxSURFM0lESXdMakkwSURFM0lESXlJaUF2UGdvZ0lEeHdZWFJvSUdROUlrMHhPQ0F5U0RaMk4yRTJJRFlnTUNBd0lEQWdNVElnTUZZeVdpSWdMejRLUEM5emRtYytDZz09KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy90cm9waHlcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBUcm9waHkgPSBjcmVhdGVMdWNpZGVJY29uKCdUcm9waHknLCBbXG4gIFsncGF0aCcsIHsgZDogJ002IDlINC41YTIuNSAyLjUgMCAwIDEgMC01SDYnLCBrZXk6ICcxN2hxYTcnIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdNMTggOWgxLjVhMi41IDIuNSAwIDAgMCAwLTVIMTgnLCBrZXk6ICdsbXB0ZHAnIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdNNCAyMmgxNicsIGtleTogJzU3d3h2MCcgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xMCAxNC42NlYxN2MwIC41NS0uNDcuOTgtLjk3IDEuMjFDNy44NSAxOC43NSA3IDIwLjI0IDcgMjInLCBrZXk6ICcxbnc5YnEnIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdNMTQgMTQuNjZWMTdjMCAuNTUuNDcuOTguOTcgMS4yMUMxNi4xNSAxOC43NSAxNyAyMC4yNCAxNyAyMicsIGtleTogJzFucDB5YicgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xOCAySDZ2N2E2IDYgMCAwIDAgMTIgMFYyWicsIGtleTogJ3U0NmZ2MycgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgVHJvcGh5O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trophy.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/user.js": /*!**********************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/icons/user.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ User)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst User = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"User\", [\n [\n \"path\",\n {\n d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\",\n key: \"975kel\"\n }\n ],\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"7\",\n r: \"4\",\n key: \"17ys0d\"\n }\n ]\n]);\n //# sourceMappingURL=user.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvdXNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLGFBQU8sZ0VBQWdCLENBQUMsTUFBUTtJQUNwQztRQUFDLE1BQVE7UUFBQTtZQUFFLEdBQUcsQ0FBNkM7WUFBQSxLQUFLO1FBQUEsQ0FBVTtLQUFBO0lBQzFFO1FBQUMsUUFBVTtRQUFBO1lBQUUsRUFBSTtZQUFNLENBQUksT0FBSztZQUFBLENBQUc7WUFBSyxHQUFLO1FBQUEsQ0FBVTtLQUFBO0NBQ3hEIiwic291cmNlcyI6WyIvaG9tZS9zcmMvaWNvbnMvdXNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIFVzZXJcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk1Ua2dNakYyTFRKaE5DQTBJREFnTUNBd0xUUXRORWc1WVRRZ05DQXdJREFnTUMwMElEUjJNaUlnTHo0S0lDQThZMmx5WTJ4bElHTjRQU0l4TWlJZ1kzazlJamNpSUhJOUlqUWlJQzgrQ2p3dmMzWm5QZ289KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy91c2VyXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgVXNlciA9IGNyZWF0ZUx1Y2lkZUljb24oJ1VzZXInLCBbXG4gIFsncGF0aCcsIHsgZDogJ00xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyJywga2V5OiAnOTc1a2VsJyB9XSxcbiAgWydjaXJjbGUnLCB7IGN4OiAnMTInLCBjeTogJzcnLCByOiAnNCcsIGtleTogJzE3eXMwZCcgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgVXNlcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/user.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js": /*!****************************************************************!*\ !*** ./node_modules/lucide-react/dist/esm/shared/src/utils.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ mergeClasses: () => (/* binding */ mergeClasses),\n/* harmony export */ toKebabCase: () => (/* binding */ toKebabCase)\n/* harmony export */ });\n/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ const toKebabCase = (string)=>string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = function() {\n for(var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++){\n classes[_key] = arguments[_key];\n }\n return classes.filter((className, index, array)=>{\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n }).join(\" \").trim();\n};\n //# sourceMappingURL=utils.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vc2hhcmVkL3NyYy91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0lBUWEsb0JBQWMsQ0FBQyxNQUMxQixVQUFPLFFBQVEsb0JBQXNCLFNBQU8sRUFBRSxXQUFZO0FBK0IvQyxtQkFBZSxJQUEyQzs7UUFBQSxPQUNyRTs7V0FBQSxRQUNHLE9BQU8sQ0FBQyxXQUFXLE9BQU8sS0FBVTtRQUVqQyxlQUFRLFNBQVMsRUFDaEIsWUFBcUIsWUFBVyxDQUNqQyxXQUFNLE9BQVEsRUFBUyxTQUFNO0lBRWpDLENBQUMsQ0FDQSxNQUFLLENBQUcsSUFDUixDQUFLIiwic291cmNlcyI6WyIvc2hhcmVkL3NyYy91dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYW1lbFRvUGFzY2FsIH0gZnJvbSAnLi91dGlsaXR5LXR5cGVzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8ga2ViYWIgY2FzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEga2ViYWJpemVkIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgdG9LZWJhYkNhc2UgPSAoc3RyaW5nOiBzdHJpbmcpID0+XG4gIHN0cmluZy5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xuXG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyB0byBjYW1lbCBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gQSBjYW1lbGl6ZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCB0b0NhbWVsQ2FzZSA9IDxUIGV4dGVuZHMgc3RyaW5nPihzdHJpbmc6IFQpID0+XG4gIHN0cmluZy5yZXBsYWNlKC9eKFtBLVpdKXxbXFxzLV9dKyhcXHcpL2csIChtYXRjaCwgcDEsIHAyKSA9PlxuICAgIHAyID8gcDIudG9VcHBlckNhc2UoKSA6IHAxLnRvTG93ZXJDYXNlKCksXG4gICk7XG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIHBhc2NhbCBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gQSBwYXNjYWxpemVkIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgdG9QYXNjYWxDYXNlID0gPFQgZXh0ZW5kcyBzdHJpbmc+KHN0cmluZzogVCk6IENhbWVsVG9QYXNjYWw8VD4gPT4ge1xuICBjb25zdCBjYW1lbENhc2UgPSB0b0NhbWVsQ2FzZShzdHJpbmcpO1xuXG4gIHJldHVybiAoY2FtZWxDYXNlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY2FtZWxDYXNlLnNsaWNlKDEpKSBhcyBDYW1lbFRvUGFzY2FsPFQ+O1xufTtcblxuLyoqXG4gKiBNZXJnZXMgY2xhc3NlcyBpbnRvIGEgc2luZ2xlIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7YXJyYXl9IGNsYXNzZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5nIG9mIGNsYXNzZXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlQ2xhc3NlcyA9IDxDbGFzc1R5cGUgPSBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsPiguLi5jbGFzc2VzOiBDbGFzc1R5cGVbXSkgPT5cbiAgY2xhc3Nlc1xuICAgIC5maWx0ZXIoKGNsYXNzTmFtZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBCb29sZWFuKGNsYXNzTmFtZSkgJiZcbiAgICAgICAgKGNsYXNzTmFtZSBhcyBzdHJpbmcpLnRyaW0oKSAhPT0gJycgJiZcbiAgICAgICAgYXJyYXkuaW5kZXhPZihjbGFzc05hbWUpID09PSBpbmRleFxuICAgICAgKTtcbiAgICB9KVxuICAgIC5qb2luKCcgJylcbiAgICAudHJpbSgpO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/client/app-dir/link.js": /*!*******************************************************!*\ !*** ./node_modules/next/dist/client/app-dir/link.js ***! \*******************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("/* __next_internal_client_entry_do_not_use__ cjs */ \nvar _s = $RefreshSig$();\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n0 && (0);\nfunction _export(target, all) {\n for(var name in all)Object.defineProperty(target, name, {\n enumerable: true,\n get: all[name]\n });\n}\n_export(exports, {\n /**\n * A React component that extends the HTML `<a>` element to provide\n * [prefetching](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching)\n * and client-side navigation. This is the primary way to navigate between routes in Next.js.\n *\n * @remarks\n * - Prefetching is only enabled in production.\n *\n * @see https://nextjs.org/docs/app/api-reference/components/link\n */ default: function() {\n return LinkComponent;\n },\n useLinkStatus: function() {\n return useLinkStatus;\n }\n});\nconst _interop_require_wildcard = __webpack_require__(/*! @swc/helpers/_/_interop_require_wildcard */ \"(app-pages-browser)/./node_modules/@swc/helpers/esm/_interop_require_wildcard.js\");\nconst _jsxruntime = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\nconst _react = /*#__PURE__*/ _interop_require_wildcard._(__webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\"));\nconst _formaturl = __webpack_require__(/*! ../../shared/lib/router/utils/format-url */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/format-url.js\");\nconst _approutercontextsharedruntime = __webpack_require__(/*! ../../shared/lib/app-router-context.shared-runtime */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.js\");\nconst _usemergedref = __webpack_require__(/*! ../use-merged-ref */ \"(app-pages-browser)/./node_modules/next/dist/client/use-merged-ref.js\");\nconst _utils = __webpack_require__(/*! ../../shared/lib/utils */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/utils.js\");\nconst _addbasepath = __webpack_require__(/*! ../add-base-path */ \"(app-pages-browser)/./node_modules/next/dist/client/add-base-path.js\");\nconst _warnonce = __webpack_require__(/*! ../../shared/lib/utils/warn-once */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/utils/warn-once.js\");\nconst _links = __webpack_require__(/*! ../components/links */ \"(app-pages-browser)/./node_modules/next/dist/client/components/links.js\");\nconst _islocalurl = __webpack_require__(/*! ../../shared/lib/router/utils/is-local-url */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/is-local-url.js\");\nconst _approuterinstance = __webpack_require__(/*! ../components/app-router-instance */ \"(app-pages-browser)/./node_modules/next/dist/client/components/app-router-instance.js\");\nconst _erroronce = __webpack_require__(/*! ../../shared/lib/utils/error-once */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/utils/error-once.js\");\nconst _segmentcache = __webpack_require__(/*! ../components/segment-cache */ \"(app-pages-browser)/./node_modules/next/dist/client/components/segment-cache.js\");\nfunction isModifiedEvent(event) {\n const eventTarget = event.currentTarget;\n const target = eventTarget.getAttribute('target');\n return target && target !== '_self' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || // triggers resource download\n event.nativeEvent && event.nativeEvent.which === 2;\n}\nfunction linkClicked(e, href, as, linkInstanceRef, replace, scroll, onNavigate) {\n const { nodeName } = e.currentTarget;\n // anchors inside an svg have a lowercase nodeName\n const isAnchorNodeName = nodeName.toUpperCase() === 'A';\n if (isAnchorNodeName && isModifiedEvent(e) || e.currentTarget.hasAttribute('download')) {\n // ignore click for browser’s default behavior\n return;\n }\n if (!(0, _islocalurl.isLocalURL)(href)) {\n if (replace) {\n // browser default behavior does not replace the history state\n // so we need to do it manually\n e.preventDefault();\n location.replace(href);\n }\n // ignore click for browser’s default behavior\n return;\n }\n e.preventDefault();\n if (onNavigate) {\n let isDefaultPrevented = false;\n onNavigate({\n preventDefault: ()=>{\n isDefaultPrevented = true;\n }\n });\n if (isDefaultPrevented) {\n return;\n }\n }\n _react.default.startTransition(()=>{\n (0, _approuterinstance.dispatchNavigateAction)(as || href, replace ? 'replace' : 'push', scroll != null ? scroll : true, linkInstanceRef.current);\n });\n}\nfunction formatStringOrUrl(urlObjOrString) {\n if (typeof urlObjOrString === 'string') {\n return urlObjOrString;\n }\n return (0, _formaturl.formatUrl)(urlObjOrString);\n}\nfunction LinkComponent(props) {\n _s();\n const [linkStatus, setOptimisticLinkStatus] = (0, _react.useOptimistic)(_links.IDLE_LINK_STATUS);\n let children;\n const linkInstanceRef = (0, _react.useRef)(null);\n const { href: hrefProp, as: asProp, children: childrenProp, prefetch: prefetchProp = null, passHref, replace, shallow, scroll, onClick, onMouseEnter: onMouseEnterProp, onTouchStart: onTouchStartProp, legacyBehavior = false, onNavigate, ref: forwardedRef, unstable_dynamicOnHover, ...restProps } = props;\n children = childrenProp;\n if (legacyBehavior && (typeof children === 'string' || typeof children === 'number')) {\n children = /*#__PURE__*/ (0, _jsxruntime.jsx)(\"a\", {\n children: children\n });\n }\n const router = _react.default.useContext(_approutercontextsharedruntime.AppRouterContext);\n const prefetchEnabled = prefetchProp !== false;\n const fetchStrategy = prefetchProp !== false ? getFetchStrategyFromPrefetchProp(prefetchProp) : _segmentcache.FetchStrategy.PPR;\n if (true) {\n function createPropError(args) {\n return Object.defineProperty(new Error(\"Failed prop type: The prop `\" + args.key + \"` expects a \" + args.expected + \" in `<Link>`, but got `\" + args.actual + \"` instead.\" + ( true ? \"\\nOpen your browser's console to view the Component stack trace.\" : 0)), \"__NEXT_ERROR_CODE\", {\n value: \"E319\",\n enumerable: false,\n configurable: true\n });\n }\n // TypeScript trick for type-guarding:\n const requiredPropsGuard = {\n href: true\n };\n const requiredProps = Object.keys(requiredPropsGuard);\n requiredProps.forEach((key)=>{\n if (key === 'href') {\n if (props[key] == null || typeof props[key] !== 'string' && typeof props[key] !== 'object') {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: props[key] === null ? 'null' : typeof props[key]\n });\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = key;\n }\n });\n // TypeScript trick for type-guarding:\n const optionalPropsGuard = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true,\n unstable_dynamicOnHover: true,\n onClick: true,\n onMouseEnter: true,\n onTouchStart: true,\n legacyBehavior: true,\n onNavigate: true\n };\n const optionalProps = Object.keys(optionalPropsGuard);\n optionalProps.forEach((key)=>{\n const valType = typeof props[key];\n if (key === 'as') {\n if (props[key] && valType !== 'string' && valType !== 'object') {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: valType\n });\n }\n } else if (key === 'onClick' || key === 'onMouseEnter' || key === 'onTouchStart' || key === 'onNavigate') {\n if (props[key] && valType !== 'function') {\n throw createPropError({\n key,\n expected: '`function`',\n actual: valType\n });\n }\n } else if (key === 'replace' || key === 'scroll' || key === 'shallow' || key === 'passHref' || key === 'legacyBehavior' || key === 'unstable_dynamicOnHover') {\n if (props[key] != null && valType !== 'boolean') {\n throw createPropError({\n key,\n expected: '`boolean`',\n actual: valType\n });\n }\n } else if (key === 'prefetch') {\n if (props[key] != null && valType !== 'boolean' && props[key] !== 'auto' && props[key] !== 'unstable_forceStale') {\n throw createPropError({\n key,\n expected: '`boolean | \"auto\" | \"unstable_forceStale\"`',\n actual: valType\n });\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = key;\n }\n });\n }\n if (true) {\n if (props.locale) {\n (0, _warnonce.warnOnce)('The `locale` prop is not supported in `next/link` while using the `app` router. Read more about app router internalization: https://nextjs.org/docs/app/building-your-application/routing/internationalization');\n }\n if (!asProp) {\n let href;\n if (typeof hrefProp === 'string') {\n href = hrefProp;\n } else if (typeof hrefProp === 'object' && typeof hrefProp.pathname === 'string') {\n href = hrefProp.pathname;\n }\n if (href) {\n const hasDynamicSegment = href.split('/').some((segment)=>segment.startsWith('[') && segment.endsWith(']'));\n if (hasDynamicSegment) {\n throw Object.defineProperty(new Error(\"Dynamic href `\" + href + \"` found in <Link> while using the `/app` router, this is not supported. Read more: https://nextjs.org/docs/messages/app-dir-dynamic-href\"), \"__NEXT_ERROR_CODE\", {\n value: \"E267\",\n enumerable: false,\n configurable: true\n });\n }\n }\n }\n }\n const { href, as } = _react.default.useMemo({\n \"LinkComponent.useMemo\": ()=>{\n const resolvedHref = formatStringOrUrl(hrefProp);\n return {\n href: resolvedHref,\n as: asProp ? formatStringOrUrl(asProp) : resolvedHref\n };\n }\n }[\"LinkComponent.useMemo\"], [\n hrefProp,\n asProp\n ]);\n // This will return the first child, if multiple are provided it will throw an error\n let child;\n if (legacyBehavior) {\n if (true) {\n if (onClick) {\n console.warn('\"onClick\" was passed to <Link> with `href` of `' + hrefProp + '` but \"legacyBehavior\" was set. The legacy behavior requires onClick be set on the child of next/link');\n }\n if (onMouseEnterProp) {\n console.warn('\"onMouseEnter\" was passed to <Link> with `href` of `' + hrefProp + '` but \"legacyBehavior\" was set. The legacy behavior requires onMouseEnter be set on the child of next/link');\n }\n try {\n child = _react.default.Children.only(children);\n } catch (err) {\n if (!children) {\n throw Object.defineProperty(new Error(\"No children were passed to <Link> with `href` of `\" + hrefProp + \"` but one child is required https://nextjs.org/docs/messages/link-no-children\"), \"__NEXT_ERROR_CODE\", {\n value: \"E320\",\n enumerable: false,\n configurable: true\n });\n }\n throw Object.defineProperty(new Error(\"Multiple children were passed to <Link> with `href` of `\" + hrefProp + \"` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children\" + ( true ? \" \\nOpen your browser's console to view the Component stack trace.\" : 0)), \"__NEXT_ERROR_CODE\", {\n value: \"E266\",\n enumerable: false,\n configurable: true\n });\n }\n } else {}\n } else {\n if (true) {\n if ((children == null ? void 0 : children.type) === 'a') {\n throw Object.defineProperty(new Error('Invalid <Link> with <a> child. Please remove <a> or use <Link legacyBehavior>.\\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor'), \"__NEXT_ERROR_CODE\", {\n value: \"E209\",\n enumerable: false,\n configurable: true\n });\n }\n }\n }\n const childRef = legacyBehavior ? child && typeof child === 'object' && child.ref : forwardedRef;\n // Use a callback ref to attach an IntersectionObserver to the anchor tag on\n // mount. In the future we will also use this to keep track of all the\n // currently mounted <Link> instances, e.g. so we can re-prefetch them after\n // a revalidation or refresh.\n const observeLinkVisibilityOnMount = _react.default.useCallback({\n \"LinkComponent.useCallback[observeLinkVisibilityOnMount]\": (element)=>{\n if (router !== null) {\n linkInstanceRef.current = (0, _links.mountLinkInstance)(element, href, router, fetchStrategy, prefetchEnabled, setOptimisticLinkStatus);\n }\n return ({\n \"LinkComponent.useCallback[observeLinkVisibilityOnMount]\": ()=>{\n if (linkInstanceRef.current) {\n (0, _links.unmountLinkForCurrentNavigation)(linkInstanceRef.current);\n linkInstanceRef.current = null;\n }\n (0, _links.unmountPrefetchableInstance)(element);\n }\n })[\"LinkComponent.useCallback[observeLinkVisibilityOnMount]\"];\n }\n }[\"LinkComponent.useCallback[observeLinkVisibilityOnMount]\"], [\n prefetchEnabled,\n href,\n router,\n fetchStrategy,\n setOptimisticLinkStatus\n ]);\n const mergedRef = (0, _usemergedref.useMergedRef)(observeLinkVisibilityOnMount, childRef);\n const childProps = {\n ref: mergedRef,\n onClick (e) {\n if (true) {\n if (!e) {\n throw Object.defineProperty(new Error('Component rendered inside next/link has to pass click event to \"onClick\" prop.'), \"__NEXT_ERROR_CODE\", {\n value: \"E312\",\n enumerable: false,\n configurable: true\n });\n }\n }\n if (!legacyBehavior && typeof onClick === 'function') {\n onClick(e);\n }\n if (legacyBehavior && child.props && typeof child.props.onClick === 'function') {\n child.props.onClick(e);\n }\n if (!router) {\n return;\n }\n if (e.defaultPrevented) {\n return;\n }\n linkClicked(e, href, as, linkInstanceRef, replace, scroll, onNavigate);\n },\n onMouseEnter (e) {\n if (!legacyBehavior && typeof onMouseEnterProp === 'function') {\n onMouseEnterProp(e);\n }\n if (legacyBehavior && child.props && typeof child.props.onMouseEnter === 'function') {\n child.props.onMouseEnter(e);\n }\n if (!router) {\n return;\n }\n if (!prefetchEnabled || \"development\" === 'development') {\n return;\n }\n const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true;\n (0, _links.onNavigationIntent)(e.currentTarget, upgradeToDynamicPrefetch);\n },\n onTouchStart: false ? 0 : function onTouchStart(e) {\n if (!legacyBehavior && typeof onTouchStartProp === 'function') {\n onTouchStartProp(e);\n }\n if (legacyBehavior && child.props && typeof child.props.onTouchStart === 'function') {\n child.props.onTouchStart(e);\n }\n if (!router) {\n return;\n }\n if (!prefetchEnabled) {\n return;\n }\n const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true;\n (0, _links.onNavigationIntent)(e.currentTarget, upgradeToDynamicPrefetch);\n }\n };\n // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is\n // defined, we specify the current 'href', so that repetition is not needed by the user.\n // If the url is absolute, we can bypass the logic to prepend the basePath.\n if ((0, _utils.isAbsoluteUrl)(as)) {\n childProps.href = as;\n } else if (!legacyBehavior || passHref || child.type === 'a' && !('href' in child.props)) {\n childProps.href = (0, _addbasepath.addBasePath)(as);\n }\n let link;\n if (legacyBehavior) {\n if (true) {\n (0, _erroronce.errorOnce)('`legacyBehavior` is deprecated and will be removed in a future ' + 'release. A codemod is available to upgrade your components:\\n\\n' + 'npx @next/codemod@latest new-link .\\n\\n' + 'Learn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components');\n }\n link = /*#__PURE__*/ _react.default.cloneElement(child, childProps);\n } else {\n link = /*#__PURE__*/ (0, _jsxruntime.jsx)(\"a\", {\n ...restProps,\n ...childProps,\n children: children\n });\n }\n return /*#__PURE__*/ (0, _jsxruntime.jsx)(LinkStatusContext.Provider, {\n value: linkStatus,\n children: link\n });\n}\n_s(LinkComponent, \"MNV6IdWv8Lu3MKc7Fm4v59uGRY0=\");\n_c = LinkComponent;\nconst LinkStatusContext = /*#__PURE__*/ (0, _react.createContext)(_links.IDLE_LINK_STATUS);\nconst useLinkStatus = ()=>{\n return (0, _react.useContext)(LinkStatusContext);\n};\nfunction getFetchStrategyFromPrefetchProp(prefetchProp) {\n if (false) {} else {\n return prefetchProp === null || prefetchProp === 'auto' ? _segmentcache.FetchStrategy.PPR : // (although invalid values should've been filtered out by prop validation in dev)\n _segmentcache.FetchStrategy.Full;\n }\n}\nif ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') {\n Object.defineProperty(exports.default, '__esModule', {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=link.js.map\nvar _c;\n$RefreshReg$(_c, \"LinkComponent\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2FwcC1kaXIvbGluay5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztJQW9UQTs7Ozs7Ozs7O0NBU0MsR0FDRCxPQWthQztlQWxhdUJBOztJQXdhWEMsYUFBYTtlQUFiQTs7Ozs7NkVBcHVCMkQ7dUNBRTlDOzJEQUNPOzBDQUNKO21DQUNDO3lDQUNGO3NDQUNIO21DQVNsQjt3Q0FDb0I7K0NBQ1k7dUNBQ2I7MENBSW5CO0FBME1QLFNBQVNDLGdCQUFnQkMsS0FBdUI7SUFDOUMsTUFBTUMsY0FBY0QsTUFBTUUsYUFBYTtJQUN2QyxNQUFNQyxTQUFTRixZQUFZRyxZQUFZLENBQUM7SUFDeEMsT0FDR0QsVUFBVUEsV0FBVyxXQUN0QkgsTUFBTUssT0FBTyxJQUNiTCxNQUFNTSxPQUFPLElBQ2JOLE1BQU1PLFFBQVEsSUFDZFAsTUFBTVEsTUFBTSxJQUFJLDZCQUE2QjtJQUM1Q1IsTUFBTVMsV0FBVyxJQUFJVCxNQUFNUyxXQUFXLENBQUNDLEtBQUssS0FBSztBQUV0RDtBQUVBLFNBQVNDLFlBQ1BDLENBQW1CLEVBQ25CQyxJQUFZLEVBQ1pDLEVBQVUsRUFDVkMsZUFBcUQsRUFDckRDLE9BQWlCLEVBQ2pCQyxNQUFnQixFQUNoQkMsVUFBbUM7SUFFbkMsTUFBTSxFQUFFQyxRQUFRLEVBQUUsR0FBR1AsRUFBRVYsYUFBYTtJQUVwQyxrREFBa0Q7SUFDbEQsTUFBTWtCLG1CQUFtQkQsU0FBU0UsV0FBVyxPQUFPO0lBRXBELElBQ0dELG9CQUFvQnJCLGdCQUFnQmEsTUFDckNBLEVBQUVWLGFBQWEsQ0FBQ29CLFlBQVksQ0FBQyxhQUM3QjtRQUNBLDhDQUE4QztRQUM5QztJQUNGO0lBRUEsSUFBSSxDQUFDQyxDQUFBQSxHQUFBQSxZQUFBQSxVQUFBQSxFQUFXVixPQUFPO1FBQ3JCLElBQUlHLFNBQVM7WUFDWCw4REFBOEQ7WUFDOUQsK0JBQStCO1lBQy9CSixFQUFFWSxjQUFj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QztJQUNwQixPQUFPLElBQ0wsQ0FBQ3VDLGtCQUNEUCxZQUNDbUQsTUFBTU0sSUFBSSxLQUFLLE9BQU8sQ0FBRSxXQUFVTixNQUFNL0QsS0FBQUEsR0FDekM7UUFDQStFLFdBQVdwRyxJQUFJLEdBQUcyRyxDQUFBQSxHQUFBQSxhQUFBQSxXQUFXLEVBQUMxRztJQUNoQztJQUVBLElBQUkyRztJQUVKLElBQUlwRSxnQkFBZ0I7UUFDbEIsSUFBSWMsSUFBb0IsRUFBb0I7WUFDMUN1RCxDQUFBQSxHQUFBQSxXQUFBQSxTQUFBQSxFQUNFLG9FQUNFLG9FQUNBLDRDQUNBO1FBRU47UUFDQUQsT0FBQUEsV0FBQUEsR0FBTzlGLE9BQUFBLE9BQUssQ0FBQ2dHLFlBQVksQ0FBQzFCLE9BQU9nQjtJQUNuQyxPQUFPO1FBQ0xRLE9BQUFBLFdBQUFBLEdBQ0UscUJBQUMvRCxLQUFBQTtZQUFHLEdBQUdELFNBQVM7WUFBRyxHQUFHd0QsVUFBVTtzQkFDN0IxRTs7SUFHUDtJQUVBLHFCQUNFLHFCQUFDcUYsa0JBQWtCQyxRQUFRO1FBQUNDLE9BQU8zRjtrQkFDaENzRjs7QUFHUDs7S0FsYXdCNUg7QUFvYXhCLE1BQU0rSCxvQkFBQUEsV0FBQUEsR0FBb0JHLENBQUFBLEdBQUFBLE9BQUFBLGFBQUFBLEVBRXhCekYsT0FBQUEsZ0JBQWdCO0FBRVgsTUFBTXhDLGdCQUFnQjtJQUMzQixPQUFPOEQsQ0FBQUEsR0FBQUEsT0FBQUEsVUFBQUEsRUFBV2dFO0FBQ3BCO0FBRUEsU0FBUzVELGlDQUNQbkIsWUFBK0Q7SUFFL0QsSUFDRXNCLEtBQ3VDLEVBQ3ZDLEVBb0JELE1BQU07UUFDTCxPQUFPdEIsaUJBQWlCLFFBQVFBLGlCQUFpQixTQUU3QyxjQUNBb0IsYUFBYSxDQUFDQyxHQUFHLEdBRWpCLDREQUg4RixzQkFJWjtRQUNsRkQsY0FBQUEsYUFBYSxDQUFDa0UsSUFBSTtJQUN4QjtBQUNGIiwic291cmNlcyI6WyIvaG9tZS9zcmMvY2xpZW50L2FwcC1kaXIvbGluay50c3giXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VPcHRpbWlzdGljLCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgVXJsT2JqZWN0IH0gZnJvbSAndXJsJ1xuaW1wb3J0IHsgZm9ybWF0VXJsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvZm9ybWF0LXVybCdcbmltcG9ydCB7IEFwcFJvdXRlckNvbnRleHQgfSBmcm9tICcuLi8uLi9zaGFyZWQvbGliL2FwcC1yb3V0ZXItY29udGV4dC5zaGFyZWQtcnVudGltZSdcbmltcG9ydCB7IHVzZU1lcmdlZFJlZiB9IGZyb20gJy4uL3VzZS1tZXJnZWQtcmVmJ1xuaW1wb3J0IHsgaXNBYnNvbHV0ZVVybCB9IGZyb20gJy4uLy4uL3NoYXJlZC9saWIvdXRpbHMnXG5pbXBvcnQgeyBhZGRCYXNlUGF0aCB9IGZyb20gJy4uL2FkZC1iYXNlLXBhdGgnXG5pbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9saWIvdXRpbHMvd2Fybi1vbmNlJ1xuaW1wb3J0IHR5cGUgeyBQRU5ESU5HX0xJTktfU1RBVFVTIH0gZnJvbSAnLi4vY29tcG9uZW50cy9saW5rcydcbmltcG9ydCB7XG4gIElETEVfTElOS19TVEFUVVMsXG4gIG1vdW50TGlua0luc3RhbmNlLFxuICBvbk5hdmlnYXRpb25JbnRlbnQsXG4gIHVubW91bnRMaW5rRm9yQ3VycmVudE5hdmlnYXRpb24sXG4gIHVubW91bnRQcmVmZXRjaGFibGVJbnN0YW5jZSxcbiAgdHlwZSBMaW5rSW5zdGFuY2UsXG59IGZyb20gJy4uL2NvbXBvbmVudHMvbGlua3MnXG5pbXBvcnQgeyBpc0xvY2FsVVJMIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvaXMtbG9jYWwtdXJsJ1xuaW1wb3J0IHsgZGlzcGF0Y2hOYXZpZ2F0ZUFjdGlvbiB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXBwLXJvdXRlci1pbnN0YW5jZSdcbmltcG9ydCB7IGVycm9yT25jZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9saWIvdXRpbHMvZXJyb3Itb25jZSdcbmltcG9ydCB7XG4gIEZldGNoU3RyYXRlZ3ksXG4gIHR5cGUgUHJlZmV0Y2hUYXNrRmV0Y2hTdHJhdGVneSxcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWdtZW50LWNhY2hlJ1xuXG50eXBlIFVybCA9IHN0cmluZyB8IFVybE9iamVjdFxudHlwZSBSZXF1aXJlZEtleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IHt9IGV4dGVuZHMgUGljazxULCBLPiA/IG5ldmVyIDogS1xufVtrZXlvZiBUXVxudHlwZSBPcHRpb25hbEtleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IHt9IGV4dGVuZHMgUGljazxULCBLPiA/IEsgOiBuZXZlclxufVtrZXlvZiBUXVxuXG50eXBlIE9uTmF2aWdhdGVFdmVudEhhbmRsZXIgPSAoZXZlbnQ6IHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQgfSkgPT4gdm9pZFxuXG50eXBlIEludGVybmFsTGlua1Byb3BzID0ge1xuICAvKipcbiAgICogKipSZXF1aXJlZCoqLiBUaGUgcGF0aCBvciBVUkwgdG8gbmF2aWdhdGUgdG8uIEl0IGNhbiBhbHNvIGJlIGFuIG9iamVjdCAoc2ltaWxhciB0byBgVVJMYCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzeFxuICAgKiAvLyBOYXZpZ2F0ZSB0byAvZGFzaGJvYXJkOlxuICAgKiA8TGluayBocmVmPVwiL2Rhc2hib2FyZFwiPkRhc2hib2FyZDwvTGluaz5cbiAgICpcbiAgICogLy8gTmF2aWdhdGUgdG8gL2Fib3V0P25hbWU9dGVzdDpcbiAgICogPExpbmsgaHJlZj17eyBwYXRobmFtZTogJy9hYm91dCcsIHF1ZXJ5OiB7IG5hbWU6ICd0ZXN0JyB9IH19PlxuICAgKiAgIEFib3V0XG4gICAqIDwvTGluaz5cbiAgICogYGBgXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gRm9yIGV4dGVybmFsIFVSTHMsIHVzZSBhIGZ1bGx5IHF1YWxpZmllZCBVUkwgc3VjaCBhcyBgaHR0cHM6Ly8uLi5gLlxuICAgKiAtIEluIHRoZSBBcHAgUm91dGVyLCBkeW5hbWljIHJvdXRlcyBtdXN0IG5vdCBpbmNsdWRlIGJyYWNrZXRlZCBzZWdtZW50cyBpbiBgaHJlZmAuXG4gICAqL1xuICBocmVmOiBVcmxcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdjEwLjAuMDogYGhyZWZgIHByb3BzIHBvaW50aW5nIHRvIGEgZHluYW1pYyByb3V0ZSBhcmVcbiAgICogYXV0b21hdGljYWxseSByZXNvbHZlZCBhbmQgbm8gbG9uZ2VyIHJlcXVpcmUgdGhlIGBhc2AgcHJvcC5cbiAgICovXG4gIGFzPzogVXJsXG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgYGhpc3RvcnlgIHN0YXRlIGluc3RlYWQgb2YgYWRkaW5nIGEgbmV3IFVSTCBpbnRvIHRoZSBzdGFjay5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgZmFsc2VgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzeFxuICAgKiA8TGluayBocmVmPVwiL2Fib3V0XCIgcmVwbGFjZT5cbiAgICogICBBYm91dCAocmVwbGFjZXMgdGhlIGhpc3Rvcnkgc3RhdGUpXG4gICAqIDwvTGluaz5cbiAgICogYGBgXG4gICAqL1xuICByZXBsYWNlPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNjcm9sbCBiZWhhdmlvci4gSWYgYHRydWVgLCBOZXh0LmpzIGF0dGVtcHRzIHRvIG1haW50YWluXG4gICAqIHRoZSBzY3JvbGwgcG9zaXRpb24gaWYgdGhlIG5ld2x5IG5hdmlnYXRlZCBwYWdlIGlzIHN0aWxsIHZpc2libGUuIElmIG5vdCwgaXQgc2Nyb2xscyB0byB0aGUgdG9wLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgLCBOZXh0LmpzIHdpbGwgbm90IG1vZGlmeSB0aGUgc2Nyb2xsIGJlaGF2aW9yIGF0IGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHN4XG4gICAqIDxMaW5rIGhyZWY9XCIvZGFzaGJvYXJkXCIgc2Nyb2xsPXtmYWxzZX0+XG4gICAqICAgTm8gYXV0byBzY3JvbGxcbiAgICogPC9MaW5rPlxuICAgKiBgYGBcbiAgICovXG4gIHNjcm9sbD86IGJvb2xlYW5cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IHBhZ2Ugd2l0aG91dCByZXJ1bm5pbmcgZGF0YSBmZXRjaGluZyBtZXRob2RzXG4gICAqIGxpa2UgYGdldFN0YXRpY1Byb3BzYCwgYGdldFNlcnZlclNpZGVQcm9wc2AsIG9yIGBnZXRJbml0aWFsUHJvcHNgLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBgc2hhbGxvd2Agb25seSBhcHBsaWVzIHRvIHRoZSBQYWdlcyBSb3V0ZXIuIEZvciB0aGUgQXBwIFJvdXRlciwgc2VlIHRoZVxuICAgKiBbZm9sbG93aW5nIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL3JvdXRpbmcvbGlua2luZy1hbmQtbmF2aWdhdGluZyN1c2luZy10aGUtbmF0aXZlLWhpc3RvcnktYXBpKS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgZmFsc2VgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzeFxuICAgKiA8TGluayBocmVmPVwiL2Jsb2dcIiBzaGFsbG93PlxuICAgKiAgIFNoYWxsb3cgbmF2aWdhdGlvblxuICAgKiA8L0xpbms+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hhbGxvdz86IGJvb2xlYW5cblxuICAvKipcbiAgICogRm9yY2VzIGBMaW5rYCB0byBwYXNzIGl0cyBgaHJlZmAgdG8gdGhlIGNoaWxkIGNvbXBvbmVudC4gVXNlZnVsIGlmIHRoZSBjaGlsZCBpcyBhIGN1c3RvbVxuICAgKiBjb21wb25lbnQgdGhhdCB3cmFwcyBhbiBgPGE+YCB0YWcsIG9yIGlmIHlvdSdyZSB1c2luZyBjZXJ0YWluIHN0eWxpbmcgbGlicmFyaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGBmYWxzZWBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHN4XG4gICAqIDxMaW5rIGhyZWY9XCIvZGFzaGJvYXJkXCIgcGFzc0hyZWY+XG4gICAqICAgPE15U3R5bGVkQW5jaG9yPkRhc2hib2FyZDwvTXlTdHlsZWRBbmNob3I+XG4gICAqIDwvTGluaz5cbiAgICogYGBgXG4gICAqL1xuICBwYXNzSHJlZj86IGJvb2xlYW5cblxuICAvKipcbiAgICogUHJlZmV0Y2ggdGhlIHBhZ2UgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSBgPExpbmsgLz5gIHRoYXQgaXMgaW4gdGhlIHZpZXdwb3J0IChpbml0aWFsbHkgb3IgdGhyb3VnaCBzY3JvbGwpIHdpbGwgYmUgcHJlZmV0Y2hlZC5cbiAgICogUHJlZmV0Y2ggY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgYHByZWZldGNoPXtmYWxzZX1gLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBQcmVmZXRjaGluZyBpcyBvbmx5IGVuYWJsZWQgaW4gcHJvZHVjdGlvbi5cbiAgICpcbiAgICogLSBJbiB0aGUgKipBcHAgUm91dGVyKio6XG4gICAqICAgLSBgXCJhdXRvXCJgLCBgbnVsbGAsIGB1bmRlZmluZWRgIChkZWZhdWx0KTogUHJlZmV0Y2ggYmVoYXZpb3IgZGVwZW5kcyBvbiBzdGF0aWMgdnMgZHluYW1pYyByb3V0ZXM6XG4gICAqICAgICAtIFN0YXRpYyByb3V0ZXM6IGZ1bGx5IHByZWZldGNoZWRcbiAgICogICAgIC0gRHluYW1pYyByb3V0ZXM6IHBhcnRpYWwgcHJlZmV0Y2ggdG8gdGhlIG5lYXJlc3Qgc2VnbWVudCB3aXRoIGEgYGxvYWRpbmcuanNgXG4gICAqICAgLSBgdHJ1ZWA6IEFsd2F5cyBwcmVmZXRjaCB0aGUgZnVsbCByb3V0ZSBhbmQgZGF0YS5cbiAgICogICAtIGBmYWxzZWA6IERpc2FibGUgcHJlZmV0Y2hpbmcgb24gYm90aCB2aWV3cG9ydCBhbmQgaG92ZXIuXG4gICAqIC0gSW4gdGhlICoqUGFnZXMgUm91dGVyKio6XG4gICAqICAgLSBgdHJ1ZWAgKGRlZmF1bHQpOiBQcmVmZXRjaGVzIHRoZSByb3V0ZSBhbmQgZGF0YSBpbiB0aGUgYmFja2dyb3VuZCBvbiB2aWV3cG9ydCBvciBob3Zlci5cbiAgICogICAtIGBmYWxzZWA6IFByZWZldGNoIG9ubHkgb24gaG92ZXIsIG5vdCBvbiB2aWV3cG9ydC5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWAgKFBhZ2VzIFJvdXRlcikgb3IgYG51bGxgIChBcHAgUm91dGVyKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c3hcbiAgICogPExpbmsgaHJlZj1cIi9kYXNoYm9hcmRcIiBwcmVmZXRjaD17ZmFsc2V9PlxuICAgKiAgIERhc2hib2FyZFxuICAgKiA8L0xpbms+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJlZmV0Y2g/OiBib29sZWFuIHwgJ2F1dG8nIHwgbnVsbCB8ICd1bnN0YWJsZV9mb3JjZVN0YWxlJ1xuXG4gIC8qKlxuICAgKiAodW5zdGFibGUpIFN3aXRjaCB0byBhIGZ1bGwgcHJlZmV0Y2ggb24gaG92ZXIuIEVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzXG4gICAqIHVwZGF0aW5nIHRoZSBwcmVmZXRjaCBwcm9wIHRvIGB0cnVlYCBpbiBhIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgdW5zdGFibGVfZHluYW1pY09uSG92ZXI/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRoZSBhY3RpdmUgbG9jYWxlIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIGluIHRoZSBQYWdlcyBSb3V0ZXIuIGBsb2NhbGVgIGFsbG93cyBmb3IgcHJvdmlkaW5nXG4gICAqIGEgZGlmZmVyZW50IGxvY2FsZSwgb3IgY2FuIGJlIHNldCB0byBgZmFsc2VgIHRvIG9wdCBvdXQgb2YgYXV0b21hdGljIGxvY2FsZSBiZWhhdmlvci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogTm90ZTogbG9jYWxlIG9ubHkgYXBwbGllcyBpbiB0aGUgUGFnZXMgUm91dGVyIGFuZCBpcyBpZ25vcmVkIGluIHRoZSBBcHAgUm91dGVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c3hcbiAgICogLy8gVXNlIHRoZSAnZnInIGxvY2FsZTpcbiAgICogPExpbmsgaHJlZj1cIi9hYm91dFwiIGxvY2FsZT1cImZyXCI+XG4gICAqICAgQWJvdXQgKEZyZW5jaClcbiAgICogPC9MaW5rPlxuICAgKlxuICAgKiAvLyBEaXNhYmxlIGxvY2FsZSBwcmVmaXg6XG4gICAqIDxMaW5rIGhyZWY9XCIvYWJvdXRcIiBsb2NhbGU9e2ZhbHNlfT5cbiAgICogICBBYm91dCAobm8gbG9jYWxlIHByZWZpeClcbiAgICogPC9MaW5rPlxuICAgKiBgYGBcbiAgICovXG4gIGxvY2FsZT86IHN0cmluZyB8IGZhbHNlXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBsZWdhY3kgbGluayBiZWhhdmlvciwgcmVxdWlyaW5nIGFuIGA8YT5gIHRhZyB0byB3cmFwIHRoZSBjaGlsZCBjb250ZW50XG4gICAqIGlmIHRoZSBjaGlsZCBpcyBhIHN0cmluZyBvciBudW1iZXIuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIHYxNlxuICAgKiBAZGVmYXVsdFZhbHVlIGBmYWxzZWBcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL25leHQuanMvY29tbWl0LzQ4OWU2NWVkOTg1NDRlNjliMGFmZDdlMGNmYzNmOWY2YzJiODAzYjdcbiAgICovXG4gIGxlZ2FjeUJlaGF2aW9yPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBldmVudCBoYW5kbGVyIGZvciB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGlzIG1vdmVkIG9udG8gdGhlIGA8TGluaz5gLlxuICAgKi9cbiAgb25Nb3VzZUVudGVyPzogUmVhY3QuTW91c2VFdmVudEhhbmRsZXI8SFRNTEFuY2hvckVsZW1lbnQ+XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gdGhlIGA8TGluaz5gIGlzIHRvdWNoZWQuXG4gICAqL1xuICBvblRvdWNoU3RhcnQ/OiBSZWFjdC5Ub3VjaEV2ZW50SGFuZGxlcjxIVE1MQW5jaG9yRWxlbWVudD5cblxuICAvKipcbiAgICogT3B0aW9uYWwgZXZlbnQgaGFuZGxlciBmb3Igd2hlbiB0aGUgYDxMaW5rPmAgaXMgY2xpY2tlZC5cbiAgICovXG4gIG9uQ2xpY2s/OiBSZWFjdC5Nb3VzZUV2ZW50SGFuZGxlcjxIVE1MQW5jaG9yRWxlbWVudD5cblxuICAvKipcbiAgICogT3B0aW9uYWwgZXZlbnQgaGFuZGxlciBmb3Igd2hlbiB0aGUgYDxMaW5rPmAgaXMgbmF2aWdhdGVkLlxuICAgKi9cbiAgb25OYXZpZ2F0ZT86IE9uTmF2aWdhdGVFdmVudEhhbmRsZXJcbn1cblxuLy8gVE9ETy1BUFA6IEluY2x1ZGUgdGhlIGZ1bGwgc2V0IG9mIEFuY2hvciBwcm9wc1xuLy8gYWRkaW5nIHRoaXMgdG8gdGhlIHB1YmxpY2x5IGV4cG9ydGVkIHR5cGUgY3VycmVudGx5IGJyZWFrcyBleGlzdGluZyBhcHBzXG5cbi8vIGBSb3V0ZUluZmVyVHlwZWAgaXMgYSBzdHViIGhlcmUgdG8gYXZvaWQgYnJlYWtpbmcgYHR5cGVkUm91dGVzYCB3aGVuIHRoZSB0eXBlXG4vLyBpc24ndCBnZW5lcmF0ZWQgeWV0LiBJdCB3aWxsIGJlIHJlcGxhY2VkIHdoZW4gdHlwZSBnZW5lcmF0aW9uIHJ1bnMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5leHBvcnQgdHlwZSBMaW5rUHJvcHM8Um91dGVJbmZlclR5cGUgPSBhbnk+ID0gSW50ZXJuYWxMaW5rUHJvcHNcbnR5cGUgTGlua1Byb3BzUmVxdWlyZWQgPSBSZXF1aXJlZEtleXM8TGlua1Byb3BzPlxudHlwZSBMaW5rUHJvcHNPcHRpb25hbCA9IE9wdGlvbmFsS2V5czxPbWl0PEludGVybmFsTGlua1Byb3BzLCAnbG9jYWxlJz4+XG5cbmZ1bmN0aW9uIGlzTW9kaWZpZWRFdmVudChldmVudDogUmVhY3QuTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBldmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEFuY2hvckVsZW1lbnQgfCBTVkdBRWxlbWVudFxuICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpXG4gIHJldHVybiAoXG4gICAgKHRhcmdldCAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHx8XG4gICAgZXZlbnQubWV0YUtleSB8fFxuICAgIGV2ZW50LmN0cmxLZXkgfHxcbiAgICBldmVudC5zaGlmdEtleSB8fFxuICAgIGV2ZW50LmFsdEtleSB8fCAvLyB0cmlnZ2VycyByZXNvdXJjZSBkb3dubG9hZFxuICAgIChldmVudC5uYXRpdmVFdmVudCAmJiBldmVudC5uYXRpdmVFdmVudC53aGljaCA9PT0gMilcbiAgKVxufVxuXG5mdW5jdGlvbiBsaW5rQ2xpY2tlZChcbiAgZTogUmVhY3QuTW91c2VFdmVudCxcbiAgaHJlZjogc3RyaW5nLFxuICBhczogc3RyaW5nLFxuICBsaW5rSW5zdGFuY2VSZWY6IFJlYWN0LlJlZk9iamVjdDxMaW5rSW5zdGFuY2UgfCBudWxsPixcbiAgcmVwbGFjZT86IGJvb2xlYW4sXG4gIHNjcm9sbD86IGJvb2xlYW4sXG4gIG9uTmF2aWdhdGU/OiBPbk5hdmlnYXRlRXZlbnRIYW5kbGVyXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBub2RlTmFtZSB9ID0gZS5jdXJyZW50VGFyZ2V0XG5cbiAgLy8gYW5jaG9ycyBpbnNpZGUgYW4gc3ZnIGhhdmUgYSBsb3dlcmNhc2Ugbm9kZU5hbWVcbiAgY29uc3QgaXNBbmNob3JOb2RlTmFtZSA9IG5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdBJ1xuXG4gIGlmIChcbiAgICAoaXNBbmNob3JOb2RlTmFtZSAmJiBpc01vZGlmaWVkRXZlbnQoZSkpIHx8XG4gICAgZS5jdXJyZW50VGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZG93bmxvYWQnKVxuICApIHtcbiAgICAvLyBpZ25vcmUgY2xpY2sgZm9yIGJyb3dzZXLigJlzIGRlZmF1bHQgYmVoYXZpb3JcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICghaXNMb2NhbFVSTChocmVmKSkge1xuICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAvLyBicm93c2VyIGRlZmF1bHQgYmVoYXZpb3IgZG9lcyBub3QgcmVwbGFjZSB0aGUgaGlzdG9yeSBzdGF0ZVxuICAgICAgLy8gc28gd2UgbmVlZCB0byBkbyBpdCBtYW51YWxseVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBsb2NhdGlvbi5yZXBsYWNlKGhyZWYpXG4gICAgfVxuXG4gICAgLy8gaWdub3JlIGNsaWNrIGZvciBicm93c2Vy4oCZcyBkZWZhdWx0IGJlaGF2aW9yXG4gICAgcmV0dXJuXG4gIH1cblxuICBlLnByZXZlbnREZWZhdWx0KClcblxuICBpZiAob25OYXZpZ2F0ZSkge1xuICAgIGxldCBpc0RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZVxuXG4gICAgb25OYXZpZ2F0ZSh7XG4gICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge1xuICAgICAgICBpc0RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAoaXNEZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBSZWFjdC5zdGFydFRyYW5zaXRpb24oKCkgPT4ge1xuICAgIGRpc3BhdGNoTmF2aWdhdGVBY3Rpb24oXG4gICAgICBhcyB8fCBocmVmLFxuICAgICAgcmVwbGFjZSA/ICdyZXBsYWNlJyA6ICdwdXNoJyxcbiAgICAgIHNjcm9sbCA/PyB0cnVlLFxuICAgICAgbGlua0luc3RhbmNlUmVmLmN1cnJlbnRcbiAgICApXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZvcm1hdFN0cmluZ09yVXJsKHVybE9iak9yU3RyaW5nOiBVcmxPYmplY3QgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHVybE9iak9yU3RyaW5nID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB1cmxPYmpPclN0cmluZ1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmpPclN0cmluZylcbn1cblxuLyoqXG4gKiBBIFJlYWN0IGNvbXBvbmVudCB0aGF0IGV4dGVuZHMgdGhlIEhUTUwgYDxhPmAgZWxlbWVudCB0byBwcm92aWRlXG4gKiBbcHJlZmV0Y2hpbmddKGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL3JvdXRpbmcvbGlua2luZy1hbmQtbmF2aWdhdGluZyMyLXByZWZldGNoaW5nKVxuICogYW5kIGNsaWVudC1zaWRlIG5hdmlnYXRpb24uIFRoaXMgaXMgdGhlIHByaW1hcnkgd2F5IHRvIG5hdmlnYXRlIGJldHdlZW4gcm91dGVzIGluIE5leHQuanMuXG4gKlxuICogQHJlbWFya3NcbiAqIC0gUHJlZmV0Y2hpbmcgaXMgb25seSBlbmFibGVkIGluIHByb2R1Y3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYXBpLXJlZmVyZW5jZS9jb21wb25lbnRzL2xpbmtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTGlua0NvbXBvbmVudChcbiAgcHJvcHM6IExpbmtQcm9wcyAmIHtcbiAgICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gICAgcmVmOiBSZWFjdC5SZWY8SFRNTEFuY2hvckVsZW1lbnQ+XG4gIH1cbikge1xuICBjb25zdCBbbGlua1N0YXR1cywgc2V0T3B0aW1pc3RpY0xpbmtTdGF0dXNdID0gdXNlT3B0aW1pc3RpYyhJRExFX0xJTktfU1RBVFVTKVxuXG4gIGxldCBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG5cbiAgY29uc3QgbGlua0luc3RhbmNlUmVmID0gdXNlUmVmPExpbmtJbnN0YW5jZSB8IG51bGw+KG51bGwpXG5cbiAgY29uc3Qge1xuICAgIGhyZWY6IGhyZWZQcm9wLFxuICAgIGFzOiBhc1Byb3AsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuUHJvcCxcbiAgICBwcmVmZXRjaDogcHJlZmV0Y2hQcm9wID0gbnVsbCxcbiAgICBwYXNzSHJlZixcbiAgICByZXBsYWNlLFxuICAgIHNoYWxsb3csXG4gICAgc2Nyb2xsLFxuICAgIG9uQ2xpY2ssXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXJQcm9wLFxuICAgIG9uVG91Y2hTdGFydDogb25Ub3VjaFN0YXJ0UHJvcCxcbiAgICBsZWdhY3lCZWhhdmlvciA9IGZhbHNlLFxuICAgIG9uTmF2aWdhdGUsXG4gICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgdW5zdGFibGVfZHluYW1pY09uSG92ZXIsXG4gICAgLi4ucmVzdFByb3BzXG4gIH0gPSBwcm9wc1xuXG4gIGNoaWxkcmVuID0gY2hpbGRyZW5Qcm9wXG5cbiAgaWYgKFxuICAgIGxlZ2FjeUJlaGF2aW9yICYmXG4gICAgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkcmVuID09PSAnbnVtYmVyJylcbiAgKSB7XG4gICAgY2hpbGRyZW4gPSA8YT57Y2hpbGRyZW59PC9hPlxuICB9XG5cbiAgY29uc3Qgcm91dGVyID0gUmVhY3QudXNlQ29udGV4dChBcHBSb3V0ZXJDb250ZXh0KVxuXG4gIGNvbnN0IHByZWZldGNoRW5hYmxlZCA9IHByZWZldGNoUHJvcCAhPT0gZmFsc2VcblxuICBjb25zdCBmZXRjaFN0cmF0ZWd5ID1cbiAgICBwcmVmZXRjaFByb3AgIT09IGZhbHNlXG4gICAgICA/IGdldEZldGNoU3RyYXRlZ3lGcm9tUHJlZmV0Y2hQcm9wKHByZWZldGNoUHJvcClcbiAgICAgIDogLy8gVE9ETzogaXQgbWFrZXMgbm8gc2Vuc2UgdG8gYXNzaWduIGEgZmV0Y2hTdHJhdGVneSB3aGVuIHByZWZldGNoaW5nIGlzIGRpc2FibGVkLlxuICAgICAgICBGZXRjaFN0cmF0ZWd5LlBQUlxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlUHJvcEVycm9yKGFyZ3M6IHtcbiAgICAgIGtleTogc3RyaW5nXG4gICAgICBleHBlY3RlZDogc3RyaW5nXG4gICAgICBhY3R1YWw6IHN0cmluZ1xuICAgIH0pIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgcHJvcCB0eXBlOiBUaGUgcHJvcCBcXGAke2FyZ3Mua2V5fVxcYCBleHBlY3RzIGEgJHthcmdzLmV4cGVjdGVkfSBpbiBcXGA8TGluaz5cXGAsIGJ1dCBnb3QgXFxgJHthcmdzLmFjdHVhbH1cXGAgaW5zdGVhZC5gICtcbiAgICAgICAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gXCJcXG5PcGVuIHlvdXIgYnJvd3NlcidzIGNvbnNvbGUgdG8gdmlldyB0aGUgQ29tcG9uZW50IHN0YWNrIHRyYWNlLlwiXG4gICAgICAgICAgICA6ICcnKVxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFR5cGVTY3JpcHQgdHJpY2sgZm9yIHR5cGUtZ3VhcmRpbmc6XG4gICAgY29uc3QgcmVxdWlyZWRQcm9wc0d1YXJkOiBSZWNvcmQ8TGlua1Byb3BzUmVxdWlyZWQsIHRydWU+ID0ge1xuICAgICAgaHJlZjogdHJ1ZSxcbiAgICB9IGFzIGNvbnN0XG4gICAgY29uc3QgcmVxdWlyZWRQcm9wczogTGlua1Byb3BzUmVxdWlyZWRbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgcmVxdWlyZWRQcm9wc0d1YXJkXG4gICAgKSBhcyBMaW5rUHJvcHNSZXF1aXJlZFtdXG4gICAgcmVxdWlyZWRQcm9wcy5mb3JFYWNoKChrZXk6IExpbmtQcm9wc1JlcXVpcmVkKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAnaHJlZicpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BzW2tleV0gPT0gbnVsbCB8fFxuICAgICAgICAgICh0eXBlb2YgcHJvcHNba2V5XSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHByb3BzW2tleV0gIT09ICdvYmplY3QnKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVQcm9wRXJyb3Ioe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZXhwZWN0ZWQ6ICdgc3RyaW5nYCBvciBgb2JqZWN0YCcsXG4gICAgICAgICAgICBhY3R1YWw6IHByb3BzW2tleV0gPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcHJvcHNba2V5XSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IHRyaWNrIGZvciB0eXBlLWd1YXJkaW5nOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIGNvbnN0IF86IG5ldmVyID0ga2V5XG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFR5cGVTY3JpcHQgdHJpY2sgZm9yIHR5cGUtZ3VhcmRpbmc6XG4gICAgY29uc3Qgb3B0aW9uYWxQcm9wc0d1YXJkOiBSZWNvcmQ8TGlua1Byb3BzT3B0aW9uYWwsIHRydWU+ID0ge1xuICAgICAgYXM6IHRydWUsXG4gICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgc2hhbGxvdzogdHJ1ZSxcbiAgICAgIHBhc3NIcmVmOiB0cnVlLFxuICAgICAgcHJlZmV0Y2g6IHRydWUsXG4gICAgICB1bnN0YWJsZV9keW5hbWljT25Ib3ZlcjogdHJ1ZSxcbiAgICAgIG9uQ2xpY2s6IHRydWUsXG4gICAgICBvbk1vdXNlRW50ZXI6IHRydWUsXG4gICAgICBvblRvdWNoU3RhcnQ6IHRydWUsXG4gICAgICBsZWdhY3lCZWhhdmlvcjogdHJ1ZSxcbiAgICAgIG9uTmF2aWdhdGU6IHRydWUsXG4gICAgfSBhcyBjb25zdFxuICAgIGNvbnN0IG9wdGlvbmFsUHJvcHM6IExpbmtQcm9wc09wdGlvbmFsW10gPSBPYmplY3Qua2V5cyhcbiAgICAgIG9wdGlvbmFsUHJvcHNHdWFyZFxuICAgICkgYXMgTGlua1Byb3BzT3B0aW9uYWxbXVxuICAgIG9wdGlvbmFsUHJvcHMuZm9yRWFjaCgoa2V5OiBMaW5rUHJvcHNPcHRpb25hbCkgPT4ge1xuICAgICAgY29uc3QgdmFsVHlwZSA9IHR5cGVvZiBwcm9wc1trZXldXG5cbiAgICAgIGlmIChrZXkgPT09ICdhcycpIHtcbiAgICAgICAgaWYgKHByb3BzW2tleV0gJiYgdmFsVHlwZSAhPT0gJ3N0cmluZycgJiYgdmFsVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVQcm9wRXJyb3Ioe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZXhwZWN0ZWQ6ICdgc3RyaW5nYCBvciBgb2JqZWN0YCcsXG4gICAgICAgICAgICBhY3R1YWw6IHZhbFR5cGUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAga2V5ID09PSAnb25DbGljaycgfHxcbiAgICAgICAga2V5ID09PSAnb25Nb3VzZUVudGVyJyB8fFxuICAgICAgICBrZXkgPT09ICdvblRvdWNoU3RhcnQnIHx8XG4gICAgICAgIGtleSA9PT0gJ29uTmF2aWdhdGUnXG4gICAgICApIHtcbiAgICAgICAgaWYgKHByb3BzW2tleV0gJiYgdmFsVHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVByb3BFcnJvcih7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBleHBlY3RlZDogJ2BmdW5jdGlvbmAnLFxuICAgICAgICAgICAgYWN0dWFsOiB2YWxUeXBlLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGtleSA9PT0gJ3JlcGxhY2UnIHx8XG4gICAgICAgIGtleSA9PT0gJ3Njcm9sbCcgfHxcbiAgICAgICAga2V5ID09PSAnc2hhbGxvdycgfHxcbiAgICAgICAga2V5ID09PSAncGFzc0hyZWYnIHx8XG4gICAgICAgIGtleSA9PT0gJ2xlZ2FjeUJlaGF2aW9yJyB8fFxuICAgICAgICBrZXkgPT09ICd1bnN0YWJsZV9keW5hbWljT25Ib3ZlcidcbiAgICAgICkge1xuICAgICAgICBpZiAocHJvcHNba2V5XSAhPSBudWxsICYmIHZhbFR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVByb3BFcnJvcih7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBleHBlY3RlZDogJ2Bib29sZWFuYCcsXG4gICAgICAgICAgICBhY3R1YWw6IHZhbFR5cGUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwcmVmZXRjaCcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BzW2tleV0gIT0gbnVsbCAmJlxuICAgICAgICAgIHZhbFR5cGUgIT09ICdib29sZWFuJyAmJlxuICAgICAgICAgIHByb3BzW2tleV0gIT09ICdhdXRvJyAmJlxuICAgICAgICAgIHByb3BzW2tleV0gIT09ICd1bnN0YWJsZV9mb3JjZVN0YWxlJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVQcm9wRXJyb3Ioe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZXhwZWN0ZWQ6ICdgYm9vbGVhbiB8IFwiYXV0b1wiIHwgXCJ1bnN0YWJsZV9mb3JjZVN0YWxlXCJgJyxcbiAgICAgICAgICAgIGFjdHVhbDogdmFsVHlwZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IHRyaWNrIGZvciB0eXBlLWd1YXJkaW5nOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIGNvbnN0IF86IG5ldmVyID0ga2V5XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHByb3BzLmxvY2FsZSkge1xuICAgICAgd2Fybk9uY2UoXG4gICAgICAgICdUaGUgYGxvY2FsZWAgcHJvcCBpcyBub3Qgc3VwcG9ydGVkIGluIGBuZXh0L2xpbmtgIHdoaWxlIHVzaW5nIHRoZSBgYXBwYCByb3V0ZXIuIFJlYWQgbW9yZSBhYm91dCBhcHAgcm91dGVyIGludGVybmFsaXphdGlvbjogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vcm91dGluZy9pbnRlcm5hdGlvbmFsaXphdGlvbidcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKCFhc1Byb3ApIHtcbiAgICAgIGxldCBocmVmOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIGlmICh0eXBlb2YgaHJlZlByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGhyZWYgPSBocmVmUHJvcFxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIGhyZWZQcm9wID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2YgaHJlZlByb3AucGF0aG5hbWUgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgaHJlZiA9IGhyZWZQcm9wLnBhdGhuYW1lXG4gICAgICB9XG5cbiAgICAgIGlmIChocmVmKSB7XG4gICAgICAgIGNvbnN0IGhhc0R5bmFtaWNTZWdtZW50ID0gaHJlZlxuICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnWycpICYmIHNlZ21lbnQuZW5kc1dpdGgoJ10nKSlcblxuICAgICAgICBpZiAoaGFzRHluYW1pY1NlZ21lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRHluYW1pYyBocmVmIFxcYCR7aHJlZn1cXGAgZm91bmQgaW4gPExpbms+IHdoaWxlIHVzaW5nIHRoZSBcXGAvYXBwXFxgIHJvdXRlciwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBSZWFkIG1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2FwcC1kaXItZHluYW1pYy1ocmVmYFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgaHJlZiwgYXMgfSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkSHJlZiA9IGZvcm1hdFN0cmluZ09yVXJsKGhyZWZQcm9wKVxuICAgIHJldHVybiB7XG4gICAgICBocmVmOiByZXNvbHZlZEhyZWYsXG4gICAgICBhczogYXNQcm9wID8gZm9ybWF0U3RyaW5nT3JVcmwoYXNQcm9wKSA6IHJlc29sdmVkSHJlZixcbiAgICB9XG4gIH0sIFtocmVmUHJvcCwgYXNQcm9wXSlcblxuICAvLyBUaGlzIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCwgaWYgbXVsdGlwbGUgYXJlIHByb3ZpZGVkIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgbGV0IGNoaWxkOiBhbnlcbiAgaWYgKGxlZ2FjeUJlaGF2aW9yKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBpZiAob25DbGljaykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFwib25DbGlja1wiIHdhcyBwYXNzZWQgdG8gPExpbms+IHdpdGggXFxgaHJlZlxcYCBvZiBcXGAke2hyZWZQcm9wfVxcYCBidXQgXCJsZWdhY3lCZWhhdmlvclwiIHdhcyBzZXQuIFRoZSBsZWdhY3kgYmVoYXZpb3IgcmVxdWlyZXMgb25DbGljayBiZSBzZXQgb24gdGhlIGNoaWxkIG9mIG5leHQvbGlua2BcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKG9uTW91c2VFbnRlclByb3ApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBcIm9uTW91c2VFbnRlclwiIHdhcyBwYXNzZWQgdG8gPExpbms+IHdpdGggXFxgaHJlZlxcYCBvZiBcXGAke2hyZWZQcm9wfVxcYCBidXQgXCJsZWdhY3lCZWhhdmlvclwiIHdhcyBzZXQuIFRoZSBsZWdhY3kgYmVoYXZpb3IgcmVxdWlyZXMgb25Nb3VzZUVudGVyIGJlIHNldCBvbiB0aGUgY2hpbGQgb2YgbmV4dC9saW5rYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBObyBjaGlsZHJlbiB3ZXJlIHBhc3NlZCB0byA8TGluaz4gd2l0aCBcXGBocmVmXFxgIG9mIFxcYCR7aHJlZlByb3B9XFxgIGJ1dCBvbmUgY2hpbGQgaXMgcmVxdWlyZWQgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvbGluay1uby1jaGlsZHJlbmBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBjaGlsZHJlbiB3ZXJlIHBhc3NlZCB0byA8TGluaz4gd2l0aCBcXGBocmVmXFxgIG9mIFxcYCR7aHJlZlByb3B9XFxgIGJ1dCBvbmx5IG9uZSBjaGlsZCBpcyBzdXBwb3J0ZWQgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvbGluay1tdWx0aXBsZS1jaGlsZHJlbmAgK1xuICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgID8gXCIgXFxuT3BlbiB5b3VyIGJyb3dzZXIncyBjb25zb2xlIHRvIHZpZXcgdGhlIENvbXBvbmVudCBzdGFjayB0cmFjZS5cIlxuICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkID0gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbilcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBpZiAoKGNoaWxkcmVuIGFzIGFueSk/LnR5cGUgPT09ICdhJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgPExpbms+IHdpdGggPGE+IGNoaWxkLiBQbGVhc2UgcmVtb3ZlIDxhPiBvciB1c2UgPExpbmsgbGVnYWN5QmVoYXZpb3I+LlxcbkxlYXJuIG1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2ludmFsaWQtbmV3LWxpbmstd2l0aC1leHRyYS1hbmNob3InXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBjaGlsZFJlZjogYW55ID0gbGVnYWN5QmVoYXZpb3JcbiAgICA/IGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgY2hpbGQucmVmXG4gICAgOiBmb3J3YXJkZWRSZWZcblxuICAvLyBVc2UgYSBjYWxsYmFjayByZWYgdG8gYXR0YWNoIGFuIEludGVyc2VjdGlvbk9ic2VydmVyIHRvIHRoZSBhbmNob3IgdGFnIG9uXG4gIC8vIG1vdW50LiBJbiB0aGUgZnV0dXJlIHdlIHdpbGwgYWxzbyB1c2UgdGhpcyB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGVcbiAgLy8gY3VycmVudGx5IG1vdW50ZWQgPExpbms+IGluc3RhbmNlcywgZS5nLiBzbyB3ZSBjYW4gcmUtcHJlZmV0Y2ggdGhlbSBhZnRlclxuICAvLyBhIHJldmFsaWRhdGlvbiBvciByZWZyZXNoLlxuICBjb25zdCBvYnNlcnZlTGlua1Zpc2liaWxpdHlPbk1vdW50ID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKGVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50IHwgU1ZHQUVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChyb3V0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgbGlua0luc3RhbmNlUmVmLmN1cnJlbnQgPSBtb3VudExpbmtJbnN0YW5jZShcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgcm91dGVyLFxuICAgICAgICAgIGZldGNoU3RyYXRlZ3ksXG4gICAgICAgICAgcHJlZmV0Y2hFbmFibGVkLFxuICAgICAgICAgIHNldE9wdGltaXN0aWNMaW5rU3RhdHVzXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGxpbmtJbnN0YW5jZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgdW5tb3VudExpbmtGb3JDdXJyZW50TmF2aWdhdGlvbihsaW5rSW5zdGFuY2VSZWYuY3VycmVudClcbiAgICAgICAgICBsaW5rSW5zdGFuY2VSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICB1bm1vdW50UHJlZmV0Y2hhYmxlSW5zdGFuY2UoZWxlbWVudClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtwcmVmZXRjaEVuYWJsZWQsIGhyZWYsIHJvdXRlciwgZmV0Y2hTdHJhdGVneSwgc2V0T3B0aW1pc3RpY0xpbmtTdGF0dXNdXG4gIClcblxuICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZWRSZWYob2JzZXJ2ZUxpbmtWaXNpYmlsaXR5T25Nb3VudCwgY2hpbGRSZWYpXG5cbiAgY29uc3QgY2hpbGRQcm9wczoge1xuICAgIG9uVG91Y2hTdGFydD86IFJlYWN0LlRvdWNoRXZlbnRIYW5kbGVyPEhUTUxBbmNob3JFbGVtZW50PlxuICAgIG9uTW91c2VFbnRlcjogUmVhY3QuTW91c2VFdmVudEhhbmRsZXI8SFRNTEFuY2hvckVsZW1lbnQ+XG4gICAgb25DbGljazogUmVhY3QuTW91c2VFdmVudEhhbmRsZXI8SFRNTEFuY2hvckVsZW1lbnQ+XG4gICAgaHJlZj86IHN0cmluZ1xuICAgIHJlZj86IGFueVxuICB9ID0ge1xuICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgIG9uQ2xpY2soZSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKCFlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCByZW5kZXJlZCBpbnNpZGUgbmV4dC9saW5rIGhhcyB0byBwYXNzIGNsaWNrIGV2ZW50IHRvIFwib25DbGlja1wiIHByb3AuYFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWxlZ2FjeUJlaGF2aW9yICYmIHR5cGVvZiBvbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ2xpY2soZSlcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBsZWdhY3lCZWhhdmlvciAmJlxuICAgICAgICBjaGlsZC5wcm9wcyAmJlxuICAgICAgICB0eXBlb2YgY2hpbGQucHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNoaWxkLnByb3BzLm9uQ2xpY2soZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFyb3V0ZXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxpbmtDbGlja2VkKGUsIGhyZWYsIGFzLCBsaW5rSW5zdGFuY2VSZWYsIHJlcGxhY2UsIHNjcm9sbCwgb25OYXZpZ2F0ZSlcbiAgICB9LFxuICAgIG9uTW91c2VFbnRlcihlKSB7XG4gICAgICBpZiAoIWxlZ2FjeUJlaGF2aW9yICYmIHR5cGVvZiBvbk1vdXNlRW50ZXJQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uTW91c2VFbnRlclByb3AoZSlcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBsZWdhY3lCZWhhdmlvciAmJlxuICAgICAgICBjaGlsZC5wcm9wcyAmJlxuICAgICAgICB0eXBlb2YgY2hpbGQucHJvcHMub25Nb3VzZUVudGVyID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgY2hpbGQucHJvcHMub25Nb3VzZUVudGVyKGUpXG4gICAgICB9XG5cbiAgICAgIGlmICghcm91dGVyKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIXByZWZldGNoRW5hYmxlZCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBncmFkZVRvRHluYW1pY1ByZWZldGNoID0gdW5zdGFibGVfZHluYW1pY09uSG92ZXIgPT09IHRydWVcbiAgICAgIG9uTmF2aWdhdGlvbkludGVudChcbiAgICAgICAgZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxBbmNob3JFbGVtZW50IHwgU1ZHQUVsZW1lbnQsXG4gICAgICAgIHVwZ3JhZGVUb0R5bmFtaWNQcmVmZXRjaFxuICAgICAgKVxuICAgIH0sXG4gICAgb25Ub3VjaFN0YXJ0OiBwcm9jZXNzLmVudi5fX05FWFRfTElOS19OT19UT1VDSF9TVEFSVFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICAgICAgICBpZiAoIWxlZ2FjeUJlaGF2aW9yICYmIHR5cGVvZiBvblRvdWNoU3RhcnRQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvblRvdWNoU3RhcnRQcm9wKGUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGVnYWN5QmVoYXZpb3IgJiZcbiAgICAgICAgICAgIGNoaWxkLnByb3BzICYmXG4gICAgICAgICAgICB0eXBlb2YgY2hpbGQucHJvcHMub25Ub3VjaFN0YXJ0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5vblRvdWNoU3RhcnQoZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXJvdXRlcikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFwcmVmZXRjaEVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwZ3JhZGVUb0R5bmFtaWNQcmVmZXRjaCA9IHVuc3RhYmxlX2R5bmFtaWNPbkhvdmVyID09PSB0cnVlXG4gICAgICAgICAgb25OYXZpZ2F0aW9uSW50ZW50KFxuICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxBbmNob3JFbGVtZW50IHwgU1ZHQUVsZW1lbnQsXG4gICAgICAgICAgICB1cGdyYWRlVG9EeW5hbWljUHJlZmV0Y2hcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gIH1cblxuICAvLyBJZiBjaGlsZCBpcyBhbiA8YT4gdGFnIGFuZCBkb2Vzbid0IGhhdmUgYSBocmVmIGF0dHJpYnV0ZSwgb3IgaWYgdGhlICdwYXNzSHJlZicgcHJvcGVydHkgaXNcbiAgLy8gZGVmaW5lZCwgd2Ugc3BlY2lmeSB0aGUgY3VycmVudCAnaHJlZicsIHNvIHRoYXQgcmVwZXRpdGlvbiBpcyBub3QgbmVlZGVkIGJ5IHRoZSB1c2VyLlxuICAvLyBJZiB0aGUgdXJsIGlzIGFic29sdXRlLCB3ZSBjYW4gYnlwYXNzIHRoZSBsb2dpYyB0byBwcmVwZW5kIHRoZSBiYXNlUGF0aC5cbiAgaWYgKGlzQWJzb2x1dGVVcmwoYXMpKSB7XG4gICAgY2hpbGRQcm9wcy5ocmVmID0gYXNcbiAgfSBlbHNlIGlmIChcbiAgICAhbGVnYWN5QmVoYXZpb3IgfHxcbiAgICBwYXNzSHJlZiB8fFxuICAgIChjaGlsZC50eXBlID09PSAnYScgJiYgISgnaHJlZicgaW4gY2hpbGQucHJvcHMpKVxuICApIHtcbiAgICBjaGlsZFByb3BzLmhyZWYgPSBhZGRCYXNlUGF0aChhcylcbiAgfVxuXG4gIGxldCBsaW5rOiBSZWFjdC5SZWFjdE5vZGVcblxuICBpZiAobGVnYWN5QmVoYXZpb3IpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIGVycm9yT25jZShcbiAgICAgICAgJ2BsZWdhY3lCZWhhdmlvcmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlICcgK1xuICAgICAgICAgICdyZWxlYXNlLiBBIGNvZGVtb2QgaXMgYXZhaWxhYmxlIHRvIHVwZ3JhZGUgeW91ciBjb21wb25lbnRzOlxcblxcbicgK1xuICAgICAgICAgICducHggQG5leHQvY29kZW1vZEBsYXRlc3QgbmV3LWxpbmsgLlxcblxcbicgK1xuICAgICAgICAgICdMZWFybiBtb3JlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi91cGdyYWRpbmcvY29kZW1vZHMjcmVtb3ZlLWEtdGFncy1mcm9tLWxpbmstY29tcG9uZW50cydcbiAgICAgIClcbiAgICB9XG4gICAgbGluayA9IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgY2hpbGRQcm9wcylcbiAgfSBlbHNlIHtcbiAgICBsaW5rID0gKFxuICAgICAgPGEgey4uLnJlc3RQcm9wc30gey4uLmNoaWxkUHJvcHN9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L2E+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8TGlua1N0YXR1c0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2xpbmtTdGF0dXN9PlxuICAgICAge2xpbmt9XG4gICAgPC9MaW5rU3RhdHVzQ29udGV4dC5Qcm92aWRlcj5cbiAgKVxufVxuXG5jb25zdCBMaW5rU3RhdHVzQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gIHR5cGVvZiBQRU5ESU5HX0xJTktfU1RBVFVTIHwgdHlwZW9mIElETEVfTElOS19TVEFUVVNcbj4oSURMRV9MSU5LX1NUQVRVUylcblxuZXhwb3J0IGNvbnN0IHVzZUxpbmtTdGF0dXMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VDb250ZXh0KExpbmtTdGF0dXNDb250ZXh0KVxufVxuXG5mdW5jdGlvbiBnZXRGZXRjaFN0cmF0ZWd5RnJvbVByZWZldGNoUHJvcChcbiAgcHJlZmV0Y2hQcm9wOiBFeGNsdWRlPExpbmtQcm9wc1sncHJlZmV0Y2gnXSwgdW5kZWZpbmVkIHwgZmFsc2U+XG4pOiBQcmVmZXRjaFRhc2tGZXRjaFN0cmF0ZWd5IHtcbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52Ll9fTkVYVF9DQUNIRV9DT01QT05FTlRTICYmXG4gICAgcHJvY2Vzcy5lbnYuX19ORVhUX0NMSUVOVF9TRUdNRU5UX0NBQ0hFXG4gICkge1xuICAgIC8vIEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb246XG4gICAgLy8gLSBgcHJlZmV0Y2g9e3RydWV9YCBpcyBhIHJ1bnRpbWUgcHJlZmV0Y2hcbiAgICAvLyAgIChpbmNsdWRlcyBjYWNoZWQgSU8gKyBwYXJhbXMgKyBjb29raWVzLCB3aXRoIGR5bmFtaWMgaG9sZXMgZm9yIHVuY2FjaGVkIElPKS5cbiAgICAvLyAtIGB1bnN0YWJsZV9mb3JjZVN0YWxlYCBpcyBhIFwiZnVsbFwiIHByZWZldGNoXG4gICAgLy8gICAoZm9yY2VzIGluY2x1c2lvbiBvZiBhbGwgZHluYW1pYyBkYXRhLCBpLmUuIHRoZSBvbGQgYmVoYXZpb3Igb2YgYHByZWZldGNoPXt0cnVlfWApXG4gICAgaWYgKHByZWZldGNoUHJvcCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIEZldGNoU3RyYXRlZ3kuUFBSUnVudGltZVxuICAgIH1cbiAgICBpZiAocHJlZmV0Y2hQcm9wID09PSAndW5zdGFibGVfZm9yY2VTdGFsZScpIHtcbiAgICAgIHJldHVybiBGZXRjaFN0cmF0ZWd5LkZ1bGxcbiAgICB9XG5cbiAgICAvLyBgbnVsbGAgb3IgYFwiYXV0b1wiYDogdGhpcyBpcyB0aGUgZGVmYXVsdCBcImF1dG9cIiBtb2RlLCB3aGVyZSB3ZSB3aWxsIHByZWZldGNoIHBhcnRpYWxseSBpZiB0aGUgbGluayBpcyBpbiB0aGUgdmlld3BvcnQuXG4gICAgLy8gVGhpcyB3aWxsIGFsc28gaW5jbHVkZSBpbnZhbGlkIHByb3AgdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHR5cGVzIHNwZWNpZmllZCBoZXJlLlxuICAgIC8vIChhbHRob3VnaCB0aG9zZSBzaG91bGQndmUgYmVlbiBmaWx0ZXJlZCBvdXQgYnkgcHJvcCB2YWxpZGF0aW9uIGluIGRldilcbiAgICBwcmVmZXRjaFByb3Agc2F0aXNmaWVzIG51bGwgfCAnYXV0bydcbiAgICAvLyBJbiBgY2xpZW50U2VnbWVudENhY2hlYCwgd2UgZGVmYXVsdCB0byBQUFIsIGFuZCB3ZSdsbCBkaXNjb3ZlciB3aGV0aGVyIG9yIG5vdCB0aGUgcm91dGUgc3VwcG9ydHMgaXQgd2l0aCB0aGUgaW5pdGlhbCBwcmVmZXRjaC5cbiAgICAvLyBJZiB3ZSdyZSBub3QgdXNpbmcgYGNsaWVudFNlZ21lbnRDYWNoZWAsIHRoaXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIGBQcmVmZXRjaEtpbmQuQVVUT2AuXG4gICAgcmV0dXJuIEZldGNoU3RyYXRlZ3kuUFBSXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZWZldGNoUHJvcCA9PT0gbnVsbCB8fCBwcmVmZXRjaFByb3AgPT09ICdhdXRvJ1xuICAgICAgPyAvLyBJbiBgY2xpZW50U2VnbWVudENhY2hlYCwgd2UgZGVmYXVsdCB0byBQUFIsIGFuZCB3ZSdsbCBkaXNjb3ZlciB3aGV0aGVyIG9yIG5vdCB0aGUgcm91dGUgc3VwcG9ydHMgaXQgd2l0aCB0aGUgaW5pdGlhbCBwcmVmZXRjaC5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHVzaW5nIGBjbGllbnRTZWdtZW50Q2FjaGVgLCB0aGlzIHdpbGwgYmUgY29udmVydGVkIGludG8gYSBgUHJlZmV0Y2hLaW5kLkFVVE9gLlxuICAgICAgICBGZXRjaFN0cmF0ZWd5LlBQUlxuICAgICAgOiAvLyBJbiB0aGUgb2xkIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgcnVudGltZSBwcmVmZXRjaGVzLCBgcHJlZmV0Y2g9e3RydWV9YCBmb3JjZXMgYWxsIGR5bmFtaWMgZGF0YSB0byBiZSBwcmVmZXRjaGVkLlxuICAgICAgICAvLyBUbyBwcmVzZXJ2ZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgYW55dGhpbmcgb3RoZXIgdGhhbiBgZmFsc2VgLCBgbnVsbGAsIG9yIGBcImF1dG9cImAgcmVzdWx0cyBpbiBhIGZ1bGwgcHJlZmV0Y2guXG4gICAgICAgIC8vIChhbHRob3VnaCBpbnZhbGlkIHZhbHVlcyBzaG91bGQndmUgYmVlbiBmaWx0ZXJlZCBvdXQgYnkgcHJvcCB2YWxpZGF0aW9uIGluIGRldilcbiAgICAgICAgRmV0Y2hTdHJhdGVneS5GdWxsXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJMaW5rQ29tcG9uZW50IiwidXNlTGlua1N0YXR1cyIsImlzTW9kaWZpZWRFdmVudCIsImV2ZW50IiwiZXZlbnRUYXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwidGFyZ2V0IiwiZ2V0QXR0cmlidXRlIiwibWV0YUtleSIsImN0cmxLZXkiLCJzaGlmdEtleSIsImFsdEtleSIsIm5hdGl2ZUV2ZW50Iiwid2hpY2giLCJsaW5rQ2xpY2tlZCIsImUiLCJocmVmIiwiYXMiLCJsaW5rSW5zdGFuY2VSZWYiLCJyZXBsYWNlIiwic2Nyb2xsIiwib25OYXZpZ2F0ZSIsIm5vZGVOYW1lIiwiaXNBbmNob3JOb2RlTmFtZSIsInRvVXBwZXJDYXNlIiwiaGFzQXR0cmlidXRlIiwiaXNMb2NhbFVSTCIsInByZXZlbnREZWZhdWx0IiwibG9jYXRpb24iLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJSZWFjdCIsInN0YXJ0VHJhbnNpdGlvbiIsImRpc3BhdGNoTmF2aWdhdGVBY3Rpb24iLCJjdXJyZW50IiwiZm9ybWF0U3RyaW5nT3JVcmwiLCJ1cmxPYmpPclN0cmluZyIsImZvcm1hdFVybCIsInByb3BzIiwibGlua1N0YXR1cyIsInNldE9wdGltaXN0aWNMaW5rU3RhdHVzIiwidXNlT3B0aW1pc3RpYyIsIklETEVfTElOS19TVEFUVVMiLCJjaGlsZHJlbiIsInVzZVJlZiIsImhyZWZQcm9wIiwiYXNQcm9wIiwiY2hpbGRyZW5Qcm9wIiwicHJlZmV0Y2giLCJwcmVmZXRjaFByb3AiLCJwYXNzSHJlZiIsInNoYWxsb3ciLCJvbkNsaWNrIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUVudGVyUHJvcCIsIm9uVG91Y2hTdGFydCIsIm9uVG91Y2hTdGFydFByb3AiLCJsZWdhY3lCZWhhdmlvciIsInJlZiIsImZvcndhcmRlZFJlZiIsInVuc3RhYmxlX2R5bmFtaWNPbkhvdmVyIiwicmVzdFByb3BzIiwiYSIsInJvdXRlciIsInVzZUNvbnRleHQiLCJBcHBSb3V0ZXJDb250ZXh0IiwicHJlZmV0Y2hFbmFibGVkIiwiZmV0Y2hTdHJhdGVneSIsImdldEZldGNoU3RyYXRlZ3lGcm9tUHJlZmV0Y2hQcm9wIiwiRmV0Y2hTdHJhdGVneSIsIlBQUiIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImNyZWF0ZVByb3BFcnJvciIsImFyZ3MiLCJFcnJvciIsImtleSIsImV4cGVjdGVkIiwiYWN0dWFsIiwid2luZG93IiwicmVxdWlyZWRQcm9wc0d1YXJkIiwicmVxdWlyZWRQcm9wcyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiXyIsIm9wdGlvbmFsUHJvcHNHdWFyZCIsIm9wdGlvbmFsUHJvcHMiLCJ2YWxUeXBlIiwibG9jYWxlIiwid2Fybk9uY2UiLCJwYXRobmFtZSIsImhhc0R5bmFtaWNTZWdtZW50Iiwic3BsaXQiLCJzb21lIiwic2VnbWVudCIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInVzZU1lbW8iLCJyZXNvbHZlZEhyZWYiLCJjaGlsZCIsImNvbnNvbGUiLCJ3YXJuIiwiQ2hpbGRyZW4iLCJvbmx5IiwiZXJyIiwidHlwZSIsImNoaWxkUmVmIiwib2JzZXJ2ZUxpbmtWaXNpYmlsaXR5T25Nb3VudCIsInVzZUNhbGxiYWNrIiwiZWxlbWVudCIsIm1vdW50TGlua0luc3RhbmNlIiwidW5tb3VudExpbmtGb3JDdXJyZW50TmF2aWdhdGlvbiIsInVubW91bnRQcmVmZXRjaGFibGVJbnN0YW5jZSIsIm1lcmdlZFJlZiIsInVzZU1lcmdlZFJlZiIsImNoaWxkUHJvcHMiLCJkZWZhdWx0UHJldmVudGVkIiwidXBncmFkZVRvRHluYW1pY1ByZWZldGNoIiwib25OYXZpZ2F0aW9uSW50ZW50IiwiX19ORVhUX0xJTktfTk9fVE9VQ0hfU1RBUlQiLCJ1bmRlZmluZWQiLCJpc0Fic29sdXRlVXJsIiwiYWRkQmFzZVBhdGgiLCJsaW5rIiwiZXJyb3JPbmNlIiwiY2xvbmVFbGVtZW50IiwiTGlua1N0YXR1c0NvbnRleHQiLCJQcm92aWRlciIsInZhbHVlIiwiY3JlYXRlQ29udGV4dCIsIl9fTkVYVF9DQUNIRV9DT01QT05FTlRTIiwiX19ORVhUX0NMSUVOVF9TRUdNRU5UX0NBQ0hFIiwiUFBSUnVudGltZSIsIkZ1bGwiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/client/app-dir/link.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/client/use-merged-ref.js": /*!*********************************************************!*\ !*** ./node_modules/next/dist/client/use-merged-ref.js ***! \*********************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nObject.defineProperty(exports, \"useMergedRef\", ({\n enumerable: true,\n get: function() {\n return useMergedRef;\n }\n}));\nconst _react = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\nfunction useMergedRef(refA, refB) {\n const cleanupA = (0, _react.useRef)(null);\n const cleanupB = (0, _react.useRef)(null);\n // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.\n // (this happens often if the user doesn't pass a ref to Link/Form/Image)\n // But this can cause us to leak a cleanup-ref into user code (e.g. via `<Link legacyBehavior>`),\n // and the user might pass that ref into ref-merging library that doesn't support cleanup refs\n // (because it hasn't been updated for React 19)\n // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.\n // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.\n return (0, _react.useCallback)((current)=>{\n if (current === null) {\n const cleanupFnA = cleanupA.current;\n if (cleanupFnA) {\n cleanupA.current = null;\n cleanupFnA();\n }\n const cleanupFnB = cleanupB.current;\n if (cleanupFnB) {\n cleanupB.current = null;\n cleanupFnB();\n }\n } else {\n if (refA) {\n cleanupA.current = applyRef(refA, current);\n }\n if (refB) {\n cleanupB.current = applyRef(refB, current);\n }\n }\n }, [\n refA,\n refB\n ]);\n}\nfunction applyRef(refA, current) {\n if (typeof refA === 'function') {\n const cleanup = refA(current);\n if (typeof cleanup === 'function') {\n return cleanup;\n } else {\n return ()=>refA(null);\n }\n } else {\n refA.current = current;\n return ()=>{\n refA.current = null;\n };\n }\n}\nif ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') {\n Object.defineProperty(exports.default, '__esModule', {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=use-merged-ref.js.map\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L3VzZS1tZXJnZWQtcmVmLmpzIiwibWFwcGluZ3MiOiI7Ozs7Z0RBU2dCQTs7O2VBQUFBOzs7bUNBVDhCO0FBU3ZDLFNBQVNBLGFBQ2RDLElBQW1CLEVBQ25CQyxJQUFtQjtJQUVuQixNQUFNQyxXQUFXQyxDQUFBQSxHQUFBQSxPQUFBQSxNQUFBQSxFQUE0QjtJQUM3QyxNQUFNQyxXQUFXRCxDQUFBQSxHQUFBQSxPQUFBQSxNQUFBQSxFQUE0QjtJQUU3QyxtRkFBbUY7SUFDbkYseUVBQXlFO0lBQ3pFLGlHQUFpRztJQUNqRyw4RkFBOEY7SUFDOUYsZ0RBQWdEO0lBQ2hELG1HQUFtRztJQUNuRyx3RkFBd0Y7SUFDeEYsT0FBT0UsQ0FBQUEsR0FBQUEsT0FBQUEsV0FBQUEsRUFDTCxDQUFDQztRQUNDLElBQUlBLFlBQVksTUFBTTtZQUNwQixNQUFNQyxhQUFhTCxTQUFTSSxPQUFPO1lBQ25DLElBQUlDLFlBQVk7Z0JBQ2RMLFNBQVNJLE9BQU8sR0FBRztnQkFDbkJDO1lBQ0Y7WUFDQSxNQUFNQyxhQUFhSixTQUFTRSxPQUFPO1lBQ25DLElBQUlFLFlBQVk7Z0JBQ2RKLFNBQVNFLE9BQU8sR0FBRztnQkFDbkJFO1lBQ0Y7UUFDRixPQUFPO1lBQ0wsSUFBSVIsTUFBTTtnQkFDUkUsU0FBU0ksT0FBTyxHQUFHRyxTQUFTVCxNQUFNTTtZQUNwQztZQUNBLElBQUlMLE1BQU07Z0JBQ1JHLFNBQVNFLE9BQU8sR0FBR0csU0FBU1IsTUFBTUs7WUFDcEM7UUFDRjtJQUNGLEdBQ0E7UUFBQ047UUFBTUM7S0FBSztBQUVoQjtBQUVBLFNBQVNRLFNBQ1BULElBQWdDLEVBQ2hDTSxPQUFpQjtJQUVqQixJQUFJLE9BQU9OLFNBQVMsWUFBWTtRQUM5QixNQUFNVSxVQUFVVixLQUFLTTtRQUNyQixJQUFJLE9BQU9JLFlBQVksWUFBWTtZQUNqQyxPQUFPQTtRQUNULE9BQU87WUFDTCxPQUFPLElBQU1WLEtBQUs7UUFDcEI7SUFDRixPQUFPO1FBQ0xBLEtBQUtNLE9BQU8sR0FBR0E7UUFDZixPQUFPO1lBQ0xOLEtBQUtNLE9BQU8sR0FBRztRQUNqQjtJQUNGO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L3NyYy9jbGllbnQvdXNlLW1lcmdlZC1yZWYudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdHlwZSBSZWYgfSBmcm9tICdyZWFjdCdcblxuLy8gVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgaG9vayB0byBzdXBwb3J0IFJlYWN0IDE4IGFuZCAxOSByZWZzLlxuLy8gSW4gMTksIGEgY2xlYW51cCBmdW5jdGlvbiBmcm9tIHJlZnMgbWF5IGJlIHJldHVybmVkLlxuLy8gSW4gMTgsIHJldHVybmluZyBhIGNsZWFudXAgZnVuY3Rpb24gY3JlYXRlcyBhIHdhcm5pbmcuXG4vLyBTaW5jZSB3ZSB0YWtlIHVzZXJzcGFjZSByZWZzLCB3ZSBkb24ndCBrbm93IGFoZWFkIG9mIHRpbWUgaWYgYSBjbGVhbnVwIGZ1bmN0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXG4vLyBUaGlzIGltcGxlbWVudHMgY2xlYW51cCBmdW5jdGlvbnMgd2l0aCB0aGUgb2xkIGJlaGF2aW9yIGluIDE4LlxuLy8gV2Uga25vdyByZWZzIGFyZSBhbHdheXMgY2FsbGVkIGFsdGVybmF0aW5nIHdpdGggYG51bGxgIGFuZCB0aGVuIGBUYC5cbi8vIFNvIGEgY2FsbCB3aXRoIGBudWxsYCBtZWFucyB3ZSBuZWVkIHRvIGNhbGwgdGhlIHByZXZpb3VzIGNsZWFudXAgZnVuY3Rpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lcmdlZFJlZjxURWxlbWVudD4oXG4gIHJlZkE6IFJlZjxURWxlbWVudD4sXG4gIHJlZkI6IFJlZjxURWxlbWVudD5cbik6IFJlZjxURWxlbWVudD4ge1xuICBjb25zdCBjbGVhbnVwQSA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBjbGVhbnVwQiA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuXG4gIC8vIE5PVEU6IEluIHRoZW9yeSwgd2UgY291bGQgc2tpcCB0aGUgd3JhcHBpbmcgaWYgb25seSBvbmUgb2YgdGhlIHJlZnMgaXMgbm9uLW51bGwuXG4gIC8vICh0aGlzIGhhcHBlbnMgb2Z0ZW4gaWYgdGhlIHVzZXIgZG9lc24ndCBwYXNzIGEgcmVmIHRvIExpbmsvRm9ybS9JbWFnZSlcbiAgLy8gQnV0IHRoaXMgY2FuIGNhdXNlIHVzIHRvIGxlYWsgYSBjbGVhbnVwLXJlZiBpbnRvIHVzZXIgY29kZSAoZS5nLiB2aWEgYDxMaW5rIGxlZ2FjeUJlaGF2aW9yPmApLFxuICAvLyBhbmQgdGhlIHVzZXIgbWlnaHQgcGFzcyB0aGF0IHJlZiBpbnRvIHJlZi1tZXJnaW5nIGxpYnJhcnkgdGhhdCBkb2Vzbid0IHN1cHBvcnQgY2xlYW51cCByZWZzXG4gIC8vIChiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHVwZGF0ZWQgZm9yIFJlYWN0IDE5KVxuICAvLyB3aGljaCBjYW4gdGhlbiBjYXVzZSB0aGluZ3MgdG8gYmxvdyB1cCwgYmVjYXVzZSBhIGNsZWFudXAtcmV0dXJuaW5nIHJlZiBnZXRzIGNhbGxlZCB3aXRoIGBudWxsYC5cbiAgLy8gU28gaW4gcHJhY3RpY2UsIGl0J3Mgc2FmZXIgdG8gYmUgZGVmZW5zaXZlIGFuZCBhbHdheXMgd3JhcCB0aGUgcmVmLCBldmVuIG9uIFJlYWN0IDE5LlxuICByZXR1cm4gdXNlQ2FsbGJhY2soXG4gICAgKGN1cnJlbnQ6IFRFbGVtZW50IHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY2xlYW51cEZuQSA9IGNsZWFudXBBLmN1cnJlbnRcbiAgICAgICAgaWYgKGNsZWFudXBGbkEpIHtcbiAgICAgICAgICBjbGVhbnVwQS5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIGNsZWFudXBGbkEoKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsZWFudXBGbkIgPSBjbGVhbnVwQi5jdXJyZW50XG4gICAgICAgIGlmIChjbGVhbnVwRm5CKSB7XG4gICAgICAgICAgY2xlYW51cEIuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBjbGVhbnVwRm5CKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJlZkEpIHtcbiAgICAgICAgICBjbGVhbnVwQS5jdXJyZW50ID0gYXBwbHlSZWYocmVmQSwgY3VycmVudClcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmQikge1xuICAgICAgICAgIGNsZWFudXBCLmN1cnJlbnQgPSBhcHBseVJlZihyZWZCLCBjdXJyZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbcmVmQSwgcmVmQl1cbiAgKVxufVxuXG5mdW5jdGlvbiBhcHBseVJlZjxURWxlbWVudD4oXG4gIHJlZkE6IE5vbk51bGxhYmxlPFJlZjxURWxlbWVudD4+LFxuICBjdXJyZW50OiBURWxlbWVudFxuKSB7XG4gIGlmICh0eXBlb2YgcmVmQSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGNsZWFudXAgPSByZWZBKGN1cnJlbnQpXG4gICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY2xlYW51cFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKCkgPT4gcmVmQShudWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZWZBLmN1cnJlbnQgPSBjdXJyZW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlZkEuY3VycmVudCA9IG51bGxcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJ1c2VNZXJnZWRSZWYiLCJyZWZBIiwicmVmQiIsImNsZWFudXBBIiwidXNlUmVmIiwiY2xlYW51cEIiLCJ1c2VDYWxsYmFjayIsImN1cnJlbnQiLCJjbGVhbnVwRm5BIiwiY2xlYW51cEZuQiIsImFwcGx5UmVmIiwiY2xlYW51cCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/client/use-merged-ref.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/format-url.js": /*!**********************************************************************!*\ !*** ./node_modules/next/dist/shared/lib/router/utils/format-url.js ***! \**********************************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("// Format function modified from nodejs\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n0 && (0);\nfunction _export(target, all) {\n for(var name in all)Object.defineProperty(target, name, {\n enumerable: true,\n get: all[name]\n });\n}\n_export(exports, {\n formatUrl: function() {\n return formatUrl;\n },\n formatWithValidation: function() {\n return formatWithValidation;\n },\n urlObjectKeys: function() {\n return urlObjectKeys;\n }\n});\nconst _interop_require_wildcard = __webpack_require__(/*! @swc/helpers/_/_interop_require_wildcard */ \"(app-pages-browser)/./node_modules/@swc/helpers/esm/_interop_require_wildcard.js\");\nconst _querystring = /*#__PURE__*/ _interop_require_wildcard._(__webpack_require__(/*! ./querystring */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/querystring.js\"));\nconst slashedProtocols = /https?|ftp|gopher|file/;\nfunction formatUrl(urlObj) {\n let { auth, hostname } = urlObj;\n let protocol = urlObj.protocol || '';\n let pathname = urlObj.pathname || '';\n let hash = urlObj.hash || '';\n let query = urlObj.query || '';\n let host = false;\n auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : '';\n if (urlObj.host) {\n host = auth + urlObj.host;\n } else if (hostname) {\n host = auth + (~hostname.indexOf(':') ? \"[\" + hostname + \"]\" : hostname);\n if (urlObj.port) {\n host += ':' + urlObj.port;\n }\n }\n if (query && typeof query === 'object') {\n query = String(_querystring.urlQueryToSearchParams(query));\n }\n let search = urlObj.search || query && \"?\" + query || '';\n if (protocol && !protocol.endsWith(':')) protocol += ':';\n if (urlObj.slashes || (!protocol || slashedProtocols.test(protocol)) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname[0] !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n if (hash && hash[0] !== '#') hash = '#' + hash;\n if (search && search[0] !== '?') search = '?' + search;\n pathname = pathname.replace(/[?#]/g, encodeURIComponent);\n search = search.replace('#', '%23');\n return \"\" + protocol + host + pathname + search + hash;\n}\nconst urlObjectKeys = [\n 'auth',\n 'hash',\n 'host',\n 'hostname',\n 'href',\n 'path',\n 'pathname',\n 'port',\n 'protocol',\n 'query',\n 'search',\n 'slashes'\n];\nfunction formatWithValidation(url) {\n if (true) {\n if (url !== null && typeof url === 'object') {\n Object.keys(url).forEach((key)=>{\n if (!urlObjectKeys.includes(key)) {\n console.warn(\"Unknown key passed via urlObject into url.format: \" + key);\n }\n });\n }\n }\n return formatUrl(url);\n} //# sourceMappingURL=format-url.js.map\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvZm9ybWF0LXVybC5qcyIsIm1hcHBpbmdzIjoiQUFBQSx1Q0FBdUM7QUFDdkMsc0RBQXNEO0FBQ3RELEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsZ0VBQWdFO0FBQ2hFLHNFQUFzRTtBQUN0RSxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLHFFQUFxRTtBQUNyRSx3QkFBd0I7QUFDeEIsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSw2REFBNkQ7QUFDN0QsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLHlDQUF5Qzs7Ozs7Ozs7Ozs7OztJQVF6QkEsU0FBUztlQUFUQTs7SUE2REFDLG9CQUFvQjtlQUFwQkE7O0lBZkhDLGFBQWE7ZUFBYkE7Ozs7bUZBbERnQjtBQUU3QixNQUFNQyxtQkFBbUI7QUFFbEIsU0FBU0gsVUFBVUksTUFBaUI7SUFDekMsSUFBSSxFQUFFQyxJQUFJLEVBQUVDLFFBQVEsRUFBRSxHQUFHRjtJQUN6QixJQUFJRyxXQUFXSCxPQUFPRyxRQUFRLElBQUk7SUFDbEMsSUFBSUMsV0FBV0osT0FBT0ksUUFBUSxJQUFJO0lBQ2xDLElBQUlDLE9BQU9MLE9BQU9LLElBQUksSUFBSTtJQUMxQixJQUFJQyxRQUFRTixPQUFPTSxLQUFLLElBQUk7SUFDNUIsSUFBSUMsT0FBdUI7SUFFM0JOLE9BQU9BLE9BQU9PLG1CQUFtQlAsTUFBTVEsT0FBTyxDQUFDLFFBQVEsT0FBTyxNQUFNO0lBRXBFLElBQUlULE9BQU9PLElBQUksRUFBRTtRQUNmQSxPQUFPTixPQUFPRCxPQUFPTyxJQUFJO0lBQzNCLE9BQU8sSUFBSUwsVUFBVTtRQUNuQkssT0FBT04sT0FBUSxFQUFDQyxTQUFTUSxPQUFPLENBQUMsT0FBUSxNQUFHUixXQUFTLE1BQUtBLFFBQUFBLENBQU87UUFDakUsSUFBSUYsT0FBT1csSUFBSSxFQUFFO1lBQ2ZKLFFBQVEsTUFBTVAsT0FBT1csSUFBSTtRQUMzQjtJQUNGO0lBRUEsSUFBSUwsU0FBUyxPQUFPQSxVQUFVLFVBQVU7UUFDdENBLFFBQVFNLE9BQU9DLGFBQVlDLHNCQUFzQixDQUFDUjtJQUNwRDtJQUVBLElBQUlTLFNBQVNmLE9BQU9lLE1BQU0sSUFBS1QsU0FBVSxNQUFHQSxTQUFZO0lBRXhELElBQUlILFlBQVksQ0FBQ0EsU0FBU2EsUUFBUSxDQUFDLE1BQU1iLFlBQVk7SUFFckQsSUFDRUgsT0FBT2lCLE9BQU8sSUFDWixFQUFDZCxZQUFZSixpQkFBaUJtQixJQUFJLENBQUNmLFNBQUFBLENBQVEsSUFBTUksU0FBUyxPQUM1RDtRQUNBQSxPQUFPLE9BQVFBLENBQUFBLFFBQVEsR0FBQztRQUN4QixJQUFJSCxZQUFZQSxRQUFRLENBQUMsRUFBRSxLQUFLLEtBQUtBLFdBQVcsTUFBTUE7SUFDeEQsT0FBTyxJQUFJLENBQUNHLE1BQU07UUFDaEJBLE9BQU87SUFDVDtJQUVBLElBQUlGLFFBQVFBLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBS0EsT0FBTyxNQUFNQTtJQUMxQyxJQUFJVSxVQUFVQSxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUtBLFNBQVMsTUFBTUE7SUFFaERYLFdBQVdBLFNBQVNLLE9BQU8sQ0FBQyxTQUFTRDtJQUNyQ08sU0FBU0EsT0FBT04sT0FBTyxDQUFDLEtBQUs7SUFFN0IsT0FBUSxLQUFFTixXQUFXSSxPQUFPSCxXQUFXVyxTQUFTVjtBQUNsRDtBQUVPLE1BQU1QLGdCQUFnQjtJQUMzQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDRDtBQUVNLFNBQVNELHFCQUFxQnNCLEdBQWM7SUFDakQsSUFBSUMsSUFBb0IsRUFBb0I7UUFDMUMsSUFBSUQsUUFBUSxRQUFRLE9BQU9BLFFBQVEsVUFBVTtZQUMzQ0ksT0FBT0MsSUFBSSxDQUFDTCxLQUFLTSxPQUFPLENBQUMsQ0FBQ0M7Z0JBQ3hCLElBQUksQ0FBQzVCLGNBQWM2QixRQUFRLENBQUNELE1BQU07b0JBQ2hDRSxRQUFRQyxJQUFJLENBQ1QsdURBQW9ESDtnQkFFekQ7WUFDRjtRQUNGO0lBQ0Y7SUFFQSxPQUFPOUIsVUFBVXVCO0FBQ25CIiwic291cmNlcyI6WyIvc3JjL3NoYXJlZC9saWIvcm91dGVyL3V0aWxzL2Zvcm1hdC11cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRm9ybWF0IGZ1bmN0aW9uIG1vZGlmaWVkIGZyb20gbm9kZWpzXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHR5cGUgeyBVcmxPYmplY3QgfSBmcm9tICd1cmwnXG5pbXBvcnQgdHlwZSB7IFBhcnNlZFVybFF1ZXJ5IH0gZnJvbSAncXVlcnlzdHJpbmcnXG5pbXBvcnQgKiBhcyBxdWVyeXN0cmluZyBmcm9tICcuL3F1ZXJ5c3RyaW5nJ1xuXG5jb25zdCBzbGFzaGVkUHJvdG9jb2xzID0gL2h0dHBzP3xmdHB8Z29waGVyfGZpbGUvXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVcmwodXJsT2JqOiBVcmxPYmplY3QpIHtcbiAgbGV0IHsgYXV0aCwgaG9zdG5hbWUgfSA9IHVybE9ialxuICBsZXQgcHJvdG9jb2wgPSB1cmxPYmoucHJvdG9jb2wgfHwgJydcbiAgbGV0IHBhdGhuYW1lID0gdXJsT2JqLnBhdGhuYW1lIHx8ICcnXG4gIGxldCBoYXNoID0gdXJsT2JqLmhhc2ggfHwgJydcbiAgbGV0IHF1ZXJ5ID0gdXJsT2JqLnF1ZXJ5IHx8ICcnXG4gIGxldCBob3N0OiBzdHJpbmcgfCBmYWxzZSA9IGZhbHNlXG5cbiAgYXV0aCA9IGF1dGggPyBlbmNvZGVVUklDb21wb25lbnQoYXV0aCkucmVwbGFjZSgvJTNBL2ksICc6JykgKyAnQCcgOiAnJ1xuXG4gIGlmICh1cmxPYmouaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgdXJsT2JqLmhvc3RcbiAgfSBlbHNlIGlmIChob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKH5ob3N0bmFtZS5pbmRleE9mKCc6JykgPyBgWyR7aG9zdG5hbWV9XWAgOiBob3N0bmFtZSlcbiAgICBpZiAodXJsT2JqLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdXJsT2JqLnBvcnRcbiAgICB9XG4gIH1cblxuICBpZiAocXVlcnkgJiYgdHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuICAgIHF1ZXJ5ID0gU3RyaW5nKHF1ZXJ5c3RyaW5nLnVybFF1ZXJ5VG9TZWFyY2hQYXJhbXMocXVlcnkgYXMgUGFyc2VkVXJsUXVlcnkpKVxuICB9XG5cbiAgbGV0IHNlYXJjaCA9IHVybE9iai5zZWFyY2ggfHwgKHF1ZXJ5ICYmIGA/JHtxdWVyeX1gKSB8fCAnJ1xuXG4gIGlmIChwcm90b2NvbCAmJiAhcHJvdG9jb2wuZW5kc1dpdGgoJzonKSkgcHJvdG9jb2wgKz0gJzonXG5cbiAgaWYgKFxuICAgIHVybE9iai5zbGFzaGVzIHx8XG4gICAgKCghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29scy50ZXN0KHByb3RvY29sKSkgJiYgaG9zdCAhPT0gZmFsc2UpXG4gICkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpXG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lWzBdICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWVcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJ1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaFswXSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaFxuICBpZiAoc2VhcmNoICYmIHNlYXJjaFswXSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2hcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZW5jb2RlVVJJQ29tcG9uZW50KVxuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKVxuXG4gIHJldHVybiBgJHtwcm90b2NvbH0ke2hvc3R9JHtwYXRobmFtZX0ke3NlYXJjaH0ke2hhc2h9YFxufVxuXG5leHBvcnQgY29uc3QgdXJsT2JqZWN0S2V5cyA9IFtcbiAgJ2F1dGgnLFxuICAnaGFzaCcsXG4gICdob3N0JyxcbiAgJ2hvc3RuYW1lJyxcbiAgJ2hyZWYnLFxuICAncGF0aCcsXG4gICdwYXRobmFtZScsXG4gICdwb3J0JyxcbiAgJ3Byb3RvY29sJyxcbiAgJ3F1ZXJ5JyxcbiAgJ3NlYXJjaCcsXG4gICdzbGFzaGVzJyxcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFdpdGhWYWxpZGF0aW9uKHVybDogVXJsT2JqZWN0KTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgaWYgKHVybCAhPT0gbnVsbCAmJiB0eXBlb2YgdXJsID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmtleXModXJsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKCF1cmxPYmplY3RLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgVW5rbm93biBrZXkgcGFzc2VkIHZpYSB1cmxPYmplY3QgaW50byB1cmwuZm9ybWF0OiAke2tleX1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXRVcmwodXJsKVxufVxuIl0sIm5hbWVzIjpbImZvcm1hdFVybCIsImZvcm1hdFdpdGhWYWxpZGF0aW9uIiwidXJsT2JqZWN0S2V5cyIsInNsYXNoZWRQcm90b2NvbHMiLCJ1cmxPYmoiLCJhdXRoIiwiaG9zdG5hbWUiLCJwcm90b2NvbCIsInBhdGhuYW1lIiwiaGFzaCIsInF1ZXJ5IiwiaG9zdCIsImVuY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJpbmRleE9mIiwicG9ydCIsIlN0cmluZyIsInF1ZXJ5c3RyaW5nIiwidXJsUXVlcnlUb1NlYXJjaFBhcmFtcyIsInNlYXJjaCIsImVuZHNXaXRoIiwic2xhc2hlcyIsInRlc3QiLCJ1cmwiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImluY2x1ZGVzIiwiY29uc29sZSIsIndhcm4iXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/format-url.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/is-local-url.js": /*!************************************************************************!*\ !*** ./node_modules/next/dist/shared/lib/router/utils/is-local-url.js ***! \************************************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nObject.defineProperty(exports, \"isLocalURL\", ({\n enumerable: true,\n get: function() {\n return isLocalURL;\n }\n}));\nconst _utils = __webpack_require__(/*! ../../utils */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/utils.js\");\nconst _hasbasepath = __webpack_require__(/*! ../../../../client/has-base-path */ \"(app-pages-browser)/./node_modules/next/dist/client/has-base-path.js\");\nfunction isLocalURL(url) {\n // prevent a hydration mismatch on href for url with anchor refs\n if (!(0, _utils.isAbsoluteUrl)(url)) return true;\n try {\n // absolute urls can be local if they are on the same origin\n const locationOrigin = (0, _utils.getLocationOrigin)();\n const resolved = new URL(url, locationOrigin);\n return resolved.origin === locationOrigin && (0, _hasbasepath.hasBasePath)(resolved.pathname);\n } catch (_) {\n return false;\n }\n} //# sourceMappingURL=is-local-url.js.map\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvaXMtbG9jYWwtdXJsLmpzIiwibWFwcGluZ3MiOiI7Ozs7OENBTWdCQTs7O2VBQUFBOzs7bUNBTmlDO3lDQUNyQjtBQUtyQixTQUFTQSxXQUFXQyxHQUFXO0lBQ3BDLGdFQUFnRTtJQUNoRSxJQUFJLENBQUNDLENBQUFBLEdBQUFBLE9BQUFBLGFBQUFBLEVBQWNELE1BQU0sT0FBTztJQUNoQyxJQUFJO1FBQ0YsNERBQTREO1FBQzVELE1BQU1FLGlCQUFpQkMsQ0FBQUEsR0FBQUEsT0FBQUEsaUJBQUFBO1FBQ3ZCLE1BQU1DLFdBQVcsSUFBSUMsSUFBSUwsS0FBS0U7UUFDOUIsT0FBT0UsU0FBU0UsTUFBTSxLQUFLSixrQkFBa0JLLENBQUFBLEdBQUFBLGFBQUFBLFdBQUFBLEVBQVlILFNBQVNJLFFBQVE7SUFDNUUsRUFBRSxPQUFPQyxHQUFHO1FBQ1YsT0FBTztJQUNUO0FBQ0YiLCJzb3VyY2VzIjpbIi9zcmMvc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvaXMtbG9jYWwtdXJsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQWJzb2x1dGVVcmwsIGdldExvY2F0aW9uT3JpZ2luIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBoYXNCYXNlUGF0aCB9IGZyb20gJy4uLy4uLy4uLy4uL2NsaWVudC9oYXMtYmFzZS1wYXRoJ1xuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBhIGdpdmVuIHVybCBpcyByb3V0YWJsZSBieSB0aGUgTmV4dC5qcyByb3V0ZXIgKGJyb3dzZXIgb25seSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvY2FsVVJMKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIHByZXZlbnQgYSBoeWRyYXRpb24gbWlzbWF0Y2ggb24gaHJlZiBmb3IgdXJsIHdpdGggYW5jaG9yIHJlZnNcbiAgaWYgKCFpc0Fic29sdXRlVXJsKHVybCkpIHJldHVybiB0cnVlXG4gIHRyeSB7XG4gICAgLy8gYWJzb2x1dGUgdXJscyBjYW4gYmUgbG9jYWwgaWYgdGhleSBhcmUgb24gdGhlIHNhbWUgb3JpZ2luXG4gICAgY29uc3QgbG9jYXRpb25PcmlnaW4gPSBnZXRMb2NhdGlvbk9yaWdpbigpXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgVVJMKHVybCwgbG9jYXRpb25PcmlnaW4pXG4gICAgcmV0dXJuIHJlc29sdmVkLm9yaWdpbiA9PT0gbG9jYXRpb25PcmlnaW4gJiYgaGFzQmFzZVBhdGgocmVzb2x2ZWQucGF0aG5hbWUpXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIl0sIm5hbWVzIjpbImlzTG9jYWxVUkwiLCJ1cmwiLCJpc0Fic29sdXRlVXJsIiwibG9jYXRpb25PcmlnaW4iLCJnZXRMb2NhdGlvbk9yaWdpbiIsInJlc29sdmVkIiwiVVJMIiwib3JpZ2luIiwiaGFzQmFzZVBhdGgiLCJwYXRobmFtZSIsIl8iXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/is-local-url.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/querystring.js": /*!***********************************************************************!*\ !*** ./node_modules/next/dist/shared/lib/router/utils/querystring.js ***! \***********************************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n0 && (0);\nfunction _export(target, all) {\n for(var name in all)Object.defineProperty(target, name, {\n enumerable: true,\n get: all[name]\n });\n}\n_export(exports, {\n assign: function() {\n return assign;\n },\n searchParamsToUrlQuery: function() {\n return searchParamsToUrlQuery;\n },\n urlQueryToSearchParams: function() {\n return urlQueryToSearchParams;\n }\n});\nfunction searchParamsToUrlQuery(searchParams) {\n const query = {};\n for (const [key, value] of searchParams.entries()){\n const existing = query[key];\n if (typeof existing === 'undefined') {\n query[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n query[key] = [\n existing,\n value\n ];\n }\n }\n return query;\n}\nfunction stringifyUrlQueryParam(param) {\n if (typeof param === 'string') {\n return param;\n }\n if (typeof param === 'number' && !isNaN(param) || typeof param === 'boolean') {\n return String(param);\n } else {\n return '';\n }\n}\nfunction urlQueryToSearchParams(query) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(query)){\n if (Array.isArray(value)) {\n for (const item of value){\n searchParams.append(key, stringifyUrlQueryParam(item));\n }\n } else {\n searchParams.set(key, stringifyUrlQueryParam(value));\n }\n }\n return searchParams;\n}\nfunction assign(target) {\n for(var _len = arguments.length, searchParamsList = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n searchParamsList[_key - 1] = arguments[_key];\n }\n for (const searchParams of searchParamsList){\n for (const key of searchParams.keys()){\n target.delete(key);\n }\n for (const [key, value] of searchParams.entries()){\n target.append(key, value);\n }\n }\n return target;\n} //# sourceMappingURL=querystring.js.map\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvcXVlcnlzdHJpbmcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0lBZ0RnQkEsTUFBTTtlQUFOQTs7SUE5Q0FDLHNCQUFzQjtlQUF0QkE7O0lBZ0NBQyxzQkFBc0I7ZUFBdEJBOzs7QUFoQ1QsU0FBU0QsdUJBQ2RFLFlBQTZCO0lBRTdCLE1BQU1DLFFBQXdCLENBQUM7SUFDL0IsS0FBSyxNQUFNLENBQUNDLEtBQUtDLE1BQU0sSUFBSUgsYUFBYUksT0FBTyxHQUFJO1FBQ2pELE1BQU1DLFdBQVdKLEtBQUssQ0FBQ0MsSUFBSTtRQUMzQixJQUFJLE9BQU9HLGFBQWEsYUFBYTtZQUNuQ0osS0FBSyxDQUFDQyxJQUFJLEdBQUdDO1FBQ2YsT0FBTyxJQUFJRyxNQUFNQyxPQUFPLENBQUNGLFdBQVc7WUFDbENBLFNBQVNHLElBQUksQ0FBQ0w7UUFDaEIsT0FBTztZQUNMRixLQUFLLENBQUNDLElBQUksR0FBRztnQkFBQ0c7Z0JBQVVGO2FBQU07UUFDaEM7SUFDRjtJQUNBLE9BQU9GO0FBQ1Q7QUFFQSxTQUFTUSx1QkFBdUJDLEtBQWM7SUFDNUMsSUFBSSxPQUFPQSxVQUFVLFVBQVU7UUFDN0IsT0FBT0E7SUFDVDtJQUVBLElBQ0csT0FBT0EsVUFBVSxZQUFZLENBQUNDLE1BQU1ELFVBQ3JDLE9BQU9BLFVBQVUsV0FDakI7UUFDQSxPQUFPRSxPQUFPRjtJQUNoQixPQUFPO1FBQ0wsT0FBTztJQUNUO0FBQ0Y7QUFFTyxTQUFTWCx1QkFBdUJFLEtBQXFCO0lBQzFELE1BQU1ELGVBQWUsSUFBSWE7SUFDekIsS0FBSyxNQUFNLENBQUNYLEtBQUtDLE1BQU0sSUFBSVcsT0FBT1YsT0FBTyxDQUFDSCxPQUFRO1FBQ2hELElBQUlLLE1BQU1DLE9BQU8sQ0FBQ0osUUFBUTtZQUN4QixLQUFLLE1BQU1ZLFFBQVFaLE1BQU87Z0JBQ3hCSCxhQUFhZ0IsTUFBTSxDQUFDZCxLQUFLTyx1QkFBdUJNO1lBQ2xEO1FBQ0YsT0FBTztZQUNMZixhQUFhaUIsR0FBRyxDQUFDZixLQUFLTyx1QkFBdUJOO1FBQy9DO0lBQ0Y7SUFDQSxPQUFPSDtBQUNUO0FBRU8sU0FBU0gsT0FDZHFCLE1BQXVCO0lBQ3ZCLGlDQUFHQyxtQkFBSDtRQUFHQSxnQkFBQUEsQ0FBSCwyQkFBc0M7O0lBRXRDLEtBQUssTUFBTW5CLGdCQUFnQm1CLGlCQUFrQjtRQUMzQyxLQUFLLE1BQU1qQixPQUFPRixhQUFhb0IsSUFBSSxHQUFJO1lBQ3JDRixPQUFPRyxNQUFNLENBQUNuQjtRQUNoQjtRQUVBLEtBQUssTUFBTSxDQUFDQSxLQUFLQyxNQUFNLElBQUlILGFBQWFJLE9BQU8sR0FBSTtZQUNqRGMsT0FBT0YsTUFBTSxDQUFDZCxLQUFLQztRQUNyQjtJQUNGO0lBRUEsT0FBT2U7QUFDVCIsInNvdXJjZXMiOlsiL3NyYy9zaGFyZWQvbGliL3JvdXRlci91dGlscy9xdWVyeXN0cmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhcnNlZFVybFF1ZXJ5IH0gZnJvbSAncXVlcnlzdHJpbmcnXG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hQYXJhbXNUb1VybFF1ZXJ5KFxuICBzZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc1xuKTogUGFyc2VkVXJsUXVlcnkge1xuICBjb25zdCBxdWVyeTogUGFyc2VkVXJsUXVlcnkgPSB7fVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBxdWVyeVtrZXldXG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHF1ZXJ5W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgIGV4aXN0aW5nLnB1c2godmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5W2tleV0gPSBbZXhpc3RpbmcsIHZhbHVlXVxuICAgIH1cbiAgfVxuICByZXR1cm4gcXVlcnlcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VXJsUXVlcnlQYXJhbShwYXJhbTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcmFtXG4gIH1cblxuICBpZiAoXG4gICAgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHBhcmFtKSkgfHxcbiAgICB0eXBlb2YgcGFyYW0gPT09ICdib29sZWFuJ1xuICApIHtcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmxRdWVyeVRvU2VhcmNoUGFyYW1zKHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeSk6IFVSTFNlYXJjaFBhcmFtcyB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeSkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgc3RyaW5naWZ5VXJsUXVlcnlQYXJhbShpdGVtKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoUGFyYW1zLnNldChrZXksIHN0cmluZ2lmeVVybFF1ZXJ5UGFyYW0odmFsdWUpKVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2VhcmNoUGFyYW1zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24oXG4gIHRhcmdldDogVVJMU2VhcmNoUGFyYW1zLFxuICAuLi5zZWFyY2hQYXJhbXNMaXN0OiBVUkxTZWFyY2hQYXJhbXNbXVxuKTogVVJMU2VhcmNoUGFyYW1zIHtcbiAgZm9yIChjb25zdCBzZWFyY2hQYXJhbXMgb2Ygc2VhcmNoUGFyYW1zTGlzdCkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHNlYXJjaFBhcmFtcy5rZXlzKCkpIHtcbiAgICAgIHRhcmdldC5kZWxldGUoa2V5KVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICAgIHRhcmdldC5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0XG59XG4iXSwibmFtZXMiOlsiYXNzaWduIiwic2VhcmNoUGFyYW1zVG9VcmxRdWVyeSIsInVybFF1ZXJ5VG9TZWFyY2hQYXJhbXMiLCJzZWFyY2hQYXJhbXMiLCJxdWVyeSIsImtleSIsInZhbHVlIiwiZW50cmllcyIsImV4aXN0aW5nIiwiQXJyYXkiLCJpc0FycmF5IiwicHVzaCIsInN0cmluZ2lmeVVybFF1ZXJ5UGFyYW0iLCJwYXJhbSIsImlzTmFOIiwiU3RyaW5nIiwiVVJMU2VhcmNoUGFyYW1zIiwiT2JqZWN0IiwiaXRlbSIsImFwcGVuZCIsInNldCIsInRhcmdldCIsInNlYXJjaFBhcmFtc0xpc3QiLCJrZXlzIiwiZGVsZXRlIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/router/utils/querystring.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/utils.js": /*!****************************************************!*\ !*** ./node_modules/next/dist/shared/lib/utils.js ***! \****************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n0 && (0);\nfunction _export(target, all) {\n for(var name in all)Object.defineProperty(target, name, {\n enumerable: true,\n get: all[name]\n });\n}\n_export(exports, {\n DecodeError: function() {\n return DecodeError;\n },\n MiddlewareNotFoundError: function() {\n return MiddlewareNotFoundError;\n },\n MissingStaticPage: function() {\n return MissingStaticPage;\n },\n NormalizeError: function() {\n return NormalizeError;\n },\n PageNotFoundError: function() {\n return PageNotFoundError;\n },\n SP: function() {\n return SP;\n },\n ST: function() {\n return ST;\n },\n WEB_VITALS: function() {\n return WEB_VITALS;\n },\n execOnce: function() {\n return execOnce;\n },\n getDisplayName: function() {\n return getDisplayName;\n },\n getLocationOrigin: function() {\n return getLocationOrigin;\n },\n getURL: function() {\n return getURL;\n },\n isAbsoluteUrl: function() {\n return isAbsoluteUrl;\n },\n isResSent: function() {\n return isResSent;\n },\n loadGetInitialProps: function() {\n return loadGetInitialProps;\n },\n normalizeRepeatedSlashes: function() {\n return normalizeRepeatedSlashes;\n },\n stringifyError: function() {\n return stringifyError;\n }\n});\nconst WEB_VITALS = [\n 'CLS',\n 'FCP',\n 'FID',\n 'INP',\n 'LCP',\n 'TTFB'\n];\nfunction execOnce(fn) {\n let used = false;\n let result;\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n if (!used) {\n used = true;\n result = fn(...args);\n }\n return result;\n };\n}\n// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1\n// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\nconst ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/;\nconst isAbsoluteUrl = (url)=>ABSOLUTE_URL_REGEX.test(url);\nfunction getLocationOrigin() {\n const { protocol, hostname, port } = window.location;\n return protocol + \"//\" + hostname + (port ? ':' + port : '');\n}\nfunction getURL() {\n const { href } = window.location;\n const origin = getLocationOrigin();\n return href.substring(origin.length);\n}\nfunction getDisplayName(Component) {\n return typeof Component === 'string' ? Component : Component.displayName || Component.name || 'Unknown';\n}\nfunction isResSent(res) {\n return res.finished || res.headersSent;\n}\nfunction normalizeRepeatedSlashes(url) {\n const urlParts = url.split('?');\n const urlNoQuery = urlParts[0];\n return urlNoQuery // first we replace any non-encoded backslashes with forward\n // then normalize repeated forward slashes\n .replace(/\\\\/g, '/').replace(/\\/\\/+/g, '/') + (urlParts[1] ? \"?\" + urlParts.slice(1).join('?') : '');\n}\nasync function loadGetInitialProps(App, ctx) {\n if (true) {\n var _App_prototype;\n if ((_App_prototype = App.prototype) == null ? void 0 : _App_prototype.getInitialProps) {\n const message = '\"' + getDisplayName(App) + '.getInitialProps()\" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.';\n throw Object.defineProperty(new Error(message), \"__NEXT_ERROR_CODE\", {\n value: \"E394\",\n enumerable: false,\n configurable: true\n });\n }\n }\n // when called from _app `ctx` is nested in `ctx`\n const res = ctx.res || ctx.ctx && ctx.ctx.res;\n if (!App.getInitialProps) {\n if (ctx.ctx && ctx.Component) {\n // @ts-ignore pageProps default\n return {\n pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx)\n };\n }\n return {};\n }\n const props = await App.getInitialProps(ctx);\n if (res && isResSent(res)) {\n return props;\n }\n if (!props) {\n const message = '\"' + getDisplayName(App) + '.getInitialProps()\" should resolve to an object. But found \"' + props + '\" instead.';\n throw Object.defineProperty(new Error(message), \"__NEXT_ERROR_CODE\", {\n value: \"E394\",\n enumerable: false,\n configurable: true\n });\n }\n if (true) {\n if (Object.keys(props).length === 0 && !ctx.ctx) {\n console.warn(\"\" + getDisplayName(App) + \" returned an empty object from `getInitialProps`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps\");\n }\n }\n return props;\n}\nconst SP = typeof performance !== 'undefined';\nconst ST = SP && [\n 'mark',\n 'measure',\n 'getEntriesByName'\n].every((method)=>typeof performance[method] === 'function');\nclass DecodeError extends Error {\n}\nclass NormalizeError extends Error {\n}\nclass PageNotFoundError extends Error {\n constructor(page){\n super();\n this.code = 'ENOENT';\n this.name = 'PageNotFoundError';\n this.message = \"Cannot find module for page: \" + page;\n }\n}\nclass MissingStaticPage extends Error {\n constructor(page, message){\n super();\n this.message = \"Failed to load static file for page: \" + page + \" \" + message;\n }\n}\nclass MiddlewareNotFoundError extends Error {\n constructor(){\n super();\n this.code = 'ENOENT';\n this.message = \"Cannot find the middleware module\";\n }\n}\nfunction stringifyError(error) {\n return JSON.stringify({\n message: error.message,\n stack: error.stack\n });\n} //# sourceMappingURL=utils.js.map\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUFvYWFBLFdBQVc7ZUFBWEE7O0lBb0JBQyx1QkFBdUI7ZUFBdkJBOztJQVBBQyxpQkFBaUI7ZUFBakJBOztJQVpBQyxjQUFjO2VBQWRBOztJQUNBQyxpQkFBaUI7ZUFBakJBOztJQVRBQyxFQUFFO2VBQUZBOztJQUNBQyxFQUFFO2VBQUZBOztJQWxYQUMsVUFBVTtlQUFWQTs7SUFzUUdDLFFBQVE7ZUFBUkE7O0lBK0JBQyxjQUFjO2VBQWRBOztJQVhBQyxpQkFBaUI7ZUFBakJBOztJQUtBQyxNQUFNO2VBQU5BOztJQVBIQyxhQUFhO2VBQWJBOztJQW1CR0MsU0FBUztlQUFUQTs7SUFrQk1DLG1CQUFtQjtlQUFuQkE7O0lBZE5DLHdCQUF3QjtlQUF4QkE7O0lBK0dBQyxjQUFjO2VBQWRBOzs7QUE5WlQsTUFBTVQsYUFBYTtJQUFDO0lBQU87SUFBTztJQUFPO0lBQU87SUFBTztDQUFPO0FBc1E5RCxTQUFTQyxTQUNkUyxFQUFLO0lBRUwsSUFBSUMsT0FBTztJQUNYLElBQUlDO0lBRUosT0FBUTt5Q0FBSUMsT0FBQUEsSUFBQUEsTUFBQUEsT0FBQUEsT0FBQUEsR0FBQUEsT0FBQUEsTUFBQUEsT0FBQUE7WUFBQUEsSUFBQUEsQ0FBQUEsS0FBQUEsR0FBQUEsU0FBQUEsQ0FBQUEsS0FBQUE7O1FBQ1YsSUFBSSxDQUFDRixNQUFNO1lBQ1RBLE9BQU87WUFDUEMsU0FBU0YsTUFBTUc7UUFDakI7UUFDQSxPQUFPRDtJQUNUO0FBQ0Y7QUFFQSwwREFBMEQ7QUFDMUQsZ0VBQWdFO0FBQ2hFLE1BQU1FLHFCQUFxQjtBQUNwQixNQUFNVCxnQkFBZ0IsQ0FBQ1UsTUFBZ0JELG1CQUFtQkUsSUFBSSxDQUFDRDtBQUUvRCxTQUFTWjtJQUNkLE1BQU0sRUFBRWMsUUFBUSxFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBRSxH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QUksR0FBRztRQUNaLElBQUksQ0FBQzlCLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ2lCLE9BQU8sR0FBSSxrQ0FBK0JZO0lBQ2pEO0FBQ0Y7QUFFTyxNQUFNOUQsMEJBQTBCbUQ7SUFDckNVLFlBQVlDLElBQVksRUFBRVosT0FBZSxDQUFFO1FBQ3pDLEtBQUs7UUFDTCxJQUFJLENBQUNBLE9BQU8sR0FBSSwwQ0FBdUNZLE9BQUssTUFBR1o7SUFDakU7QUFDRjtBQUVPLE1BQU1uRCxnQ0FBZ0NvRDtJQUUzQ1UsYUFBYztRQUNaLEtBQUs7UUFDTCxJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ2IsT0FBTyxHQUFJO0lBQ2xCO0FBQ0Y7QUFXTyxTQUFTcEMsZUFBZWtELEtBQVk7SUFDekMsT0FBT0MsS0FBS0MsU0FBUyxDQUFDO1FBQUVoQixTQUFTYyxNQUFNZCxPQUFPO1FBQUVpQixPQUFPSCxNQUFNRyxLQUFLO0lBQUM7QUFDckUiLCJzb3VyY2VzIjpbIi9ob21lL3NyYy9zaGFyZWQvbGliL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSHRtbFByb3BzIH0gZnJvbSAnLi9odG1sLWNvbnRleHQuc2hhcmVkLXJ1bnRpbWUnXG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFR5cGUsIEpTWCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBEb21haW5Mb2NhbGUgfSBmcm9tICcuLi8uLi9zZXJ2ZXIvY29uZmlnJ1xuaW1wb3J0IHR5cGUgeyBFbnYgfSBmcm9tICdAbmV4dC9lbnYnXG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHR5cGUgeyBOZXh0Um91dGVyIH0gZnJvbSAnLi9yb3V0ZXIvcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBQYXJzZWRVcmxRdWVyeSB9IGZyb20gJ3F1ZXJ5c3RyaW5nJ1xuaW1wb3J0IHR5cGUgeyBQcmV2aWV3RGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBDT01QSUxFUl9OQU1FUyB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHR5cGUgZnMgZnJvbSAnZnMnXG5cbmV4cG9ydCB0eXBlIE5leHRDb21wb25lbnRUeXBlPFxuICBDb250ZXh0IGV4dGVuZHMgQmFzZUNvbnRleHQgPSBOZXh0UGFnZUNvbnRleHQsXG4gIEluaXRpYWxQcm9wcyA9IHt9LFxuICBQcm9wcyA9IHt9LFxuPiA9IENvbXBvbmVudFR5cGU8UHJvcHM+ICYge1xuICAvKipcbiAgICogVXNlZCBmb3IgaW5pdGlhbCBwYWdlIGxvYWQgZGF0YSBwb3B1bGF0aW9uLiBEYXRhIHJldHVybmVkIGZyb20gYGdldEluaXRpYWxQcm9wc2AgaXMgc2VyaWFsaXplZCB3aGVuIHNlcnZlciByZW5kZXJlZC5cbiAgICogTWFrZSBzdXJlIHRvIHJldHVybiBwbGFpbiBgT2JqZWN0YCB3aXRob3V0IHVzaW5nIGBEYXRlYCwgYE1hcGAsIGBTZXRgLlxuICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIGBwYWdlYFxuICAgKi9cbiAgZ2V0SW5pdGlhbFByb3BzPyhjb250ZXh0OiBDb250ZXh0KTogSW5pdGlhbFByb3BzIHwgUHJvbWlzZTxJbml0aWFsUHJvcHM+XG59XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50VHlwZSA9IE5leHRDb21wb25lbnRUeXBlPFxuICBEb2N1bWVudENvbnRleHQsXG4gIERvY3VtZW50SW5pdGlhbFByb3BzLFxuICBEb2N1bWVudFByb3BzXG4+XG5cbmV4cG9ydCB0eXBlIEFwcFR5cGU8UCA9IHt9PiA9IE5leHRDb21wb25lbnRUeXBlPFxuICBBcHBDb250ZXh0VHlwZSxcbiAgUCxcbiAgQXBwUHJvcHNUeXBlPGFueSwgUD5cbj5cblxuZXhwb3J0IHR5cGUgQXBwVHJlZVR5cGUgPSBDb21wb25lbnRUeXBlPFxuICBBcHBJbml0aWFsUHJvcHMgJiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuPlxuXG4vKipcbiAqIFdlYiB2aXRhbHMgcHJvdmlkZWQgdG8gX2FwcC5yZXBvcnRXZWJWaXRhbHMgYnkgQ29yZSBXZWIgVml0YWxzIHBsdWdpbiBkZXZlbG9wZWQgYnkgR29vZ2xlIENocm9tZSB0ZWFtLlxuICogaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvbmV4dC05LTQjaW50ZWdyYXRlZC13ZWItdml0YWxzLXJlcG9ydGluZ1xuICovXG5leHBvcnQgY29uc3QgV0VCX1ZJVEFMUyA9IFsnQ0xTJywgJ0ZDUCcsICdGSUQnLCAnSU5QJywgJ0xDUCcsICdUVEZCJ10gYXMgY29uc3RcbmV4cG9ydCB0eXBlIE5leHRXZWJWaXRhbHNNZXRyaWMgPSB7XG4gIGlkOiBzdHJpbmdcbiAgc3RhcnRUaW1lOiBudW1iZXJcbiAgdmFsdWU6IG51bWJlclxuICBhdHRyaWJ1dGlvbj86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9XG59ICYgKFxuICB8IHtcbiAgICAgIGxhYmVsOiAnd2ViLXZpdGFsJ1xuICAgICAgbmFtZTogKHR5cGVvZiBXRUJfVklUQUxTKVtudW1iZXJdXG4gICAgfVxuICB8IHtcbiAgICAgIGxhYmVsOiAnY3VzdG9tJ1xuICAgICAgbmFtZTpcbiAgICAgICAgfCAnTmV4dC5qcy1oeWRyYXRpb24nXG4gICAgICAgIHwgJ05leHQuanMtcm91dGUtY2hhbmdlLXRvLXJlbmRlcidcbiAgICAgICAgfCAnTmV4dC5qcy1yZW5kZXInXG4gICAgfVxuKVxuXG5leHBvcnQgdHlwZSBFbmhhbmNlcjxDPiA9IChDb21wb25lbnQ6IEMpID0+IENcblxuZXhwb3J0IHR5cGUgQ29tcG9uZW50c0VuaGFuY2VyID1cbiAgfCB7XG4gICAgICBlbmhhbmNlQXBwPzogRW5oYW5jZXI8QXBwVHlwZT5cbiAgICAgIGVuaGFuY2VDb21wb25lbnQ/OiBFbmhhbmNlcjxOZXh0Q29tcG9uZW50VHlwZT5cbiAgICB9XG4gIHwgRW5oYW5jZXI8TmV4dENvbXBvbmVudFR5cGU+XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhZ2VSZXN1bHQgPSB7XG4gIGh0bWw6IHN0cmluZ1xuICBoZWFkPzogQXJyYXk8SlNYLkVsZW1lbnQgfCBudWxsPlxufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJQYWdlID0gKFxuICBvcHRpb25zPzogQ29tcG9uZW50c0VuaGFuY2VyXG4pID0+IERvY3VtZW50SW5pdGlhbFByb3BzIHwgUHJvbWlzZTxEb2N1bWVudEluaXRpYWxQcm9wcz5cblxuZXhwb3J0IHR5cGUgQmFzZUNvbnRleHQgPSB7XG4gIHJlcz86IFNlcnZlclJlc3BvbnNlXG4gIFtrOiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IHR5cGUgTkVYVF9EQVRBID0ge1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PlxuICBwYWdlOiBzdHJpbmdcbiAgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5XG4gIGJ1aWxkSWQ6IHN0cmluZ1xuICBhc3NldFByZWZpeD86IHN0cmluZ1xuICBydW50aW1lQ29uZmlnPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICBuZXh0RXhwb3J0PzogYm9vbGVhblxuICBhdXRvRXhwb3J0PzogYm9vbGVhblxuICBpc0ZhbGxiYWNrPzogYm9vbGVhblxuICBpc0V4cGVyaW1lbnRhbENvbXBpbGU/OiBib29sZWFuXG4gIGR5bmFtaWNJZHM/OiAoc3RyaW5nIHwgbnVtYmVyKVtdXG4gIGVycj86IEVycm9yICYge1xuICAgIHN0YXR1c0NvZGU/OiBudW1iZXJcbiAgICBzb3VyY2U/OiB0eXBlb2YgQ09NUElMRVJfTkFNRVMuc2VydmVyIHwgdHlwZW9mIENPTVBJTEVSX05BTUVTLmVkZ2VTZXJ2ZXJcbiAgfVxuICBnc3A/OiBib29sZWFuXG4gIGdzc3A/OiBib29sZWFuXG4gIGN1c3RvbVNlcnZlcj86IGJvb2xlYW5cbiAgZ2lwPzogYm9vbGVhblxuICBhcHBHaXA/OiBib29sZWFuXG4gIGxvY2FsZT86IHN0cmluZ1xuICBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW11cbiAgZGVmYXVsdExvY2FsZT86IHN0cmluZ1xuICBkb21haW5Mb2NhbGVzPzogcmVhZG9ubHkgRG9tYWluTG9jYWxlW11cbiAgc2NyaXB0TG9hZGVyPzogYW55W11cbiAgaXNQcmV2aWV3PzogYm9vbGVhblxuICBub3RGb3VuZFNyY1BhZ2U/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBgTmV4dGAgY29udGV4dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRQYWdlQ29udGV4dCB7XG4gIC8qKlxuICAgKiBFcnJvciBvYmplY3QgaWYgZW5jb3VudGVyZWQgZHVyaW5nIHJlbmRlcmluZ1xuICAgKi9cbiAgZXJyPzogKEVycm9yICYgeyBzdGF0dXNDb2RlPzogbnVtYmVyIH0pIHwgbnVsbFxuICAvKipcbiAgICogYEhUVFBgIHJlcXVlc3Qgb2JqZWN0LlxuICAgKi9cbiAgcmVxPzogSW5jb21pbmdNZXNzYWdlXG4gIC8qKlxuICAgKiBgSFRUUGAgcmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgcmVzPzogU2VydmVyUmVzcG9uc2VcbiAgLyoqXG4gICAqIFBhdGggc2VjdGlvbiBvZiBgVVJMYC5cbiAgICovXG4gIHBhdGhuYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIFF1ZXJ5IHN0cmluZyBzZWN0aW9uIG9mIGBVUkxgIHBhcnNlZCBhcyBhbiBvYmplY3QuXG4gICAqL1xuICBxdWVyeTogUGFyc2VkVXJsUXVlcnlcbiAgLyoqXG4gICAqIGBTdHJpbmdgIG9mIHRoZSBhY3R1YWwgcGF0aCBpbmNsdWRpbmcgcXVlcnkuXG4gICAqL1xuICBhc1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGxvY2FsZVxuICAgKi9cbiAgbG9jYWxlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBBbGwgY29uZmlndXJlZCBsb2NhbGVzXG4gICAqL1xuICBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW11cbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmVkIGRlZmF1bHQgbG9jYWxlXG4gICAqL1xuICBkZWZhdWx0TG9jYWxlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBgQ29tcG9uZW50YCB0aGUgdHJlZSBvZiB0aGUgQXBwIHRvIHVzZSBpZiBuZWVkaW5nIHRvIHJlbmRlciBzZXBhcmF0ZWx5XG4gICAqL1xuICBBcHBUcmVlOiBBcHBUcmVlVHlwZVxufVxuXG5leHBvcnQgdHlwZSBBcHBDb250ZXh0VHlwZTxSb3V0ZXIgZXh0ZW5kcyBOZXh0Um91dGVyID0gTmV4dFJvdXRlcj4gPSB7XG4gIENvbXBvbmVudDogTmV4dENvbXBvbmVudFR5cGU8TmV4dFBhZ2VDb250ZXh0PlxuICBBcHBUcmVlOiBBcHBUcmVlVHlwZVxuICBjdHg6IE5leHRQYWdlQ29udGV4dFxuICByb3V0ZXI6IFJvdXRlclxufVxuXG5leHBvcnQgdHlwZSBBcHBJbml0aWFsUHJvcHM8UGFnZVByb3BzID0gYW55PiA9IHtcbiAgcGFnZVByb3BzOiBQYWdlUHJvcHNcbn1cblxuZXhwb3J0IHR5cGUgQXBwUHJvcHNUeXBlPFxuICBSb3V0ZXIgZXh0ZW5kcyBOZXh0Um91dGVyID0gTmV4dFJvdXRlcixcbiAgUGFnZVByb3BzID0ge30sXG4+ID0gQXBwSW5pdGlhbFByb3BzPFBhZ2VQcm9wcz4gJiB7XG4gIENvbXBvbmVudDogTmV4dENvbXBvbmVudFR5cGU8TmV4dFBhZ2VDb250ZXh0LCBhbnksIGFueT5cbiAgcm91dGVyOiBSb3V0ZXJcbiAgX19OX1NTRz86IGJvb2xlYW5cbiAgX19OX1NTUD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRDb250ZXh0ID0gTmV4dFBhZ2VDb250ZXh0ICYge1xuICByZW5kZXJQYWdlOiBSZW5kZXJQYWdlXG4gIGRlZmF1bHRHZXRJbml0aWFsUHJvcHMoXG4gICAgY3R4OiBEb2N1bWVudENvbnRleHQsXG4gICAgb3B0aW9ucz86IHsgbm9uY2U/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPERvY3VtZW50SW5pdGlhbFByb3BzPlxufVxuXG5leHBvcnQgdHlwZSBEb2N1bWVudEluaXRpYWxQcm9wcyA9IFJlbmRlclBhZ2VSZXN1bHQgJiB7XG4gIHN0eWxlcz86IFJlYWN0LlJlYWN0RWxlbWVudFtdIHwgSXRlcmFibGU8UmVhY3QuUmVhY3ROb2RlPiB8IEpTWC5FbGVtZW50XG59XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50UHJvcHMgPSBEb2N1bWVudEluaXRpYWxQcm9wcyAmIEh0bWxQcm9wc1xuXG4vKipcbiAqIE5leHQgYEFQSWAgcm91dGUgcmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRBcGlSZXF1ZXN0IGV4dGVuZHMgSW5jb21pbmdNZXNzYWdlIHtcbiAgLyoqXG4gICAqIE9iamVjdCBvZiBgcXVlcnlgIHZhbHVlcyBmcm9tIHVybFxuICAgKi9cbiAgcXVlcnk6IFBhcnRpYWw8e1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdXG4gIH0+XG4gIC8qKlxuICAgKiBPYmplY3Qgb2YgYGNvb2tpZXNgIGZyb20gaGVhZGVyXG4gICAqL1xuICBjb29raWVzOiBQYXJ0aWFsPHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdcbiAgfT5cblxuICBib2R5OiBhbnlcblxuICBlbnY6IEVudlxuXG4gIGRyYWZ0TW9kZT86IGJvb2xlYW5cblxuICBwcmV2aWV3PzogYm9vbGVhblxuICAvKipcbiAgICogUHJldmlldyBkYXRhIHNldCBvbiB0aGUgcmVxdWVzdCwgaWYgYW55XG4gICAqICovXG4gIHByZXZpZXdEYXRhPzogUHJldmlld0RhdGFcbn1cblxuLyoqXG4gKiBTZW5kIGJvZHkgb2YgcmVzcG9uc2VcbiAqL1xudHlwZSBTZW5kPFQ+ID0gKGJvZHk6IFQpID0+IHZvaWRcblxuLyoqXG4gKiBOZXh0IGBBUElgIHJvdXRlIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCB0eXBlIE5leHRBcGlSZXNwb25zZTxEYXRhID0gYW55PiA9IFNlcnZlclJlc3BvbnNlICYge1xuICAvKipcbiAgICogU2VuZCBkYXRhIGBhbnlgIGRhdGEgaW4gcmVzcG9uc2VcbiAgICovXG4gIHNlbmQ6IFNlbmQ8RGF0YT5cbiAgLyoqXG4gICAqIFNlbmQgZGF0YSBganNvbmAgZGF0YSBpbiByZXNwb25zZVxuICAgKi9cbiAganNvbjogU2VuZDxEYXRhPlxuICBzdGF0dXM6IChzdGF0dXNDb2RlOiBudW1iZXIpID0+IE5leHRBcGlSZXNwb25zZTxEYXRhPlxuICByZWRpcmVjdCh1cmw6IHN0cmluZyk6IE5leHRBcGlSZXNwb25zZTxEYXRhPlxuICByZWRpcmVjdChzdGF0dXM6IG51bWJlciwgdXJsOiBzdHJpbmcpOiBOZXh0QXBpUmVzcG9uc2U8RGF0YT5cblxuICAvKipcbiAgICogU2V0IGRyYWZ0IG1vZGVcbiAgICovXG4gIHNldERyYWZ0TW9kZTogKG9wdGlvbnM6IHsgZW5hYmxlOiBib29sZWFuIH0pID0+IE5leHRBcGlSZXNwb25zZTxEYXRhPlxuXG4gIC8qKlxuICAgKiBTZXQgcHJldmlldyBkYXRhIGZvciBOZXh0LmpzJyBwcmVyZW5kZXIgbW9kZVxuICAgKi9cbiAgc2V0UHJldmlld0RhdGE6IChcbiAgICBkYXRhOiBvYmplY3QgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHRoZSBudW1iZXIgKGluIHNlY29uZHMpIGZvciB0aGUgcHJldmlldyBzZXNzaW9uIHRvIGxhc3QgZm9yLlxuICAgICAgICogVGhlIGdpdmVuIG51bWJlciB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIGJ5IHJvdW5kaW5nIGRvd24uXG4gICAgICAgKiBCeSBkZWZhdWx0LCBubyBtYXhpbXVtIGFnZSBpcyBzZXQgYW5kIHRoZSBwcmV2aWV3IHNlc3Npb24gZmluaXNoZXNcbiAgICAgICAqIHdoZW4gdGhlIGNsaWVudCBzaHV0cyBkb3duIChicm93c2VyIGlzIGNsb3NlZCkuXG4gICAgICAgKi9cbiAgICAgIG1heEFnZT86IG51bWJlclxuICAgICAgLyoqXG4gICAgICAgKiBTcGVjaWZpZXMgdGhlIHBhdGggZm9yIHRoZSBwcmV2aWV3IHNlc3Npb24gdG8gd29yayB1bmRlci4gQnkgZGVmYXVsdCxcbiAgICAgICAqIHRoZSBwYXRoIGlzIGNvbnNpZGVyZWQgdGhlIFwiZGVmYXVsdCBwYXRoXCIsIGkuZS4sIGFueSBwYWdlcyB1bmRlciBcIi9cIi5cbiAgICAgICAqL1xuICAgICAgcGF0aD86IHN0cmluZ1xuICAgIH1cbiAgKSA9PiBOZXh0QXBpUmVzcG9uc2U8RGF0YT5cblxuICAvKipcbiAgICogQ2xlYXIgcHJldmlldyBkYXRhIGZvciBOZXh0LmpzJyBwcmVyZW5kZXIgbW9kZVxuICAgKi9cbiAgY2xlYXJQcmV2aWV3RGF0YTogKG9wdGlvbnM/OiB7IHBhdGg/OiBzdHJpbmcgfSkgPT4gTmV4dEFwaVJlc3BvbnNlPERhdGE+XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGUgYSBzcGVjaWZpYyBwYWdlIGFuZCByZWdlbmVyYXRlIGl0IHVzaW5nIE9uLURlbWFuZCBJbmNyZW1lbnRhbFxuICAgKiBTdGF0aWMgUmVnZW5lcmF0aW9uLlxuICAgKiBUaGUgcGF0aCBzaG91bGQgYmUgYW4gYWN0dWFsIHBhdGgsIG5vdCBhIHJld3JpdHRlbiBwYXRoLiBFLmcuIGZvclxuICAgKiBcIi9ibG9nL1tzbHVnXVwiIHRoaXMgc2hvdWxkIGJlIFwiL2Jsb2cvcG9zdC0xXCIuXG4gICAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2RhdGEtZmV0Y2hpbmcvaW5jcmVtZW50YWwtc3RhdGljLXJlZ2VuZXJhdGlvbiNvbi1kZW1hbmQtcmV2YWxpZGF0aW9uLXdpdGgtcmV2YWxpZGF0ZXBhdGhcbiAgICovXG4gIHJldmFsaWRhdGU6IChcbiAgICB1cmxQYXRoOiBzdHJpbmcsXG4gICAgb3B0cz86IHtcbiAgICAgIHVuc3RhYmxlX29ubHlHZW5lcmF0ZWQ/OiBib29sZWFuXG4gICAgfVxuICApID0+IFByb21pc2U8dm9pZD5cbn1cblxuLyoqXG4gKiBOZXh0IGBBUElgIHJvdXRlIGhhbmRsZXJcbiAqL1xuZXhwb3J0IHR5cGUgTmV4dEFwaUhhbmRsZXI8VCA9IGFueT4gPSAoXG4gIHJlcTogTmV4dEFwaVJlcXVlc3QsXG4gIHJlczogTmV4dEFwaVJlc3BvbnNlPFQ+XG4pID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+XG5cbi8qKlxuICogVXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNPbmNlPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IFJldHVyblR5cGU8VD4+KFxuICBmbjogVFxuKTogVCB7XG4gIGxldCB1c2VkID0gZmFsc2VcbiAgbGV0IHJlc3VsdDogUmV0dXJuVHlwZTxUPlxuXG4gIHJldHVybiAoKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgaWYgKCF1c2VkKSB7XG4gICAgICB1c2VkID0gdHJ1ZVxuICAgICAgcmVzdWx0ID0gZm4oLi4uYXJncylcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KSBhcyBUXG59XG5cbi8vIFNjaGVtZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjFcbi8vIEFic29sdXRlIFVSTDogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi00LjNcbmNvbnN0IEFCU09MVVRFX1VSTF9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aXFxkK1xcLS5dKj86L1xuZXhwb3J0IGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAodXJsOiBzdHJpbmcpID0+IEFCU09MVVRFX1VSTF9SRUdFWC50ZXN0KHVybClcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2F0aW9uT3JpZ2luKCkge1xuICBjb25zdCB7IHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCB9ID0gd2luZG93LmxvY2F0aW9uXG4gIHJldHVybiBgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9JHtwb3J0ID8gJzonICsgcG9ydCA6ICcnfWBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVSTCgpIHtcbiAgY29uc3QgeyBocmVmIH0gPSB3aW5kb3cubG9jYXRpb25cbiAgY29uc3Qgb3JpZ2luID0gZ2V0TG9jYXRpb25PcmlnaW4oKVxuICByZXR1cm4gaHJlZi5zdWJzdHJpbmcob3JpZ2luLmxlbmd0aClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3BsYXlOYW1lPFA+KENvbXBvbmVudDogQ29tcG9uZW50VHlwZTxQPikge1xuICByZXR1cm4gdHlwZW9mIENvbXBvbmVudCA9PT0gJ3N0cmluZydcbiAgICA/IENvbXBvbmVudFxuICAgIDogQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdVbmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNTZW50KHJlczogU2VydmVyUmVzcG9uc2UpIHtcbiAgcmV0dXJuIHJlcy5maW5pc2hlZCB8fCByZXMuaGVhZGVyc1NlbnRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlcGVhdGVkU2xhc2hlcyh1cmw6IHN0cmluZykge1xuICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdCgnPycpXG4gIGNvbnN0IHVybE5vUXVlcnkgPSB1cmxQYXJ0c1swXVxuXG4gIHJldHVybiAoXG4gICAgdXJsTm9RdWVyeVxuICAgICAgLy8gZmlyc3Qgd2UgcmVwbGFjZSBhbnkgbm9uLWVuY29kZWQgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkXG4gICAgICAvLyB0aGVuIG5vcm1hbGl6ZSByZXBlYXRlZCBmb3J3YXJkIHNsYXNoZXNcbiAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8rL2csICcvJykgK1xuICAgICh1cmxQYXJ0c1sxXSA/IGA/JHt1cmxQYXJ0cy5zbGljZSgxKS5qb2luKCc/Jyl9YCA6ICcnKVxuICApXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkR2V0SW5pdGlhbFByb3BzPFxuICBDIGV4dGVuZHMgQmFzZUNvbnRleHQsXG4gIElQID0ge30sXG4gIFAgPSB7fSxcbj4oQXBwOiBOZXh0Q29tcG9uZW50VHlwZTxDLCBJUCwgUD4sIGN0eDogQyk6IFByb21pc2U8SVA+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoQXBwLnByb3RvdHlwZT8uZ2V0SW5pdGlhbFByb3BzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYFwiJHtnZXREaXNwbGF5TmFtZShcbiAgICAgICAgQXBwXG4gICAgICApfS5nZXRJbml0aWFsUHJvcHMoKVwiIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kIC0gdmlzaXQgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvZ2V0LWluaXRpYWwtcHJvcHMtYXMtYW4taW5zdGFuY2UtbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKVxuICAgIH1cbiAgfVxuICAvLyB3aGVuIGNhbGxlZCBmcm9tIF9hcHAgYGN0eGAgaXMgbmVzdGVkIGluIGBjdHhgXG4gIGNvbnN0IHJlcyA9IGN0eC5yZXMgfHwgKGN0eC5jdHggJiYgY3R4LmN0eC5yZXMpXG5cbiAgaWYgKCFBcHAuZ2V0SW5pdGlhbFByb3BzKSB7XG4gICAgaWYgKGN0eC5jdHggJiYgY3R4LkNvbXBvbmVudCkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwYWdlUHJvcHMgZGVmYXVsdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVByb3BzOiBhd2FpdCBsb2FkR2V0SW5pdGlhbFByb3BzKGN0eC5Db21wb25lbnQsIGN0eC5jdHgpLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge30gYXMgSVBcbiAgfVxuXG4gIGNvbnN0IHByb3BzID0gYXdhaXQgQXBwLmdldEluaXRpYWxQcm9wcyhjdHgpXG5cbiAgaWYgKHJlcyAmJiBpc1Jlc1NlbnQocmVzKSkge1xuICAgIHJldHVybiBwcm9wc1xuICB9XG5cbiAgaWYgKCFwcm9wcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgXCIke2dldERpc3BsYXlOYW1lKFxuICAgICAgQXBwXG4gICAgKX0uZ2V0SW5pdGlhbFByb3BzKClcIiBzaG91bGQgcmVzb2x2ZSB0byBhbiBvYmplY3QuIEJ1dCBmb3VuZCBcIiR7cHJvcHN9XCIgaW5zdGVhZC5gXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wcykubGVuZ3RoID09PSAwICYmICFjdHguY3R4KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke2dldERpc3BsYXlOYW1lKFxuICAgICAgICAgIEFwcFxuICAgICAgICApfSByZXR1cm5lZCBhbiBlbXB0eSBvYmplY3QgZnJvbSBcXGBnZXRJbml0aWFsUHJvcHNcXGAuIFRoaXMgZGUtb3B0aW1pemVzIGFuZCBwcmV2ZW50cyBhdXRvbWF0aWMgc3RhdGljIG9wdGltaXphdGlvbi4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvZW1wdHktb2JqZWN0LWdldEluaXRpYWxQcm9wc2BcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvcHNcbn1cblxuZXhwb3J0IGNvbnN0IFNQID0gdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJ1xuZXhwb3J0IGNvbnN0IFNUID1cbiAgU1AgJiZcbiAgKFsnbWFyaycsICdtZWFzdXJlJywgJ2dldEVudHJpZXNCeU5hbWUnXSBhcyBjb25zdCkuZXZlcnkoXG4gICAgKG1ldGhvZCkgPT4gdHlwZW9mIHBlcmZvcm1hbmNlW21ldGhvZF0gPT09ICdmdW5jdGlvbidcbiAgKVxuXG5leHBvcnQgY2xhc3MgRGVjb2RlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuZXhwb3J0IGNsYXNzIE5vcm1hbGl6ZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmV4cG9ydCBjbGFzcyBQYWdlTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29kZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IocGFnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY29kZSA9ICdFTk9FTlQnXG4gICAgdGhpcy5uYW1lID0gJ1BhZ2VOb3RGb3VuZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IGBDYW5ub3QgZmluZCBtb2R1bGUgZm9yIHBhZ2U6ICR7cGFnZX1gXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdTdGF0aWNQYWdlIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwYWdlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLm1lc3NhZ2UgPSBgRmFpbGVkIHRvIGxvYWQgc3RhdGljIGZpbGUgZm9yIHBhZ2U6ICR7cGFnZX0gJHttZXNzYWdlfWBcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlkZGxld2FyZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvZGU6IHN0cmluZ1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5jb2RlID0gJ0VOT0VOVCdcbiAgICB0aGlzLm1lc3NhZ2UgPSBgQ2Fubm90IGZpbmQgdGhlIG1pZGRsZXdhcmUgbW9kdWxlYFxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVGcyB7XG4gIGV4aXN0c1N5bmM6IHR5cGVvZiBmcy5leGlzdHNTeW5jXG4gIHJlYWRGaWxlOiB0eXBlb2YgZnMucHJvbWlzZXMucmVhZEZpbGVcbiAgcmVhZEZpbGVTeW5jOiB0eXBlb2YgZnMucmVhZEZpbGVTeW5jXG4gIHdyaXRlRmlsZShmOiBzdHJpbmcsIGQ6IGFueSk6IFByb21pc2U8dm9pZD5cbiAgbWtkaXIoZGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQgfCBzdHJpbmc+XG4gIHN0YXQoZjogc3RyaW5nKTogUHJvbWlzZTx7IG10aW1lOiBEYXRlIH0+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlFcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrIH0pXG59XG4iXSwibmFtZXMiOlsiRGVjb2RlRXJyb3IiLCJNaWRkbGV3YXJlTm90Rm91bmRFcnJvciIsIk1pc3NpbmdTdGF0aWNQYWdlIiwiTm9ybWFsaXplRXJyb3IiLCJQYWdlTm90Rm91bmRFcnJvciIsIlNQIiwiU1QiLCJXRUJfVklUQUxTIiwiZXhlY09uY2UiLCJnZXREaXNwbGF5TmFtZSIsImdldExvY2F0aW9uT3JpZ2luIiwiZ2V0VVJMIiwiaXNBYnNvbHV0ZVVybCIsImlzUmVzU2VudCIsImxvYWRHZXRJbml0aWFsUHJvcHMiLCJub3JtYWxpemVSZXBlYXRlZFNsYXNoZXMiLCJzdHJpbmdpZnlFcnJvciIsImZuIiwidXNlZCIsInJlc3VsdCIsImFyZ3MiLCJBQlNPTFVURV9VUkxfUkVHRVgiLCJ1cmwiLCJ0ZXN0IiwicHJvdG9jb2wiLCJob3N0bmFtZSIsInBvcnQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJvcmlnaW4iLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJDb21wb25lbnQiLCJkaXNwbGF5TmFtZSIsIm5hbWUiLCJyZXMiLCJmaW5pc2hlZCIsImhlYWRlcnNTZW50IiwidXJsUGFydHMiLCJzcGxpdCIsInVybE5vUXVlcnkiLCJyZXBsYWNlIiwic2xpY2UiLCJqb2luIiwiQXBwIiwiY3R4IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicHJvdG90eXBlIiwiZ2V0SW5pdGlhbFByb3BzIiwibWVzc2FnZSIsIkVycm9yIiwicGFnZVByb3BzIiwicHJvcHMiLCJPYmplY3QiLCJrZXlzIiwiY29uc29sZSIsIndhcm4iLCJwZXJmb3JtYW5jZSIsImV2ZXJ5IiwibWV0aG9kIiwiY29uc3RydWN0b3IiLCJwYWdlIiwiY29kZSIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YWNrIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/utils.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/utils/error-once.js": /*!***************************************************************!*\ !*** ./node_modules/next/dist/shared/lib/utils/error-once.js ***! \***************************************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nObject.defineProperty(exports, \"errorOnce\", ({\n enumerable: true,\n get: function() {\n return errorOnce;\n }\n}));\nlet errorOnce = (_)=>{};\nif (true) {\n const errors = new Set();\n errorOnce = (msg)=>{\n if (!errors.has(msg)) {\n console.error(msg);\n }\n errors.add(msg);\n };\n} //# sourceMappingURL=error-once.js.map\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi91dGlscy9lcnJvci1vbmNlLmpzIiwibWFwcGluZ3MiOiI7Ozs7NkNBV1NBOzs7ZUFBQUE7OztBQVhULElBQUlBLFlBQVksQ0FBQ0MsS0FBZTtBQUNoQyxJQUFJQyxJQUFvQixFQUFtQjtJQUN6QyxNQUFNRyxTQUFTLElBQUlDO0lBQ25CTixZQUFZLENBQUNPO1FBQ1gsSUFBSSxDQUFDRixPQUFPRyxHQUFHLENBQUNELE1BQU07WUFDcEJFLFFBQVFDLEtBQUssQ0FBQ0g7UUFDaEI7UUFDQUYsT0FBT00sR0FBRyxDQUFDSjtJQUNiO0FBQ0YiLCJzb3VyY2VzIjpbIi9zcmMvc2hhcmVkL2xpYi91dGlscy9lcnJvci1vbmNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBlcnJvck9uY2UgPSAoXzogc3RyaW5nKSA9PiB7fVxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgY29uc3QgZXJyb3JzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgZXJyb3JPbmNlID0gKG1zZzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFlcnJvcnMuaGFzKG1zZykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH1cbiAgICBlcnJvcnMuYWRkKG1zZylcbiAgfVxufVxuXG5leHBvcnQgeyBlcnJvck9uY2UgfVxuIl0sIm5hbWVzIjpbImVycm9yT25jZSIsIl8iLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJlcnJvcnMiLCJTZXQiLCJtc2ciLCJoYXMiLCJjb25zb2xlIiwiZXJyb3IiLCJhZGQiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/utils/error-once.js\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/sonner/dist/index.mjs": /*!********************************************!*\ !*** ./node_modules/sonner/dist/index.mjs ***! \********************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Toaster: () => (/* binding */ Toaster),\n/* harmony export */ toast: () => (/* binding */ toast),\n/* harmony export */ useSonner: () => (/* binding */ useSonner)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react-dom/index.js\");\n/* __next_internal_client_entry_do_not_use__ Toaster,toast,useSonner auto */ var _s = $RefreshSig$(), _s1 = $RefreshSig$(), _s2 = $RefreshSig$(), _s3 = $RefreshSig$();\nfunction __insertCSS(code) {\n if (!code || typeof document == 'undefined') return;\n let head = document.head || document.getElementsByTagName('head')[0];\n let style = document.createElement('style');\n style.type = 'text/css';\n head.appendChild(style);\n style.styleSheet ? style.styleSheet.cssText = code : style.appendChild(document.createTextNode(code));\n}\n\n\nconst getAsset = (type)=>{\n switch(type){\n case 'success':\n return SuccessIcon;\n case 'info':\n return InfoIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n default:\n return null;\n }\n};\nconst bars = Array(12).fill(0);\nconst Loader = (param)=>{\n let { visible, className } = param;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: [\n 'sonner-loading-wrapper',\n className\n ].filter(Boolean).join(' '),\n \"data-visible\": visible\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"sonner-spinner\"\n }, bars.map((_, i)=>/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"sonner-loading-bar\",\n key: \"spinner-bar-\".concat(i)\n }))));\n};\n_c = Loader;\nconst SuccessIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\n clipRule: \"evenodd\"\n}));\nconst WarningIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n clipRule: \"evenodd\"\n}));\nconst InfoIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",\n clipRule: \"evenodd\"\n}));\nconst ErrorIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",\n clipRule: \"evenodd\"\n}));\nconst CloseIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"12\",\n height: \"12\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"line\", {\n x1: \"18\",\n y1: \"6\",\n x2: \"6\",\n y2: \"18\"\n}), /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"line\", {\n x1: \"6\",\n y1: \"6\",\n x2: \"18\",\n y2: \"18\"\n}));\nconst useIsDocumentHidden = ()=>{\n _s();\n const [isDocumentHidden, setIsDocumentHidden] = react__WEBPACK_IMPORTED_MODULE_0__.useState(document.hidden);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"useIsDocumentHidden.useEffect\": ()=>{\n const callback = {\n \"useIsDocumentHidden.useEffect.callback\": ()=>{\n setIsDocumentHidden(document.hidden);\n }\n }[\"useIsDocumentHidden.useEffect.callback\"];\n document.addEventListener('visibilitychange', callback);\n return ({\n \"useIsDocumentHidden.useEffect\": ()=>window.removeEventListener('visibilitychange', callback)\n })[\"useIsDocumentHidden.useEffect\"];\n }\n }[\"useIsDocumentHidden.useEffect\"], []);\n return isDocumentHidden;\n};\n_s(useIsDocumentHidden, \"RJwWklAunJjdVVAElZ/SoraKxVU=\");\nlet toastsCounter = 1;\nclass Observer {\n constructor(){\n // We use arrow functions to maintain the correct `this` reference\n this.subscribe = (subscriber)=>{\n this.subscribers.push(subscriber);\n return ()=>{\n const index = this.subscribers.indexOf(subscriber);\n this.subscribers.splice(index, 1);\n };\n };\n this.publish = (data)=>{\n this.subscribers.forEach((subscriber)=>subscriber(data));\n };\n this.addToast = (data)=>{\n this.publish(data);\n this.toasts = [\n ...this.toasts,\n data\n ];\n };\n this.create = (data)=>{\n var _data_id;\n const { message, ...rest } = data;\n const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;\n const alreadyExists = this.toasts.find((toast)=>{\n return toast.id === id;\n });\n const dismissible = data.dismissible === undefined ? true : data.dismissible;\n if (this.dismissedToasts.has(id)) {\n this.dismissedToasts.delete(id);\n }\n if (alreadyExists) {\n this.toasts = this.toasts.map((toast)=>{\n if (toast.id === id) {\n this.publish({\n ...toast,\n ...data,\n id,\n title: message\n });\n return {\n ...toast,\n ...data,\n id,\n dismissible,\n title: message\n };\n }\n return toast;\n });\n } else {\n this.addToast({\n title: message,\n ...rest,\n dismissible,\n id\n });\n }\n return id;\n };\n this.dismiss = (id)=>{\n if (id) {\n this.dismissedToasts.add(id);\n requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({\n id,\n dismiss: true\n })));\n } else {\n this.toasts.forEach((toast)=>{\n this.subscribers.forEach((subscriber)=>subscriber({\n id: toast.id,\n dismiss: true\n }));\n });\n }\n return id;\n };\n this.message = (message, data)=>{\n return this.create({\n ...data,\n message\n });\n };\n this.error = (message, data)=>{\n return this.create({\n ...data,\n message,\n type: 'error'\n });\n };\n this.success = (message, data)=>{\n return this.create({\n ...data,\n type: 'success',\n message\n });\n };\n this.info = (message, data)=>{\n return this.create({\n ...data,\n type: 'info',\n message\n });\n };\n this.warning = (message, data)=>{\n return this.create({\n ...data,\n type: 'warning',\n message\n });\n };\n this.loading = (message, data)=>{\n return this.create({\n ...data,\n type: 'loading',\n message\n });\n };\n this.promise = (promise, data)=>{\n if (!data) {\n // Nothing to show\n return;\n }\n let id = undefined;\n if (data.loading !== undefined) {\n id = this.create({\n ...data,\n promise,\n type: 'loading',\n message: data.loading,\n description: typeof data.description !== 'function' ? data.description : undefined\n });\n }\n const p = Promise.resolve(promise instanceof Function ? promise() : promise);\n let shouldDismiss = id !== undefined;\n let result;\n const originalPromise = p.then(async (response)=>{\n result = [\n 'resolve',\n response\n ];\n const isReactElementResponse = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(response);\n if (isReactElementResponse) {\n shouldDismiss = false;\n this.create({\n id,\n type: 'default',\n message: response\n });\n } else if (isHttpResponse(response) && !response.ok) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(\"HTTP error! status: \".concat(response.status)) : data.error;\n const description = typeof data.description === 'function' ? await data.description(\"HTTP error! status: \".concat(response.status)) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (response instanceof Error) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (data.success !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'success',\n description,\n ...toastSettings\n });\n }\n }).catch(async (error)=>{\n result = [\n 'reject',\n error\n ];\n if (data.error !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;\n const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n }\n }).finally(()=>{\n if (shouldDismiss) {\n // Toast is still in load state (and will be indefinitely — dismiss it)\n this.dismiss(id);\n id = undefined;\n }\n data.finally == null ? void 0 : data.finally.call(data);\n });\n const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));\n if (typeof id !== 'string' && typeof id !== 'number') {\n // cannot Object.assign on undefined\n return {\n unwrap\n };\n } else {\n return Object.assign(id, {\n unwrap\n });\n }\n };\n this.custom = (jsx, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n this.create({\n jsx: jsx(id),\n id,\n ...data\n });\n return id;\n };\n this.getActiveToasts = ()=>{\n return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));\n };\n this.subscribers = [];\n this.toasts = [];\n this.dismissedToasts = new Set();\n }\n}\nconst ToastState = new Observer();\n// bind this to the toast function\nconst toastFunction = (message, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n ToastState.addToast({\n title: message,\n ...data,\n id\n });\n return id;\n};\nconst isHttpResponse = (data)=>{\n return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';\n};\nconst basicToast = toastFunction;\nconst getHistory = ()=>ToastState.toasts;\nconst getToasts = ()=>ToastState.getActiveToasts();\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nconst toast = Object.assign(basicToast, {\n success: ToastState.success,\n info: ToastState.info,\n warning: ToastState.warning,\n error: ToastState.error,\n custom: ToastState.custom,\n message: ToastState.message,\n promise: ToastState.promise,\n dismiss: ToastState.dismiss,\n loading: ToastState.loading\n}, {\n getHistory,\n getToasts\n});\n__insertCSS(\"[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\");\nfunction isAction(action) {\n return action.label !== undefined;\n}\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n// Viewport padding\nconst VIEWPORT_OFFSET = '24px';\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n// Default toast width\nconst TOAST_WIDTH = 356;\n// Default gap between toasts\nconst GAP = 14;\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 45;\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\nfunction cn() {\n for(var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++){\n classes[_key] = arguments[_key];\n }\n return classes.filter(Boolean).join(' ');\n}\nfunction getDefaultSwipeDirections(position) {\n const [y, x] = position.split('-');\n const directions = [];\n if (y) {\n directions.push(y);\n }\n if (x) {\n directions.push(x);\n }\n return directions;\n}\nconst Toast = (props)=>{\n _s1();\n var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;\n const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;\n const [swipeDirection, setSwipeDirection] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [swipeOutDirection, setSwipeOutDirection] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [mounted, setMounted] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [removed, setRemoved] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [swiping, setSwiping] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [swipeOut, setSwipeOut] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [isSwiped, setIsSwiped] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [offsetBeforeRemove, setOffsetBeforeRemove] = react__WEBPACK_IMPORTED_MODULE_0__.useState(0);\n const [initialHeight, setInitialHeight] = react__WEBPACK_IMPORTED_MODULE_0__.useState(0);\n const remainingTime = react__WEBPACK_IMPORTED_MODULE_0__.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n const dragStartTime = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const toastRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const isFront = index === 0;\n const isVisible = index + 1 <= visibleToasts;\n const toastType = toast.type;\n const dismissible = toast.dismissible !== false;\n const toastClassname = toast.className || '';\n const toastDescriptionClassname = toast.descriptionClassName || '';\n // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n const heightIndex = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toast.useMemo[heightIndex]\": ()=>heights.findIndex({\n \"Toast.useMemo[heightIndex]\": (height)=>height.toastId === toast.id\n }[\"Toast.useMemo[heightIndex]\"]) || 0\n }[\"Toast.useMemo[heightIndex]\"], [\n heights,\n toast.id\n ]);\n const closeButton = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toast.useMemo[closeButton]\": ()=>{\n var _toast_closeButton;\n return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;\n }\n }[\"Toast.useMemo[closeButton]\"], [\n toast.closeButton,\n closeButtonFromToaster\n ]);\n const duration = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toast.useMemo[duration]\": ()=>toast.duration || durationFromToaster || TOAST_LIFETIME\n }[\"Toast.useMemo[duration]\"], [\n toast.duration,\n durationFromToaster\n ]);\n const closeTimerStartTimeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(0);\n const offset = react__WEBPACK_IMPORTED_MODULE_0__.useRef(0);\n const lastCloseTimerStartTimeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(0);\n const pointerStartRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const [y, x] = position.split('-');\n const toastsHeightBefore = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toast.useMemo[toastsHeightBefore]\": ()=>{\n return heights.reduce({\n \"Toast.useMemo[toastsHeightBefore]\": (prev, curr, reducerIndex)=>{\n // Calculate offset up until current toast\n if (reducerIndex >= heightIndex) {\n return prev;\n }\n return prev + curr.height;\n }\n }[\"Toast.useMemo[toastsHeightBefore]\"], 0);\n }\n }[\"Toast.useMemo[toastsHeightBefore]\"], [\n heights,\n heightIndex\n ]);\n const isDocumentHidden = useIsDocumentHidden();\n const invert = toast.invert || ToasterInvert;\n const disabled = toastType === 'loading';\n offset.current = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toast.useMemo\": ()=>heightIndex * gap + toastsHeightBefore\n }[\"Toast.useMemo\"], [\n heightIndex,\n toastsHeightBefore\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toast.useEffect\": ()=>{\n remainingTime.current = duration;\n }\n }[\"Toast.useEffect\"], [\n duration\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toast.useEffect\": ()=>{\n // Trigger enter animation without using CSS animation\n setMounted(true);\n }\n }[\"Toast.useEffect\"], []);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toast.useEffect\": ()=>{\n const toastNode = toastRef.current;\n if (toastNode) {\n const height = toastNode.getBoundingClientRect().height;\n // Add toast height to heights array after the toast is mounted\n setInitialHeight(height);\n setHeights({\n \"Toast.useEffect\": (h)=>[\n {\n toastId: toast.id,\n height,\n position: toast.position\n },\n ...h\n ]\n }[\"Toast.useEffect\"]);\n return ({\n \"Toast.useEffect\": ()=>setHeights({\n \"Toast.useEffect\": (h)=>h.filter({\n \"Toast.useEffect\": (height)=>height.toastId !== toast.id\n }[\"Toast.useEffect\"])\n }[\"Toast.useEffect\"])\n })[\"Toast.useEffect\"];\n }\n }\n }[\"Toast.useEffect\"], [\n setHeights,\n toast.id\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect({\n \"Toast.useLayoutEffect\": ()=>{\n // Keep height up to date with the content in case it updates\n if (!mounted) return;\n const toastNode = toastRef.current;\n const originalHeight = toastNode.style.height;\n toastNode.style.height = 'auto';\n const newHeight = toastNode.getBoundingClientRect().height;\n toastNode.style.height = originalHeight;\n setInitialHeight(newHeight);\n setHeights({\n \"Toast.useLayoutEffect\": (heights)=>{\n const alreadyExists = heights.find({\n \"Toast.useLayoutEffect.alreadyExists\": (height)=>height.toastId === toast.id\n }[\"Toast.useLayoutEffect.alreadyExists\"]);\n if (!alreadyExists) {\n return [\n {\n toastId: toast.id,\n height: newHeight,\n position: toast.position\n },\n ...heights\n ];\n } else {\n return heights.map({\n \"Toast.useLayoutEffect\": (height)=>height.toastId === toast.id ? {\n ...height,\n height: newHeight\n } : height\n }[\"Toast.useLayoutEffect\"]);\n }\n }\n }[\"Toast.useLayoutEffect\"]);\n }\n }[\"Toast.useLayoutEffect\"], [\n mounted,\n toast.title,\n toast.description,\n setHeights,\n toast.id,\n toast.jsx,\n toast.action,\n toast.cancel\n ]);\n const deleteToast = react__WEBPACK_IMPORTED_MODULE_0__.useCallback({\n \"Toast.useCallback[deleteToast]\": ()=>{\n // Save the offset for the exit swipe animation\n setRemoved(true);\n setOffsetBeforeRemove(offset.current);\n setHeights({\n \"Toast.useCallback[deleteToast]\": (h)=>h.filter({\n \"Toast.useCallback[deleteToast]\": (height)=>height.toastId !== toast.id\n }[\"Toast.useCallback[deleteToast]\"])\n }[\"Toast.useCallback[deleteToast]\"]);\n setTimeout({\n \"Toast.useCallback[deleteToast]\": ()=>{\n removeToast(toast);\n }\n }[\"Toast.useCallback[deleteToast]\"], TIME_BEFORE_UNMOUNT);\n }\n }[\"Toast.useCallback[deleteToast]\"], [\n toast,\n removeToast,\n setHeights,\n offset\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toast.useEffect\": ()=>{\n if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;\n let timeoutId;\n // Pause the timer on each hover\n const pauseTimer = {\n \"Toast.useEffect.pauseTimer\": ()=>{\n if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n // Get the elapsed time since the timer started\n const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n remainingTime.current = remainingTime.current - elapsedTime;\n }\n lastCloseTimerStartTimeRef.current = new Date().getTime();\n }\n }[\"Toast.useEffect.pauseTimer\"];\n const startTimer = {\n \"Toast.useEffect.startTimer\": ()=>{\n // setTimeout(, Infinity) behaves as if the delay is 0.\n // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n if (remainingTime.current === Infinity) return;\n closeTimerStartTimeRef.current = new Date().getTime();\n // Let the toast know it has started\n timeoutId = setTimeout({\n \"Toast.useEffect.startTimer\": ()=>{\n toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);\n deleteToast();\n }\n }[\"Toast.useEffect.startTimer\"], remainingTime.current);\n }\n }[\"Toast.useEffect.startTimer\"];\n if (expanded || interacting || isDocumentHidden) {\n pauseTimer();\n } else {\n startTimer();\n }\n return ({\n \"Toast.useEffect\": ()=>clearTimeout(timeoutId)\n })[\"Toast.useEffect\"];\n }\n }[\"Toast.useEffect\"], [\n expanded,\n interacting,\n toast,\n toastType,\n isDocumentHidden,\n deleteToast\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toast.useEffect\": ()=>{\n if (toast.delete) {\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n }\n }\n }[\"Toast.useEffect\"], [\n deleteToast,\n toast.delete\n ]);\n function getLoadingIcon() {\n var _toast_classNames;\n if (icons == null ? void 0 : icons.loading) {\n var _toast_classNames1;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),\n \"data-visible\": toastType === 'loading'\n }, icons.loading);\n }\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Loader, {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),\n visible: toastType === 'loading'\n });\n }\n const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);\n var _toast_richColors, _icons_close;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"li\", {\n tabIndex: 0,\n ref: toastRef,\n className: cn(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),\n \"data-sonner-toast\": \"\",\n \"data-rich-colors\": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,\n \"data-styled\": !Boolean(toast.jsx || toast.unstyled || unstyled),\n \"data-mounted\": mounted,\n \"data-promise\": Boolean(toast.promise),\n \"data-swiped\": isSwiped,\n \"data-removed\": removed,\n \"data-visible\": isVisible,\n \"data-y-position\": y,\n \"data-x-position\": x,\n \"data-index\": index,\n \"data-front\": isFront,\n \"data-swiping\": swiping,\n \"data-dismissible\": dismissible,\n \"data-type\": toastType,\n \"data-invert\": invert,\n \"data-swipe-out\": swipeOut,\n \"data-swipe-direction\": swipeOutDirection,\n \"data-expanded\": Boolean(expanded || expandByDefault && mounted),\n \"data-testid\": toast.testId,\n style: {\n '--index': index,\n '--toasts-before': index,\n '--z-index': toasts.length - index,\n '--offset': \"\".concat(removed ? offsetBeforeRemove : offset.current, \"px\"),\n '--initial-height': expandByDefault ? 'auto' : \"\".concat(initialHeight, \"px\"),\n ...style,\n ...toast.style\n },\n onDragEnd: ()=>{\n setSwiping(false);\n setSwipeDirection(null);\n pointerStartRef.current = null;\n },\n onPointerDown: (event)=>{\n if (event.button === 2) return; // Return early on right click\n if (disabled || !dismissible) return;\n dragStartTime.current = new Date();\n setOffsetBeforeRemove(offset.current);\n // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n event.target.setPointerCapture(event.pointerId);\n if (event.target.tagName === 'BUTTON') return;\n setSwiping(true);\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY\n };\n },\n onPointerUp: ()=>{\n var _toastRef_current, _toastRef_current1, _dragStartTime_current;\n if (swipeOut || !dismissible) return;\n pointerStartRef.current = null;\n const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);\n const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);\n const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());\n const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n const velocity = Math.abs(swipeAmount) / timeTaken;\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n setOffsetBeforeRemove(offset.current);\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n if (swipeDirection === 'x') {\n setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n } else {\n setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n }\n deleteToast();\n setSwipeOut(true);\n return;\n } else {\n var _toastRef_current2, _toastRef_current3;\n (_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', \"0px\");\n (_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', \"0px\");\n }\n setIsSwiped(false);\n setSwiping(false);\n setSwipeDirection(null);\n },\n onPointerMove: (event)=>{\n var _window_getSelection, _toastRef_current, _toastRef_current1;\n if (!pointerStartRef.current || !dismissible) return;\n const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;\n if (isHighlighted) return;\n const yDelta = event.clientY - pointerStartRef.current.y;\n const xDelta = event.clientX - pointerStartRef.current.x;\n var _props_swipeDirections;\n const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);\n // Determine swipe direction if not already locked\n if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n let swipeAmount = {\n x: 0,\n y: 0\n };\n const getDampening = (delta)=>{\n const factor = Math.abs(delta) / 20;\n return 1 / (1.5 + factor);\n };\n // Only apply swipe in the locked direction\n if (swipeDirection === 'y') {\n // Handle vertical swipes\n if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {\n swipeAmount.y = yDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = yDelta * getDampening(yDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;\n }\n }\n } else if (swipeDirection === 'x') {\n // Handle horizontal swipes\n if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {\n swipeAmount.x = xDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = xDelta * getDampening(xDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;\n }\n }\n }\n if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n setIsSwiped(true);\n }\n (_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', \"\".concat(swipeAmount.x, \"px\"));\n (_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', \"\".concat(swipeAmount.y, \"px\"));\n }\n }, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n \"aria-label\": closeButtonAriaLabel,\n \"data-disabled\": disabled,\n \"data-close-button\": true,\n onClick: disabled || !dismissible ? ()=>{} : ()=>{\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n },\n className: cn(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)\n }, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n \"data-icon\": \"\",\n className: cn(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)\n }, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n \"data-content\": \"\",\n className: cn(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)\n }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n \"data-title\": \"\",\n className: cn(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)\n }, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n \"data-description\": \"\",\n className: cn(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)\n }, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n \"data-button\": true,\n \"data-cancel\": true,\n style: toast.cancelButtonStyle || cancelButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.cancel)) return;\n if (!dismissible) return;\n toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)\n }, toast.cancel.label) : null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n \"data-button\": true,\n \"data-action\": true,\n style: toast.actionButtonStyle || actionButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.action)) return;\n toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);\n if (event.defaultPrevented) return;\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)\n }, toast.action.label) : null);\n};\n_s1(Toast, \"Hs2RwklMUctKsF2fEbXUzesmn3w=\", false, function() {\n return [\n useIsDocumentHidden\n ];\n});\n_c1 = Toast;\nfunction getDocumentDirection() {\n if (typeof window === 'undefined') return 'ltr';\n if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n const dirAttribute = document.documentElement.getAttribute('dir');\n if (dirAttribute === 'auto' || !dirAttribute) {\n return window.getComputedStyle(document.documentElement).direction;\n }\n return dirAttribute;\n}\nfunction assignOffset(defaultOffset, mobileOffset) {\n const styles = {};\n [\n defaultOffset,\n mobileOffset\n ].forEach((offset, index)=>{\n const isMobile = index === 1;\n const prefix = isMobile ? '--mobile-offset' : '--offset';\n const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n function assignAll(offset) {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n styles[\"\".concat(prefix, \"-\").concat(key)] = typeof offset === 'number' ? \"\".concat(offset, \"px\") : offset;\n });\n }\n if (typeof offset === 'number' || typeof offset === 'string') {\n assignAll(offset);\n } else if (typeof offset === 'object') {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n if (offset[key] === undefined) {\n styles[\"\".concat(prefix, \"-\").concat(key)] = defaultValue;\n } else {\n styles[\"\".concat(prefix, \"-\").concat(key)] = typeof offset[key] === 'number' ? \"\".concat(offset[key], \"px\") : offset[key];\n }\n });\n } else {\n assignAll(defaultValue);\n }\n });\n return styles;\n}\nfunction useSonner() {\n _s2();\n const [activeToasts, setActiveToasts] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"useSonner.useEffect\": ()=>{\n return ToastState.subscribe({\n \"useSonner.useEffect\": (toast)=>{\n if (toast.dismiss) {\n setTimeout({\n \"useSonner.useEffect\": ()=>{\n react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync({\n \"useSonner.useEffect\": ()=>{\n setActiveToasts({\n \"useSonner.useEffect\": (toasts)=>toasts.filter({\n \"useSonner.useEffect\": (t)=>t.id !== toast.id\n }[\"useSonner.useEffect\"])\n }[\"useSonner.useEffect\"]);\n }\n }[\"useSonner.useEffect\"]);\n }\n }[\"useSonner.useEffect\"]);\n return;\n }\n // Prevent batching, temp solution.\n setTimeout({\n \"useSonner.useEffect\": ()=>{\n react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync({\n \"useSonner.useEffect\": ()=>{\n setActiveToasts({\n \"useSonner.useEffect\": (toasts)=>{\n const indexOfExistingToast = toasts.findIndex({\n \"useSonner.useEffect.indexOfExistingToast\": (t)=>t.id === toast.id\n }[\"useSonner.useEffect.indexOfExistingToast\"]);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n }\n }[\"useSonner.useEffect\"]);\n }\n }[\"useSonner.useEffect\"]);\n }\n }[\"useSonner.useEffect\"]);\n }\n }[\"useSonner.useEffect\"]);\n }\n }[\"useSonner.useEffect\"], []);\n return {\n toasts: activeToasts\n };\n}\n_s2(useSonner, \"wvKkrpl8d9UBJsfUcWYgFEOa7SA=\");\nconst Toaster = /*#__PURE__*/ _s3(react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(_c2 = _s3(function Toaster(props, ref) {\n _s3();\n const { id, invert, position = 'bottom-right', hotkey = [\n 'altKey',\n 'KeyT'\n ], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;\n const [toasts, setToasts] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);\n const filteredToasts = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toaster.Toaster.useMemo[filteredToasts]\": ()=>{\n if (id) {\n return toasts.filter({\n \"Toaster.Toaster.useMemo[filteredToasts]\": (toast)=>toast.toasterId === id\n }[\"Toaster.Toaster.useMemo[filteredToasts]\"]);\n }\n return toasts.filter({\n \"Toaster.Toaster.useMemo[filteredToasts]\": (toast)=>!toast.toasterId\n }[\"Toaster.Toaster.useMemo[filteredToasts]\"]);\n }\n }[\"Toaster.Toaster.useMemo[filteredToasts]\"], [\n toasts,\n id\n ]);\n const possiblePositions = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n \"Toaster.Toaster.useMemo[possiblePositions]\": ()=>{\n return Array.from(new Set([\n position\n ].concat(filteredToasts.filter({\n \"Toaster.Toaster.useMemo[possiblePositions]\": (toast)=>toast.position\n }[\"Toaster.Toaster.useMemo[possiblePositions]\"]).map({\n \"Toaster.Toaster.useMemo[possiblePositions]\": (toast)=>toast.position\n }[\"Toaster.Toaster.useMemo[possiblePositions]\"]))));\n }\n }[\"Toaster.Toaster.useMemo[possiblePositions]\"], [\n filteredToasts,\n position\n ]);\n const [heights, setHeights] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);\n const [expanded, setExpanded] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [interacting, setInteracting] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n const [actualTheme, setActualTheme] = react__WEBPACK_IMPORTED_MODULE_0__.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');\n const listRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n const lastFocusedElementRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n const isFocusWithinRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);\n const removeToast = react__WEBPACK_IMPORTED_MODULE_0__.useCallback({\n \"Toaster.Toaster.useCallback[removeToast]\": (toastToRemove)=>{\n setToasts({\n \"Toaster.Toaster.useCallback[removeToast]\": (toasts)=>{\n var _toasts_find;\n if (!((_toasts_find = toasts.find({\n \"Toaster.Toaster.useCallback[removeToast]\": (toast)=>toast.id === toastToRemove.id\n }[\"Toaster.Toaster.useCallback[removeToast]\"])) == null ? void 0 : _toasts_find.delete)) {\n ToastState.dismiss(toastToRemove.id);\n }\n return toasts.filter({\n \"Toaster.Toaster.useCallback[removeToast]\": (param)=>{\n let { id } = param;\n return id !== toastToRemove.id;\n }\n }[\"Toaster.Toaster.useCallback[removeToast]\"]);\n }\n }[\"Toaster.Toaster.useCallback[removeToast]\"]);\n }\n }[\"Toaster.Toaster.useCallback[removeToast]\"], []);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toaster.Toaster.useEffect\": ()=>{\n return ToastState.subscribe({\n \"Toaster.Toaster.useEffect\": (toast)=>{\n if (toast.dismiss) {\n // Prevent batching of other state updates\n requestAnimationFrame({\n \"Toaster.Toaster.useEffect\": ()=>{\n setToasts({\n \"Toaster.Toaster.useEffect\": (toasts)=>toasts.map({\n \"Toaster.Toaster.useEffect\": (t)=>t.id === toast.id ? {\n ...t,\n delete: true\n } : t\n }[\"Toaster.Toaster.useEffect\"])\n }[\"Toaster.Toaster.useEffect\"]);\n }\n }[\"Toaster.Toaster.useEffect\"]);\n return;\n }\n // Prevent batching, temp solution.\n setTimeout({\n \"Toaster.Toaster.useEffect\": ()=>{\n react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync({\n \"Toaster.Toaster.useEffect\": ()=>{\n setToasts({\n \"Toaster.Toaster.useEffect\": (toasts)=>{\n const indexOfExistingToast = toasts.findIndex({\n \"Toaster.Toaster.useEffect.indexOfExistingToast\": (t)=>t.id === toast.id\n }[\"Toaster.Toaster.useEffect.indexOfExistingToast\"]);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n }\n }[\"Toaster.Toaster.useEffect\"]);\n }\n }[\"Toaster.Toaster.useEffect\"]);\n }\n }[\"Toaster.Toaster.useEffect\"]);\n }\n }[\"Toaster.Toaster.useEffect\"]);\n }\n }[\"Toaster.Toaster.useEffect\"], [\n toasts\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toaster.Toaster.useEffect\": ()=>{\n if (theme !== 'system') {\n setActualTheme(theme);\n return;\n }\n if (theme === 'system') {\n // check if current preference is dark\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n // it's currently dark\n setActualTheme('dark');\n } else {\n // it's not dark\n setActualTheme('light');\n }\n }\n if (typeof window === 'undefined') return;\n const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n try {\n // Chrome & Firefox\n darkMediaQuery.addEventListener('change', {\n \"Toaster.Toaster.useEffect\": (param)=>{\n let { matches } = param;\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n }\n }[\"Toaster.Toaster.useEffect\"]);\n } catch (error) {\n // Safari < 14\n darkMediaQuery.addListener({\n \"Toaster.Toaster.useEffect\": (param)=>{\n let { matches } = param;\n try {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n } catch (e) {\n console.error(e);\n }\n }\n }[\"Toaster.Toaster.useEffect\"]);\n }\n }\n }[\"Toaster.Toaster.useEffect\"], [\n theme\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toaster.Toaster.useEffect\": ()=>{\n // Ensure expanded is always false when no toasts are present / only one left\n if (toasts.length <= 1) {\n setExpanded(false);\n }\n }\n }[\"Toaster.Toaster.useEffect\"], [\n toasts\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toaster.Toaster.useEffect\": ()=>{\n const handleKeyDown = {\n \"Toaster.Toaster.useEffect.handleKeyDown\": (event)=>{\n var _listRef_current;\n const isHotkeyPressed = hotkey.every({\n \"Toaster.Toaster.useEffect.handleKeyDown.isHotkeyPressed\": (key)=>event[key] || event.code === key\n }[\"Toaster.Toaster.useEffect.handleKeyDown.isHotkeyPressed\"]);\n if (isHotkeyPressed) {\n var _listRef_current1;\n setExpanded(true);\n (_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();\n }\n if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {\n setExpanded(false);\n }\n }\n }[\"Toaster.Toaster.useEffect.handleKeyDown\"];\n document.addEventListener('keydown', handleKeyDown);\n return ({\n \"Toaster.Toaster.useEffect\": ()=>document.removeEventListener('keydown', handleKeyDown)\n })[\"Toaster.Toaster.useEffect\"];\n }\n }[\"Toaster.Toaster.useEffect\"], [\n hotkey\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n \"Toaster.Toaster.useEffect\": ()=>{\n if (listRef.current) {\n return ({\n \"Toaster.Toaster.useEffect\": ()=>{\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n isFocusWithinRef.current = false;\n }\n }\n })[\"Toaster.Toaster.useEffect\"];\n }\n }\n }[\"Toaster.Toaster.useEffect\"], [\n listRef.current\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"section\", {\n ref: ref,\n \"aria-label\": \"\".concat(containerAriaLabel, \" \").concat(hotkeyLabel),\n tabIndex: -1,\n \"aria-live\": \"polite\",\n \"aria-relevant\": \"additions text\",\n \"aria-atomic\": \"false\",\n suppressHydrationWarning: true\n }, possiblePositions.map((position, index)=>{\n var _heights_;\n const [y, x] = position.split('-');\n if (!filteredToasts.length) return null;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"ol\", {\n key: position,\n dir: dir === 'auto' ? getDocumentDirection() : dir,\n tabIndex: -1,\n ref: listRef,\n className: className,\n \"data-sonner-toaster\": true,\n \"data-sonner-theme\": actualTheme,\n \"data-y-position\": y,\n \"data-x-position\": x,\n style: {\n '--front-toast-height': \"\".concat(((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0, \"px\"),\n '--width': \"\".concat(TOAST_WIDTH, \"px\"),\n '--gap': \"\".concat(gap, \"px\"),\n ...style,\n ...assignOffset(offset, mobileOffset)\n },\n onBlur: (event)=>{\n if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n isFocusWithinRef.current = false;\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n }\n }\n },\n onFocus: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n if (!isFocusWithinRef.current) {\n isFocusWithinRef.current = true;\n lastFocusedElementRef.current = event.relatedTarget;\n }\n },\n onMouseEnter: ()=>setExpanded(true),\n onMouseMove: ()=>setExpanded(true),\n onMouseLeave: ()=>{\n // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n if (!interacting) {\n setExpanded(false);\n }\n },\n onDragEnd: ()=>setExpanded(false),\n onPointerDown: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n setInteracting(true);\n },\n onPointerUp: ()=>setInteracting(false)\n }, filteredToasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{\n var _toastOptions_duration, _toastOptions_closeButton;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Toast, {\n key: toast.id,\n icons: icons,\n index: index,\n toast: toast,\n defaultRichColors: richColors,\n duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,\n className: toastOptions == null ? void 0 : toastOptions.className,\n descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,\n invert: invert,\n visibleToasts: visibleToasts,\n closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,\n interacting: interacting,\n position: position,\n style: toastOptions == null ? void 0 : toastOptions.style,\n unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,\n classNames: toastOptions == null ? void 0 : toastOptions.classNames,\n cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,\n actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,\n closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,\n removeToast: removeToast,\n toasts: filteredToasts.filter((t)=>t.position == toast.position),\n heights: heights.filter((h)=>h.position == toast.position),\n setHeights: setHeights,\n expandByDefault: expand,\n gap: gap,\n expanded: expanded,\n swipeDirections: props.swipeDirections\n });\n }));\n }));\n}, \"ShJc+0hlP7kpJg+bSV2b9eE3FXo=\")), \"ShJc+0hlP7kpJg+bSV2b9eE3FXo=\");\n_c3 = Toaster;\n\nvar _c, _c1, _c2, _c3;\n$RefreshReg$(_c, \"Loader\");\n$RefreshReg$(_c1, \"Toast\");\n$RefreshReg$(_c2, \"Toaster$React.forwardRef\");\n$RefreshReg$(_c3, \"Toaster\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9zb25uZXIvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0EsU0FBU0EsWUFBWUMsSUFBSTtJQUN2QixJQUFJLENBQUNBLFFBQVEsT0FBT0MsWUFBWSxhQUFhO0lBQzdDLElBQUlDLE9BQU9ELFNBQVNDLElBQUksSUFBSUQsU0FBU0Usb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUU7SUFDcEUsSUFBSUMsUUFBUUgsU0FBU0ksYUFBYSxDQUFDO0lBQ25DRCxNQUFNRSxJQUFJLEdBQUc7SUFDYkosS0FBS0ssV0FBVyxDQUFDSDtJQUNoQkEsTUFBTUksVUFBVSxHQUFJSixNQUFNSSxVQUFVLENBQUNDLE9BQU8sR0FBR1QsT0FBUUksTUFBTUcsV0FBVyxDQUFDTixTQUFTUyxjQUFjLENBQUNWO0FBQ3BHO0FBRTBCO0FBQ087QUFFakMsTUFBTWEsV0FBVyxDQUFDUDtJQUNkLE9BQU9BO1FBQ0gsS0FBSztZQUNELE9BQU9RO1FBQ1gsS0FBSztZQUNELE9BQU9DO1FBQ1gsS0FBSztZQUNELE9BQU9DO1FBQ1gsS0FBSztZQUNELE9BQU9DO1FBQ1g7WUFDSSxPQUFPO0lBQ2Y7QUFDSjtBQUNBLE1BQU1DLE9BQU9DLE1BQU0sSUFBSUMsSUFBSSxDQUFDO0FBQzVCLE1BQU1DLFNBQVM7UUFBQyxFQUFFQyxPQUFPLEVBQUVDLFNBQVMsRUFBRTtJQUNsQyxPQUFPLFdBQVcsR0FBR1osZ0RBQW1CLENBQUMsT0FBTztRQUM1Q1ksV0FBVztZQUNQO1lBQ0FBO1NBQ0gsQ0FBQ0MsTUFBTSxDQUFDQyxTQUFTQyxJQUFJLENBQUM7UUFDdkIsZ0JBQWdCSjtJQUNwQixHQUFHLFdBQVcsR0FBR1gsZ0RBQW1CLENBQUMsT0FBTztRQUN4Q1ksV0FBVztJQUNmLEdBQUdMLEtBQUtTLEdBQUcsQ0FBQyxDQUFDQyxHQUFHQyxJQUFJLFdBQVcsR0FBR2xCLGdEQUFtQixDQUFDLE9BQU87WUFDckRZLFdBQVc7WUFD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LEtBQUs7Z0JBQ3pEOEosVUFBVXNLLGdCQUFnQixPQUFPLEtBQUssSUFBSUEsYUFBYXRLLFFBQVE7Z0JBQy9EaUIsWUFBWXFKLGdCQUFnQixPQUFPLEtBQUssSUFBSUEsYUFBYXJKLFVBQVU7Z0JBQ25FUCxtQkFBbUI0SixnQkFBZ0IsT0FBTyxLQUFLLElBQUlBLGFBQWE1SixpQkFBaUI7Z0JBQ2pGQyxtQkFBbUIySixnQkFBZ0IsT0FBTyxLQUFLLElBQUlBLGFBQWEzSixpQkFBaUI7Z0JBQ2pGUSxzQkFBc0JtSixnQkFBZ0IsT0FBTyxLQUFLLElBQUlBLGFBQWFuSixvQkFBb0I7Z0JBQ3ZGYixhQUFhQTtnQkFDYmxHLFFBQVFzUSxlQUFlcFQsTUFBTSxDQUFDLENBQUN3UyxJQUFJQSxFQUFFaEwsUUFBUSxJQUFJakUsTUFBTWlFLFFBQVE7Z0JBQy9Ec0IsU0FBU0EsUUFBUTlJLE1BQU0sQ0FBQyxDQUFDMk0sSUFBSUEsRUFBRW5GLFFBQVEsSUFBSWpFLE1BQU1pRSxRQUFRO2dCQUN6RG9CLFlBQVlBO2dCQUNaYyxpQkFBaUJvSjtnQkFDakJySixLQUFLQTtnQkFDTFYsVUFBVUE7Z0JBQ1YySCxpQkFBaUI1SSxNQUFNNEksZUFBZTtZQUMxQztRQUNKO0lBQ0o7QUFDSjs7QUFFcUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvc29ubmVyL2Rpc3QvaW5kZXgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcbmZ1bmN0aW9uIF9faW5zZXJ0Q1NTKGNvZGUpIHtcbiAgaWYgKCFjb2RlIHx8IHR5cGVvZiBkb2N1bWVudCA9PSAndW5kZWZpbmVkJykgcmV0dXJuXG4gIGxldCBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgc3R5bGUudHlwZSA9ICd0ZXh0L2NzcydcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSlcbiAgO3N0eWxlLnN0eWxlU2hlZXQgPyAoc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY29kZSkgOiBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2RlKSlcbn1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5jb25zdCBnZXRBc3NldCA9ICh0eXBlKT0+e1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICByZXR1cm4gU3VjY2Vzc0ljb247XG4gICAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICAgICAgcmV0dXJuIEluZm9JY29uO1xuICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBXYXJuaW5nSWNvbjtcbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgcmV0dXJuIEVycm9ySWNvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5jb25zdCBiYXJzID0gQXJyYXkoMTIpLmZpbGwoMCk7XG5jb25zdCBMb2FkZXIgPSAoeyB2aXNpYmxlLCBjbGFzc05hbWUgfSk9PntcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBbXG4gICAgICAgICAgICAnc29ubmVyLWxvYWRpbmctd3JhcHBlcicsXG4gICAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpLFxuICAgICAgICBcImRhdGEtdmlzaWJsZVwiOiB2aXNpYmxlXG4gICAgfSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInNvbm5lci1zcGlubmVyXCJcbiAgICB9LCBiYXJzLm1hcCgoXywgaSk9Pi8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwic29ubmVyLWxvYWRpbmctYmFyXCIsXG4gICAgICAgICAgICBrZXk6IGBzcGlubmVyLWJhci0ke2l9YFxuICAgICAgICB9KSkpKTtcbn07XG5jb25zdCBTdWNjZXNzSWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyMCAyMFwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgd2lkdGg6IFwiMjBcIlxufSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuODU3LTkuODA5YS43NS43NSAwIDAwLTEuMjE0LS44ODJsLTMuNDgzIDQuNzktMS44OC0xLjg4YS43NS43NSAwIDEwLTEuMDYgMS4wNjFsMi41IDIuNWEuNzUuNzUgMCAwMDEuMTM3LS4wODlsNC01LjV6XCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiXG59KSk7XG5jb25zdCBXYXJuaW5nSWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgd2lkdGg6IFwiMjBcIlxufSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTkuNDAxIDMuMDAzYzEuMTU1LTIgNC4wNDMtMiA1LjE5NyAwbDcuMzU1IDEyLjc0OGMxLjE1NCAyLS4yOSA0LjUtMi41OTkgNC41SDQuNjQ1Yy0yLjMwOSAwLTMuNzUyLTIuNS0yLjU5OC00LjVMOS40IDMuMDAzek0xMiA4LjI1YS43NS43NSAwIDAxLjc1Ljc1djMuNzVhLjc1Ljc1IDAgMDEtMS41IDBWOWEuNzUuNzUgMCAwMS43NS0uNzV6bTAgOC4yNWEuNzUuNzUgMCAxMDAtMS41Ljc1Ljc1IDAgMDAwIDEuNXpcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbn0pKTtcbmNvbnN0IEluZm9JY29uID0gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwIDIwXCIsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBoZWlnaHQ6IFwiMjBcIixcbiAgICB3aWR0aDogXCIyMFwiXG59LCAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTggMTBhOCA4IDAgMTEtMTYgMCA4IDggMCAwMTE2IDB6bS03LTRhMSAxIDAgMTEtMiAwIDEgMSAwIDAxMiAwek05IDlhLjc1Ljc1IDAgMDAwIDEuNWguMjUzYS4yNS4yNSAwIDAxLjI0NC4zMDRsLS40NTkgMi4wNjZBMS43NSAxLjc1IDAgMDAxMC43NDcgMTVIMTFhLjc1Ljc1IDAgMDAwLTEuNWgtLjI1M2EuMjUuMjUgMCAwMS0uMjQ0LS4zMDRsLjQ1OS0yLjA2NkExLjc1IDEuNzUgMCAwMDkuMjUzIDlIOXpcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbn0pKTtcbmNvbnN0IEVycm9ySWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyMCAyMFwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgd2lkdGg6IFwiMjBcIlxufSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE4IDEwYTggOCAwIDExLTE2IDAgOCA4IDAgMDExNiAwem0tOC01YS43NS43NSAwIDAxLjc1Ljc1djQuNWEuNzUuNzUgMCAwMS0xLjUgMHYtNC41QS43NS43NSAwIDAxMTAgNXptMCAxMGExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnpcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbn0pKTtcbmNvbnN0IENsb3NlSWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogXCIxMlwiLFxuICAgIGhlaWdodDogXCIxMlwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuNVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG59LCAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIHtcbiAgICB4MTogXCIxOFwiLFxuICAgIHkxOiBcIjZcIixcbiAgICB4MjogXCI2XCIsXG4gICAgeTI6IFwiMThcIlxufSksIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVcIiwge1xuICAgIHgxOiBcIjZcIixcbiAgICB5MTogXCI2XCIsXG4gICAgeDI6IFwiMThcIixcbiAgICB5MjogXCIxOFwiXG59KSk7XG5cbmNvbnN0IHVzZUlzRG9jdW1lbnRIaWRkZW4gPSAoKT0+e1xuICAgIGNvbnN0IFtpc0RvY3VtZW50SGlkZGVuLCBzZXRJc0RvY3VtZW50SGlkZGVuXSA9IFJlYWN0LnVzZVN0YXRlKGRvY3VtZW50LmhpZGRlbik7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCk9PntcbiAgICAgICAgICAgIHNldElzRG9jdW1lbnRIaWRkZW4oZG9jdW1lbnQuaGlkZGVuKTtcbiAgICAgICAgfTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGNhbGxiYWNrKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGlzRG9jdW1lbnRIaWRkZW47XG59O1xuXG5sZXQgdG9hc3RzQ291bnRlciA9IDE7XG5jbGFzcyBPYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgLy8gV2UgdXNlIGFycm93IGZ1bmN0aW9ucyB0byBtYWludGFpbiB0aGUgY29ycmVjdCBgdGhpc2AgcmVmZXJlbmNlXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlID0gKHN1YnNjcmliZXIpPT57XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc3Vic2NyaWJlcnMuaW5kZXhPZihzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnB1Ymxpc2ggPSAoZGF0YSk9PntcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcik9PnN1YnNjcmliZXIoZGF0YSkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZFRvYXN0ID0gKGRhdGEpPT57XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2goZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0cyA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRvYXN0cyxcbiAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IChkYXRhKT0+e1xuICAgICAgICAgICAgdmFyIF9kYXRhX2lkO1xuICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPSBkYXRhO1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0eXBlb2YgKGRhdGEgPT0gbnVsbCA/IHZvaWQgMCA6IGRhdGEuaWQpID09PSAnbnVtYmVyJyB8fCAoKF9kYXRhX2lkID0gZGF0YS5pZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhX2lkLmxlbmd0aCkgPiAwID8gZGF0YS5pZCA6IHRvYXN0c0NvdW50ZXIrKztcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSB0aGlzLnRvYXN0cy5maW5kKCh0b2FzdCk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9hc3QuaWQgPT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXNtaXNzaWJsZSA9IGRhdGEuZGlzbWlzc2libGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBkYXRhLmRpc21pc3NpYmxlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzbWlzc2VkVG9hc3RzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NlZFRvYXN0cy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0cyA9IHRoaXMudG9hc3RzLm1hcCgodG9hc3QpPT57XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvYXN0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvYXN0KHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAgICAgICAgIGRpc21pc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc21pc3MgPSAoaWQpPT57XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NlZFRvYXN0cy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKT0+c3Vic2NyaWJlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzczogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHMuZm9yRWFjaCgodG9hc3QpPT57XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcik9PnN1YnNjcmliZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0b2FzdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IChtZXNzYWdlLCBkYXRhKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVycm9yID0gKG1lc3NhZ2UsIGRhdGEpPT57XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0gKG1lc3NhZ2UsIGRhdGEpPT57XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluZm8gPSAobWVzc2FnZSwgZGF0YSk9PntcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2FybmluZyA9IChtZXNzYWdlLCBkYXRhKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gKG1lc3NhZ2UsIGRhdGEpPT57XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xvYWRpbmcnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByb21pc2UgPSAocHJvbWlzZSwgZGF0YSk9PntcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gc2hvd1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChkYXRhLmxvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbG9hZGluZycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubG9hZGluZyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHR5cGVvZiBkYXRhLmRlc2NyaXB0aW9uICE9PSAnZnVuY3Rpb24nID8gZGF0YS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcCA9IFByb21pc2UucmVzb2x2ZShwcm9taXNlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBwcm9taXNlKCkgOiBwcm9taXNlKTtcbiAgICAgICAgICAgIGxldCBzaG91bGREaXNtaXNzID0gaWQgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFByb21pc2UgPSBwLnRoZW4oYXN5bmMgKHJlc3BvbnNlKT0+e1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc29sdmUnLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZWFjdEVsZW1lbnRSZXNwb25zZSA9IFJlYWN0LmlzVmFsaWRFbGVtZW50KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWFjdEVsZW1lbnRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0h0dHBSZXNwb25zZShyZXNwb25zZSkgJiYgIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZURhdGEgPSB0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCkgOiBkYXRhLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHR5cGVvZiBkYXRhLmRlc2NyaXB0aW9uID09PSAnZnVuY3Rpb24nID8gYXdhaXQgZGF0YS5kZXNjcmlwdGlvbihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKSA6IGRhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0ZW5kZWRSZXN1bHQgPSB0eXBlb2YgcHJvbWlzZURhdGEgPT09ICdvYmplY3QnICYmICFSZWFjdC5pc1ZhbGlkRWxlbWVudChwcm9taXNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvYXN0U2V0dGluZ3MgPSBpc0V4dGVuZGVkUmVzdWx0ID8gcHJvbWlzZURhdGEgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9taXNlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0U2V0dGluZ3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZURhdGEgPSB0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZXJyb3IocmVzcG9uc2UpIDogZGF0YS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0eXBlb2YgZGF0YS5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZGVzY3JpcHRpb24ocmVzcG9uc2UpIDogZGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFeHRlbmRlZFJlc3VsdCA9IHR5cGVvZiBwcm9taXNlRGF0YSA9PT0gJ29iamVjdCcgJiYgIVJlYWN0LmlzVmFsaWRFbGVtZW50KHByb21pc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9hc3RTZXR0aW5ncyA9IGlzRXh0ZW5kZWRSZXN1bHQgPyBwcm9taXNlRGF0YSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb21pc2VEYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3RTZXR0aW5nc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc3VjY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZURhdGEgPSB0eXBlb2YgZGF0YS5zdWNjZXNzID09PSAnZnVuY3Rpb24nID8gYXdhaXQgZGF0YS5zdWNjZXNzKHJlc3BvbnNlKSA6IGRhdGEuc3VjY2VzcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0eXBlb2YgZGF0YS5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZGVzY3JpcHRpb24ocmVzcG9uc2UpIDogZGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFeHRlbmRlZFJlc3VsdCA9IHR5cGVvZiBwcm9taXNlRGF0YSA9PT0gJ29iamVjdCcgJiYgIVJlYWN0LmlzVmFsaWRFbGVtZW50KHByb21pc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9hc3RTZXR0aW5ncyA9IGlzRXh0ZW5kZWRSZXN1bHQgPyBwcm9taXNlRGF0YSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb21pc2VEYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdFNldHRpbmdzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmNhdGNoKGFzeW5jIChlcnJvcik9PntcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdyZWplY3QnLFxuICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VEYXRhID0gdHlwZW9mIGRhdGEuZXJyb3IgPT09ICdmdW5jdGlvbicgPyBhd2FpdCBkYXRhLmVycm9yKGVycm9yKSA6IGRhdGEuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdHlwZW9mIGRhdGEuZGVzY3JpcHRpb24gPT09ICdmdW5jdGlvbicgPyBhd2FpdCBkYXRhLmRlc2NyaXB0aW9uKGVycm9yKSA6IGRhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0ZW5kZWRSZXN1bHQgPSB0eXBlb2YgcHJvbWlzZURhdGEgPT09ICdvYmplY3QnICYmICFSZWFjdC5pc1ZhbGlkRWxlbWVudChwcm9taXNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvYXN0U2V0dGluZ3MgPSBpc0V4dGVuZGVkUmVzdWx0ID8gcHJvbWlzZURhdGEgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9taXNlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0U2V0dGluZ3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuZmluYWxseSgoKT0+e1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNtaXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGlzIHN0aWxsIGluIGxvYWQgc3RhdGUgKGFuZCB3aWxsIGJlIGluZGVmaW5pdGVseSDigJQgZGlzbWlzcyBpdClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEuZmluYWxseSA9PSBudWxsID8gdm9pZCAwIDogZGF0YS5maW5hbGx5LmNhbGwoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVud3JhcCA9ICgpPT5uZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+b3JpZ2luYWxQcm9taXNlLnRoZW4oKCk9PnJlc3VsdFswXSA9PT0gJ3JlamVjdCcgPyByZWplY3QocmVzdWx0WzFdKSA6IHJlc29sdmUocmVzdWx0WzFdKSkuY2F0Y2gocmVqZWN0KSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgaWQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gY2Fubm90IE9iamVjdC5hc3NpZ24gb24gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdW53cmFwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgdW53cmFwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY3VzdG9tID0gKGpzeCwgZGF0YSk9PntcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKGRhdGEgPT0gbnVsbCA/IHZvaWQgMCA6IGRhdGEuaWQpIHx8IHRvYXN0c0NvdW50ZXIrKztcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICBqc3g6IGpzeChpZCksXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVG9hc3RzID0gKCk9PntcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvYXN0cy5maWx0ZXIoKHRvYXN0KT0+IXRoaXMuZGlzbWlzc2VkVG9hc3RzLmhhcyh0b2FzdC5pZCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0gW107XG4gICAgICAgIHRoaXMudG9hc3RzID0gW107XG4gICAgICAgIHRoaXMuZGlzbWlzc2VkVG9hc3RzID0gbmV3IFNldCgpO1xuICAgIH1cbn1cbmNvbnN0IFRvYXN0U3RhdGUgPSBuZXcgT2JzZXJ2ZXIoKTtcbi8vIGJpbmQgdGhpcyB0byB0aGUgdG9hc3QgZnVuY3Rpb25cbmNvbnN0IHRvYXN0RnVuY3Rpb24gPSAobWVzc2FnZSwgZGF0YSk9PntcbiAgICBjb25zdCBpZCA9IChkYXRhID09IG51bGwgPyB2b2lkIDAgOiBkYXRhLmlkKSB8fCB0b2FzdHNDb3VudGVyKys7XG4gICAgVG9hc3RTdGF0ZS5hZGRUb2FzdCh7XG4gICAgICAgIHRpdGxlOiBtZXNzYWdlLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBpZFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbn07XG5jb25zdCBpc0h0dHBSZXNwb25zZSA9IChkYXRhKT0+e1xuICAgIHJldHVybiBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAnb2snIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEub2sgPT09ICdib29sZWFuJyAmJiAnc3RhdHVzJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnN0YXR1cyA9PT0gJ251bWJlcic7XG59O1xuY29uc3QgYmFzaWNUb2FzdCA9IHRvYXN0RnVuY3Rpb247XG5jb25zdCBnZXRIaXN0b3J5ID0gKCk9PlRvYXN0U3RhdGUudG9hc3RzO1xuY29uc3QgZ2V0VG9hc3RzID0gKCk9PlRvYXN0U3RhdGUuZ2V0QWN0aXZlVG9hc3RzKCk7XG4vLyBXZSB1c2UgYE9iamVjdC5hc3NpZ25gIHRvIG1haW50YWluIHRoZSBjb3JyZWN0IHR5cGVzIGFzIHdlIHdvdWxkIGxvc2UgdGhlbSBvdGhlcndpc2VcbmNvbnN0IHRvYXN0ID0gT2JqZWN0LmFzc2lnbihiYXNpY1RvYXN0LCB7XG4gICAgc3VjY2VzczogVG9hc3RTdGF0ZS5zdWNjZXNzLFxuICAgIGluZm86IFRvYXN0U3RhdGUuaW5mbyxcbiAgICB3YXJuaW5nOiBUb2FzdFN0YXRlLndhcm5pbmcsXG4gICAgZXJyb3I6IFRvYXN0U3RhdGUuZXJyb3IsXG4gICAgY3VzdG9tOiBUb2FzdFN0YXRlLmN1c3RvbSxcbiAgICBtZXNzYWdlOiBUb2FzdFN0YXRlLm1lc3NhZ2UsXG4gICAgcHJvbWlzZTogVG9hc3RTdGF0ZS5wcm9taXNlLFxuICAgIGRpc21pc3M6IFRvYXN0U3RhdGUuZGlzbWlzcyxcbiAgICBsb2FkaW5nOiBUb2FzdFN0YXRlLmxvYWRpbmdcbn0sIHtcbiAgICBnZXRIaXN0b3J5LFxuICAgIGdldFRvYXN0c1xufSk7XG5cbl9faW5zZXJ0Q1NTKFwiW2RhdGEtc29ubmVyLXRvYXN0ZXJdW2Rpcj1sdHJdLGh0bWxbZGlyPWx0cl17LS10b2FzdC1pY29uLW1hcmdpbi1zdGFydDotM3B4Oy0tdG9hc3QtaWNvbi1tYXJnaW4tZW5kOjRweDstLXRvYXN0LXN2Zy1tYXJnaW4tc3RhcnQ6LTFweDstLXRvYXN0LXN2Zy1tYXJnaW4tZW5kOjBweDstLXRvYXN0LWJ1dHRvbi1tYXJnaW4tc3RhcnQ6YXV0bzstLXRvYXN0LWJ1dHRvbi1tYXJnaW4tZW5kOjA7LS10b2FzdC1jbG9zZS1idXR0b24tc3RhcnQ6MDstLXRvYXN0LWNsb3NlLWJ1dHRvbi1lbmQ6dW5zZXQ7LS10b2FzdC1jbG9zZS1idXR0b24tdHJhbnNmb3JtOnRyYW5zbGF0ZSgtMzUlLCAtMzUlKX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGlyPXJ0bF0saHRtbFtkaXI9cnRsXXstLXRvYXN0LWljb24tbWFyZ2luLXN0YXJ0OjRweDstLXRvYXN0LWljb24tbWFyZ2luLWVuZDotM3B4Oy0tdG9hc3Qtc3ZnLW1hcmdpbi1zdGFydDowcHg7LS10b2FzdC1zdmctbWFyZ2luLWVuZDotMXB4Oy0tdG9hc3QtYnV0dG9uLW1hcmdpbi1zdGFydDowOy0tdG9hc3QtYnV0dG9uLW1hcmdpbi1lbmQ6YXV0bzstLXRvYXN0LWNsb3NlLWJ1dHRvbi1zdGFydDp1bnNldDstLXRvYXN0LWNsb3NlLWJ1dHRvbi1lbmQ6MDstLXRvYXN0LWNsb3NlLWJ1dHRvbi10cmFuc2Zvcm06dHJhbnNsYXRlKDM1JSwgLTM1JSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOnZhcigtLXdpZHRoKTtmb250LWZhbWlseTp1aS1zYW5zLXNlcmlmLHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxTZWdvZSBVSSxSb2JvdG8sSGVsdmV0aWNhIE5ldWUsQXJpYWwsTm90byBTYW5zLHNhbnMtc2VyaWYsQXBwbGUgQ29sb3IgRW1vamksU2Vnb2UgVUkgRW1vamksU2Vnb2UgVUkgU3ltYm9sLE5vdG8gQ29sb3IgRW1vamk7LS1ncmF5MTpoc2woMCwgMCUsIDk5JSk7LS1ncmF5Mjpoc2woMCwgMCUsIDk3LjMlKTstLWdyYXkzOmhzbCgwLCAwJSwgOTUuMSUpOy0tZ3JheTQ6aHNsKDAsIDAlLCA5MyUpOy0tZ3JheTU6aHNsKDAsIDAlLCA5MC45JSk7LS1ncmF5Njpoc2woMCwgMCUsIDg4LjclKTstLWdyYXk3OmhzbCgwLCAwJSwgODUuOCUpOy0tZ3JheTg6aHNsKDAsIDAlLCA3OCUpOy0tZ3JheTk6aHNsKDAsIDAlLCA1Ni4xJSk7LS1ncmF5MTA6aHNsKDAsIDAlLCA1Mi4zJSk7LS1ncmF5MTE6aHNsKDAsIDAlLCA0My41JSk7LS1ncmF5MTI6aHNsKDAsIDAlLCA5JSk7LS1ib3JkZXItcmFkaXVzOjhweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtvdXRsaW5lOjA7ei1pbmRleDo5OTk5OTk5OTk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjRzIGVhc2V9QG1lZGlhIChob3Zlcjpub25lKSBhbmQgKHBvaW50ZXI6Y29hcnNlKXtbZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS1saWZ0ZWQ9dHJ1ZV17dHJhbnNmb3JtOm5vbmV9fVtkYXRhLXNvbm5lci10b2FzdGVyXVtkYXRhLXgtcG9zaXRpb249cmlnaHRde3JpZ2h0OnZhcigtLW9mZnNldC1yaWdodCl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteC1wb3NpdGlvbj1sZWZ0XXtsZWZ0OnZhcigtLW9mZnNldC1sZWZ0KX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS14LXBvc2l0aW9uPWNlbnRlcl17bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteS1wb3NpdGlvbj10b3Bde3RvcDp2YXIoLS1vZmZzZXQtdG9wKX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS15LXBvc2l0aW9uPWJvdHRvbV17Ym90dG9tOnZhcigtLW9mZnNldC1ib3R0b20pfVtkYXRhLXNvbm5lci10b2FzdF17LS15OnRyYW5zbGF0ZVkoMTAwJSk7LS1saWZ0LWFtb3VudDpjYWxjKHZhcigtLWxpZnQpICogdmFyKC0tZ2FwKSk7ei1pbmRleDp2YXIoLS16LWluZGV4KTtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7dHJhbnNmb3JtOnZhcigtLXkpO3RvdWNoLWFjdGlvbjpub25lO3RyYW5zaXRpb246dHJhbnNmb3JtIC40cyxvcGFjaXR5IC40cyxoZWlnaHQgLjRzLGJveC1zaGFkb3cgLjJzO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOjA7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVde3BhZGRpbmc6MTZweDtiYWNrZ3JvdW5kOnZhcigtLW5vcm1hbC1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ub3JtYWwtYm9yZGVyKTtjb2xvcjp2YXIoLS1ub3JtYWwtdGV4dCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1ib3JkZXItcmFkaXVzKTtib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSk7d2lkdGg6dmFyKC0td2lkdGgpO2ZvbnQtc2l6ZToxM3B4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweH1bZGF0YS1zb25uZXItdG9hc3RdOmZvY3VzLXZpc2libGV7Ym94LXNoYWRvdzowIDRweCAxMnB4IHJnYmEoMCwwLDAsLjEpLDAgMCAwIDJweCByZ2JhKDAsMCwwLC4yKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEteS1wb3NpdGlvbj10b3Bde3RvcDowOy0teTp0cmFuc2xhdGVZKC0xMDAlKTstLWxpZnQ6MTstLWxpZnQtYW1vdW50OmNhbGMoMSAqIHZhcigtLWdhcCkpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS15LXBvc2l0aW9uPWJvdHRvbV17Ym90dG9tOjA7LS15OnRyYW5zbGF0ZVkoMTAwJSk7LS1saWZ0Oi0xOy0tbGlmdC1hbW91bnQ6Y2FsYyh2YXIoLS1saWZ0KSAqIHZhcigtLWdhcCkpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtZGVzY3JpcHRpb25de2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjQ7Y29sb3I6IzNmM2YzZn1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtZGVzY3JpcHRpb25de2NvbG9yOmluaGVyaXR9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWRhcmtdIFtkYXRhLWRlc2NyaXB0aW9uXXtjb2xvcjojZThlOGU4fVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtdGl0bGVde2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjU7Y29sb3I6aW5oZXJpdH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWljb25de2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTZweDt3aWR0aDoxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXNocmluazowO21hcmdpbi1sZWZ0OnZhcigtLXRvYXN0LWljb24tbWFyZ2luLXN0YXJ0KTttYXJnaW4tcmlnaHQ6dmFyKC0tdG9hc3QtaWNvbi1tYXJnaW4tZW5kKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtcHJvbWlzZT10cnVlXSBbZGF0YS1pY29uXT5zdmd7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7YW5pbWF0aW9uOnNvbm5lci1mYWRlLWluIC4zcyBlYXNlIGZvcndhcmRzfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtaWNvbl0+KntmbGV4LXNocmluazowfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtaWNvbl0gc3Zne21hcmdpbi1sZWZ0OnZhcigtLXRvYXN0LXN2Zy1tYXJnaW4tc3RhcnQpO21hcmdpbi1yaWdodDp2YXIoLS10b2FzdC1zdmctbWFyZ2luLWVuZCl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1jb250ZW50XXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHh9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1idXR0b25de2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmctbGVmdDo4cHg7cGFkZGluZy1yaWdodDo4cHg7aGVpZ2h0OjI0cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tbm9ybWFsLWJnKTtiYWNrZ3JvdW5kOnZhcigtLW5vcm1hbC10ZXh0KTttYXJnaW4tbGVmdDp2YXIoLS10b2FzdC1idXR0b24tbWFyZ2luLXN0YXJ0KTttYXJnaW4tcmlnaHQ6dmFyKC0tdG9hc3QtYnV0dG9uLW1hcmdpbi1lbmQpO2JvcmRlcjpub25lO2ZvbnQtd2VpZ2h0OjUwMDtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOjA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXNocmluazowO3RyYW5zaXRpb246b3BhY2l0eSAuNHMsYm94LXNoYWRvdyAuMnN9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1idXR0b25dOmZvY3VzLXZpc2libGV7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgwLDAsMCwuNCl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1idXR0b25dOmZpcnN0LW9mLXR5cGV7bWFyZ2luLWxlZnQ6dmFyKC0tdG9hc3QtYnV0dG9uLW1hcmdpbi1zdGFydCk7bWFyZ2luLXJpZ2h0OnZhcigtLXRvYXN0LWJ1dHRvbi1tYXJnaW4tZW5kKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNhbmNlbF17Y29sb3I6dmFyKC0tbm9ybWFsLXRleHQpO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDgpfVtkYXRhLXNvbm5lci10b2FzdGVyXVtkYXRhLXNvbm5lci10aGVtZT1kYXJrXSBbZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNhbmNlbF17YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNsb3NlLWJ1dHRvbl17cG9zaXRpb246YWJzb2x1dGU7bGVmdDp2YXIoLS10b2FzdC1jbG9zZS1idXR0b24tc3RhcnQpO3JpZ2h0OnZhcigtLXRvYXN0LWNsb3NlLWJ1dHRvbi1lbmQpO3RvcDowO2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6MDtjb2xvcjp2YXIoLS1ncmF5MTIpO2JhY2tncm91bmQ6dmFyKC0tbm9ybWFsLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWdyYXk0KTt0cmFuc2Zvcm06dmFyKC0tdG9hc3QtY2xvc2UtYnV0dG9uLXRyYW5zZm9ybSk7Ym9yZGVyLXJhZGl1czo1MCU7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDoxO3RyYW5zaXRpb246b3BhY2l0eSAuMXMsYmFja2dyb3VuZCAuMnMsYm9yZGVyLWNvbG9yIC4yc31bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNsb3NlLWJ1dHRvbl06Zm9jdXMtdmlzaWJsZXtib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSksMCAwIDAgMnB4IHJnYmEoMCwwLDAsLjIpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtZGlzYWJsZWQ9dHJ1ZV17Y3Vyc29yOm5vdC1hbGxvd2VkfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV06aG92ZXIgW2RhdGEtY2xvc2UtYnV0dG9uXTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWdyYXkyKTtib3JkZXItY29sb3I6dmFyKC0tZ3JheTUpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwaW5nPXRydWVdOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMDAlO3JpZ2h0Oi0xMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6LTF9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXktcG9zaXRpb249dG9wXVtkYXRhLXN3aXBpbmc9dHJ1ZV06OmJlZm9yZXtib3R0b206NTAlO3RyYW5zZm9ybTpzY2FsZVkoMykgdHJhbnNsYXRlWSg1MCUpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS15LXBvc2l0aW9uPWJvdHRvbV1bZGF0YS1zd2lwaW5nPXRydWVdOjpiZWZvcmV7dG9wOjUwJTt0cmFuc2Zvcm06c2NhbGVZKDMpIHRyYW5zbGF0ZVkoLTUwJSl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN3aXBpbmc9ZmFsc2VdW2RhdGEtcmVtb3ZlZD10cnVlXTo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDt0cmFuc2Zvcm06c2NhbGVZKDIpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1leHBhbmRlZD10cnVlXTo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7aGVpZ2h0OmNhbGModmFyKC0tZ2FwKSArIDFweCk7Ym90dG9tOjEwMCU7d2lkdGg6MTAwJX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtbW91bnRlZD10cnVlXXstLXk6dHJhbnNsYXRlWSgwKTtvcGFjaXR5OjF9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLWV4cGFuZGVkPWZhbHNlXVtkYXRhLWZyb250PWZhbHNlXXstLXNjYWxlOnZhcigtLXRvYXN0cy1iZWZvcmUpICogMC4wNSArIDE7LS15OnRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1saWZ0LWFtb3VudCkgKiB2YXIoLS10b2FzdHMtYmVmb3JlKSkpIHNjYWxlKGNhbGMoLTEgKiB2YXIoLS1zY2FsZSkpKTtoZWlnaHQ6dmFyKC0tZnJvbnQtdG9hc3QtaGVpZ2h0KX1bZGF0YS1zb25uZXItdG9hc3RdPip7dHJhbnNpdGlvbjpvcGFjaXR5IC40c31bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEteC1wb3NpdGlvbj1yaWdodF17cmlnaHQ6MH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEteC1wb3NpdGlvbj1sZWZ0XXtsZWZ0OjB9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLWV4cGFuZGVkPWZhbHNlXVtkYXRhLWZyb250PWZhbHNlXVtkYXRhLXN0eWxlZD10cnVlXT4qe29wYWNpdHk6MH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdmlzaWJsZT1mYWxzZV17b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmV9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLW1vdW50ZWQ9dHJ1ZV1bZGF0YS1leHBhbmRlZD10cnVlXXstLXk6dHJhbnNsYXRlWShjYWxjKHZhcigtLWxpZnQpICogdmFyKC0tb2Zmc2V0KSkpO2hlaWdodDp2YXIoLS1pbml0aWFsLWhlaWdodCl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXJlbW92ZWQ9dHJ1ZV1bZGF0YS1mcm9udD10cnVlXVtkYXRhLXN3aXBlLW91dD1mYWxzZV17LS15OnRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1saWZ0KSAqIC0xMDAlKSk7b3BhY2l0eTowfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1yZW1vdmVkPXRydWVdW2RhdGEtZnJvbnQ9ZmFsc2VdW2RhdGEtc3dpcGUtb3V0PWZhbHNlXVtkYXRhLWV4cGFuZGVkPXRydWVdey0teTp0cmFuc2xhdGVZKGNhbGModmFyKC0tbGlmdCkgKiB2YXIoLS1vZmZzZXQpICsgdmFyKC0tbGlmdCkgKiAtMTAwJSkpO29wYWNpdHk6MH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtcmVtb3ZlZD10cnVlXVtkYXRhLWZyb250PWZhbHNlXVtkYXRhLXN3aXBlLW91dD1mYWxzZV1bZGF0YS1leHBhbmRlZD1mYWxzZV17LS15OnRyYW5zbGF0ZVkoNDAlKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzLG9wYWNpdHkgLjJzfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1yZW1vdmVkPXRydWVdW2RhdGEtZnJvbnQ9ZmFsc2VdOjpiZWZvcmV7aGVpZ2h0OmNhbGModmFyKC0taW5pdGlhbC1oZWlnaHQpICsgMjAlKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3dpcGluZz10cnVlXXt0cmFuc2Zvcm06dmFyKC0teSkgdHJhbnNsYXRlWSh2YXIoLS1zd2lwZS1hbW91bnQteSwwKSkgdHJhbnNsYXRlWCh2YXIoLS1zd2lwZS1hbW91bnQteCwwKSk7dHJhbnNpdGlvbjpub25lfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwZWQ9dHJ1ZV17dXNlci1zZWxlY3Q6bm9uZX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3dpcGUtb3V0PXRydWVdW2RhdGEteS1wb3NpdGlvbj1ib3R0b21dLFtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwZS1vdXQ9dHJ1ZV1bZGF0YS15LXBvc2l0aW9uPXRvcF17YW5pbWF0aW9uLWR1cmF0aW9uOi4yczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi1maWxsLW1vZGU6Zm9yd2FyZHN9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN3aXBlLW91dD10cnVlXVtkYXRhLXN3aXBlLWRpcmVjdGlvbj1sZWZ0XXthbmltYXRpb24tbmFtZTpzd2lwZS1vdXQtbGVmdH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3dpcGUtb3V0PXRydWVdW2RhdGEtc3dpcGUtZGlyZWN0aW9uPXJpZ2h0XXthbmltYXRpb24tbmFtZTpzd2lwZS1vdXQtcmlnaHR9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN3aXBlLW91dD10cnVlXVtkYXRhLXN3aXBlLWRpcmVjdGlvbj11cF17YW5pbWF0aW9uLW5hbWU6c3dpcGUtb3V0LXVwfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwZS1vdXQ9dHJ1ZV1bZGF0YS1zd2lwZS1kaXJlY3Rpb249ZG93bl17YW5pbWF0aW9uLW5hbWU6c3dpcGUtb3V0LWRvd259QGtleWZyYW1lcyBzd2lwZS1vdXQtbGVmdHtmcm9te3RyYW5zZm9ybTp2YXIoLS15KSB0cmFuc2xhdGVYKHZhcigtLXN3aXBlLWFtb3VudC14KSk7b3BhY2l0eToxfXRve3RyYW5zZm9ybTp2YXIoLS15KSB0cmFuc2xhdGVYKGNhbGModmFyKC0tc3dpcGUtYW1vdW50LXgpIC0gMTAwJSkpO29wYWNpdHk6MH19QGtleWZyYW1lcyBzd2lwZS1vdXQtcmlnaHR7ZnJvbXt0cmFuc2Zvcm06dmFyKC0teSkgdHJhbnNsYXRlWCh2YXIoLS1zd2lwZS1hbW91bnQteCkpO29wYWNpdHk6MX10b3t0cmFuc2Zvcm06dmFyKC0teSkgdHJhbnNsYXRlWChjYWxjKHZhcigtLXN3aXBlLWFtb3VudC14KSArIDEwMCUpKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dpcGUtb3V0LXVwe2Zyb217dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkodmFyKC0tc3dpcGUtYW1vdW50LXkpKTtvcGFjaXR5OjF9dG97dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1zd2lwZS1hbW91bnQteSkgLSAxMDAlKSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3aXBlLW91dC1kb3due2Zyb217dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkodmFyKC0tc3dpcGUtYW1vdW50LXkpKTtvcGFjaXR5OjF9dG97dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1zd2lwZS1hbW91bnQteSkgKyAxMDAlKSk7b3BhY2l0eTowfX1AbWVkaWEgKG1heC13aWR0aDo2MDBweCl7W2RhdGEtc29ubmVyLXRvYXN0ZXJde3Bvc2l0aW9uOmZpeGVkO3JpZ2h0OnZhcigtLW1vYmlsZS1vZmZzZXQtcmlnaHQpO2xlZnQ6dmFyKC0tbW9iaWxlLW9mZnNldC1sZWZ0KTt3aWR0aDoxMDAlfVtkYXRhLXNvbm5lci10b2FzdGVyXVtkaXI9cnRsXXtsZWZ0OmNhbGModmFyKC0tbW9iaWxlLW9mZnNldC1sZWZ0KSAqIC0xKX1bZGF0YS1zb25uZXItdG9hc3Rlcl0gW2RhdGEtc29ubmVyLXRvYXN0XXtsZWZ0OjA7cmlnaHQ6MDt3aWR0aDpjYWxjKDEwMCUgLSB2YXIoLS1tb2JpbGUtb2Zmc2V0LWxlZnQpICogMil9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteC1wb3NpdGlvbj1sZWZ0XXtsZWZ0OnZhcigtLW1vYmlsZS1vZmZzZXQtbGVmdCl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteS1wb3NpdGlvbj1ib3R0b21de2JvdHRvbTp2YXIoLS1tb2JpbGUtb2Zmc2V0LWJvdHRvbSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteS1wb3NpdGlvbj10b3Bde3RvcDp2YXIoLS1tb2JpbGUtb2Zmc2V0LXRvcCl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteC1wb3NpdGlvbj1jZW50ZXJde2xlZnQ6dmFyKC0tbW9iaWxlLW9mZnNldC1sZWZ0KTtyaWdodDp2YXIoLS1tb2JpbGUtb2Zmc2V0LXJpZ2h0KTt0cmFuc2Zvcm06bm9uZX19W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWxpZ2h0XXstLW5vcm1hbC1iZzojZmZmOy0tbm9ybWFsLWJvcmRlcjp2YXIoLS1ncmF5NCk7LS1ub3JtYWwtdGV4dDp2YXIoLS1ncmF5MTIpOy0tc3VjY2Vzcy1iZzpoc2woMTQzLCA4NSUsIDk2JSk7LS1zdWNjZXNzLWJvcmRlcjpoc2woMTQ1LCA5MiUsIDg3JSk7LS1zdWNjZXNzLXRleHQ6aHNsKDE0MCwgMTAwJSwgMjclKTstLWluZm8tYmc6aHNsKDIwOCwgMTAwJSwgOTclKTstLWluZm8tYm9yZGVyOmhzbCgyMjEsIDkxJSwgOTMlKTstLWluZm8tdGV4dDpoc2woMjEwLCA5MiUsIDQ1JSk7LS13YXJuaW5nLWJnOmhzbCg0OSwgMTAwJSwgOTclKTstLXdhcm5pbmctYm9yZGVyOmhzbCg0OSwgOTElLCA4NCUpOy0td2FybmluZy10ZXh0OmhzbCgzMSwgOTIlLCA0NSUpOy0tZXJyb3ItYmc6aHNsKDM1OSwgMTAwJSwgOTclKTstLWVycm9yLWJvcmRlcjpoc2woMzU5LCAxMDAlLCA5NCUpOy0tZXJyb3ItdGV4dDpoc2woMzYwLCAxMDAlLCA0NSUpfVtkYXRhLXNvbm5lci10b2FzdGVyXVtkYXRhLXNvbm5lci10aGVtZT1saWdodF0gW2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLWludmVydD10cnVlXXstLW5vcm1hbC1iZzojMDAwOy0tbm9ybWFsLWJvcmRlcjpoc2woMCwgMCUsIDIwJSk7LS1ub3JtYWwtdGV4dDp2YXIoLS1ncmF5MSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWRhcmtdIFtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1pbnZlcnQ9dHJ1ZV17LS1ub3JtYWwtYmc6I2ZmZjstLW5vcm1hbC1ib3JkZXI6dmFyKC0tZ3JheTMpOy0tbm9ybWFsLXRleHQ6dmFyKC0tZ3JheTEyKX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS1zb25uZXItdGhlbWU9ZGFya117LS1ub3JtYWwtYmc6IzAwMDstLW5vcm1hbC1iZy1ob3Zlcjpoc2woMCwgMCUsIDEyJSk7LS1ub3JtYWwtYm9yZGVyOmhzbCgwLCAwJSwgMjAlKTstLW5vcm1hbC1ib3JkZXItaG92ZXI6aHNsKDAsIDAlLCAyNSUpOy0tbm9ybWFsLXRleHQ6dmFyKC0tZ3JheTEpOy0tc3VjY2Vzcy1iZzpoc2woMTUwLCAxMDAlLCA2JSk7LS1zdWNjZXNzLWJvcmRlcjpoc2woMTQ3LCAxMDAlLCAxMiUpOy0tc3VjY2Vzcy10ZXh0OmhzbCgxNTAsIDg2JSwgNjUlKTstLWluZm8tYmc6aHNsKDIxNSwgMTAwJSwgNiUpOy0taW5mby1ib3JkZXI6aHNsKDIyMywgNDMlLCAxNyUpOy0taW5mby10ZXh0OmhzbCgyMTYsIDg3JSwgNjUlKTstLXdhcm5pbmctYmc6aHNsKDY0LCAxMDAlLCA2JSk7LS13YXJuaW5nLWJvcmRlcjpoc2woNjAsIDEwMCUsIDklKTstLXdhcm5pbmctdGV4dDpoc2woNDYsIDg3JSwgNjUlKTstLWVycm9yLWJnOmhzbCgzNTgsIDc2JSwgMTAlKTstLWVycm9yLWJvcmRlcjpoc2woMzU3LCA4OSUsIDE2JSk7LS1lcnJvci10ZXh0OmhzbCgzNTgsIDEwMCUsIDgxJSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWRhcmtdIFtkYXRhLXNvbm5lci10b2FzdF0gW2RhdGEtY2xvc2UtYnV0dG9uXXtiYWNrZ3JvdW5kOnZhcigtLW5vcm1hbC1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLW5vcm1hbC1ib3JkZXIpO2NvbG9yOnZhcigtLW5vcm1hbC10ZXh0KX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS1zb25uZXItdGhlbWU9ZGFya10gW2RhdGEtc29ubmVyLXRvYXN0XSBbZGF0YS1jbG9zZS1idXR0b25dOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tbm9ybWFsLWJnLWhvdmVyKTtib3JkZXItY29sb3I6dmFyKC0tbm9ybWFsLWJvcmRlci1ob3Zlcil9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1zdWNjZXNzXXtiYWNrZ3JvdW5kOnZhcigtLXN1Y2Nlc3MtYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1zdWNjZXNzLWJvcmRlcik7Y29sb3I6dmFyKC0tc3VjY2Vzcy10ZXh0KX1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS10eXBlPXN1Y2Nlc3NdIFtkYXRhLWNsb3NlLWJ1dHRvbl17YmFja2dyb3VuZDp2YXIoLS1zdWNjZXNzLWJnKTtib3JkZXItY29sb3I6dmFyKC0tc3VjY2Vzcy1ib3JkZXIpO2NvbG9yOnZhcigtLXN1Y2Nlc3MtdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1pbmZvXXtiYWNrZ3JvdW5kOnZhcigtLWluZm8tYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1pbmZvLWJvcmRlcik7Y29sb3I6dmFyKC0taW5mby10ZXh0KX1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS10eXBlPWluZm9dIFtkYXRhLWNsb3NlLWJ1dHRvbl17YmFja2dyb3VuZDp2YXIoLS1pbmZvLWJnKTtib3JkZXItY29sb3I6dmFyKC0taW5mby1ib3JkZXIpO2NvbG9yOnZhcigtLWluZm8tdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT13YXJuaW5nXXtiYWNrZ3JvdW5kOnZhcigtLXdhcm5pbmctYmcpO2JvcmRlci1jb2xvcjp2YXIoLS13YXJuaW5nLWJvcmRlcik7Y29sb3I6dmFyKC0td2FybmluZy10ZXh0KX1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS10eXBlPXdhcm5pbmddIFtkYXRhLWNsb3NlLWJ1dHRvbl17YmFja2dyb3VuZDp2YXIoLS13YXJuaW5nLWJnKTtib3JkZXItY29sb3I6dmFyKC0td2FybmluZy1ib3JkZXIpO2NvbG9yOnZhcigtLXdhcm5pbmctdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1lcnJvcl17YmFja2dyb3VuZDp2YXIoLS1lcnJvci1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLWVycm9yLWJvcmRlcik7Y29sb3I6dmFyKC0tZXJyb3ItdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1lcnJvcl0gW2RhdGEtY2xvc2UtYnV0dG9uXXtiYWNrZ3JvdW5kOnZhcigtLWVycm9yLWJnKTtib3JkZXItY29sb3I6dmFyKC0tZXJyb3ItYm9yZGVyKTtjb2xvcjp2YXIoLS1lcnJvci10ZXh0KX0uc29ubmVyLWxvYWRpbmctd3JhcHBlcnstLXNpemU6MTZweDtoZWlnaHQ6dmFyKC0tc2l6ZSk7d2lkdGg6dmFyKC0tc2l6ZSk7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDt6LWluZGV4OjEwfS5zb25uZXItbG9hZGluZy13cmFwcGVyW2RhdGEtdmlzaWJsZT1mYWxzZV17dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7YW5pbWF0aW9uOnNvbm5lci1mYWRlLW91dCAuMnMgZWFzZSBmb3J3YXJkc30uc29ubmVyLXNwaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7dG9wOjUwJTtsZWZ0OjUwJTtoZWlnaHQ6dmFyKC0tc2l6ZSk7d2lkdGg6dmFyKC0tc2l6ZSl9LnNvbm5lci1sb2FkaW5nLWJhcnthbmltYXRpb246c29ubmVyLXNwaW4gMS4ycyBsaW5lYXIgaW5maW5pdGU7YmFja2dyb3VuZDp2YXIoLS1ncmF5MTEpO2JvcmRlci1yYWRpdXM6NnB4O2hlaWdodDo4JTtsZWZ0Oi0xMCU7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0zLjklO3dpZHRoOjI0JX0uc29ubmVyLWxvYWRpbmctYmFyOmZpcnN0LWNoaWxke2FuaW1hdGlvbi1kZWxheTotMS4yczt0cmFuc2Zvcm06cm90YXRlKC4wMDAxZGVnKSB0cmFuc2xhdGUoMTQ2JSl9LnNvbm5lci1sb2FkaW5nLWJhcjpudGgtY2hpbGQoMil7YW5pbWF0aW9uLWRlbGF5Oi0xLjFzO3RyYW5zZm9ybTpyb3RhdGUoMzBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCgzKXthbmltYXRpb24tZGVsYXk6LTFzO3RyYW5zZm9ybTpyb3RhdGUoNjBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCg0KXthbmltYXRpb24tZGVsYXk6LS45czt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKSB0cmFuc2xhdGUoMTQ2JSl9LnNvbm5lci1sb2FkaW5nLWJhcjpudGgtY2hpbGQoNSl7YW5pbWF0aW9uLWRlbGF5Oi0uOHM7dHJhbnNmb3JtOnJvdGF0ZSgxMjBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCg2KXthbmltYXRpb24tZGVsYXk6LS43czt0cmFuc2Zvcm06cm90YXRlKDE1MGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDcpe2FuaW1hdGlvbi1kZWxheTotLjZzO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGUoMTQ2JSl9LnNvbm5lci1sb2FkaW5nLWJhcjpudGgtY2hpbGQoOCl7YW5pbWF0aW9uLWRlbGF5Oi0uNXM7dHJhbnNmb3JtOnJvdGF0ZSgyMTBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCg5KXthbmltYXRpb24tZGVsYXk6LS40czt0cmFuc2Zvcm06cm90YXRlKDI0MGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDEwKXthbmltYXRpb24tZGVsYXk6LS4zczt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDExKXthbmltYXRpb24tZGVsYXk6LS4yczt0cmFuc2Zvcm06cm90YXRlKDMwMGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDEyKXthbmltYXRpb24tZGVsYXk6LS4xczt0cmFuc2Zvcm06cm90YXRlKDMzMGRlZykgdHJhbnNsYXRlKDE0NiUpfUBrZXlmcmFtZXMgc29ubmVyLWZhZGUtaW57MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCl9MTAwJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHNvbm5lci1mYWRlLW91dHswJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCl9fUBrZXlmcmFtZXMgc29ubmVyLXNwaW57MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTouMTV9fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbil7LnNvbm5lci1sb2FkaW5nLWJhcixbZGF0YS1zb25uZXItdG9hc3RdLFtkYXRhLXNvbm5lci10b2FzdF0+Knt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50O2FuaW1hdGlvbjpub25lIWltcG9ydGFudH19LnNvbm5lci1sb2FkZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycyx0cmFuc2Zvcm0gLjJzfS5zb25uZXItbG9hZGVyW2RhdGEtdmlzaWJsZT1mYWxzZV17b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlKC01MCUsLTUwJSl9XCIpO1xuXG5mdW5jdGlvbiBpc0FjdGlvbihhY3Rpb24pIHtcbiAgICByZXR1cm4gYWN0aW9uLmxhYmVsICE9PSB1bmRlZmluZWQ7XG59XG5cbi8vIFZpc2libGUgdG9hc3RzIGFtb3VudFxuY29uc3QgVklTSUJMRV9UT0FTVFNfQU1PVU5UID0gMztcbi8vIFZpZXdwb3J0IHBhZGRpbmdcbmNvbnN0IFZJRVdQT1JUX09GRlNFVCA9ICcyNHB4Jztcbi8vIE1vYmlsZSB2aWV3cG9ydCBwYWRkaW5nXG5jb25zdCBNT0JJTEVfVklFV1BPUlRfT0ZGU0VUID0gJzE2cHgnO1xuLy8gRGVmYXVsdCBsaWZldGltZSBvZiBhIHRvYXN0cyAoaW4gbXMpXG5jb25zdCBUT0FTVF9MSUZFVElNRSA9IDQwMDA7XG4vLyBEZWZhdWx0IHRvYXN0IHdpZHRoXG5jb25zdCBUT0FTVF9XSURUSCA9IDM1Njtcbi8vIERlZmF1bHQgZ2FwIGJldHdlZW4gdG9hc3RzXG5jb25zdCBHQVAgPSAxNDtcbi8vIFRocmVzaG9sZCB0byBkaXNtaXNzIGEgdG9hc3RcbmNvbnN0IFNXSVBFX1RIUkVTSE9MRCA9IDQ1O1xuLy8gRXF1YWwgdG8gZXhpdCBhbmltYXRpb24gZHVyYXRpb25cbmNvbnN0IFRJTUVfQkVGT1JFX1VOTU9VTlQgPSAyMDA7XG5mdW5jdGlvbiBjbiguLi5jbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRTd2lwZURpcmVjdGlvbnMocG9zaXRpb24pIHtcbiAgICBjb25zdCBbeSwgeF0gPSBwb3NpdGlvbi5zcGxpdCgnLScpO1xuICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBbXTtcbiAgICBpZiAoeSkge1xuICAgICAgICBkaXJlY3Rpb25zLnB1c2goeSk7XG4gICAgfVxuICAgIGlmICh4KSB7XG4gICAgICAgIGRpcmVjdGlvbnMucHVzaCh4KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbnM7XG59XG5jb25zdCBUb2FzdCA9IChwcm9wcyk9PntcbiAgICB2YXIgX3RvYXN0X2NsYXNzTmFtZXMsIF90b2FzdF9jbGFzc05hbWVzMSwgX3RvYXN0X2NsYXNzTmFtZXMyLCBfdG9hc3RfY2xhc3NOYW1lczMsIF90b2FzdF9jbGFzc05hbWVzNCwgX3RvYXN0X2NsYXNzTmFtZXM1LCBfdG9hc3RfY2xhc3NOYW1lczYsIF90b2FzdF9jbGFzc05hbWVzNywgX3RvYXN0X2NsYXNzTmFtZXM4O1xuICAgIGNvbnN0IHsgaW52ZXJ0OiBUb2FzdGVySW52ZXJ0LCB0b2FzdCwgdW5zdHlsZWQsIGludGVyYWN0aW5nLCBzZXRIZWlnaHRzLCB2aXNpYmxlVG9hc3RzLCBoZWlnaHRzLCBpbmRleCwgdG9hc3RzLCBleHBhbmRlZCwgcmVtb3ZlVG9hc3QsIGRlZmF1bHRSaWNoQ29sb3JzLCBjbG9zZUJ1dHRvbjogY2xvc2VCdXR0b25Gcm9tVG9hc3Rlciwgc3R5bGUsIGNhbmNlbEJ1dHRvblN0eWxlLCBhY3Rpb25CdXR0b25TdHlsZSwgY2xhc3NOYW1lID0gJycsIGRlc2NyaXB0aW9uQ2xhc3NOYW1lID0gJycsIGR1cmF0aW9uOiBkdXJhdGlvbkZyb21Ub2FzdGVyLCBwb3NpdGlvbiwgZ2FwLCBleHBhbmRCeURlZmF1bHQsIGNsYXNzTmFtZXMsIGljb25zLCBjbG9zZUJ1dHRvbkFyaWFMYWJlbCA9ICdDbG9zZSB0b2FzdCcgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtzd2lwZURpcmVjdGlvbiwgc2V0U3dpcGVEaXJlY3Rpb25dID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgW3N3aXBlT3V0RGlyZWN0aW9uLCBzZXRTd2lwZU91dERpcmVjdGlvbl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBbbW91bnRlZCwgc2V0TW91bnRlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3JlbW92ZWQsIHNldFJlbW92ZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtzd2lwaW5nLCBzZXRTd2lwaW5nXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbc3dpcGVPdXQsIHNldFN3aXBlT3V0XSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbaXNTd2lwZWQsIHNldElzU3dpcGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbb2Zmc2V0QmVmb3JlUmVtb3ZlLCBzZXRPZmZzZXRCZWZvcmVSZW1vdmVdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW2luaXRpYWxIZWlnaHQsIHNldEluaXRpYWxIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgcmVtYWluaW5nVGltZSA9IFJlYWN0LnVzZVJlZih0b2FzdC5kdXJhdGlvbiB8fCBkdXJhdGlvbkZyb21Ub2FzdGVyIHx8IFRPQVNUX0xJRkVUSU1FKTtcbiAgICBjb25zdCBkcmFnU3RhcnRUaW1lID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHRvYXN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGlzRnJvbnQgPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBpc1Zpc2libGUgPSBpbmRleCArIDEgPD0gdmlzaWJsZVRvYXN0cztcbiAgICBjb25zdCB0b2FzdFR5cGUgPSB0b2FzdC50eXBlO1xuICAgIGNvbnN0IGRpc21pc3NpYmxlID0gdG9hc3QuZGlzbWlzc2libGUgIT09IGZhbHNlO1xuICAgIGNvbnN0IHRvYXN0Q2xhc3NuYW1lID0gdG9hc3QuY2xhc3NOYW1lIHx8ICcnO1xuICAgIGNvbnN0IHRvYXN0RGVzY3JpcHRpb25DbGFzc25hbWUgPSB0b2FzdC5kZXNjcmlwdGlvbkNsYXNzTmFtZSB8fCAnJztcbiAgICAvLyBIZWlnaHQgaW5kZXggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBhcyBpdCBnZXRzIHVwZGF0ZWQgYmVmb3JlIHRoZSB0b2FzdCBhcnJheSwgd2hpY2ggbWVhbnMgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgbmV3IGxheW91dCBmYXN0ZXIuXG4gICAgY29uc3QgaGVpZ2h0SW5kZXggPSBSZWFjdC51c2VNZW1vKCgpPT5oZWlnaHRzLmZpbmRJbmRleCgoaGVpZ2h0KT0+aGVpZ2h0LnRvYXN0SWQgPT09IHRvYXN0LmlkKSB8fCAwLCBbXG4gICAgICAgIGhlaWdodHMsXG4gICAgICAgIHRvYXN0LmlkXG4gICAgXSk7XG4gICAgY29uc3QgY2xvc2VCdXR0b24gPSBSZWFjdC51c2VNZW1vKCgpPT57XG4gICAgICAgIHZhciBfdG9hc3RfY2xvc2VCdXR0b247XG4gICAgICAgIHJldHVybiAoX3RvYXN0X2Nsb3NlQnV0dG9uID0gdG9hc3QuY2xvc2VCdXR0b24pICE9IG51bGwgPyBfdG9hc3RfY2xvc2VCdXR0b24gOiBjbG9zZUJ1dHRvbkZyb21Ub2FzdGVyO1xuICAgIH0sIFtcbiAgICAgICAgdG9hc3QuY2xvc2VCdXR0b24sXG4gICAgICAgIGNsb3NlQnV0dG9uRnJvbVRvYXN0ZXJcbiAgICBdKTtcbiAgICBjb25zdCBkdXJhdGlvbiA9IFJlYWN0LnVzZU1lbW8oKCk9PnRvYXN0LmR1cmF0aW9uIHx8IGR1cmF0aW9uRnJvbVRvYXN0ZXIgfHwgVE9BU1RfTElGRVRJTUUsIFtcbiAgICAgICAgdG9hc3QuZHVyYXRpb24sXG4gICAgICAgIGR1cmF0aW9uRnJvbVRvYXN0ZXJcbiAgICBdKTtcbiAgICBjb25zdCBjbG9zZVRpbWVyU3RhcnRUaW1lUmVmID0gUmVhY3QudXNlUmVmKDApO1xuICAgIGNvbnN0IG9mZnNldCA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBsYXN0Q2xvc2VUaW1lclN0YXJ0VGltZVJlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBwb2ludGVyU3RhcnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW3ksIHhdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgICBjb25zdCB0b2FzdHNIZWlnaHRCZWZvcmUgPSBSZWFjdC51c2VNZW1vKCgpPT57XG4gICAgICAgIHJldHVybiBoZWlnaHRzLnJlZHVjZSgocHJldiwgY3VyciwgcmVkdWNlckluZGV4KT0+e1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9mZnNldCB1cCB1bnRpbCBjdXJyZW50IHRvYXN0XG4gICAgICAgICAgICBpZiAocmVkdWNlckluZGV4ID49IGhlaWdodEluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIuaGVpZ2h0O1xuICAgICAgICB9LCAwKTtcbiAgICB9LCBbXG4gICAgICAgIGhlaWdodHMsXG4gICAgICAgIGhlaWdodEluZGV4XG4gICAgXSk7XG4gICAgY29uc3QgaXNEb2N1bWVudEhpZGRlbiA9IHVzZUlzRG9jdW1lbnRIaWRkZW4oKTtcbiAgICBjb25zdCBpbnZlcnQgPSB0b2FzdC5pbnZlcnQgfHwgVG9hc3RlckludmVydDtcbiAgICBjb25zdCBkaXNhYmxlZCA9IHRvYXN0VHlwZSA9PT0gJ2xvYWRpbmcnO1xuICAgIG9mZnNldC5jdXJyZW50ID0gUmVhY3QudXNlTWVtbygoKT0+aGVpZ2h0SW5kZXggKiBnYXAgKyB0b2FzdHNIZWlnaHRCZWZvcmUsIFtcbiAgICAgICAgaGVpZ2h0SW5kZXgsXG4gICAgICAgIHRvYXN0c0hlaWdodEJlZm9yZVxuICAgIF0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKT0+e1xuICAgICAgICByZW1haW5pbmdUaW1lLmN1cnJlbnQgPSBkdXJhdGlvbjtcbiAgICB9LCBbXG4gICAgICAgIGR1cmF0aW9uXG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIC8vIFRyaWdnZXIgZW50ZXIgYW5pbWF0aW9uIHdpdGhvdXQgdXNpbmcgQ1NTIGFuaW1hdGlvblxuICAgICAgICBzZXRNb3VudGVkKHRydWUpO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgY29uc3QgdG9hc3ROb2RlID0gdG9hc3RSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKHRvYXN0Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdG9hc3ROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIC8vIEFkZCB0b2FzdCBoZWlnaHQgdG8gaGVpZ2h0cyBhcnJheSBhZnRlciB0aGUgdG9hc3QgaXMgbW91bnRlZFxuICAgICAgICAgICAgc2V0SW5pdGlhbEhlaWdodChoZWlnaHQpO1xuICAgICAgICAgICAgc2V0SGVpZ2h0cygoaCk9PltcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3RJZDogdG9hc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogdG9hc3QucG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uaFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuICgpPT5zZXRIZWlnaHRzKChoKT0+aC5maWx0ZXIoKGhlaWdodCk9PmhlaWdodC50b2FzdElkICE9PSB0b2FzdC5pZCkpO1xuICAgICAgICB9XG4gICAgfSwgW1xuICAgICAgICBzZXRIZWlnaHRzLFxuICAgICAgICB0b2FzdC5pZFxuICAgIF0pO1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKT0+e1xuICAgICAgICAvLyBLZWVwIGhlaWdodCB1cCB0byBkYXRlIHdpdGggdGhlIGNvbnRlbnQgaW4gY2FzZSBpdCB1cGRhdGVzXG4gICAgICAgIGlmICghbW91bnRlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0b2FzdE5vZGUgPSB0b2FzdFJlZi5jdXJyZW50O1xuICAgICAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9IHRvYXN0Tm9kZS5zdHlsZS5oZWlnaHQ7XG4gICAgICAgIHRvYXN0Tm9kZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IHRvYXN0Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIHRvYXN0Tm9kZS5zdHlsZS5oZWlnaHQgPSBvcmlnaW5hbEhlaWdodDtcbiAgICAgICAgc2V0SW5pdGlhbEhlaWdodChuZXdIZWlnaHQpO1xuICAgICAgICBzZXRIZWlnaHRzKChoZWlnaHRzKT0+e1xuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGhlaWdodHMuZmluZCgoaGVpZ2h0KT0+aGVpZ2h0LnRvYXN0SWQgPT09IHRvYXN0LmlkKTtcbiAgICAgICAgICAgIGlmICghYWxyZWFkeUV4aXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0SWQ6IHRvYXN0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogdG9hc3QucG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uaGVpZ2h0c1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBoZWlnaHRzLm1hcCgoaGVpZ2h0KT0+aGVpZ2h0LnRvYXN0SWQgPT09IHRvYXN0LmlkID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgfSA6IGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIFtcbiAgICAgICAgbW91bnRlZCxcbiAgICAgICAgdG9hc3QudGl0bGUsXG4gICAgICAgIHRvYXN0LmRlc2NyaXB0aW9uLFxuICAgICAgICBzZXRIZWlnaHRzLFxuICAgICAgICB0b2FzdC5pZCxcbiAgICAgICAgdG9hc3QuanN4LFxuICAgICAgICB0b2FzdC5hY3Rpb24sXG4gICAgICAgIHRvYXN0LmNhbmNlbFxuICAgIF0pO1xuICAgIGNvbnN0IGRlbGV0ZVRvYXN0ID0gUmVhY3QudXNlQ2FsbGJhY2soKCk9PntcbiAgICAgICAgLy8gU2F2ZSB0aGUgb2Zmc2V0IGZvciB0aGUgZXhpdCBzd2lwZSBhbmltYXRpb25cbiAgICAgICAgc2V0UmVtb3ZlZCh0cnVlKTtcbiAgICAgICAgc2V0T2Zmc2V0QmVmb3JlUmVtb3ZlKG9mZnNldC5jdXJyZW50KTtcbiAgICAgICAgc2V0SGVpZ2h0cygoaCk9PmguZmlsdGVyKChoZWlnaHQpPT5oZWlnaHQudG9hc3RJZCAhPT0gdG9hc3QuaWQpKTtcbiAgICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgcmVtb3ZlVG9hc3QodG9hc3QpO1xuICAgICAgICB9LCBUSU1FX0JFRk9SRV9VTk1PVU5UKTtcbiAgICB9LCBbXG4gICAgICAgIHRvYXN0LFxuICAgICAgICByZW1vdmVUb2FzdCxcbiAgICAgICAgc2V0SGVpZ2h0cyxcbiAgICAgICAgb2Zmc2V0XG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmICh0b2FzdC5wcm9taXNlICYmIHRvYXN0VHlwZSA9PT0gJ2xvYWRpbmcnIHx8IHRvYXN0LmR1cmF0aW9uID09PSBJbmZpbml0eSB8fCB0b2FzdC50eXBlID09PSAnbG9hZGluZycpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWVvdXRJZDtcbiAgICAgICAgLy8gUGF1c2UgdGhlIHRpbWVyIG9uIGVhY2ggaG92ZXJcbiAgICAgICAgY29uc3QgcGF1c2VUaW1lciA9ICgpPT57XG4gICAgICAgICAgICBpZiAobGFzdENsb3NlVGltZXJTdGFydFRpbWVSZWYuY3VycmVudCA8IGNsb3NlVGltZXJTdGFydFRpbWVSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZWxhcHNlZCB0aW1lIHNpbmNlIHRoZSB0aW1lciBzdGFydGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGNsb3NlVGltZXJTdGFydFRpbWVSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdUaW1lLmN1cnJlbnQgPSByZW1haW5pbmdUaW1lLmN1cnJlbnQgLSBlbGFwc2VkVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDbG9zZVRpbWVyU3RhcnRUaW1lUmVmLmN1cnJlbnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpPT57XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCwgSW5maW5pdHkpIGJlaGF2ZXMgYXMgaWYgdGhlIGRlbGF5IGlzIDAuXG4gICAgICAgICAgICAvLyBBcyBhIHJlc3VsdCwgdGhlIHRvYXN0IHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseSwgZ2l2aW5nIHRoZSBhcHBlYXJhbmNlIHRoYXQgaXQgd2FzIG5ldmVyIHJlbmRlcmVkLlxuICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGVueXNkb3ZoYW4vd3RmanM/dGFiPXJlYWRtZS1vdi1maWxlI2FuLWluZmluaXRlLXRpbWVvdXRcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmdUaW1lLmN1cnJlbnQgPT09IEluZmluaXR5KSByZXR1cm47XG4gICAgICAgICAgICBjbG9zZVRpbWVyU3RhcnRUaW1lUmVmLmN1cnJlbnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIC8vIExldCB0aGUgdG9hc3Qga25vdyBpdCBoYXMgc3RhcnRlZFxuICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgICAgIHRvYXN0Lm9uQXV0b0Nsb3NlID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdC5vbkF1dG9DbG9zZS5jYWxsKHRvYXN0LCB0b2FzdCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgICAgIH0sIHJlbWFpbmluZ1RpbWUuY3VycmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChleHBhbmRlZCB8fCBpbnRlcmFjdGluZyB8fCBpc0RvY3VtZW50SGlkZGVuKSB7XG4gICAgICAgICAgICBwYXVzZVRpbWVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFydFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpPT5jbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9LCBbXG4gICAgICAgIGV4cGFuZGVkLFxuICAgICAgICBpbnRlcmFjdGluZyxcbiAgICAgICAgdG9hc3QsXG4gICAgICAgIHRvYXN0VHlwZSxcbiAgICAgICAgaXNEb2N1bWVudEhpZGRlbixcbiAgICAgICAgZGVsZXRlVG9hc3RcbiAgICBdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKHRvYXN0LmRlbGV0ZSkge1xuICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgICAgIHRvYXN0Lm9uRGlzbWlzcyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3Qub25EaXNtaXNzLmNhbGwodG9hc3QsIHRvYXN0KTtcbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgZGVsZXRlVG9hc3QsXG4gICAgICAgIHRvYXN0LmRlbGV0ZVxuICAgIF0pO1xuICAgIGZ1bmN0aW9uIGdldExvYWRpbmdJY29uKCkge1xuICAgICAgICB2YXIgX3RvYXN0X2NsYXNzTmFtZXM7XG4gICAgICAgIGlmIChpY29ucyA9PSBudWxsID8gdm9pZCAwIDogaWNvbnMubG9hZGluZykge1xuICAgICAgICAgICAgdmFyIF90b2FzdF9jbGFzc05hbWVzMTtcbiAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5sb2FkZXIsIHRvYXN0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RvYXN0X2NsYXNzTmFtZXMxID0gdG9hc3QuY2xhc3NOYW1lcykgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdF9jbGFzc05hbWVzMS5sb2FkZXIsICdzb25uZXItbG9hZGVyJyksXG4gICAgICAgICAgICAgICAgXCJkYXRhLXZpc2libGVcIjogdG9hc3RUeXBlID09PSAnbG9hZGluZydcbiAgICAgICAgICAgIH0sIGljb25zLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGVyLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGNuKGNsYXNzTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMubG9hZGVyLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzID0gdG9hc3QuY2xhc3NOYW1lcykgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdF9jbGFzc05hbWVzLmxvYWRlciksXG4gICAgICAgICAgICB2aXNpYmxlOiB0b2FzdFR5cGUgPT09ICdsb2FkaW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaWNvbiA9IHRvYXN0Lmljb24gfHwgKGljb25zID09IG51bGwgPyB2b2lkIDAgOiBpY29uc1t0b2FzdFR5cGVdKSB8fCBnZXRBc3NldCh0b2FzdFR5cGUpO1xuICAgIHZhciBfdG9hc3RfcmljaENvbG9ycywgX2ljb25zX2Nsb3NlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICByZWY6IHRvYXN0UmVmLFxuICAgICAgICBjbGFzc05hbWU6IGNuKGNsYXNzTmFtZSwgdG9hc3RDbGFzc25hbWUsIGNsYXNzTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudG9hc3QsIHRvYXN0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RvYXN0X2NsYXNzTmFtZXMgPSB0b2FzdC5jbGFzc05hbWVzKSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0X2NsYXNzTmFtZXMudG9hc3QsIGNsYXNzTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuZGVmYXVsdCwgY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lc1t0b2FzdFR5cGVdLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzMSA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczFbdG9hc3RUeXBlXSksXG4gICAgICAgIFwiZGF0YS1zb25uZXItdG9hc3RcIjogXCJcIixcbiAgICAgICAgXCJkYXRhLXJpY2gtY29sb3JzXCI6IChfdG9hc3RfcmljaENvbG9ycyA9IHRvYXN0LnJpY2hDb2xvcnMpICE9IG51bGwgPyBfdG9hc3RfcmljaENvbG9ycyA6IGRlZmF1bHRSaWNoQ29sb3JzLFxuICAgICAgICBcImRhdGEtc3R5bGVkXCI6ICFCb29sZWFuKHRvYXN0LmpzeCB8fCB0b2FzdC51bnN0eWxlZCB8fCB1bnN0eWxlZCksXG4gICAgICAgIFwiZGF0YS1tb3VudGVkXCI6IG1vdW50ZWQsXG4gICAgICAgIFwiZGF0YS1wcm9taXNlXCI6IEJvb2xlYW4odG9hc3QucHJvbWlzZSksXG4gICAgICAgIFwiZGF0YS1zd2lwZWRcIjogaXNTd2lwZWQsXG4gICAgICAgIFwiZGF0YS1yZW1vdmVkXCI6IHJlbW92ZWQsXG4gICAgICAgIFwiZGF0YS12aXNpYmxlXCI6IGlzVmlzaWJsZSxcbiAgICAgICAgXCJkYXRhLXktcG9zaXRpb25cIjogeSxcbiAgICAgICAgXCJkYXRhLXgtcG9zaXRpb25cIjogeCxcbiAgICAgICAgXCJkYXRhLWluZGV4XCI6IGluZGV4LFxuICAgICAgICBcImRhdGEtZnJvbnRcIjogaXNGcm9udCxcbiAgICAgICAgXCJkYXRhLXN3aXBpbmdcIjogc3dpcGluZyxcbiAgICAgICAgXCJkYXRhLWRpc21pc3NpYmxlXCI6IGRpc21pc3NpYmxlLFxuICAgICAgICBcImRhdGEtdHlwZVwiOiB0b2FzdFR5cGUsXG4gICAgICAgIFwiZGF0YS1pbnZlcnRcIjogaW52ZXJ0LFxuICAgICAgICBcImRhdGEtc3dpcGUtb3V0XCI6IHN3aXBlT3V0LFxuICAgICAgICBcImRhdGEtc3dpcGUtZGlyZWN0aW9uXCI6IHN3aXBlT3V0RGlyZWN0aW9uLFxuICAgICAgICBcImRhdGEtZXhwYW5kZWRcIjogQm9vbGVhbihleHBhbmRlZCB8fCBleHBhbmRCeURlZmF1bHQgJiYgbW91bnRlZCksXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogdG9hc3QudGVzdElkLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJy0taW5kZXgnOiBpbmRleCxcbiAgICAgICAgICAgICctLXRvYXN0cy1iZWZvcmUnOiBpbmRleCxcbiAgICAgICAgICAgICctLXotaW5kZXgnOiB0b2FzdHMubGVuZ3RoIC0gaW5kZXgsXG4gICAgICAgICAgICAnLS1vZmZzZXQnOiBgJHtyZW1vdmVkID8gb2Zmc2V0QmVmb3JlUmVtb3ZlIDogb2Zmc2V0LmN1cnJlbnR9cHhgLFxuICAgICAgICAgICAgJy0taW5pdGlhbC1oZWlnaHQnOiBleHBhbmRCeURlZmF1bHQgPyAnYXV0bycgOiBgJHtpbml0aWFsSGVpZ2h0fXB4YCxcbiAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgLi4udG9hc3Quc3R5bGVcbiAgICAgICAgfSxcbiAgICAgICAgb25EcmFnRW5kOiAoKT0+e1xuICAgICAgICAgICAgc2V0U3dpcGluZyhmYWxzZSk7XG4gICAgICAgICAgICBzZXRTd2lwZURpcmVjdGlvbihudWxsKTtcbiAgICAgICAgICAgIHBvaW50ZXJTdGFydFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogKGV2ZW50KT0+e1xuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMikgcmV0dXJuOyAvLyBSZXR1cm4gZWFybHkgb24gcmlnaHQgY2xpY2tcbiAgICAgICAgICAgIGlmIChkaXNhYmxlZCB8fCAhZGlzbWlzc2libGUpIHJldHVybjtcbiAgICAgICAgICAgIGRyYWdTdGFydFRpbWUuY3VycmVudCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBzZXRPZmZzZXRCZWZvcmVSZW1vdmUob2Zmc2V0LmN1cnJlbnQpO1xuICAgICAgICAgICAgLy8gRW5zdXJlIHdlIG1haW50YWluIGNvcnJlY3QgcG9pbnRlciBjYXB0dXJlIGV2ZW4gd2hlbiBnb2luZyBvdXRzaWRlIG9mIHRoZSB0b2FzdCAoZS5nLiB3aGVuIHN3aXBpbmcpXG4gICAgICAgICAgICBldmVudC50YXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHJldHVybjtcbiAgICAgICAgICAgIHNldFN3aXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICBwb2ludGVyU3RhcnRSZWYuY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uUG9pbnRlclVwOiAoKT0+e1xuICAgICAgICAgICAgdmFyIF90b2FzdFJlZl9jdXJyZW50LCBfdG9hc3RSZWZfY3VycmVudDEsIF9kcmFnU3RhcnRUaW1lX2N1cnJlbnQ7XG4gICAgICAgICAgICBpZiAoc3dpcGVPdXQgfHwgIWRpc21pc3NpYmxlKSByZXR1cm47XG4gICAgICAgICAgICBwb2ludGVyU3RhcnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBzd2lwZUFtb3VudFggPSBOdW1iZXIoKChfdG9hc3RSZWZfY3VycmVudCA9IHRvYXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RSZWZfY3VycmVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXN3aXBlLWFtb3VudC14JykucmVwbGFjZSgncHgnLCAnJykpIHx8IDApO1xuICAgICAgICAgICAgY29uc3Qgc3dpcGVBbW91bnRZID0gTnVtYmVyKCgoX3RvYXN0UmVmX2N1cnJlbnQxID0gdG9hc3RSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdFJlZl9jdXJyZW50MS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXN3aXBlLWFtb3VudC15JykucmVwbGFjZSgncHgnLCAnJykpIHx8IDApO1xuICAgICAgICAgICAgY29uc3QgdGltZVRha2VuID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSAoKF9kcmFnU3RhcnRUaW1lX2N1cnJlbnQgPSBkcmFnU3RhcnRUaW1lLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZHJhZ1N0YXJ0VGltZV9jdXJyZW50LmdldFRpbWUoKSk7XG4gICAgICAgICAgICBjb25zdCBzd2lwZUFtb3VudCA9IHN3aXBlRGlyZWN0aW9uID09PSAneCcgPyBzd2lwZUFtb3VudFggOiBzd2lwZUFtb3VudFk7XG4gICAgICAgICAgICBjb25zdCB2ZWxvY2l0eSA9IE1hdGguYWJzKHN3aXBlQW1vdW50KSAvIHRpbWVUYWtlbjtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhzd2lwZUFtb3VudCkgPj0gU1dJUEVfVEhSRVNIT0xEIHx8IHZlbG9jaXR5ID4gMC4xMSkge1xuICAgICAgICAgICAgICAgIHNldE9mZnNldEJlZm9yZVJlbW92ZShvZmZzZXQuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgdG9hc3Qub25EaXNtaXNzID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdC5vbkRpc21pc3MuY2FsbCh0b2FzdCwgdG9hc3QpO1xuICAgICAgICAgICAgICAgIGlmIChzd2lwZURpcmVjdGlvbiA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFN3aXBlT3V0RGlyZWN0aW9uKHN3aXBlQW1vdW50WCA+IDAgPyAncmlnaHQnIDogJ2xlZnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRTd2lwZU91dERpcmVjdGlvbihzd2lwZUFtb3VudFkgPiAwID8gJ2Rvd24nIDogJ3VwJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZVRvYXN0KCk7XG4gICAgICAgICAgICAgICAgc2V0U3dpcGVPdXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RvYXN0UmVmX2N1cnJlbnQyLCBfdG9hc3RSZWZfY3VycmVudDM7XG4gICAgICAgICAgICAgICAgKF90b2FzdFJlZl9jdXJyZW50MiA9IHRvYXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RSZWZfY3VycmVudDIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3dpcGUtYW1vdW50LXgnLCBgMHB4YCk7XG4gICAgICAgICAgICAgICAgKF90b2FzdFJlZl9jdXJyZW50MyA9IHRvYXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RSZWZfY3VycmVudDMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3dpcGUtYW1vdW50LXknLCBgMHB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRJc1N3aXBlZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRTd2lwaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIHNldFN3aXBlRGlyZWN0aW9uKG51bGwpO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiAoZXZlbnQpPT57XG4gICAgICAgICAgICB2YXIgX3dpbmRvd19nZXRTZWxlY3Rpb24sIC8vIEFwcGx5IHRyYW5zZm9ybSB1c2luZyBib3RoIHggYW5kIHkgdmFsdWVzXG4gICAgICAgICAgICBfdG9hc3RSZWZfY3VycmVudCwgX3RvYXN0UmVmX2N1cnJlbnQxO1xuICAgICAgICAgICAgaWYgKCFwb2ludGVyU3RhcnRSZWYuY3VycmVudCB8fCAhZGlzbWlzc2libGUpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGlzSGlnaGxpZ2h0ZWQgPSAoKF93aW5kb3dfZ2V0U2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpKSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvd19nZXRTZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGgpID4gMDtcbiAgICAgICAgICAgIGlmIChpc0hpZ2hsaWdodGVkKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB5RGVsdGEgPSBldmVudC5jbGllbnRZIC0gcG9pbnRlclN0YXJ0UmVmLmN1cnJlbnQueTtcbiAgICAgICAgICAgIGNvbnN0IHhEZWx0YSA9IGV2ZW50LmNsaWVudFggLSBwb2ludGVyU3RhcnRSZWYuY3VycmVudC54O1xuICAgICAgICAgICAgdmFyIF9wcm9wc19zd2lwZURpcmVjdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBzd2lwZURpcmVjdGlvbnMgPSAoX3Byb3BzX3N3aXBlRGlyZWN0aW9ucyA9IHByb3BzLnN3aXBlRGlyZWN0aW9ucykgIT0gbnVsbCA/IF9wcm9wc19zd2lwZURpcmVjdGlvbnMgOiBnZXREZWZhdWx0U3dpcGVEaXJlY3Rpb25zKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIC8vIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gaWYgbm90IGFscmVhZHkgbG9ja2VkXG4gICAgICAgICAgICBpZiAoIXN3aXBlRGlyZWN0aW9uICYmIChNYXRoLmFicyh4RGVsdGEpID4gMSB8fCBNYXRoLmFicyh5RGVsdGEpID4gMSkpIHtcbiAgICAgICAgICAgICAgICBzZXRTd2lwZURpcmVjdGlvbihNYXRoLmFicyh4RGVsdGEpID4gTWF0aC5hYnMoeURlbHRhKSA/ICd4JyA6ICd5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3dpcGVBbW91bnQgPSB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZ2V0RGFtcGVuaW5nID0gKGRlbHRhKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhY3RvciA9IE1hdGguYWJzKGRlbHRhKSAvIDIwO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8gKDEuNSArIGZhY3Rvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gT25seSBhcHBseSBzd2lwZSBpbiB0aGUgbG9ja2VkIGRpcmVjdGlvblxuICAgICAgICAgICAgaWYgKHN3aXBlRGlyZWN0aW9uID09PSAneScpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdmVydGljYWwgc3dpcGVzXG4gICAgICAgICAgICAgICAgaWYgKHN3aXBlRGlyZWN0aW9ucy5pbmNsdWRlcygndG9wJykgfHwgc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCdib3R0b20nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCd0b3AnKSAmJiB5RGVsdGEgPCAwIHx8IHN3aXBlRGlyZWN0aW9ucy5pbmNsdWRlcygnYm90dG9tJykgJiYgeURlbHRhID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVBbW91bnQueSA9IHlEZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNtb290aGx5IHRyYW5zaXRpb24gdG8gZGFtcGVuZWQgbW92ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhbXBlbmVkRGVsdGEgPSB5RGVsdGEgKiBnZXREYW1wZW5pbmcoeURlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSBkb24ndCBqdW1wIHdoZW4gdHJhbnNpdGlvbmluZyB0byBkYW1wZW5lZCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVBbW91bnQueSA9IE1hdGguYWJzKGRhbXBlbmVkRGVsdGEpIDwgTWF0aC5hYnMoeURlbHRhKSA/IGRhbXBlbmVkRGVsdGEgOiB5RGVsdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN3aXBlRGlyZWN0aW9uID09PSAneCcpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaG9yaXpvbnRhbCBzd2lwZXNcbiAgICAgICAgICAgICAgICBpZiAoc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCdsZWZ0JykgfHwgc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCdyaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzd2lwZURpcmVjdGlvbnMuaW5jbHVkZXMoJ2xlZnQnKSAmJiB4RGVsdGEgPCAwIHx8IHN3aXBlRGlyZWN0aW9ucy5pbmNsdWRlcygncmlnaHQnKSAmJiB4RGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUFtb3VudC54ID0geERlbHRhO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU21vb3RobHkgdHJhbnNpdGlvbiB0byBkYW1wZW5lZCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGFtcGVuZWREZWx0YSA9IHhEZWx0YSAqIGdldERhbXBlbmluZyh4RGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlIGRvbid0IGp1bXAgd2hlbiB0cmFuc2l0aW9uaW5nIHRvIGRhbXBlbmVkIG1vdmVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUFtb3VudC54ID0gTWF0aC5hYnMoZGFtcGVuZWREZWx0YSkgPCBNYXRoLmFicyh4RGVsdGEpID8gZGFtcGVuZWREZWx0YSA6IHhEZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhzd2lwZUFtb3VudC54KSA+IDAgfHwgTWF0aC5hYnMoc3dpcGVBbW91bnQueSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTd2lwZWQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX3RvYXN0UmVmX2N1cnJlbnQgPSB0b2FzdFJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0UmVmX2N1cnJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3dpcGUtYW1vdW50LXgnLCBgJHtzd2lwZUFtb3VudC54fXB4YCk7XG4gICAgICAgICAgICAoX3RvYXN0UmVmX2N1cnJlbnQxID0gdG9hc3RSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdFJlZl9jdXJyZW50MS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zd2lwZS1hbW91bnQteScsIGAke3N3aXBlQW1vdW50Lnl9cHhgKTtcbiAgICAgICAgfVxuICAgIH0sIGNsb3NlQnV0dG9uICYmICF0b2FzdC5qc3ggJiYgdG9hc3RUeXBlICE9PSAnbG9hZGluZycgPyAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICBcImFyaWEtbGFiZWxcIjogY2xvc2VCdXR0b25BcmlhTGFiZWwsXG4gICAgICAgIFwiZGF0YS1kaXNhYmxlZFwiOiBkaXNhYmxlZCxcbiAgICAgICAgXCJkYXRhLWNsb3NlLWJ1dHRvblwiOiB0cnVlLFxuICAgICAgICBvbkNsaWNrOiBkaXNhYmxlZCB8fCAhZGlzbWlzc2libGUgPyAoKT0+e30gOiAoKT0+e1xuICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgICAgIHRvYXN0Lm9uRGlzbWlzcyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3Qub25EaXNtaXNzLmNhbGwodG9hc3QsIHRvYXN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbihjbGFzc05hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmNsb3NlQnV0dG9uLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzMiA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczIuY2xvc2VCdXR0b24pXG4gICAgfSwgKF9pY29uc19jbG9zZSA9IGljb25zID09IG51bGwgPyB2b2lkIDAgOiBpY29ucy5jbG9zZSkgIT0gbnVsbCA/IF9pY29uc19jbG9zZSA6IENsb3NlSWNvbikgOiBudWxsLCAodG9hc3RUeXBlIHx8IHRvYXN0Lmljb24gfHwgdG9hc3QucHJvbWlzZSkgJiYgdG9hc3QuaWNvbiAhPT0gbnVsbCAmJiAoKGljb25zID09IG51bGwgPyB2b2lkIDAgOiBpY29uc1t0b2FzdFR5cGVdKSAhPT0gbnVsbCB8fCB0b2FzdC5pY29uKSA/IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS1pY29uXCI6IFwiXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5pY29uLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzMyA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczMuaWNvbilcbiAgICB9LCB0b2FzdC5wcm9taXNlIHx8IHRvYXN0LnR5cGUgPT09ICdsb2FkaW5nJyAmJiAhdG9hc3QuaWNvbiA/IHRvYXN0Lmljb24gfHwgZ2V0TG9hZGluZ0ljb24oKSA6IG51bGwsIHRvYXN0LnR5cGUgIT09ICdsb2FkaW5nJyA/IGljb24gOiBudWxsKSA6IG51bGwsIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS1jb250ZW50XCI6IFwiXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5jb250ZW50LCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzNCA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczQuY29udGVudClcbiAgICB9LCAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGl0bGVcIjogXCJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBjbihjbGFzc05hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjbGFzc05hbWVzLnRpdGxlLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzNSA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczUudGl0bGUpXG4gICAgfSwgdG9hc3QuanN4ID8gdG9hc3QuanN4IDogdHlwZW9mIHRvYXN0LnRpdGxlID09PSAnZnVuY3Rpb24nID8gdG9hc3QudGl0bGUoKSA6IHRvYXN0LnRpdGxlKSwgdG9hc3QuZGVzY3JpcHRpb24gPyAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBjbihkZXNjcmlwdGlvbkNsYXNzTmFtZSwgdG9hc3REZXNjcmlwdGlvbkNsYXNzbmFtZSwgY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5kZXNjcmlwdGlvbiwgdG9hc3QgPT0gbnVsbCA/IHZvaWQgMCA6IChfdG9hc3RfY2xhc3NOYW1lczYgPSB0b2FzdC5jbGFzc05hbWVzKSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0X2NsYXNzTmFtZXM2LmRlc2NyaXB0aW9uKVxuICAgIH0sIHR5cGVvZiB0b2FzdC5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRvYXN0LmRlc2NyaXB0aW9uKCkgOiB0b2FzdC5kZXNjcmlwdGlvbikgOiBudWxsKSwgLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudCh0b2FzdC5jYW5jZWwpID8gdG9hc3QuY2FuY2VsIDogdG9hc3QuY2FuY2VsICYmIGlzQWN0aW9uKHRvYXN0LmNhbmNlbCkgPyAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICBcImRhdGEtYnV0dG9uXCI6IHRydWUsXG4gICAgICAgIFwiZGF0YS1jYW5jZWxcIjogdHJ1ZSxcbiAgICAgICAgc3R5bGU6IHRvYXN0LmNhbmNlbEJ1dHRvblN0eWxlIHx8IGNhbmNlbEJ1dHRvblN0eWxlLFxuICAgICAgICBvbkNsaWNrOiAoZXZlbnQpPT57XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHR3aWNlIGJlY2F1c2UgdHlwZXNjcmlwdFxuICAgICAgICAgICAgaWYgKCFpc0FjdGlvbih0b2FzdC5jYW5jZWwpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWRpc21pc3NpYmxlKSByZXR1cm47XG4gICAgICAgICAgICB0b2FzdC5jYW5jZWwub25DbGljayA9PSBudWxsID8gdm9pZCAwIDogdG9hc3QuY2FuY2VsLm9uQ2xpY2suY2FsbCh0b2FzdC5jYW5jZWwsIGV2ZW50KTtcbiAgICAgICAgICAgIGRlbGV0ZVRvYXN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5jYW5jZWxCdXR0b24sIHRvYXN0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RvYXN0X2NsYXNzTmFtZXM3ID0gdG9hc3QuY2xhc3NOYW1lcykgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdF9jbGFzc05hbWVzNy5jYW5jZWxCdXR0b24pXG4gICAgfSwgdG9hc3QuY2FuY2VsLmxhYmVsKSA6IG51bGwsIC8qI19fUFVSRV9fKi8gUmVhY3QuaXNWYWxpZEVsZW1lbnQodG9hc3QuYWN0aW9uKSA/IHRvYXN0LmFjdGlvbiA6IHRvYXN0LmFjdGlvbiAmJiBpc0FjdGlvbih0b2FzdC5hY3Rpb24pID8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgXCJkYXRhLWJ1dHRvblwiOiB0cnVlLFxuICAgICAgICBcImRhdGEtYWN0aW9uXCI6IHRydWUsXG4gICAgICAgIHN0eWxlOiB0b2FzdC5hY3Rpb25CdXR0b25TdHlsZSB8fCBhY3Rpb25CdXR0b25TdHlsZSxcbiAgICAgICAgb25DbGljazogKGV2ZW50KT0+e1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0d2ljZSBiZWNhdXNlIHR5cGVzY3JpcHRcbiAgICAgICAgICAgIGlmICghaXNBY3Rpb24odG9hc3QuYWN0aW9uKSkgcmV0dXJuO1xuICAgICAgICAgICAgdG9hc3QuYWN0aW9uLm9uQ2xpY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHRvYXN0LmFjdGlvbi5vbkNsaWNrLmNhbGwodG9hc3QuYWN0aW9uLCBldmVudCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbihjbGFzc05hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmFjdGlvbkJ1dHRvbiwgdG9hc3QgPT0gbnVsbCA/IHZvaWQgMCA6IChfdG9hc3RfY2xhc3NOYW1lczggPSB0b2FzdC5jbGFzc05hbWVzKSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0X2NsYXNzTmFtZXM4LmFjdGlvbkJ1dHRvbilcbiAgICB9LCB0b2FzdC5hY3Rpb24ubGFiZWwpIDogbnVsbCk7XG59O1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnREaXJlY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ2x0cic7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnbHRyJzsgLy8gRm9yIEZyZXNoIHB1cnBvc2VcbiAgICBjb25zdCBkaXJBdHRyaWJ1dGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKTtcbiAgICBpZiAoZGlyQXR0cmlidXRlID09PSAnYXV0bycgfHwgIWRpckF0dHJpYnV0ZSkge1xuICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5kaXJlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBkaXJBdHRyaWJ1dGU7XG59XG5mdW5jdGlvbiBhc3NpZ25PZmZzZXQoZGVmYXVsdE9mZnNldCwgbW9iaWxlT2Zmc2V0KSB7XG4gICAgY29uc3Qgc3R5bGVzID0ge307XG4gICAgW1xuICAgICAgICBkZWZhdWx0T2Zmc2V0LFxuICAgICAgICBtb2JpbGVPZmZzZXRcbiAgICBdLmZvckVhY2goKG9mZnNldCwgaW5kZXgpPT57XG4gICAgICAgIGNvbnN0IGlzTW9iaWxlID0gaW5kZXggPT09IDE7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGlzTW9iaWxlID8gJy0tbW9iaWxlLW9mZnNldCcgOiAnLS1vZmZzZXQnO1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBpc01vYmlsZSA/IE1PQklMRV9WSUVXUE9SVF9PRkZTRVQgOiBWSUVXUE9SVF9PRkZTRVQ7XG4gICAgICAgIGZ1bmN0aW9uIGFzc2lnbkFsbChvZmZzZXQpIHtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAndG9wJyxcbiAgICAgICAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICAgICAgICdib3R0b20nLFxuICAgICAgICAgICAgICAgICdsZWZ0J1xuICAgICAgICAgICAgXS5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICAgICAgc3R5bGVzW2Ake3ByZWZpeH0tJHtrZXl9YF0gPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IGAke29mZnNldH1weGAgOiBvZmZzZXQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGFzc2lnbkFsbChvZmZzZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ3RvcCcsXG4gICAgICAgICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAgICAgICAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAnbGVmdCdcbiAgICAgICAgICAgIF0uZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlc1tgJHtwcmVmaXh9LSR7a2V5fWBdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlc1tgJHtwcmVmaXh9LSR7a2V5fWBdID0gdHlwZW9mIG9mZnNldFtrZXldID09PSAnbnVtYmVyJyA/IGAke29mZnNldFtrZXldfXB4YCA6IG9mZnNldFtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzaWduQWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3R5bGVzO1xufVxuZnVuY3Rpb24gdXNlU29ubmVyKCkge1xuICAgIGNvbnN0IFthY3RpdmVUb2FzdHMsIHNldEFjdGl2ZVRvYXN0c10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIHJldHVybiBUb2FzdFN0YXRlLnN1YnNjcmliZSgodG9hc3QpPT57XG4gICAgICAgICAgICBpZiAodG9hc3QuZGlzbWlzcykge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBY3RpdmVUb2FzdHMoKHRvYXN0cyk9PnRvYXN0cy5maWx0ZXIoKHQpPT50LmlkICE9PSB0b2FzdC5pZCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQcmV2ZW50IGJhdGNoaW5nLCB0ZW1wIHNvbHV0aW9uLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKT0+e1xuICAgICAgICAgICAgICAgICAgICBzZXRBY3RpdmVUb2FzdHMoKHRvYXN0cyk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZFeGlzdGluZ1RvYXN0ID0gdG9hc3RzLmZpbmRJbmRleCgodCk9PnQuaWQgPT09IHRvYXN0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdG9hc3QgaWYgaXQgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mRXhpc3RpbmdUb2FzdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHMuc2xpY2UoMCwgaW5kZXhPZkV4aXN0aW5nVG9hc3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHNbaW5kZXhPZkV4aXN0aW5nVG9hc3RdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3RzLnNsaWNlKGluZGV4T2ZFeGlzdGluZ1RvYXN0ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0b2FzdHM6IGFjdGl2ZVRvYXN0c1xuICAgIH07XG59XG5jb25zdCBUb2FzdGVyID0gLyojX19QVVJFX18qLyBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFRvYXN0ZXIocHJvcHMsIHJlZikge1xuICAgIGNvbnN0IHsgaWQsIGludmVydCwgcG9zaXRpb24gPSAnYm90dG9tLXJpZ2h0JywgaG90a2V5ID0gW1xuICAgICAgICAnYWx0S2V5JyxcbiAgICAgICAgJ0tleVQnXG4gICAgXSwgZXhwYW5kLCBjbG9zZUJ1dHRvbiwgY2xhc3NOYW1lLCBvZmZzZXQsIG1vYmlsZU9mZnNldCwgdGhlbWUgPSAnbGlnaHQnLCByaWNoQ29sb3JzLCBkdXJhdGlvbiwgc3R5bGUsIHZpc2libGVUb2FzdHMgPSBWSVNJQkxFX1RPQVNUU19BTU9VTlQsIHRvYXN0T3B0aW9ucywgZGlyID0gZ2V0RG9jdW1lbnREaXJlY3Rpb24oKSwgZ2FwID0gR0FQLCBpY29ucywgY29udGFpbmVyQXJpYUxhYmVsID0gJ05vdGlmaWNhdGlvbnMnIH0gPSBwcm9wcztcbiAgICBjb25zdCBbdG9hc3RzLCBzZXRUb2FzdHNdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICAgIGNvbnN0IGZpbHRlcmVkVG9hc3RzID0gUmVhY3QudXNlTWVtbygoKT0+e1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2FzdHMuZmlsdGVyKCh0b2FzdCk9PnRvYXN0LnRvYXN0ZXJJZCA9PT0gaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2FzdHMuZmlsdGVyKCh0b2FzdCk9PiF0b2FzdC50b2FzdGVySWQpO1xuICAgIH0sIFtcbiAgICAgICAgdG9hc3RzLFxuICAgICAgICBpZFxuICAgIF0pO1xuICAgIGNvbnN0IHBvc3NpYmxlUG9zaXRpb25zID0gUmVhY3QudXNlTWVtbygoKT0+e1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFtcbiAgICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgIF0uY29uY2F0KGZpbHRlcmVkVG9hc3RzLmZpbHRlcigodG9hc3QpPT50b2FzdC5wb3NpdGlvbikubWFwKCh0b2FzdCk9PnRvYXN0LnBvc2l0aW9uKSkpKTtcbiAgICB9LCBbXG4gICAgICAgIGZpbHRlcmVkVG9hc3RzLFxuICAgICAgICBwb3NpdGlvblxuICAgIF0pO1xuICAgIGNvbnN0IFtoZWlnaHRzLCBzZXRIZWlnaHRzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgICBjb25zdCBbZXhwYW5kZWQsIHNldEV4cGFuZGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbaW50ZXJhY3RpbmcsIHNldEludGVyYWN0aW5nXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbYWN0dWFsVGhlbWUsIHNldEFjdHVhbFRoZW1lXSA9IFJlYWN0LnVzZVN0YXRlKHRoZW1lICE9PSAnc3lzdGVtJyA/IHRoZW1lIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnIDogJ2xpZ2h0Jyk7XG4gICAgY29uc3QgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBob3RrZXlMYWJlbCA9IGhvdGtleS5qb2luKCcrJykucmVwbGFjZSgvS2V5L2csICcnKS5yZXBsYWNlKC9EaWdpdC9nLCAnJyk7XG4gICAgY29uc3QgbGFzdEZvY3VzZWRFbGVtZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGlzRm9jdXNXaXRoaW5SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHJlbW92ZVRvYXN0ID0gUmVhY3QudXNlQ2FsbGJhY2soKHRvYXN0VG9SZW1vdmUpPT57XG4gICAgICAgIHNldFRvYXN0cygodG9hc3RzKT0+e1xuICAgICAgICAgICAgdmFyIF90b2FzdHNfZmluZDtcbiAgICAgICAgICAgIGlmICghKChfdG9hc3RzX2ZpbmQgPSB0b2FzdHMuZmluZCgodG9hc3QpPT50b2FzdC5pZCA9PT0gdG9hc3RUb1JlbW92ZS5pZCkpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RzX2ZpbmQuZGVsZXRlKSkge1xuICAgICAgICAgICAgICAgIFRvYXN0U3RhdGUuZGlzbWlzcyh0b2FzdFRvUmVtb3ZlLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b2FzdHMuZmlsdGVyKCh7IGlkIH0pPT5pZCAhPT0gdG9hc3RUb1JlbW92ZS5pZCk7XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgcmV0dXJuIFRvYXN0U3RhdGUuc3Vic2NyaWJlKCh0b2FzdCk9PntcbiAgICAgICAgICAgIGlmICh0b2FzdC5kaXNtaXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBiYXRjaGluZyBvZiBvdGhlciBzdGF0ZSB1cGRhdGVzXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHNldFRvYXN0cygodG9hc3RzKT0+dG9hc3RzLm1hcCgodCk9PnQuaWQgPT09IHRvYXN0LmlkID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZXZlbnQgYmF0Y2hpbmcsIHRlbXAgc29sdXRpb24uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHNldFRvYXN0cygodG9hc3RzKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhPZkV4aXN0aW5nVG9hc3QgPSB0b2FzdHMuZmluZEluZGV4KCh0KT0+dC5pZCA9PT0gdG9hc3QuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0b2FzdCBpZiBpdCBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZFeGlzdGluZ1RvYXN0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0cy5zbGljZSgwLCBpbmRleE9mRXhpc3RpbmdUb2FzdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0c1tpbmRleE9mRXhpc3RpbmdUb2FzdF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHMuc2xpY2UoaW5kZXhPZkV4aXN0aW5nVG9hc3QgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSwgW1xuICAgICAgICB0b2FzdHNcbiAgICBdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKHRoZW1lICE9PSAnc3lzdGVtJykge1xuICAgICAgICAgICAgc2V0QWN0dWFsVGhlbWUodGhlbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGVtZSA9PT0gJ3N5c3RlbScpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgcHJlZmVyZW5jZSBpcyBkYXJrXG4gICAgICAgICAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gaXQncyBjdXJyZW50bHkgZGFya1xuICAgICAgICAgICAgICAgIHNldEFjdHVhbFRoZW1lKCdkYXJrJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IGRhcmtcbiAgICAgICAgICAgICAgICBzZXRBY3R1YWxUaGVtZSgnbGlnaHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGFya01lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hyb21lICYgRmlyZWZveFxuICAgICAgICAgICAgZGFya01lZGlhUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKHsgbWF0Y2hlcyB9KT0+e1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEFjdHVhbFRoZW1lKCdkYXJrJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QWN0dWFsVGhlbWUoJ2xpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTYWZhcmkgPCAxNFxuICAgICAgICAgICAgZGFya01lZGlhUXVlcnkuYWRkTGlzdGVuZXIoKHsgbWF0Y2hlcyB9KT0+e1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBY3R1YWxUaGVtZSgnZGFyaycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWN0dWFsVGhlbWUoJ2xpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIHRoZW1lXG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIC8vIEVuc3VyZSBleHBhbmRlZCBpcyBhbHdheXMgZmFsc2Ugd2hlbiBubyB0b2FzdHMgYXJlIHByZXNlbnQgLyBvbmx5IG9uZSBsZWZ0XG4gICAgICAgIGlmICh0b2FzdHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHNldEV4cGFuZGVkKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgdG9hc3RzXG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQpPT57XG4gICAgICAgICAgICB2YXIgX2xpc3RSZWZfY3VycmVudDtcbiAgICAgICAgICAgIGNvbnN0IGlzSG90a2V5UHJlc3NlZCA9IGhvdGtleS5ldmVyeSgoa2V5KT0+ZXZlbnRba2V5XSB8fCBldmVudC5jb2RlID09PSBrZXkpO1xuICAgICAgICAgICAgaWYgKGlzSG90a2V5UHJlc3NlZCkge1xuICAgICAgICAgICAgICAgIHZhciBfbGlzdFJlZl9jdXJyZW50MTtcbiAgICAgICAgICAgICAgICBzZXRFeHBhbmRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAoX2xpc3RSZWZfY3VycmVudDEgPSBsaXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbGlzdFJlZl9jdXJyZW50MS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnICYmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBsaXN0UmVmLmN1cnJlbnQgfHwgKChfbGlzdFJlZl9jdXJyZW50ID0gbGlzdFJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2xpc3RSZWZfY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkpKSB7XG4gICAgICAgICAgICAgICAgc2V0RXhwYW5kZWQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIHJldHVybiAoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xuICAgIH0sIFtcbiAgICAgICAgaG90a2V5XG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmIChsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudC5mb2N1cyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNXaXRoaW5SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGxpc3RSZWYuY3VycmVudFxuICAgIF0pO1xuICAgIHJldHVybigvLyBSZW1vdmUgaXRlbSBmcm9tIG5vcm1hbCBuYXZpZ2F0aW9uIGZsb3csIG9ubHkgYXZhaWxhYmxlIHZpYSBob3RrZXlcbiAgICAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIHtcbiAgICAgICAgcmVmOiByZWYsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBgJHtjb250YWluZXJBcmlhTGFiZWx9ICR7aG90a2V5TGFiZWx9YCxcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLFxuICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwiZmFsc2VcIixcbiAgICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlXG4gICAgfSwgcG9zc2libGVQb3NpdGlvbnMubWFwKChwb3NpdGlvbiwgaW5kZXgpPT57XG4gICAgICAgIHZhciBfaGVpZ2h0c187XG4gICAgICAgIGNvbnN0IFt5LCB4XSA9IHBvc2l0aW9uLnNwbGl0KCctJyk7XG4gICAgICAgIGlmICghZmlsdGVyZWRUb2FzdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcIm9sXCIsIHtcbiAgICAgICAgICAgIGtleTogcG9zaXRpb24sXG4gICAgICAgICAgICBkaXI6IGRpciA9PT0gJ2F1dG8nID8gZ2V0RG9jdW1lbnREaXJlY3Rpb24oKSA6IGRpcixcbiAgICAgICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgICAgIHJlZjogbGlzdFJlZixcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgICAgXCJkYXRhLXNvbm5lci10b2FzdGVyXCI6IHRydWUsXG4gICAgICAgICAgICBcImRhdGEtc29ubmVyLXRoZW1lXCI6IGFjdHVhbFRoZW1lLFxuICAgICAgICAgICAgXCJkYXRhLXktcG9zaXRpb25cIjogeSxcbiAgICAgICAgICAgIFwiZGF0YS14LXBvc2l0aW9uXCI6IHgsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICctLWZyb250LXRvYXN0LWhlaWdodCc6IGAkeygoX2hlaWdodHNfID0gaGVpZ2h0c1swXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9oZWlnaHRzXy5oZWlnaHQpIHx8IDB9cHhgLFxuICAgICAgICAgICAgICAgICctLXdpZHRoJzogYCR7VE9BU1RfV0lEVEh9cHhgLFxuICAgICAgICAgICAgICAgICctLWdhcCc6IGAke2dhcH1weGAsXG4gICAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgICAgLi4uYXNzaWduT2Zmc2V0KG9mZnNldCwgbW9iaWxlT2Zmc2V0KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQmx1cjogKGV2ZW50KT0+e1xuICAgICAgICAgICAgICAgIGlmIChpc0ZvY3VzV2l0aGluUmVmLmN1cnJlbnQgJiYgIWV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNGb2N1c1dpdGhpblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRm9jdXM6IChldmVudCk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBpc05vdERpc21pc3NpYmxlID0gZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0LmRhdGFzZXQuZGlzbWlzc2libGUgPT09ICdmYWxzZSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm90RGlzbWlzc2libGUpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNXaXRoaW5SZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpc0ZvY3VzV2l0aGluUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uTW91c2VFbnRlcjogKCk9PnNldEV4cGFuZGVkKHRydWUpLFxuICAgICAgICAgICAgb25Nb3VzZU1vdmU6ICgpPT5zZXRFeHBhbmRlZCh0cnVlKSxcbiAgICAgICAgICAgIG9uTW91c2VMZWF2ZTogKCk9PntcbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGV4cGFuZGVkIHRvIGZhbHNlIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBhIHRvYXN0LCBlLmcuIHN3aXBpbmdcbiAgICAgICAgICAgICAgICBpZiAoIWludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEV4cGFuZGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EcmFnRW5kOiAoKT0+c2V0RXhwYW5kZWQoZmFsc2UpLFxuICAgICAgICAgICAgb25Qb2ludGVyRG93bjogKGV2ZW50KT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTm90RGlzbWlzc2libGUgPSBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC50YXJnZXQuZGF0YXNldC5kaXNtaXNzaWJsZSA9PT0gJ2ZhbHNlJztcbiAgICAgICAgICAgICAgICBpZiAoaXNOb3REaXNtaXNzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNldEludGVyYWN0aW5nKHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uUG9pbnRlclVwOiAoKT0+c2V0SW50ZXJhY3RpbmcoZmFsc2UpXG4gICAgICAgIH0sIGZpbHRlcmVkVG9hc3RzLmZpbHRlcigodG9hc3QpPT4hdG9hc3QucG9zaXRpb24gJiYgaW5kZXggPT09IDAgfHwgdG9hc3QucG9zaXRpb24gPT09IHBvc2l0aW9uKS5tYXAoKHRvYXN0LCBpbmRleCk9PntcbiAgICAgICAgICAgIHZhciBfdG9hc3RPcHRpb25zX2R1cmF0aW9uLCBfdG9hc3RPcHRpb25zX2Nsb3NlQnV0dG9uO1xuICAgICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChUb2FzdCwge1xuICAgICAgICAgICAgICAgIGtleTogdG9hc3QuaWQsXG4gICAgICAgICAgICAgICAgaWNvbnM6IGljb25zLFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB0b2FzdDogdG9hc3QsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFJpY2hDb2xvcnM6IHJpY2hDb2xvcnMsXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IChfdG9hc3RPcHRpb25zX2R1cmF0aW9uID0gdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuZHVyYXRpb24pICE9IG51bGwgPyBfdG9hc3RPcHRpb25zX2R1cmF0aW9uIDogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiB0b2FzdE9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvYXN0T3B0aW9ucy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25DbGFzc05hbWU6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLmRlc2NyaXB0aW9uQ2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgIGludmVydDogaW52ZXJ0LFxuICAgICAgICAgICAgICAgIHZpc2libGVUb2FzdHM6IHZpc2libGVUb2FzdHMsXG4gICAgICAgICAgICAgICAgY2xvc2VCdXR0b246IChfdG9hc3RPcHRpb25zX2Nsb3NlQnV0dG9uID0gdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuY2xvc2VCdXR0b24pICE9IG51bGwgPyBfdG9hc3RPcHRpb25zX2Nsb3NlQnV0dG9uIDogY2xvc2VCdXR0b24sXG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpbmc6IGludGVyYWN0aW5nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZTogdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgdW5zdHlsZWQ6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLnVuc3R5bGVkLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZXM6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLmNsYXNzTmFtZXMsXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uU3R5bGU6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLmNhbmNlbEJ1dHRvblN0eWxlLFxuICAgICAgICAgICAgICAgIGFjdGlvbkJ1dHRvblN0eWxlOiB0b2FzdE9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvYXN0T3B0aW9ucy5hY3Rpb25CdXR0b25TdHlsZSxcbiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuY2xvc2VCdXR0b25BcmlhTGFiZWwsXG4gICAgICAgICAgICAgICAgcmVtb3ZlVG9hc3Q6IHJlbW92ZVRvYXN0LFxuICAgICAgICAgICAgICAgIHRvYXN0czogZmlsdGVyZWRUb2FzdHMuZmlsdGVyKCh0KT0+dC5wb3NpdGlvbiA9PSB0b2FzdC5wb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgaGVpZ2h0czogaGVpZ2h0cy5maWx0ZXIoKGgpPT5oLnBvc2l0aW9uID09IHRvYXN0LnBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBzZXRIZWlnaHRzOiBzZXRIZWlnaHRzLFxuICAgICAgICAgICAgICAgIGV4cGFuZEJ5RGVmYXVsdDogZXhwYW5kLFxuICAgICAgICAgICAgICAgIGdhcDogZ2FwLFxuICAgICAgICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgICAgICAgICBzd2lwZURpcmVjdGlvbnM6IHByb3BzLnN3aXBlRGlyZWN0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9KSkpO1xufSk7XG5cbmV4cG9ydCB7IFRvYXN0ZXIsIHRvYXN0LCB1c2VTb25uZXIgfTtcbiJdLCJuYW1lcyI6WyJfX2luc2VydENTUyIsImNvZGUiLCJkb2N1bWVudCIsImhlYWQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInN0eWxlIiwiY3JlYXRlRWxlbWVudCIsInR5cGUiLCJhcHBlbmRDaGlsZCIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwiY3JlYXRlVGV4dE5vZGUiLCJSZWFjdCIsIlJlYWN0RE9NIiwiZ2V0QXNzZXQiLCJTdWNjZXNzSWNvbiIsIkluZm9JY29uIiwiV2FybmluZ0ljb24iLCJFcnJvckljb24iLCJiYXJzIiwiQXJyYXkiLCJmaWxsIiwiTG9hZGVyIiwidmlzaWJsZSIsImNsYXNzTmFtZSIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwibWFwIiwiXyIsImkiLCJrZXkiLCJ4bWxucyIsInZpZXdCb3giLCJoZWlnaHQiLCJ3aWR0aCIsImZpbGxSdWxlIiwiZCIsImNsaXBSdWxlIiwiQ2xvc2VJY29uIiwic3Ryb2tlIiwic3Ryb2tlV2lkdGgiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJ4MSIsInkxIiwieDIiLCJ5MiIsInVzZUlzRG9jdW1lbnRIaWRkZW4iLCJpc0RvY3VtZW50SGlkZGVuIiwic2V0SXNEb2N1bWVudEhpZGRlbiIsInVzZVN0YXRlIiwiaGlkZGVuIiwidXNlRWZmZWN0IiwiY2FsbGJhY2siLCJhZGRFdmVudExpc3RlbmVyIiwid2luZG93IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRvYXN0c0NvdW50ZXIiLCJPYnNlcnZlciIsInN1YnNjcmliZSIsInN1YnNjcmliZXIiLCJzdWJzY3JpYmVycyIsInB1c2giLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJwdWJsaXNoIiwiZGF0YSIsImZvckVhY2giLCJhZGRUb2FzdCIsInRvYXN0cyIsImNyZWF0ZSIsIl9kYXRhX2lkIiwibWVzc2FnZSIsInJlc3QiLCJpZCIsImxlbmd0aCIsImFscmVhZHlFeGlzdHMiLCJmaW5kIiwidG9hc3QiLCJkaXNtaXNzaWJsZSIsInVuZGVmaW5lZCIsImRpc21pc3NlZFRvYXN0cyIsImhhcyIsImRlbGV0ZSIsInRpdGxlIiwiZGlzbWlzcyIsImFkZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImVycm9yIiwic3VjY2VzcyIsImluZm8iLCJ3YXJuaW5nIiwibG9hZGluZyIsInByb21pc2UiLCJkZXNjcmlwdGlvbiIsInAiLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZ1bmN0aW9uIiwic2hvdWxkRGlzbWlzcyIsInJlc3VsdCIsIm9yaWdpbmFsUHJvbWlzZSIsInRoZW4iLCJyZXNwb25zZSIsImlzUmVhY3RFbGVtZW50UmVzcG9uc2UiLCJpc1ZhbGlkRWxlbWVudCIsImlzSHR0cFJlc3BvbnNlIiwib2siLCJwcm9taXNlRGF0YSIsInN0YXR1cyIsImlzRXh0ZW5kZWRSZXN1bHQiLCJ0b2FzdFNldHRpbmdzIiwiRXJyb3IiLCJjYXRjaCIsImZpbmFsbHkiLCJjYWxsIiwidW53cmFwIiwicmVqZWN0IiwiT2JqZWN0IiwiYXNzaWduIiwiY3VzdG9tIiwianN4IiwiZ2V0QWN0aXZlVG9hc3RzIiwiU2V0IiwiVG9hc3RTdGF0ZSIsInRvYXN0RnVuY3Rpb24iLCJiYXNpY1RvYXN0IiwiZ2V0SGlzdG9yeSIsImdldFRvYXN0cyIsImlzQWN0aW9uIiwiYWN0aW9uIiwibGFiZWwiLCJWSVNJQkxFX1RPQVNUU19BTU9VTlQiLCJWSUVXUE9SVF9PRkZTRVQiLCJNT0JJTEVfVklFV1BPUlRfT0ZGU0VUIiwiVE9BU1RfTElGRVRJTUUiLCJUT0FTVF9XSURUSCIsIkdBUCIsIlNXSVBFX1RIUkVTSE9MRCIsIlRJTUVfQkVGT1JFX1VOTU9VTlQiLCJjbiIsImNsYXNzZXMiLCJnZXREZWZhdWx0U3dpcGVEaXJlY3Rpb25zIiwicG9zaXRpb24iLCJ5IiwieCIsInNwbGl0IiwiZGlyZWN0aW9ucyIsIlRvYXN0IiwicHJvcHMiLCJfdG9hc3RfY2xhc3NOYW1lcyIsIl90b2FzdF9jbGFzc05hbWVzMSIsIl90b2FzdF9jbGFzc05hbWVzMiIsIl90b2FzdF9jbGFzc05hbWVzMyIsIl90b2FzdF9jbGFzc05hbWVzNCIsIl90b2FzdF9jbGFzc05hbWVzNSIsIl90b2FzdF9jbGFzc05hbWVzNiIsIl90b2FzdF9jbGFzc05hbWVzNyIsIl90b2FzdF9jbGFzc05hbWVzOCIsImludmVydCIsIlRvYXN0ZXJJbnZlcnQiLCJ1bnN0eWxlZCIsImludGVyYWN0aW5nIiwic2V0SGVpZ2h0cyIsInZpc2libGVUb2FzdHMiLCJoZWlnaHRzIiwiZXhwYW5kZWQiLCJyZW1vdmVUb2FzdCIsImRlZmF1bHRSaWNoQ29sb3JzIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkZyb21Ub2FzdGVyIiwiY2FuY2VsQnV0dG9uU3R5bGUiLCJhY3Rpb25CdXR0b25TdHlsZSIsImRlc2NyaXB0aW9uQ2xhc3NOYW1lIiwiZHVyYXRpb24iLCJkdXJhdGlvbkZyb21Ub2FzdGVyIiwiZ2FwIiwiZXhwYW5kQnlEZWZhdWx0IiwiY2xhc3NOYW1lcyIsImljb25zIiwiY2xvc2VCdXR0b25BcmlhTGFiZWwiLCJzd2lwZURpcmVjdGlvbiIsInNldFN3aXBlRGlyZWN0aW9uIiwic3dpcGVPdXREaXJlY3Rpb24iLCJzZXRTd2lwZU91dERpcmVjdGlvbiIsIm1vdW50ZWQiLCJzZXRNb3VudGVkIiwicmVtb3ZlZCIsInNldFJlbW92ZWQiLCJzd2lwaW5nIiwic2V0U3dpcGluZyIsInN3aXBlT3V0Iiwic2V0U3dpcGVPdXQiLCJpc1N3aXBlZCIsInNldElzU3dpcGVkIiwib2Zmc2V0QmVmb3JlUmVtb3ZlIiwic2V0T2Zmc2V0QmVmb3JlUmVtb3ZlIiwiaW5pdGlhbEhlaWdodCIsInNldEluaXRpYWxIZWlnaHQiLCJyZW1haW5pbmdUaW1lIiwidXNlUmVmIiwiZHJhZ1N0YXJ0VGltZSIsInRvYXN0UmVmIiwiaXNGcm9udCIsImlzVmlzaWJsZSIsInRvYXN0VHlwZSIsInRvYXN0Q2xhc3NuYW1lIiwidG9hc3REZXNjcmlwdGlvbkNsYXNzbmFtZSIsImhlaWdodEluZGV4IiwidXNlTWVtbyIsImZpbmRJbmRleCIsInRvYXN0SWQiLCJfdG9hc3RfY2xvc2VCdXR0b24iLCJjbG9zZVRpbWVyU3RhcnRUaW1lUmVmIiwib2Zmc2V0IiwibGFzdENsb3NlVGltZXJTdGFydFRpbWVSZWYiLCJwb2ludGVyU3RhcnRSZWYiLCJ0b2FzdHNIZWlnaHRCZWZvcmUiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInJlZHVjZXJJbmRleCIsImRpc2FibGVkIiwiY3VycmVudCIsInRvYXN0Tm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImgiLCJ1c2VMYXlvdXRFZmZlY3QiLCJvcmlnaW5hbEhlaWdodCIsIm5ld0hlaWdodCIsImNhbmNlbCIsImRlbGV0ZVRvYXN0IiwidXNlQ2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiSW5maW5pdHkiLCJ0aW1lb3V0SWQiLCJwYXVzZVRpbWVyIiwiZWxhcHNlZFRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsInN0YXJ0VGltZXIiLCJvbkF1dG9DbG9zZSIsImNsZWFyVGltZW91dCIsIm9uRGlzbWlzcyIsImdldExvYWRpbmdJY29uIiwibG9hZGVyIiwiaWNvbiIsIl90b2FzdF9yaWNoQ29sb3JzIiwiX2ljb25zX2Nsb3NlIiwidGFiSW5kZXgiLCJyZWYiLCJkZWZhdWx0IiwicmljaENvbG9ycyIsInRlc3RJZCIsIm9uRHJhZ0VuZCIsIm9uUG9pbnRlckRvd24iLCJldmVudCIsImJ1dHRvbiIsInRhcmdldCIsInNldFBvaW50ZXJDYXB0dXJlIiwicG9pbnRlcklkIiwidGFnTmFtZSIsImNsaWVudFgiLCJjbGllbnRZIiwib25Qb2ludGVyVXAiLCJfdG9hc3RSZWZfY3VycmVudCIsIl90b2FzdFJlZl9jdXJyZW50MSIsIl9kcmFnU3RhcnRUaW1lX2N1cnJlbnQiLCJzd2lwZUFtb3VudFgiLCJOdW1iZXIiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicmVwbGFjZSIsInN3aXBlQW1vdW50WSIsInRpbWVUYWtlbiIsInN3aXBlQW1vdW50IiwidmVsb2NpdHkiLCJNYXRoIiwiYWJzIiwiX3RvYXN0UmVmX2N1cnJlbnQyIiwiX3RvYXN0UmVmX2N1cnJlbnQzIiwic2V0UHJvcGVydHkiLCJvblBvaW50ZXJNb3ZlIiwiX3dpbmRvd19nZXRTZWxlY3Rpb24iLCJpc0hpZ2hsaWdodGVkIiwiZ2V0U2VsZWN0aW9uIiwidG9TdHJpbmciLCJ5RGVsdGEiLCJ4RGVsdGEiLCJfcHJvcHNfc3dpcGVEaXJlY3Rpb25zIiwic3dpcGVEaXJlY3Rpb25zIiwiZ2V0RGFtcGVuaW5nIiwiZGVsdGEiLCJmYWN0b3IiLCJpbmNsdWRlcyIsImRhbXBlbmVkRGVsdGEiLCJvbkNsaWNrIiwiY2xvc2UiLCJjb250ZW50IiwiY2FuY2VsQnV0dG9uIiwiZGVmYXVsdFByZXZlbnRlZCIsImFjdGlvbkJ1dHRvbiIsImdldERvY3VtZW50RGlyZWN0aW9uIiwiZGlyQXR0cmlidXRlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0QXR0cmlidXRlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImRpcmVjdGlvbiIsImFzc2lnbk9mZnNldCIsImRlZmF1bHRPZmZzZXQiLCJtb2JpbGVPZmZzZXQiLCJzdHlsZXMiLCJpc01vYmlsZSIsInByZWZpeCIsImRlZmF1bHRWYWx1ZSIsImFzc2lnbkFsbCIsInVzZVNvbm5lciIsImFjdGl2ZVRvYXN0cyIsInNldEFjdGl2ZVRvYXN0cyIsImZsdXNoU3luYyIsInQiLCJpbmRleE9mRXhpc3RpbmdUb2FzdCIsInNsaWNlIiwiVG9hc3RlciIsImZvcndhcmRSZWYiLCJob3RrZXkiLCJleHBhbmQiLCJ0aGVtZSIsInRvYXN0T3B0aW9ucyIsImRpciIsImNvbnRhaW5lckFyaWFMYWJlbCIsInNldFRvYXN0cyIsImZpbHRlcmVkVG9hc3RzIiwidG9hc3RlcklkIiwicG9zc2libGVQb3NpdGlvbnMiLCJmcm9tIiwiY29uY2F0Iiwic2V0RXhwYW5kZWQiLCJzZXRJbnRlcmFjdGluZyIsImFjdHVhbFRoZW1lIiwic2V0QWN0dWFsVGhlbWUiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsImxpc3RSZWYiLCJob3RrZXlMYWJlbCIsImxhc3RGb2N1c2VkRWxlbWVudFJlZiIsImlzRm9jdXNXaXRoaW5SZWYiLCJ0b2FzdFRvUmVtb3ZlIiwiX3RvYXN0c19maW5kIiwiZGFya01lZGlhUXVlcnkiLCJhZGRMaXN0ZW5lciIsImUiLCJjb25zb2xlIiwiaGFuZGxlS2V5RG93biIsIl9saXN0UmVmX2N1cnJlbnQiLCJpc0hvdGtleVByZXNzZWQiLCJldmVyeSIsIl9saXN0UmVmX2N1cnJlbnQxIiwiZm9jdXMiLCJhY3RpdmVFbGVtZW50IiwiY29udGFpbnMiLCJwcmV2ZW50U2Nyb2xsIiwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiwiX2hlaWdodHNfIiwib25CbHVyIiwiY3VycmVudFRhcmdldCIsInJlbGF0ZWRUYXJnZXQiLCJvbkZvY3VzIiwiaXNOb3REaXNtaXNzaWJsZSIsIkhUTUxFbGVtZW50IiwiZGF0YXNldCIsIm9uTW91c2VFbnRlciIsIm9uTW91c2VNb3ZlIiwib25Nb3VzZUxlYXZlIiwiX3RvYXN0T3B0aW9uc19kdXJhdGlvbiIsIl90b2FzdE9wdGlvbnNfY2xvc2VCdXR0b24iXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/sonner/dist/index.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/tailwind-merge/dist/bundle-mjs.mjs": /*!*********************************************************!*\ !*** ./node_modules/tailwind-merge/dist/bundle-mjs.mjs ***! \*********************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createTailwindMerge: () => (/* binding */ createTailwindMerge),\n/* harmony export */ extendTailwindMerge: () => (/* binding */ extendTailwindMerge),\n/* harmony export */ fromTheme: () => (/* binding */ fromTheme),\n/* harmony export */ getDefaultConfig: () => (/* binding */ getDefaultConfig),\n/* harmony export */ mergeConfigs: () => (/* binding */ mergeConfigs),\n/* harmony export */ twJoin: () => (/* binding */ twJoin),\n/* harmony export */ twMerge: () => (/* binding */ twMerge),\n/* harmony export */ validators: () => (/* binding */ validators)\n/* harmony export */ });\nconst CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift();\n }\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n const conflicts = conflictingClassGroups[classGroupId] || [];\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n }\n return conflicts;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[0];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart;\n }\n if (classPartObject.validators.length === 0) {\n return undefined;\n }\n const classRest = classParts.join(CLASS_PART_SEPARATOR);\n return classPartObject.validators.find(({\n validator\n }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property;\n }\n }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n prefix\n } = config;\n const classMap = {\n nextPart: new Map(),\n validators: []\n };\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme);\n });\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n classGroup.forEach(classDefinition => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n return;\n }\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId\n });\n return;\n }\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n });\n });\n};\nconst getPart = (classPartObject, path) => {\n let currentClassPartObject = classPartObject;\n path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: []\n });\n }\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n });\n return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\nconst getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {\n if (!prefix) {\n return classGroupEntries;\n }\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map(classDefinition => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition;\n }\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));\n }\n return classDefinition;\n });\n return [classGroupId, prefixedClassGroup];\n });\n};\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = new Map();\n let previousCache = new Map();\n const update = (key, value) => {\n cache.set(key, value);\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = new Map();\n }\n };\n return {\n get(key) {\n let value = cache.get(key);\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value);\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst createParseClassName = config => {\n const {\n separator,\n experimentalParseClassName\n } = config;\n const isSeparatorSingleCharacter = separator.length === 1;\n const firstSeparatorCharacter = separator[0];\n const separatorLength = separator.length;\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = className => {\n const modifiers = [];\n let bracketDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index];\n if (bracketDepth === 0) {\n if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + separatorLength;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') {\n bracketDepth++;\n } else if (currentCharacter === ']') {\n bracketDepth--;\n }\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);\n const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n };\n };\n if (experimentalParseClassName) {\n return className => experimentalParseClassName({\n className,\n parseClassName\n });\n }\n return parseClassName;\n};\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst sortModifiers = modifiers => {\n if (modifiers.length <= 1) {\n return modifiers;\n }\n const sortedModifiers = [];\n let unsortedModifiers = [];\n modifiers.forEach(modifier => {\n const isArbitraryVariant = modifier[0] === '[';\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n unsortedModifiers = [];\n } else {\n unsortedModifiers.push(modifier);\n }\n });\n sortedModifiers.push(...unsortedModifiers.sort());\n return sortedModifiers;\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition);\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n const variantModifier = sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < arguments.length) {\n if (argument = arguments[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n}\nconst toValue = mix => {\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall = initTailwindMerge;\n function initTailwindMerge(classList) {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n }\n function tailwindMerge(classList) {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n }\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments));\n };\n}\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || [];\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst stringLengths = /*#__PURE__*/new Set(['px', 'full', 'screen']);\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isLength = value => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, 'length', isLengthOnly);\nconst isNumber = value => Boolean(value) && !Number.isNaN(Number(value));\nconst isArbitraryNumber = value => getIsArbitraryValue(value, 'number', isNumber);\nconst isInteger = value => Boolean(value) && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst sizeLabels = /*#__PURE__*/new Set(['length', 'size', 'percentage']);\nconst isArbitrarySize = value => getIsArbitraryValue(value, sizeLabels, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, 'position', isNever);\nconst imageLabels = /*#__PURE__*/new Set(['image', 'url']);\nconst isArbitraryImage = value => getIsArbitraryValue(value, imageLabels, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, '', isShadow);\nconst isAny = () => true;\nconst getIsArbitraryValue = (value, label, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n const colors = fromTheme('colors');\n const spacing = fromTheme('spacing');\n const blur = fromTheme('blur');\n const brightness = fromTheme('brightness');\n const borderColor = fromTheme('borderColor');\n const borderRadius = fromTheme('borderRadius');\n const borderSpacing = fromTheme('borderSpacing');\n const borderWidth = fromTheme('borderWidth');\n const contrast = fromTheme('contrast');\n const grayscale = fromTheme('grayscale');\n const hueRotate = fromTheme('hueRotate');\n const invert = fromTheme('invert');\n const gap = fromTheme('gap');\n const gradientColorStops = fromTheme('gradientColorStops');\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions');\n const inset = fromTheme('inset');\n const margin = fromTheme('margin');\n const opacity = fromTheme('opacity');\n const padding = fromTheme('padding');\n const saturate = fromTheme('saturate');\n const scale = fromTheme('scale');\n const sepia = fromTheme('sepia');\n const skew = fromTheme('skew');\n const space = fromTheme('space');\n const translate = fromTheme('translate');\n const getOverscroll = () => ['auto', 'contain', 'none'];\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing];\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength];\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue];\n const getPositions = () => ['bottom', 'center', 'left', 'left-bottom', 'left-top', 'right', 'right-bottom', 'right-top', 'top'];\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'];\n const getBlendModes = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const getAlign = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'];\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue];\n const getBreaks = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary()\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', 'video', isArbitraryValue]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isTshirtSize]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': getBreaks()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': getBreaks()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: [...getPositions(), isArbitraryValue]\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: getOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': getOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': getOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: getOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': getOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': getOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: [inset]\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': [inset]\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': [inset]\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: [inset]\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: [inset]\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: [inset]\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: [inset]\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: [inset]\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: [inset]\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: ['auto', isInteger, isArbitraryValue]\n }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: getSpacingWithAutoAndArbitrary()\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['wrap', 'wrap-reverse', 'nowrap']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: ['1', 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: getZeroAndEmpty()\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: getZeroAndEmpty()\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: ['first', 'last', 'none', isInteger, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': [isAny]\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: ['auto', {\n span: ['full', isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': [isAny]\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: ['auto', {\n span: [isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: [gap]\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': [gap]\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': [gap]\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: ['normal', ...getAlign()]\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': ['start', 'end', 'center', 'stretch']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...getAlign(), 'baseline']\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline']\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': [...getAlign(), 'baseline']\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: [padding]\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: [padding]\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: [padding]\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: [padding]\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: [padding]\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: [padding]\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: [padding]\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: [padding]\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: [padding]\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: [margin]\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: [margin]\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: [margin]\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: [margin]\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: [margin]\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: [margin]\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: [margin]\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: [margin]\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: [margin]\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{\n 'space-x': [space]\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{\n 'space-y': [space]\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: ['auto', 'min', 'max', 'fit', 'svw', 'lvw', 'dvw', isArbitraryValue, spacing]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit']\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [isArbitraryValue, spacing, 'none', 'full', 'min', 'max', 'fit', 'prose', {\n screen: [isTshirtSize]\n }, isTshirtSize]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{\n size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit']\n }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', isTshirtSize, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black', isArbitraryNumber]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isAny]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest', isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': ['none', isNumber, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose', isLength, isArbitraryValue]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryValue]\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['none', 'disc', 'decimal', isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: [colors]\n }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{\n 'placeholder-opacity': [opacity]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: [colors]\n }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{\n 'text-opacity': [opacity]\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...getLineStyles(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: ['auto', 'from-font', isLength, isArbitraryLength]\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': ['auto', isLength, isArbitraryValue]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: [colors]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: getSpacingWithArbitrary()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryValue]\n }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{\n 'bg-opacity': [opacity]\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: [...getPositions(), isArbitraryPosition]\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: ['no-repeat', {\n repeat: ['', 'x', 'y', 'round', 'space']\n }]\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: ['auto', 'cover', 'contain', isArbitrarySize]\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: [colors]\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: [gradientColorStops]\n }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: [borderRadius]\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': [borderRadius]\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': [borderRadius]\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': [borderRadius]\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': [borderRadius]\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': [borderRadius]\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': [borderRadius]\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': [borderRadius]\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': [borderRadius]\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': [borderRadius]\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': [borderRadius]\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': [borderRadius]\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': [borderRadius]\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': [borderRadius]\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': [borderRadius]\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: [borderWidth]\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': [borderWidth]\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': [borderWidth]\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': [borderWidth]\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': [borderWidth]\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': [borderWidth]\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': [borderWidth]\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': [borderWidth]\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': [borderWidth]\n }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{\n 'border-opacity': [opacity]\n }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...getLineStyles(), 'hidden']\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{\n 'divide-x': [borderWidth]\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{\n 'divide-y': [borderWidth]\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{\n 'divide-opacity': [opacity]\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{\n divide: getLineStyles()\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: [borderColor]\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': [borderColor]\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': [borderColor]\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': [borderColor]\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': [borderColor]\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': [borderColor]\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': [borderColor]\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': [borderColor]\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': [borderColor]\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: [borderColor]\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: ['', ...getLineStyles()]\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isLength, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: [isLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: [colors]\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{\n ring: getLengthWithEmptyAndArbitrary()\n }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{\n ring: [colors]\n }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{\n 'ring-opacity': [opacity]\n }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{\n 'ring-offset': [isLength, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{\n 'ring-offset': [colors]\n }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{\n shadow: [isAny]\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [opacity]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': getBlendModes()\n }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: ['', 'none']\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: [blur]\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [brightness]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [contrast]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue]\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: [grayscale]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [hueRotate]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: [invert]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [saturate]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: [sepia]\n }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': ['', 'none']\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': [blur]\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [brightness]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [contrast]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': [grayscale]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [hueRotate]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': [invert]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [opacity]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [saturate]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': [sepia]\n }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': [borderSpacing]\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': [borderSpacing]\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': [borderSpacing]\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['none', 'all', '', 'colors', 'opacity', 'shadow', 'transform', isArbitraryValue]\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: getNumberAndArbitrary()\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: getNumberAndArbitrary()\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue]\n }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: ['', 'gpu', 'none']\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: [scale]\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': [scale]\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': [scale]\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: [isInteger, isArbitraryValue]\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': [translate]\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': [translate]\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': [skew]\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': [skew]\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: ['center', 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', isArbitraryValue]\n }],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: ['auto', colors]\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryValue]\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: [colors]\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['none', 'auto']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', 'y', 'x', '']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue]\n }],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: [colors, 'none']\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: [colors, 'none']\n }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n }\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'separator', separator);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n for (const configKey in override) {\n overrideConfigProperties(baseConfig[configKey], override[configKey]);\n }\n for (const key in extend) {\n mergeConfigProperties(baseConfig[key], extend[key]);\n }\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue);\n }\n }\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\n\n//# sourceMappingURL=bundle-mjs.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy90YWlsd2luZC1tZXJnZS9kaXN0L2J1bmRsZS1tanMubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxPQUFPLG1CQUFtQixrQkFBa0IsYUFBYTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwyQkFBMkI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNEg7QUFDNUgiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdGFpbHdpbmQtbWVyZ2UvZGlzdC9idW5kbGUtbWpzLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDTEFTU19QQVJUX1NFUEFSQVRPUiA9ICctJztcbmNvbnN0IGNyZWF0ZUNsYXNzR3JvdXBVdGlscyA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IGNsYXNzTWFwID0gY3JlYXRlQ2xhc3NNYXAoY29uZmlnKTtcbiAgY29uc3Qge1xuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cHMsXG4gICAgY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzXG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IGdldENsYXNzR3JvdXBJZCA9IGNsYXNzTmFtZSA9PiB7XG4gICAgY29uc3QgY2xhc3NQYXJ0cyA9IGNsYXNzTmFtZS5zcGxpdChDTEFTU19QQVJUX1NFUEFSQVRPUik7XG4gICAgLy8gQ2xhc3NlcyBsaWtlIGAtaW5zZXQtMWAgcHJvZHVjZSBhbiBlbXB0eSBzdHJpbmcgYXMgZmlyc3QgY2xhc3NQYXJ0LiBXZSBhc3N1bWUgdGhhdCBjbGFzc2VzIGZvciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgY29ycmVjdGx5IGFuZCByZW1vdmUgaXQgZnJvbSBjbGFzc1BhcnRzLlxuICAgIGlmIChjbGFzc1BhcnRzWzBdID09PSAnJyAmJiBjbGFzc1BhcnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY2xhc3NQYXJ0cy5zaGlmdCgpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0R3JvdXBSZWN1cnNpdmUoY2xhc3NQYXJ0cywgY2xhc3NNYXApIHx8IGdldEdyb3VwSWRGb3JBcmJpdHJhcnlQcm9wZXJ0eShjbGFzc05hbWUpO1xuICB9O1xuICBjb25zdCBnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHMgPSAoY2xhc3NHcm91cElkLCBoYXNQb3N0Zml4TW9kaWZpZXIpID0+IHtcbiAgICBjb25zdCBjb25mbGljdHMgPSBjb25mbGljdGluZ0NsYXNzR3JvdXBzW2NsYXNzR3JvdXBJZF0gfHwgW107XG4gICAgaWYgKGhhc1Bvc3RmaXhNb2RpZmllciAmJiBjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnNbY2xhc3NHcm91cElkXSkge1xuICAgICAgcmV0dXJuIFsuLi5jb25mbGljdHMsIC4uLmNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyc1tjbGFzc0dyb3VwSWRdXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZsaWN0cztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXRDbGFzc0dyb3VwSWQsXG4gICAgZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzXG4gIH07XG59O1xuY29uc3QgZ2V0R3JvdXBSZWN1cnNpdmUgPSAoY2xhc3NQYXJ0cywgY2xhc3NQYXJ0T2JqZWN0KSA9PiB7XG4gIGlmIChjbGFzc1BhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjbGFzc1BhcnRPYmplY3QuY2xhc3NHcm91cElkO1xuICB9XG4gIGNvbnN0IGN1cnJlbnRDbGFzc1BhcnQgPSBjbGFzc1BhcnRzWzBdO1xuICBjb25zdCBuZXh0Q2xhc3NQYXJ0T2JqZWN0ID0gY2xhc3NQYXJ0T2JqZWN0Lm5leHRQYXJ0LmdldChjdXJyZW50Q2xhc3NQYXJ0KTtcbiAgY29uc3QgY2xhc3NHcm91cEZyb21OZXh0Q2xhc3NQYXJ0ID0gbmV4dENsYXNzUGFydE9iamVjdCA/IGdldEdyb3VwUmVjdXJzaXZlKGNsYXNzUGFydHMuc2xpY2UoMSksIG5leHRDbGFzc1BhcnRPYmplY3QpIDogdW5kZWZpbmVkO1xuICBpZiAoY2xhc3NHcm91cEZyb21OZXh0Q2xhc3NQYXJ0KSB7XG4gICAgcmV0dXJuIGNsYXNzR3JvdXBGcm9tTmV4dENsYXNzUGFydDtcbiAgfVxuICBpZiAoY2xhc3NQYXJ0T2JqZWN0LnZhbGlkYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBjbGFzc1Jlc3QgPSBjbGFzc1BhcnRzLmpvaW4oQ0xBU1NfUEFSVF9TRVBBUkFUT1IpO1xuICByZXR1cm4gY2xhc3NQYXJ0T2JqZWN0LnZhbGlkYXRvcnMuZmluZCgoe1xuICAgIHZhbGlkYXRvclxuICB9KSA9PiB2YWxpZGF0b3IoY2xhc3NSZXN0KSk/LmNsYXNzR3JvdXBJZDtcbn07XG5jb25zdCBhcmJpdHJhcnlQcm9wZXJ0eVJlZ2V4ID0gL15cXFsoLispXFxdJC87XG5jb25zdCBnZXRHcm91cElkRm9yQXJiaXRyYXJ5UHJvcGVydHkgPSBjbGFzc05hbWUgPT4ge1xuICBpZiAoYXJiaXRyYXJ5UHJvcGVydHlSZWdleC50ZXN0KGNsYXNzTmFtZSkpIHtcbiAgICBjb25zdCBhcmJpdHJhcnlQcm9wZXJ0eUNsYXNzTmFtZSA9IGFyYml0cmFyeVByb3BlcnR5UmVnZXguZXhlYyhjbGFzc05hbWUpWzFdO1xuICAgIGNvbnN0IHByb3BlcnR5ID0gYXJiaXRyYXJ5UHJvcGVydHlDbGFzc05hbWU/LnN1YnN0cmluZygwLCBhcmJpdHJhcnlQcm9wZXJ0eUNsYXNzTmFtZS5pbmRleE9mKCc6JykpO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgLy8gSSB1c2UgdHdvIGRvdHMgaGVyZSBiZWNhdXNlIG9uZSBkb3QgaXMgdXNlZCBhcyBwcmVmaXggZm9yIGNsYXNzIGdyb3VwcyBpbiBwbHVnaW5zXG4gICAgICByZXR1cm4gJ2FyYml0cmFyeS4uJyArIHByb3BlcnR5O1xuICAgIH1cbiAgfVxufTtcbi8qKlxuICogRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5jb25zdCBjcmVhdGVDbGFzc01hcCA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IHtcbiAgICB0aGVtZSxcbiAgICBwcmVmaXhcbiAgfSA9IGNvbmZpZztcbiAgY29uc3QgY2xhc3NNYXAgPSB7XG4gICAgbmV4dFBhcnQ6IG5ldyBNYXAoKSxcbiAgICB2YWxpZGF0b3JzOiBbXVxuICB9O1xuICBjb25zdCBwcmVmaXhlZENsYXNzR3JvdXBFbnRyaWVzID0gZ2V0UHJlZml4ZWRDbGFzc0dyb3VwRW50cmllcyhPYmplY3QuZW50cmllcyhjb25maWcuY2xhc3NHcm91cHMpLCBwcmVmaXgpO1xuICBwcmVmaXhlZENsYXNzR3JvdXBFbnRyaWVzLmZvckVhY2goKFtjbGFzc0dyb3VwSWQsIGNsYXNzR3JvdXBdKSA9PiB7XG4gICAgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseShjbGFzc0dyb3VwLCBjbGFzc01hcCwgY2xhc3NHcm91cElkLCB0aGVtZSk7XG4gIH0pO1xuICByZXR1cm4gY2xhc3NNYXA7XG59O1xuY29uc3QgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseSA9IChjbGFzc0dyb3VwLCBjbGFzc1BhcnRPYmplY3QsIGNsYXNzR3JvdXBJZCwgdGhlbWUpID0+IHtcbiAgY2xhc3NHcm91cC5mb3JFYWNoKGNsYXNzRGVmaW5pdGlvbiA9PiB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc0RlZmluaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjbGFzc1BhcnRPYmplY3RUb0VkaXQgPSBjbGFzc0RlZmluaXRpb24gPT09ICcnID8gY2xhc3NQYXJ0T2JqZWN0IDogZ2V0UGFydChjbGFzc1BhcnRPYmplY3QsIGNsYXNzRGVmaW5pdGlvbik7XG4gICAgICBjbGFzc1BhcnRPYmplY3RUb0VkaXQuY2xhc3NHcm91cElkID0gY2xhc3NHcm91cElkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNsYXNzRGVmaW5pdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGlzVGhlbWVHZXR0ZXIoY2xhc3NEZWZpbml0aW9uKSkge1xuICAgICAgICBwcm9jZXNzQ2xhc3Nlc1JlY3Vyc2l2ZWx5KGNsYXNzRGVmaW5pdGlvbih0aGVtZSksIGNsYXNzUGFydE9iamVjdCwgY2xhc3NHcm91cElkLCB0aGVtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNsYXNzUGFydE9iamVjdC52YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICB2YWxpZGF0b3I6IGNsYXNzRGVmaW5pdGlvbixcbiAgICAgICAgY2xhc3NHcm91cElkXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXMoY2xhc3NEZWZpbml0aW9uKS5mb3JFYWNoKChba2V5LCBjbGFzc0dyb3VwXSkgPT4ge1xuICAgICAgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseShjbGFzc0dyb3VwLCBnZXRQYXJ0KGNsYXNzUGFydE9iamVjdCwga2V5KSwgY2xhc3NHcm91cElkLCB0aGVtZSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbmNvbnN0IGdldFBhcnQgPSAoY2xhc3NQYXJ0T2JqZWN0LCBwYXRoKSA9PiB7XG4gIGxldCBjdXJyZW50Q2xhc3NQYXJ0T2JqZWN0ID0gY2xhc3NQYXJ0T2JqZWN0O1xuICBwYXRoLnNwbGl0KENMQVNTX1BBUlRfU0VQQVJBVE9SKS5mb3JFYWNoKHBhdGhQYXJ0ID0+IHtcbiAgICBpZiAoIWN1cnJlbnRDbGFzc1BhcnRPYmplY3QubmV4dFBhcnQuaGFzKHBhdGhQYXJ0KSkge1xuICAgICAgY3VycmVudENsYXNzUGFydE9iamVjdC5uZXh0UGFydC5zZXQocGF0aFBhcnQsIHtcbiAgICAgICAgbmV4dFBhcnQ6IG5ldyBNYXAoKSxcbiAgICAgICAgdmFsaWRhdG9yczogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjdXJyZW50Q2xhc3NQYXJ0T2JqZWN0ID0gY3VycmVudENsYXNzUGFydE9iamVjdC5uZXh0UGFydC5nZXQocGF0aFBhcnQpO1xuICB9KTtcbiAgcmV0dXJuIGN1cnJlbnRDbGFzc1BhcnRPYmplY3Q7XG59O1xuY29uc3QgaXNUaGVtZUdldHRlciA9IGZ1bmMgPT4gZnVuYy5pc1RoZW1lR2V0dGVyO1xuY29uc3QgZ2V0UHJlZml4ZWRDbGFzc0dyb3VwRW50cmllcyA9IChjbGFzc0dyb3VwRW50cmllcywgcHJlZml4KSA9PiB7XG4gIGlmICghcHJlZml4KSB7XG4gICAgcmV0dXJuIGNsYXNzR3JvdXBFbnRyaWVzO1xuICB9XG4gIHJldHVybiBjbGFzc0dyb3VwRW50cmllcy5tYXAoKFtjbGFzc0dyb3VwSWQsIGNsYXNzR3JvdXBdKSA9PiB7XG4gICAgY29uc3QgcHJlZml4ZWRDbGFzc0dyb3VwID0gY2xhc3NHcm91cC5tYXAoY2xhc3NEZWZpbml0aW9uID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY2xhc3NEZWZpbml0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgY2xhc3NEZWZpbml0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjbGFzc0RlZmluaXRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xhc3NEZWZpbml0aW9uKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW3ByZWZpeCArIGtleSwgdmFsdWVdKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3NEZWZpbml0aW9uO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhc3NHcm91cElkLCBwcmVmaXhlZENsYXNzR3JvdXBdO1xuICB9KTtcbn07XG5cbi8vIExSVSBjYWNoZSBpbnNwaXJlZCBmcm9tIGhhc2hscnUgKGh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9oYXNobHJ1L2Jsb2IvdjEuMC40L2luZGV4LmpzKSBidXQgb2JqZWN0IHJlcGxhY2VkIHdpdGggTWFwIHRvIGltcHJvdmUgcGVyZm9ybWFuY2VcbmNvbnN0IGNyZWF0ZUxydUNhY2hlID0gbWF4Q2FjaGVTaXplID0+IHtcbiAgaWYgKG1heENhY2hlU2l6ZSA8IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICBzZXQ6ICgpID0+IHt9XG4gICAgfTtcbiAgfVxuICBsZXQgY2FjaGVTaXplID0gMDtcbiAgbGV0IGNhY2hlID0gbmV3IE1hcCgpO1xuICBsZXQgcHJldmlvdXNDYWNoZSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgdXBkYXRlID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBjYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgY2FjaGVTaXplKys7XG4gICAgaWYgKGNhY2hlU2l6ZSA+IG1heENhY2hlU2l6ZSkge1xuICAgICAgY2FjaGVTaXplID0gMDtcbiAgICAgIHByZXZpb3VzQ2FjaGUgPSBjYWNoZTtcbiAgICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICBsZXQgdmFsdWUgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICgodmFsdWUgPSBwcmV2aW91c0NhY2hlLmdldChrZXkpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZShrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICBjYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGUoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IElNUE9SVEFOVF9NT0RJRklFUiA9ICchJztcbmNvbnN0IGNyZWF0ZVBhcnNlQ2xhc3NOYW1lID0gY29uZmlnID0+IHtcbiAgY29uc3Qge1xuICAgIHNlcGFyYXRvcixcbiAgICBleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZVxuICB9ID0gY29uZmlnO1xuICBjb25zdCBpc1NlcGFyYXRvclNpbmdsZUNoYXJhY3RlciA9IHNlcGFyYXRvci5sZW5ndGggPT09IDE7XG4gIGNvbnN0IGZpcnN0U2VwYXJhdG9yQ2hhcmFjdGVyID0gc2VwYXJhdG9yWzBdO1xuICBjb25zdCBzZXBhcmF0b3JMZW5ndGggPSBzZXBhcmF0b3IubGVuZ3RoO1xuICAvLyBwYXJzZUNsYXNzTmFtZSBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL2Jsb2IvdjMuMi4yL3NyYy91dGlsL3NwbGl0QXRUb3BMZXZlbE9ubHkuanNcbiAgY29uc3QgcGFyc2VDbGFzc05hbWUgPSBjbGFzc05hbWUgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtdO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBtb2RpZmllclN0YXJ0ID0gMDtcbiAgICBsZXQgcG9zdGZpeE1vZGlmaWVyUG9zaXRpb247XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNsYXNzTmFtZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBjdXJyZW50Q2hhcmFjdGVyID0gY2xhc3NOYW1lW2luZGV4XTtcbiAgICAgIGlmIChicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09IGZpcnN0U2VwYXJhdG9yQ2hhcmFjdGVyICYmIChpc1NlcGFyYXRvclNpbmdsZUNoYXJhY3RlciB8fCBjbGFzc05hbWUuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VwYXJhdG9yTGVuZ3RoKSA9PT0gc2VwYXJhdG9yKSkge1xuICAgICAgICAgIG1vZGlmaWVycy5wdXNoKGNsYXNzTmFtZS5zbGljZShtb2RpZmllclN0YXJ0LCBpbmRleCkpO1xuICAgICAgICAgIG1vZGlmaWVyU3RhcnQgPSBpbmRleCArIHNlcGFyYXRvckxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlciA9PT0gJy8nKSB7XG4gICAgICAgICAgcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gPSBpbmRleDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09ICdbJykge1xuICAgICAgICBicmFja2V0RGVwdGgrKztcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENoYXJhY3RlciA9PT0gJ10nKSB7XG4gICAgICAgIGJyYWNrZXREZXB0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBiYXNlQ2xhc3NOYW1lV2l0aEltcG9ydGFudE1vZGlmaWVyID0gbW9kaWZpZXJzLmxlbmd0aCA9PT0gMCA/IGNsYXNzTmFtZSA6IGNsYXNzTmFtZS5zdWJzdHJpbmcobW9kaWZpZXJTdGFydCk7XG4gICAgY29uc3QgaGFzSW1wb3J0YW50TW9kaWZpZXIgPSBiYXNlQ2xhc3NOYW1lV2l0aEltcG9ydGFudE1vZGlmaWVyLnN0YXJ0c1dpdGgoSU1QT1JUQU5UX01PRElGSUVSKTtcbiAgICBjb25zdCBiYXNlQ2xhc3NOYW1lID0gaGFzSW1wb3J0YW50TW9kaWZpZXIgPyBiYXNlQ2xhc3NOYW1lV2l0aEltcG9ydGFudE1vZGlmaWVyLnN1YnN0cmluZygxKSA6IGJhc2VDbGFzc05hbWVXaXRoSW1wb3J0YW50TW9kaWZpZXI7XG4gICAgY29uc3QgbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvbiA9IHBvc3RmaXhNb2RpZmllclBvc2l0aW9uICYmIHBvc3RmaXhNb2RpZmllclBvc2l0aW9uID4gbW9kaWZpZXJTdGFydCA/IHBvc3RmaXhNb2RpZmllclBvc2l0aW9uIC0gbW9kaWZpZXJTdGFydCA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kaWZpZXJzLFxuICAgICAgaGFzSW1wb3J0YW50TW9kaWZpZXIsXG4gICAgICBiYXNlQ2xhc3NOYW1lLFxuICAgICAgbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvblxuICAgIH07XG4gIH07XG4gIGlmIChleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZSkge1xuICAgIHJldHVybiBjbGFzc05hbWUgPT4gZXhwZXJpbWVudGFsUGFyc2VDbGFzc05hbWUoe1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcGFyc2VDbGFzc05hbWVcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VDbGFzc05hbWU7XG59O1xuLyoqXG4gKiBTb3J0cyBtb2RpZmllcnMgYWNjb3JkaW5nIHRvIGZvbGxvd2luZyBzY2hlbWE6XG4gKiAtIFByZWRlZmluZWQgbW9kaWZpZXJzIGFyZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHlcbiAqIC0gV2hlbiBhbiBhcmJpdHJhcnkgdmFyaWFudCBhcHBlYXJzLCBpdCBtdXN0IGJlIHByZXNlcnZlZCB3aGljaCBtb2RpZmllcnMgYXJlIGJlZm9yZSBhbmQgYWZ0ZXIgaXRcbiAqL1xuY29uc3Qgc29ydE1vZGlmaWVycyA9IG1vZGlmaWVycyA9PiB7XG4gIGlmIChtb2RpZmllcnMubGVuZ3RoIDw9IDEpIHtcbiAgICByZXR1cm4gbW9kaWZpZXJzO1xuICB9XG4gIGNvbnN0IHNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICBsZXQgdW5zb3J0ZWRNb2RpZmllcnMgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4ge1xuICAgIGNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFudCA9IG1vZGlmaWVyWzBdID09PSAnWyc7XG4gICAgaWYgKGlzQXJiaXRyYXJ5VmFyaWFudCkge1xuICAgICAgc29ydGVkTW9kaWZpZXJzLnB1c2goLi4udW5zb3J0ZWRNb2RpZmllcnMuc29ydCgpLCBtb2RpZmllcik7XG4gICAgICB1bnNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnNvcnRlZE1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICBzb3J0ZWRNb2RpZmllcnMucHVzaCguLi51bnNvcnRlZE1vZGlmaWVycy5zb3J0KCkpO1xuICByZXR1cm4gc29ydGVkTW9kaWZpZXJzO1xufTtcbmNvbnN0IGNyZWF0ZUNvbmZpZ1V0aWxzID0gY29uZmlnID0+ICh7XG4gIGNhY2hlOiBjcmVhdGVMcnVDYWNoZShjb25maWcuY2FjaGVTaXplKSxcbiAgcGFyc2VDbGFzc05hbWU6IGNyZWF0ZVBhcnNlQ2xhc3NOYW1lKGNvbmZpZyksXG4gIC4uLmNyZWF0ZUNsYXNzR3JvdXBVdGlscyhjb25maWcpXG59KTtcbmNvbnN0IFNQTElUX0NMQVNTRVNfUkVHRVggPSAvXFxzKy87XG5jb25zdCBtZXJnZUNsYXNzTGlzdCA9IChjbGFzc0xpc3QsIGNvbmZpZ1V0aWxzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUNsYXNzTmFtZSxcbiAgICBnZXRDbGFzc0dyb3VwSWQsXG4gICAgZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzXG4gIH0gPSBjb25maWdVdGlscztcbiAgLyoqXG4gICAqIFNldCBvZiBjbGFzc0dyb3VwSWRzIGluIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqIGB7aW1wb3J0YW50TW9kaWZpZXJ9e3ZhcmlhbnRNb2RpZmllcnN9e2NsYXNzR3JvdXBJZH1gXG4gICAqIEBleGFtcGxlICdmbG9hdCdcbiAgICogQGV4YW1wbGUgJ2hvdmVyOmZvY3VzOmJnLWNvbG9yJ1xuICAgKiBAZXhhbXBsZSAnbWQ6IXByJ1xuICAgKi9cbiAgY29uc3QgY2xhc3NHcm91cHNJbkNvbmZsaWN0ID0gW107XG4gIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc0xpc3QudHJpbSgpLnNwbGl0KFNQTElUX0NMQVNTRVNfUkVHRVgpO1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGZvciAobGV0IGluZGV4ID0gY2xhc3NOYW1lcy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleCAtPSAxKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxDbGFzc05hbWUgPSBjbGFzc05hbWVzW2luZGV4XTtcbiAgICBjb25zdCB7XG4gICAgICBtb2RpZmllcnMsXG4gICAgICBoYXNJbXBvcnRhbnRNb2RpZmllcixcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uXG4gICAgfSA9IHBhcnNlQ2xhc3NOYW1lKG9yaWdpbmFsQ2xhc3NOYW1lKTtcbiAgICBsZXQgaGFzUG9zdGZpeE1vZGlmaWVyID0gQm9vbGVhbihtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uKTtcbiAgICBsZXQgY2xhc3NHcm91cElkID0gZ2V0Q2xhc3NHcm91cElkKGhhc1Bvc3RmaXhNb2RpZmllciA/IGJhc2VDbGFzc05hbWUuc3Vic3RyaW5nKDAsIG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb24pIDogYmFzZUNsYXNzTmFtZSk7XG4gICAgaWYgKCFjbGFzc0dyb3VwSWQpIHtcbiAgICAgIGlmICghaGFzUG9zdGZpeE1vZGlmaWVyKSB7XG4gICAgICAgIC8vIE5vdCBhIFRhaWx3aW5kIGNsYXNzXG4gICAgICAgIHJlc3VsdCA9IG9yaWdpbmFsQ2xhc3NOYW1lICsgKHJlc3VsdC5sZW5ndGggPiAwID8gJyAnICsgcmVzdWx0IDogcmVzdWx0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjbGFzc0dyb3VwSWQgPSBnZXRDbGFzc0dyb3VwSWQoYmFzZUNsYXNzTmFtZSk7XG4gICAgICBpZiAoIWNsYXNzR3JvdXBJZCkge1xuICAgICAgICAvLyBOb3QgYSBUYWlsd2luZCBjbGFzc1xuICAgICAgICByZXN1bHQgPSBvcmlnaW5hbENsYXNzTmFtZSArIChyZXN1bHQubGVuZ3RoID4gMCA/ICcgJyArIHJlc3VsdCA6IHJlc3VsdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaGFzUG9zdGZpeE1vZGlmaWVyID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhcmlhbnRNb2RpZmllciA9IHNvcnRNb2RpZmllcnMobW9kaWZpZXJzKS5qb2luKCc6Jyk7XG4gICAgY29uc3QgbW9kaWZpZXJJZCA9IGhhc0ltcG9ydGFudE1vZGlmaWVyID8gdmFyaWFudE1vZGlmaWVyICsgSU1QT1JUQU5UX01PRElGSUVSIDogdmFyaWFudE1vZGlmaWVyO1xuICAgIGNvbnN0IGNsYXNzSWQgPSBtb2RpZmllcklkICsgY2xhc3NHcm91cElkO1xuICAgIGlmIChjbGFzc0dyb3Vwc0luQ29uZmxpY3QuaW5jbHVkZXMoY2xhc3NJZCkpIHtcbiAgICAgIC8vIFRhaWx3aW5kIGNsYXNzIG9taXR0ZWQgZHVlIHRvIGNvbmZsaWN0XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY2xhc3NHcm91cHNJbkNvbmZsaWN0LnB1c2goY2xhc3NJZCk7XG4gICAgY29uc3QgY29uZmxpY3RHcm91cHMgPSBnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHMoY2xhc3NHcm91cElkLCBoYXNQb3N0Zml4TW9kaWZpZXIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmxpY3RHcm91cHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gY29uZmxpY3RHcm91cHNbaV07XG4gICAgICBjbGFzc0dyb3Vwc0luQ29uZmxpY3QucHVzaChtb2RpZmllcklkICsgZ3JvdXApO1xuICAgIH1cbiAgICAvLyBUYWlsd2luZCBjbGFzcyBub3QgaW4gY29uZmxpY3RcbiAgICByZXN1bHQgPSBvcmlnaW5hbENsYXNzTmFtZSArIChyZXN1bHQubGVuZ3RoID4gMCA/ICcgJyArIHJlc3VsdCA6IHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvY2xzeCBhbmQgbW9kaWZpZWQgdG8gc3VpdCB0aGUgbmVlZHMgb2YgdGFpbHdpbmQtbWVyZ2UgYmV0dGVyLlxuICpcbiAqIFNwZWNpZmljYWxseTpcbiAqIC0gUnVudGltZSBjb2RlIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2x1a2VlZC9jbHN4L2Jsb2IvdjEuMi4xL3NyYy9pbmRleC5qc1xuICogLSBUeXBlU2NyaXB0IHR5cGVzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2x1a2VlZC9jbHN4L2Jsb2IvdjEuMi4xL2Nsc3guZC50c1xuICpcbiAqIE9yaWdpbmFsIGNvZGUgaGFzIE1JVCBsaWNlbnNlOiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAobHVrZWVkLmNvbSlcbiAqL1xuZnVuY3Rpb24gdHdKb2luKCkge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgYXJndW1lbnQ7XG4gIGxldCByZXNvbHZlZFZhbHVlO1xuICBsZXQgc3RyaW5nID0gJyc7XG4gIHdoaWxlIChpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBpZiAoYXJndW1lbnQgPSBhcmd1bWVudHNbaW5kZXgrK10pIHtcbiAgICAgIGlmIChyZXNvbHZlZFZhbHVlID0gdG9WYWx1ZShhcmd1bWVudCkpIHtcbiAgICAgICAgc3RyaW5nICYmIChzdHJpbmcgKz0gJyAnKTtcbiAgICAgICAgc3RyaW5nICs9IHJlc29sdmVkVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5jb25zdCB0b1ZhbHVlID0gbWl4ID0+IHtcbiAgaWYgKHR5cGVvZiBtaXggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG1peDtcbiAgfVxuICBsZXQgcmVzb2x2ZWRWYWx1ZTtcbiAgbGV0IHN0cmluZyA9ICcnO1xuICBmb3IgKGxldCBrID0gMDsgayA8IG1peC5sZW5ndGg7IGsrKykge1xuICAgIGlmIChtaXhba10pIHtcbiAgICAgIGlmIChyZXNvbHZlZFZhbHVlID0gdG9WYWx1ZShtaXhba10pKSB7XG4gICAgICAgIHN0cmluZyAmJiAoc3RyaW5nICs9ICcgJyk7XG4gICAgICAgIHN0cmluZyArPSByZXNvbHZlZFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5nO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVRhaWx3aW5kTWVyZ2UoY3JlYXRlQ29uZmlnRmlyc3QsIC4uLmNyZWF0ZUNvbmZpZ1Jlc3QpIHtcbiAgbGV0IGNvbmZpZ1V0aWxzO1xuICBsZXQgY2FjaGVHZXQ7XG4gIGxldCBjYWNoZVNldDtcbiAgbGV0IGZ1bmN0aW9uVG9DYWxsID0gaW5pdFRhaWx3aW5kTWVyZ2U7XG4gIGZ1bmN0aW9uIGluaXRUYWlsd2luZE1lcmdlKGNsYXNzTGlzdCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZUNvbmZpZ1Jlc3QucmVkdWNlKChwcmV2aW91c0NvbmZpZywgY3JlYXRlQ29uZmlnQ3VycmVudCkgPT4gY3JlYXRlQ29uZmlnQ3VycmVudChwcmV2aW91c0NvbmZpZyksIGNyZWF0ZUNvbmZpZ0ZpcnN0KCkpO1xuICAgIGNvbmZpZ1V0aWxzID0gY3JlYXRlQ29uZmlnVXRpbHMoY29uZmlnKTtcbiAgICBjYWNoZUdldCA9IGNvbmZpZ1V0aWxzLmNhY2hlLmdldDtcbiAgICBjYWNoZVNldCA9IGNvbmZpZ1V0aWxzLmNhY2hlLnNldDtcbiAgICBmdW5jdGlvblRvQ2FsbCA9IHRhaWx3aW5kTWVyZ2U7XG4gICAgcmV0dXJuIHRhaWx3aW5kTWVyZ2UoY2xhc3NMaXN0KTtcbiAgfVxuICBmdW5jdGlvbiB0YWlsd2luZE1lcmdlKGNsYXNzTGlzdCkge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGNhY2hlR2V0KGNsYXNzTGlzdCk7XG4gICAgaWYgKGNhY2hlZFJlc3VsdCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gbWVyZ2VDbGFzc0xpc3QoY2xhc3NMaXN0LCBjb25maWdVdGlscyk7XG4gICAgY2FjaGVTZXQoY2xhc3NMaXN0LCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIGNhbGxUYWlsd2luZE1lcmdlKCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvQ2FsbCh0d0pvaW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gIH07XG59XG5jb25zdCBmcm9tVGhlbWUgPSBrZXkgPT4ge1xuICBjb25zdCB0aGVtZUdldHRlciA9IHRoZW1lID0+IHRoZW1lW2tleV0gfHwgW107XG4gIHRoZW1lR2V0dGVyLmlzVGhlbWVHZXR0ZXIgPSB0cnVlO1xuICByZXR1cm4gdGhlbWVHZXR0ZXI7XG59O1xuY29uc3QgYXJiaXRyYXJ5VmFsdWVSZWdleCA9IC9eXFxbKD86KFthLXotXSspOik/KC4rKVxcXSQvaTtcbmNvbnN0IGZyYWN0aW9uUmVnZXggPSAvXlxcZCtcXC9cXGQrJC87XG5jb25zdCBzdHJpbmdMZW5ndGhzID0gLyojX19QVVJFX18qL25ldyBTZXQoWydweCcsICdmdWxsJywgJ3NjcmVlbiddKTtcbmNvbnN0IHRzaGlydFVuaXRSZWdleCA9IC9eKFxcZCsoXFwuXFxkKyk/KT8oeHN8c218bWR8bGd8eGwpJC87XG5jb25zdCBsZW5ndGhVbml0UmVnZXggPSAvXFxkKyglfHB4fHI/ZW18W3NkbF0/dihbaHdpYl18bWlufG1heCl8cHR8cGN8aW58Y218bW18Y2FwfGNofGV4fHI/bGh8Y3Eod3xofGl8YnxtaW58bWF4KSl8XFxiKGNhbGN8bWlufG1heHxjbGFtcClcXCguK1xcKXxeMCQvO1xuY29uc3QgY29sb3JGdW5jdGlvblJlZ2V4ID0gL14ocmdiYT98aHNsYT98aHdifChvayk/KGxhYnxsY2gpKVxcKC4rXFwpJC87XG4vLyBTaGFkb3cgYWx3YXlzIGJlZ2lucyB3aXRoIHggYW5kIHkgb2Zmc2V0IHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlIG9wdGlvbmFsbHkgcHJlcGVuZGVkIGJ5IGluc2V0XG5jb25zdCBzaGFkb3dSZWdleCA9IC9eKGluc2V0Xyk/LT8oKFxcZCspP1xcLj8oXFxkKylbYS16XSt8MClfLT8oKFxcZCspP1xcLj8oXFxkKylbYS16XSt8MCkvO1xuY29uc3QgaW1hZ2VSZWdleCA9IC9eKHVybHxpbWFnZXxpbWFnZS1zZXR8Y3Jvc3MtZmFkZXxlbGVtZW50fChyZXBlYXRpbmctKT8obGluZWFyfHJhZGlhbHxjb25pYyktZ3JhZGllbnQpXFwoLitcXCkkLztcbmNvbnN0IGlzTGVuZ3RoID0gdmFsdWUgPT4gaXNOdW1iZXIodmFsdWUpIHx8IHN0cmluZ0xlbmd0aHMuaGFzKHZhbHVlKSB8fCBmcmFjdGlvblJlZ2V4LnRlc3QodmFsdWUpO1xuY29uc3QgaXNBcmJpdHJhcnlMZW5ndGggPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCAnbGVuZ3RoJywgaXNMZW5ndGhPbmx5KTtcbmNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4gQm9vbGVhbih2YWx1ZSkgJiYgIU51bWJlci5pc05hTihOdW1iZXIodmFsdWUpKTtcbmNvbnN0IGlzQXJiaXRyYXJ5TnVtYmVyID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYWx1ZSh2YWx1ZSwgJ251bWJlcicsIGlzTnVtYmVyKTtcbmNvbnN0IGlzSW50ZWdlciA9IHZhbHVlID0+IEJvb2xlYW4odmFsdWUpICYmIE51bWJlci5pc0ludGVnZXIoTnVtYmVyKHZhbHVlKSk7XG5jb25zdCBpc1BlcmNlbnQgPSB2YWx1ZSA9PiB2YWx1ZS5lbmRzV2l0aCgnJScpICYmIGlzTnVtYmVyKHZhbHVlLnNsaWNlKDAsIC0xKSk7XG5jb25zdCBpc0FyYml0cmFyeVZhbHVlID0gdmFsdWUgPT4gYXJiaXRyYXJ5VmFsdWVSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzVHNoaXJ0U2l6ZSA9IHZhbHVlID0+IHRzaGlydFVuaXRSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IHNpemVMYWJlbHMgPSAvKiNfX1BVUkVfXyovbmV3IFNldChbJ2xlbmd0aCcsICdzaXplJywgJ3BlcmNlbnRhZ2UnXSk7XG5jb25zdCBpc0FyYml0cmFyeVNpemUgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBzaXplTGFiZWxzLCBpc05ldmVyKTtcbmNvbnN0IGlzQXJiaXRyYXJ5UG9zaXRpb24gPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCAncG9zaXRpb24nLCBpc05ldmVyKTtcbmNvbnN0IGltYWdlTGFiZWxzID0gLyojX19QVVJFX18qL25ldyBTZXQoWydpbWFnZScsICd1cmwnXSk7XG5jb25zdCBpc0FyYml0cmFyeUltYWdlID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYWx1ZSh2YWx1ZSwgaW1hZ2VMYWJlbHMsIGlzSW1hZ2UpO1xuY29uc3QgaXNBcmJpdHJhcnlTaGFkb3cgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCAnJywgaXNTaGFkb3cpO1xuY29uc3QgaXNBbnkgPSAoKSA9PiB0cnVlO1xuY29uc3QgZ2V0SXNBcmJpdHJhcnlWYWx1ZSA9ICh2YWx1ZSwgbGFiZWwsIHRlc3RWYWx1ZSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhcmJpdHJhcnlWYWx1ZVJlZ2V4LmV4ZWModmFsdWUpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdFsxXSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycgPyByZXN1bHRbMV0gPT09IGxhYmVsIDogbGFiZWwuaGFzKHJlc3VsdFsxXSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0VmFsdWUocmVzdWx0WzJdKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgaXNMZW5ndGhPbmx5ID0gdmFsdWUgPT5cbi8vIGBjb2xvckZ1bmN0aW9uUmVnZXhgIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNvbG9yIGZ1bmN0aW9ucyBjYW4gaGF2ZSBwZXJjZW50YWdlcyBpbiB0aGVtIHdoaWNoIHdoaWNoIHdvdWxkIGJlIGluY29ycmVjdGx5IGNsYXNzaWZpZWQgYXMgbGVuZ3Rocy5cbi8vIEZvciBleGFtcGxlLCBgaHNsKDAgMCUgMCUpYCB3b3VsZCBiZSBjbGFzc2lmaWVkIGFzIGEgbGVuZ3RoIHdpdGhvdXQgdGhpcyBjaGVjay5cbi8vIEkgY291bGQgYWxzbyB1c2UgbG9va2JlaGluZCBhc3NlcnRpb24gaW4gYGxlbmd0aFVuaXRSZWdleGAgYnV0IHRoYXQgaXNuJ3Qgc3VwcG9ydGVkIHdpZGVseSBlbm91Z2guXG5sZW5ndGhVbml0UmVnZXgudGVzdCh2YWx1ZSkgJiYgIWNvbG9yRnVuY3Rpb25SZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzTmV2ZXIgPSAoKSA9PiBmYWxzZTtcbmNvbnN0IGlzU2hhZG93ID0gdmFsdWUgPT4gc2hhZG93UmVnZXgudGVzdCh2YWx1ZSk7XG5jb25zdCBpc0ltYWdlID0gdmFsdWUgPT4gaW1hZ2VSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IHZhbGlkYXRvcnMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmRlZmluZVByb3BlcnR5KHtcbiAgX19wcm90b19fOiBudWxsLFxuICBpc0FueSxcbiAgaXNBcmJpdHJhcnlJbWFnZSxcbiAgaXNBcmJpdHJhcnlMZW5ndGgsXG4gIGlzQXJiaXRyYXJ5TnVtYmVyLFxuICBpc0FyYml0cmFyeVBvc2l0aW9uLFxuICBpc0FyYml0cmFyeVNoYWRvdyxcbiAgaXNBcmJpdHJhcnlTaXplLFxuICBpc0FyYml0cmFyeVZhbHVlLFxuICBpc0ludGVnZXIsXG4gIGlzTGVuZ3RoLFxuICBpc051bWJlcixcbiAgaXNQZXJjZW50LFxuICBpc1RzaGlydFNpemVcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICB2YWx1ZTogJ01vZHVsZSdcbn0pO1xuY29uc3QgZ2V0RGVmYXVsdENvbmZpZyA9ICgpID0+IHtcbiAgY29uc3QgY29sb3JzID0gZnJvbVRoZW1lKCdjb2xvcnMnKTtcbiAgY29uc3Qgc3BhY2luZyA9IGZyb21UaGVtZSgnc3BhY2luZycpO1xuICBjb25zdCBibHVyID0gZnJvbVRoZW1lKCdibHVyJyk7XG4gIGNvbnN0IGJyaWdodG5lc3MgPSBmcm9tVGhlbWUoJ2JyaWdodG5lc3MnKTtcbiAgY29uc3QgYm9yZGVyQ29sb3IgPSBmcm9tVGhlbWUoJ2JvcmRlckNvbG9yJyk7XG4gIGNvbnN0IGJvcmRlclJhZGl1cyA9IGZyb21UaGVtZSgnYm9yZGVyUmFkaXVzJyk7XG4gIGNvbnN0IGJvcmRlclNwYWNpbmcgPSBmcm9tVGhlbWUoJ2JvcmRlclNwYWNpbmcnKTtcbiAgY29uc3QgYm9yZGVyV2lkdGggPSBmcm9tVGhlbWUoJ2JvcmRlcldpZHRoJyk7XG4gIGNvbnN0IGNvbnRyYXN0ID0gZnJvbVRoZW1lKCdjb250cmFzdCcpO1xuICBjb25zdCBncmF5c2NhbGUgPSBmcm9tVGhlbWUoJ2dyYXlzY2FsZScpO1xuICBjb25zdCBodWVSb3RhdGUgPSBmcm9tVGhlbWUoJ2h1ZVJvdGF0ZScpO1xuICBjb25zdCBpbnZlcnQgPSBmcm9tVGhlbWUoJ2ludmVydCcpO1xuICBjb25zdCBnYXAgPSBmcm9tVGhlbWUoJ2dhcCcpO1xuICBjb25zdCBncmFkaWVudENvbG9yU3RvcHMgPSBmcm9tVGhlbWUoJ2dyYWRpZW50Q29sb3JTdG9wcycpO1xuICBjb25zdCBncmFkaWVudENvbG9yU3RvcFBvc2l0aW9ucyA9IGZyb21UaGVtZSgnZ3JhZGllbnRDb2xvclN0b3BQb3NpdGlvbnMnKTtcbiAgY29uc3QgaW5zZXQgPSBmcm9tVGhlbWUoJ2luc2V0Jyk7XG4gIGNvbnN0IG1hcmdpbiA9IGZyb21UaGVtZSgnbWFyZ2luJyk7XG4gIGNvbnN0IG9wYWNpdHkgPSBmcm9tVGhlbWUoJ29wYWNpdHknKTtcbiAgY29uc3QgcGFkZGluZyA9IGZyb21UaGVtZSgncGFkZGluZycpO1xuICBjb25zdCBzYXR1cmF0ZSA9IGZyb21UaGVtZSgnc2F0dXJhdGUnKTtcbiAgY29uc3Qgc2NhbGUgPSBmcm9tVGhlbWUoJ3NjYWxlJyk7XG4gIGNvbnN0IHNlcGlhID0gZnJvbVRoZW1lKCdzZXBpYScpO1xuICBjb25zdCBza2V3ID0gZnJvbVRoZW1lKCdza2V3Jyk7XG4gIGNvbnN0IHNwYWNlID0gZnJvbVRoZW1lKCdzcGFjZScpO1xuICBjb25zdCB0cmFuc2xhdGUgPSBmcm9tVGhlbWUoJ3RyYW5zbGF0ZScpO1xuICBjb25zdCBnZXRPdmVyc2Nyb2xsID0gKCkgPT4gWydhdXRvJywgJ2NvbnRhaW4nLCAnbm9uZSddO1xuICBjb25zdCBnZXRPdmVyZmxvdyA9ICgpID0+IFsnYXV0bycsICdoaWRkZW4nLCAnY2xpcCcsICd2aXNpYmxlJywgJ3Njcm9sbCddO1xuICBjb25zdCBnZXRTcGFjaW5nV2l0aEF1dG9BbmRBcmJpdHJhcnkgPSAoKSA9PiBbJ2F1dG8nLCBpc0FyYml0cmFyeVZhbHVlLCBzcGFjaW5nXTtcbiAgY29uc3QgZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkgPSAoKSA9PiBbaXNBcmJpdHJhcnlWYWx1ZSwgc3BhY2luZ107XG4gIGNvbnN0IGdldExlbmd0aFdpdGhFbXB0eUFuZEFyYml0cmFyeSA9ICgpID0+IFsnJywgaXNMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXTtcbiAgY29uc3QgZ2V0TnVtYmVyV2l0aEF1dG9BbmRBcmJpdHJhcnkgPSAoKSA9PiBbJ2F1dG8nLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IGdldFBvc2l0aW9ucyA9ICgpID0+IFsnYm90dG9tJywgJ2NlbnRlcicsICdsZWZ0JywgJ2xlZnQtYm90dG9tJywgJ2xlZnQtdG9wJywgJ3JpZ2h0JywgJ3JpZ2h0LWJvdHRvbScsICdyaWdodC10b3AnLCAndG9wJ107XG4gIGNvbnN0IGdldExpbmVTdHlsZXMgPSAoKSA9PiBbJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAnZG91YmxlJywgJ25vbmUnXTtcbiAgY29uc3QgZ2V0QmxlbmRNb2RlcyA9ICgpID0+IFsnbm9ybWFsJywgJ211bHRpcGx5JywgJ3NjcmVlbicsICdvdmVybGF5JywgJ2RhcmtlbicsICdsaWdodGVuJywgJ2NvbG9yLWRvZGdlJywgJ2NvbG9yLWJ1cm4nLCAnaGFyZC1saWdodCcsICdzb2Z0LWxpZ2h0JywgJ2RpZmZlcmVuY2UnLCAnZXhjbHVzaW9uJywgJ2h1ZScsICdzYXR1cmF0aW9uJywgJ2NvbG9yJywgJ2x1bWlub3NpdHknXTtcbiAgY29uc3QgZ2V0QWxpZ24gPSAoKSA9PiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYmV0d2VlbicsICdhcm91bmQnLCAnZXZlbmx5JywgJ3N0cmV0Y2gnXTtcbiAgY29uc3QgZ2V0WmVyb0FuZEVtcHR5ID0gKCkgPT4gWycnLCAnMCcsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBnZXRCcmVha3MgPSAoKSA9PiBbJ2F1dG8nLCAnYXZvaWQnLCAnYWxsJywgJ2F2b2lkLXBhZ2UnLCAncGFnZScsICdsZWZ0JywgJ3JpZ2h0JywgJ2NvbHVtbiddO1xuICBjb25zdCBnZXROdW1iZXJBbmRBcmJpdHJhcnkgPSAoKSA9PiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICByZXR1cm4ge1xuICAgIGNhY2hlU2l6ZTogNTAwLFxuICAgIHNlcGFyYXRvcjogJzonLFxuICAgIHRoZW1lOiB7XG4gICAgICBjb2xvcnM6IFtpc0FueV0sXG4gICAgICBzcGFjaW5nOiBbaXNMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXSxcbiAgICAgIGJsdXI6IFsnbm9uZScsICcnLCBpc1RzaGlydFNpemUsIGlzQXJiaXRyYXJ5VmFsdWVdLFxuICAgICAgYnJpZ2h0bmVzczogZ2V0TnVtYmVyQW5kQXJiaXRyYXJ5KCksXG4gICAgICBib3JkZXJDb2xvcjogW2NvbG9yc10sXG4gICAgICBib3JkZXJSYWRpdXM6IFsnbm9uZScsICcnLCAnZnVsbCcsIGlzVHNoaXJ0U2l6ZSwgaXNBcmJpdHJhcnlWYWx1ZV0sXG4gICAgICBib3JkZXJTcGFjaW5nOiBnZXRTcGFjaW5nV2l0aEFyYml0cmFyeSgpLFxuICAgICAgYm9yZGVyV2lkdGg6IGdldExlbmd0aFdpdGhFbXB0eUFuZEFyYml0cmFyeSgpLFxuICAgICAgY29udHJhc3Q6IGdldE51bWJlckFuZEFyYml0cmFyeSgpLFxuICAgICAgZ3JheXNjYWxlOiBnZXRaZXJvQW5kRW1wdHkoKSxcbiAgICAgIGh1ZVJvdGF0ZTogZ2V0TnVtYmVyQW5kQXJiaXRyYXJ5KCksXG4gICAgICBpbnZlcnQ6IGdldFplcm9BbmRFbXB0eSgpLFxuICAgICAgZ2FwOiBnZXRTcGFjaW5nV2l0aEFyYml0cmFyeSgpLFxuICAgICAgZ3JhZGllbnRDb2xvclN0b3BzOiBbY29sb3JzXSxcbiAgICAgIGdyYWRpZW50Q29sb3JTdG9wUG9zaXRpb25zOiBbaXNQZXJjZW50LCBpc0FyYml0cmFyeUxlbmd0aF0sXG4gICAgICBpbnNldDogZ2V0U3BhY2luZ1dpdGhBdXRvQW5kQXJiaXRyYXJ5KCksXG4gICAgICBtYXJnaW46IGdldFNwYWNpbmdXaXRoQXV0b0FuZEFyYml0cmFyeSgpLFxuICAgICAgb3BhY2l0eTogZ2V0TnVtYmVyQW5kQXJiaXRyYXJ5KCksXG4gICAgICBwYWRkaW5nOiBnZXRTcGFjaW5nV2l0aEFyYml0cmFyeSgpLFxuICAgICAgc2F0dXJhdGU6IGdldE51bWJlckFuZEFyYml0cmFyeSgpLFxuICAgICAgc2NhbGU6IGdldE51bWJlckFuZEFyYml0cmFyeSgpLFxuICAgICAgc2VwaWE6IGdldFplcm9BbmRFbXB0eSgpLFxuICAgICAgc2tldzogZ2V0TnVtYmVyQW5kQXJiaXRyYXJ5KCksXG4gICAgICBzcGFjZTogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKSxcbiAgICAgIHRyYW5zbGF0ZTogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgIH0sXG4gICAgY2xhc3NHcm91cHM6IHtcbiAgICAgIC8vIExheW91dFxuICAgICAgLyoqXG4gICAgICAgKiBBc3BlY3QgUmF0aW9cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hc3BlY3QtcmF0aW9cbiAgICAgICAqL1xuICAgICAgYXNwZWN0OiBbe1xuICAgICAgICBhc3BlY3Q6IFsnYXV0bycsICdzcXVhcmUnLCAndmlkZW8nLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIENvbnRhaW5lclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NvbnRhaW5lclxuICAgICAgICovXG4gICAgICBjb250YWluZXI6IFsnY29udGFpbmVyJ10sXG4gICAgICAvKipcbiAgICAgICAqIENvbHVtbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jb2x1bW5zXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbnM6IFt7XG4gICAgICAgIGNvbHVtbnM6IFtpc1RzaGlydFNpemVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQnJlYWsgQWZ0ZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1hZnRlclxuICAgICAgICovXG4gICAgICAnYnJlYWstYWZ0ZXInOiBbe1xuICAgICAgICAnYnJlYWstYWZ0ZXInOiBnZXRCcmVha3MoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJyZWFrIEJlZm9yZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JyZWFrLWJlZm9yZVxuICAgICAgICovXG4gICAgICAnYnJlYWstYmVmb3JlJzogW3tcbiAgICAgICAgJ2JyZWFrLWJlZm9yZSc6IGdldEJyZWFrcygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQnJlYWsgSW5zaWRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJlYWstaW5zaWRlXG4gICAgICAgKi9cbiAgICAgICdicmVhay1pbnNpZGUnOiBbe1xuICAgICAgICAnYnJlYWstaW5zaWRlJzogWydhdXRvJywgJ2F2b2lkJywgJ2F2b2lkLXBhZ2UnLCAnYXZvaWQtY29sdW1uJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3ggRGVjb3JhdGlvbiBCcmVha1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JveC1kZWNvcmF0aW9uLWJyZWFrXG4gICAgICAgKi9cbiAgICAgICdib3gtZGVjb3JhdGlvbic6IFt7XG4gICAgICAgICdib3gtZGVjb3JhdGlvbic6IFsnc2xpY2UnLCAnY2xvbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJveCBTaXppbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2l6aW5nXG4gICAgICAgKi9cbiAgICAgIGJveDogW3tcbiAgICAgICAgYm94OiBbJ2JvcmRlcicsICdjb250ZW50J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXNwbGF5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZGlzcGxheVxuICAgICAgICovXG4gICAgICBkaXNwbGF5OiBbJ2Jsb2NrJywgJ2lubGluZS1ibG9jaycsICdpbmxpbmUnLCAnZmxleCcsICdpbmxpbmUtZmxleCcsICd0YWJsZScsICdpbmxpbmUtdGFibGUnLCAndGFibGUtY2FwdGlvbicsICd0YWJsZS1jZWxsJywgJ3RhYmxlLWNvbHVtbicsICd0YWJsZS1jb2x1bW4tZ3JvdXAnLCAndGFibGUtZm9vdGVyLWdyb3VwJywgJ3RhYmxlLWhlYWRlci1ncm91cCcsICd0YWJsZS1yb3ctZ3JvdXAnLCAndGFibGUtcm93JywgJ2Zsb3ctcm9vdCcsICdncmlkJywgJ2lubGluZS1ncmlkJywgJ2NvbnRlbnRzJywgJ2xpc3QtaXRlbScsICdoaWRkZW4nXSxcbiAgICAgIC8qKlxuICAgICAgICogRmxvYXRzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxvYXRcbiAgICAgICAqL1xuICAgICAgZmxvYXQ6IFt7XG4gICAgICAgIGZsb2F0OiBbJ3JpZ2h0JywgJ2xlZnQnLCAnbm9uZScsICdzdGFydCcsICdlbmQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY2xlYXJcbiAgICAgICAqL1xuICAgICAgY2xlYXI6IFt7XG4gICAgICAgIGNsZWFyOiBbJ2xlZnQnLCAncmlnaHQnLCAnYm90aCcsICdub25lJywgJ3N0YXJ0JywgJ2VuZCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSXNvbGF0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaXNvbGF0aW9uXG4gICAgICAgKi9cbiAgICAgIGlzb2xhdGlvbjogWydpc29sYXRlJywgJ2lzb2xhdGlvbi1hdXRvJ10sXG4gICAgICAvKipcbiAgICAgICAqIE9iamVjdCBGaXRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vYmplY3QtZml0XG4gICAgICAgKi9cbiAgICAgICdvYmplY3QtZml0JzogW3tcbiAgICAgICAgb2JqZWN0OiBbJ2NvbnRhaW4nLCAnY292ZXInLCAnZmlsbCcsICdub25lJywgJ3NjYWxlLWRvd24nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE9iamVjdCBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL29iamVjdC1wb3NpdGlvblxuICAgICAgICovXG4gICAgICAnb2JqZWN0LXBvc2l0aW9uJzogW3tcbiAgICAgICAgb2JqZWN0OiBbLi4uZ2V0UG9zaXRpb25zKCksIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcmZsb3dcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyZmxvd1xuICAgICAgICovXG4gICAgICBvdmVyZmxvdzogW3tcbiAgICAgICAgb3ZlcmZsb3c6IGdldE92ZXJmbG93KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyZmxvdyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgJ292ZXJmbG93LXgnOiBbe1xuICAgICAgICAnb3ZlcmZsb3cteCc6IGdldE92ZXJmbG93KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyZmxvdyBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgJ292ZXJmbG93LXknOiBbe1xuICAgICAgICAnb3ZlcmZsb3cteSc6IGdldE92ZXJmbG93KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyc2Nyb2xsIEJlaGF2aW9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcnNjcm9sbC1iZWhhdmlvclxuICAgICAgICovXG4gICAgICBvdmVyc2Nyb2xsOiBbe1xuICAgICAgICBvdmVyc2Nyb2xsOiBnZXRPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyc2Nyb2xsIEJlaGF2aW9yIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyc2Nyb2xsLWJlaGF2aW9yXG4gICAgICAgKi9cbiAgICAgICdvdmVyc2Nyb2xsLXgnOiBbe1xuICAgICAgICAnb3ZlcnNjcm9sbC14JzogZ2V0T3ZlcnNjcm9sbCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnNjcm9sbCBCZWhhdmlvciBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcnNjcm9sbC1iZWhhdmlvclxuICAgICAgICovXG4gICAgICAnb3ZlcnNjcm9sbC15JzogW3tcbiAgICAgICAgJ292ZXJzY3JvbGwteSc6IGdldE92ZXJzY3JvbGwoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgcG9zaXRpb246IFsnc3RhdGljJywgJ2ZpeGVkJywgJ2Fic29sdXRlJywgJ3JlbGF0aXZlJywgJ3N0aWNreSddLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3AgLyBSaWdodCAvIEJvdHRvbSAvIExlZnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgaW5zZXQ6IFt7XG4gICAgICAgIGluc2V0OiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUmlnaHQgLyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgICdpbnNldC14JzogW3tcbiAgICAgICAgJ2luc2V0LXgnOiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVG9wIC8gQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgICdpbnNldC15JzogW3tcbiAgICAgICAgJ2luc2V0LXknOiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgc3RhcnQ6IFt7XG4gICAgICAgIHN0YXJ0OiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGVuZDogW3tcbiAgICAgICAgZW5kOiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIHRvcDogW3tcbiAgICAgICAgdG9wOiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUmlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgcmlnaHQ6IFt7XG4gICAgICAgIHJpZ2h0OiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGJvdHRvbTogW3tcbiAgICAgICAgYm90dG9tOiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RvcC1yaWdodC1ib3R0b20tbGVmdFxuICAgICAgICovXG4gICAgICBsZWZ0OiBbe1xuICAgICAgICBsZWZ0OiBbaW5zZXRdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVmlzaWJpbGl0eVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Zpc2liaWxpdHlcbiAgICAgICAqL1xuICAgICAgdmlzaWJpbGl0eTogWyd2aXNpYmxlJywgJ2ludmlzaWJsZScsICdjb2xsYXBzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBaLUluZGV4XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvei1pbmRleFxuICAgICAgICovXG4gICAgICB6OiBbe1xuICAgICAgICB6OiBbJ2F1dG8nLCBpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8vIEZsZXhib3ggYW5kIEdyaWRcbiAgICAgIC8qKlxuICAgICAgICogRmxleCBCYXNpc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXgtYmFzaXNcbiAgICAgICAqL1xuICAgICAgYmFzaXM6IFt7XG4gICAgICAgIGJhc2lzOiBnZXRTcGFjaW5nV2l0aEF1dG9BbmRBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggRGlyZWN0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleC1kaXJlY3Rpb25cbiAgICAgICAqL1xuICAgICAgJ2ZsZXgtZGlyZWN0aW9uJzogW3tcbiAgICAgICAgZmxleDogWydyb3cnLCAncm93LXJldmVyc2UnLCAnY29sJywgJ2NvbC1yZXZlcnNlJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGbGV4IFdyYXBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mbGV4LXdyYXBcbiAgICAgICAqL1xuICAgICAgJ2ZsZXgtd3JhcCc6IFt7XG4gICAgICAgIGZsZXg6IFsnd3JhcCcsICd3cmFwLXJldmVyc2UnLCAnbm93cmFwJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGbGV4XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleFxuICAgICAgICovXG4gICAgICBmbGV4OiBbe1xuICAgICAgICBmbGV4OiBbJzEnLCAnYXV0bycsICdpbml0aWFsJywgJ25vbmUnLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggR3Jvd1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXgtZ3Jvd1xuICAgICAgICovXG4gICAgICBncm93OiBbe1xuICAgICAgICBncm93OiBnZXRaZXJvQW5kRW1wdHkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggU2hyaW5rXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleC1zaHJpbmtcbiAgICAgICAqL1xuICAgICAgc2hyaW5rOiBbe1xuICAgICAgICBzaHJpbms6IGdldFplcm9BbmRFbXB0eSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3JkZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vcmRlclxuICAgICAgICovXG4gICAgICBvcmRlcjogW3tcbiAgICAgICAgb3JkZXI6IFsnZmlyc3QnLCAnbGFzdCcsICdub25lJywgaXNJbnRlZ2VyLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgVGVtcGxhdGUgQ29sdW1uc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtdGVtcGxhdGUtY29sdW1uc1xuICAgICAgICovXG4gICAgICAnZ3JpZC1jb2xzJzogW3tcbiAgICAgICAgJ2dyaWQtY29scyc6IFtpc0FueV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIENvbHVtbiBTdGFydCAvIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtY29sdW1uXG4gICAgICAgKi9cbiAgICAgICdjb2wtc3RhcnQtZW5kJzogW3tcbiAgICAgICAgY29sOiBbJ2F1dG8nLCB7XG4gICAgICAgICAgc3BhbjogWydmdWxsJywgaXNJbnRlZ2VyLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgICB9LCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgQ29sdW1uIFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1jb2x1bW5cbiAgICAgICAqL1xuICAgICAgJ2NvbC1zdGFydCc6IFt7XG4gICAgICAgICdjb2wtc3RhcnQnOiBnZXROdW1iZXJXaXRoQXV0b0FuZEFyYml0cmFyeSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBDb2x1bW4gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1jb2x1bW5cbiAgICAgICAqL1xuICAgICAgJ2NvbC1lbmQnOiBbe1xuICAgICAgICAnY29sLWVuZCc6IGdldE51bWJlcldpdGhBdXRvQW5kQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIFRlbXBsYXRlIFJvd3NcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLXRlbXBsYXRlLXJvd3NcbiAgICAgICAqL1xuICAgICAgJ2dyaWQtcm93cyc6IFt7XG4gICAgICAgICdncmlkLXJvd3MnOiBbaXNBbnldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBSb3cgU3RhcnQgLyBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLXJvd1xuICAgICAgICovXG4gICAgICAncm93LXN0YXJ0LWVuZCc6IFt7XG4gICAgICAgIHJvdzogWydhdXRvJywge1xuICAgICAgICAgIHNwYW46IFtpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICAgIH0sIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBSb3cgU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLXJvd1xuICAgICAgICovXG4gICAgICAncm93LXN0YXJ0JzogW3tcbiAgICAgICAgJ3Jvdy1zdGFydCc6IGdldE51bWJlcldpdGhBdXRvQW5kQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIFJvdyBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLXJvd1xuICAgICAgICovXG4gICAgICAncm93LWVuZCc6IFt7XG4gICAgICAgICdyb3ctZW5kJzogZ2V0TnVtYmVyV2l0aEF1dG9BbmRBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgQXV0byBGbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1hdXRvLWZsb3dcbiAgICAgICAqL1xuICAgICAgJ2dyaWQtZmxvdyc6IFt7XG4gICAgICAgICdncmlkLWZsb3cnOiBbJ3JvdycsICdjb2wnLCAnZGVuc2UnLCAncm93LWRlbnNlJywgJ2NvbC1kZW5zZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBBdXRvIENvbHVtbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLWF1dG8tY29sdW1uc1xuICAgICAgICovXG4gICAgICAnYXV0by1jb2xzJzogW3tcbiAgICAgICAgJ2F1dG8tY29scyc6IFsnYXV0bycsICdtaW4nLCAnbWF4JywgJ2ZyJywgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIEF1dG8gUm93c1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtYXV0by1yb3dzXG4gICAgICAgKi9cbiAgICAgICdhdXRvLXJvd3MnOiBbe1xuICAgICAgICAnYXV0by1yb3dzJzogWydhdXRvJywgJ21pbicsICdtYXgnLCAnZnInLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdhcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dhcFxuICAgICAgICovXG4gICAgICBnYXA6IFt7XG4gICAgICAgIGdhcDogW2dhcF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHYXAgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dhcFxuICAgICAgICovXG4gICAgICAnZ2FwLXgnOiBbe1xuICAgICAgICAnZ2FwLXgnOiBbZ2FwXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdhcCBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ2FwXG4gICAgICAgKi9cbiAgICAgICdnYXAteSc6IFt7XG4gICAgICAgICdnYXAteSc6IFtnYXBdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSnVzdGlmeSBDb250ZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvanVzdGlmeS1jb250ZW50XG4gICAgICAgKi9cbiAgICAgICdqdXN0aWZ5LWNvbnRlbnQnOiBbe1xuICAgICAgICBqdXN0aWZ5OiBbJ25vcm1hbCcsIC4uLmdldEFsaWduKCldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSnVzdGlmeSBJdGVtc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2p1c3RpZnktaXRlbXNcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktaXRlbXMnOiBbe1xuICAgICAgICAnanVzdGlmeS1pdGVtcyc6IFsnc3RhcnQnLCAnZW5kJywgJ2NlbnRlcicsICdzdHJldGNoJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBKdXN0aWZ5IFNlbGZcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9qdXN0aWZ5LXNlbGZcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktc2VsZic6IFt7XG4gICAgICAgICdqdXN0aWZ5LXNlbGYnOiBbJ2F1dG8nLCAnc3RhcnQnLCAnZW5kJywgJ2NlbnRlcicsICdzdHJldGNoJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGlnbiBDb250ZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYWxpZ24tY29udGVudFxuICAgICAgICovXG4gICAgICAnYWxpZ24tY29udGVudCc6IFt7XG4gICAgICAgIGNvbnRlbnQ6IFsnbm9ybWFsJywgLi4uZ2V0QWxpZ24oKSwgJ2Jhc2VsaW5lJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGlnbiBJdGVtc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FsaWduLWl0ZW1zXG4gICAgICAgKi9cbiAgICAgICdhbGlnbi1pdGVtcyc6IFt7XG4gICAgICAgIGl0ZW1zOiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYmFzZWxpbmUnLCAnc3RyZXRjaCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQWxpZ24gU2VsZlxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FsaWduLXNlbGZcbiAgICAgICAqL1xuICAgICAgJ2FsaWduLXNlbGYnOiBbe1xuICAgICAgICBzZWxmOiBbJ2F1dG8nLCAnc3RhcnQnLCAnZW5kJywgJ2NlbnRlcicsICdzdHJldGNoJywgJ2Jhc2VsaW5lJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQbGFjZSBDb250ZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGxhY2UtY29udGVudFxuICAgICAgICovXG4gICAgICAncGxhY2UtY29udGVudCc6IFt7XG4gICAgICAgICdwbGFjZS1jb250ZW50JzogWy4uLmdldEFsaWduKCksICdiYXNlbGluZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2UgSXRlbXNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wbGFjZS1pdGVtc1xuICAgICAgICovXG4gICAgICAncGxhY2UtaXRlbXMnOiBbe1xuICAgICAgICAncGxhY2UtaXRlbXMnOiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYmFzZWxpbmUnLCAnc3RyZXRjaCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2UgU2VsZlxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BsYWNlLXNlbGZcbiAgICAgICAqL1xuICAgICAgJ3BsYWNlLXNlbGYnOiBbe1xuICAgICAgICAncGxhY2Utc2VsZic6IFsnYXV0bycsICdzdGFydCcsICdlbmQnLCAnY2VudGVyJywgJ3N0cmV0Y2gnXVxuICAgICAgfV0sXG4gICAgICAvLyBTcGFjaW5nXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHA6IFt7XG4gICAgICAgIHA6IFtwYWRkaW5nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHg6IFt7XG4gICAgICAgIHB4OiBbcGFkZGluZ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHB5OiBbe1xuICAgICAgICBweTogW3BhZGRpbmddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHM6IFt7XG4gICAgICAgIHBzOiBbcGFkZGluZ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcGU6IFt7XG4gICAgICAgIHBlOiBbcGFkZGluZ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHQ6IFt7XG4gICAgICAgIHB0OiBbcGFkZGluZ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBwcjogW3tcbiAgICAgICAgcHI6IFtwYWRkaW5nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBwYjogW3tcbiAgICAgICAgcGI6IFtwYWRkaW5nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcGw6IFt7XG4gICAgICAgIHBsOiBbcGFkZGluZ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXJnaW5cbiAgICAgICAqL1xuICAgICAgbTogW3tcbiAgICAgICAgbTogW21hcmdpbl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBteDogW3tcbiAgICAgICAgbXg6IFttYXJnaW5dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXJnaW5cbiAgICAgICAqL1xuICAgICAgbXk6IFt7XG4gICAgICAgIG15OiBbbWFyZ2luXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hcmdpbiBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtczogW3tcbiAgICAgICAgbXM6IFttYXJnaW5dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtZTogW3tcbiAgICAgICAgbWU6IFttYXJnaW5dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtdDogW3tcbiAgICAgICAgbXQ6IFttYXJnaW5dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG1yOiBbe1xuICAgICAgICBtcjogW21hcmdpbl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG1iOiBbe1xuICAgICAgICBtYjogW21hcmdpbl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtbDogW3tcbiAgICAgICAgbWw6IFttYXJnaW5dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3BhY2UgQmV0d2VlbiBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3BhY2VcbiAgICAgICAqL1xuICAgICAgJ3NwYWNlLXgnOiBbe1xuICAgICAgICAnc3BhY2UteCc6IFtzcGFjZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTcGFjZSBCZXR3ZWVuIFggUmV2ZXJzZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NwYWNlXG4gICAgICAgKi9cbiAgICAgICdzcGFjZS14LXJldmVyc2UnOiBbJ3NwYWNlLXgtcmV2ZXJzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBTcGFjZSBCZXR3ZWVuIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zcGFjZVxuICAgICAgICovXG4gICAgICAnc3BhY2UteSc6IFt7XG4gICAgICAgICdzcGFjZS15JzogW3NwYWNlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNwYWNlIEJldHdlZW4gWSBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3BhY2VcbiAgICAgICAqL1xuICAgICAgJ3NwYWNlLXktcmV2ZXJzZSc6IFsnc3BhY2UteS1yZXZlcnNlJ10sXG4gICAgICAvLyBTaXppbmdcbiAgICAgIC8qKlxuICAgICAgICogV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy93aWR0aFxuICAgICAgICovXG4gICAgICB3OiBbe1xuICAgICAgICB3OiBbJ2F1dG8nLCAnbWluJywgJ21heCcsICdmaXQnLCAnc3Z3JywgJ2x2dycsICdkdncnLCBpc0FyYml0cmFyeVZhbHVlLCBzcGFjaW5nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1pbi1XaWR0aFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21pbi13aWR0aFxuICAgICAgICovXG4gICAgICAnbWluLXcnOiBbe1xuICAgICAgICAnbWluLXcnOiBbaXNBcmJpdHJhcnlWYWx1ZSwgc3BhY2luZywgJ21pbicsICdtYXgnLCAnZml0J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXgtV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXgtd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ21heC13JzogW3tcbiAgICAgICAgJ21heC13JzogW2lzQXJiaXRyYXJ5VmFsdWUsIHNwYWNpbmcsICdub25lJywgJ2Z1bGwnLCAnbWluJywgJ21heCcsICdmaXQnLCAncHJvc2UnLCB7XG4gICAgICAgICAgc2NyZWVuOiBbaXNUc2hpcnRTaXplXVxuICAgICAgICB9LCBpc1RzaGlydFNpemVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSGVpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaGVpZ2h0XG4gICAgICAgKi9cbiAgICAgIGg6IFt7XG4gICAgICAgIGg6IFtpc0FyYml0cmFyeVZhbHVlLCBzcGFjaW5nLCAnYXV0bycsICdtaW4nLCAnbWF4JywgJ2ZpdCcsICdzdmgnLCAnbHZoJywgJ2R2aCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWluLUhlaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21pbi1oZWlnaHRcbiAgICAgICAqL1xuICAgICAgJ21pbi1oJzogW3tcbiAgICAgICAgJ21pbi1oJzogW2lzQXJiaXRyYXJ5VmFsdWUsIHNwYWNpbmcsICdtaW4nLCAnbWF4JywgJ2ZpdCcsICdzdmgnLCAnbHZoJywgJ2R2aCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWF4LUhlaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21heC1oZWlnaHRcbiAgICAgICAqL1xuICAgICAgJ21heC1oJzogW3tcbiAgICAgICAgJ21heC1oJzogW2lzQXJiaXRyYXJ5VmFsdWUsIHNwYWNpbmcsICdtaW4nLCAnbWF4JywgJ2ZpdCcsICdzdmgnLCAnbHZoJywgJ2R2aCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NpemVcbiAgICAgICAqL1xuICAgICAgc2l6ZTogW3tcbiAgICAgICAgc2l6ZTogW2lzQXJiaXRyYXJ5VmFsdWUsIHNwYWNpbmcsICdhdXRvJywgJ21pbicsICdtYXgnLCAnZml0J11cbiAgICAgIH1dLFxuICAgICAgLy8gVHlwb2dyYXBoeVxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFNpemVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXNpemVcbiAgICAgICAqL1xuICAgICAgJ2ZvbnQtc2l6ZSc6IFt7XG4gICAgICAgIHRleHQ6IFsnYmFzZScsIGlzVHNoaXJ0U2l6ZSwgaXNBcmJpdHJhcnlMZW5ndGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBTbW9vdGhpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXNtb290aGluZ1xuICAgICAgICovXG4gICAgICAnZm9udC1zbW9vdGhpbmcnOiBbJ2FudGlhbGlhc2VkJywgJ3N1YnBpeGVsLWFudGlhbGlhc2VkJ10sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgU3R5bGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdmb250LXN0eWxlJzogWydpdGFsaWMnLCAnbm90LWl0YWxpYyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFdlaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtd2VpZ2h0XG4gICAgICAgKi9cbiAgICAgICdmb250LXdlaWdodCc6IFt7XG4gICAgICAgIGZvbnQ6IFsndGhpbicsICdleHRyYWxpZ2h0JywgJ2xpZ2h0JywgJ25vcm1hbCcsICdtZWRpdW0nLCAnc2VtaWJvbGQnLCAnYm9sZCcsICdleHRyYWJvbGQnLCAnYmxhY2snLCBpc0FyYml0cmFyeU51bWJlcl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IEZhbWlseVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtZmFtaWx5XG4gICAgICAgKi9cbiAgICAgICdmb250LWZhbWlseSc6IFt7XG4gICAgICAgIGZvbnQ6IFtpc0FueV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tbm9ybWFsJzogWydub3JtYWwtbnVtcyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tb3JkaW5hbCc6IFsnb3JkaW5hbCddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tc2xhc2hlZC16ZXJvJzogWydzbGFzaGVkLXplcm8nXSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBWYXJpYW50IE51bWVyaWNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXZhcmlhbnQtbnVtZXJpY1xuICAgICAgICovXG4gICAgICAnZnZuLWZpZ3VyZSc6IFsnbGluaW5nLW51bXMnLCAnb2xkc3R5bGUtbnVtcyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tc3BhY2luZyc6IFsncHJvcG9ydGlvbmFsLW51bXMnLCAndGFidWxhci1udW1zJ10sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgVmFyaWFudCBOdW1lcmljXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZm9udC12YXJpYW50LW51bWVyaWNcbiAgICAgICAqL1xuICAgICAgJ2Z2bi1mcmFjdGlvbic6IFsnZGlhZ29uYWwtZnJhY3Rpb25zJywgJ3N0YWNrZWQtZnJhY3Rpb25zJ10sXG4gICAgICAvKipcbiAgICAgICAqIExldHRlciBTcGFjaW5nXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGV0dGVyLXNwYWNpbmdcbiAgICAgICAqL1xuICAgICAgdHJhY2tpbmc6IFt7XG4gICAgICAgIHRyYWNraW5nOiBbJ3RpZ2h0ZXInLCAndGlnaHQnLCAnbm9ybWFsJywgJ3dpZGUnLCAnd2lkZXInLCAnd2lkZXN0JywgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMaW5lIENsYW1wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGluZS1jbGFtcFxuICAgICAgICovXG4gICAgICAnbGluZS1jbGFtcCc6IFt7XG4gICAgICAgICdsaW5lLWNsYW1wJzogWydub25lJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5TnVtYmVyXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpbmUgSGVpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGluZS1oZWlnaHRcbiAgICAgICAqL1xuICAgICAgbGVhZGluZzogW3tcbiAgICAgICAgbGVhZGluZzogWydub25lJywgJ3RpZ2h0JywgJ3NudWcnLCAnbm9ybWFsJywgJ3JlbGF4ZWQnLCAnbG9vc2UnLCBpc0xlbmd0aCwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMaXN0IFN0eWxlIEltYWdlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGlzdC1zdHlsZS1pbWFnZVxuICAgICAgICovXG4gICAgICAnbGlzdC1pbWFnZSc6IFt7XG4gICAgICAgICdsaXN0LWltYWdlJzogWydub25lJywgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMaXN0IFN0eWxlIFR5cGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9saXN0LXN0eWxlLXR5cGVcbiAgICAgICAqL1xuICAgICAgJ2xpc3Qtc3R5bGUtdHlwZSc6IFt7XG4gICAgICAgIGxpc3Q6IFsnbm9uZScsICdkaXNjJywgJ2RlY2ltYWwnLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpc3QgU3R5bGUgUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9saXN0LXN0eWxlLXBvc2l0aW9uXG4gICAgICAgKi9cbiAgICAgICdsaXN0LXN0eWxlLXBvc2l0aW9uJzogW3tcbiAgICAgICAgbGlzdDogWydpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2Vob2xkZXIgQ29sb3JcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2My4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wbGFjZWhvbGRlci1jb2xvclxuICAgICAgICovXG4gICAgICAncGxhY2Vob2xkZXItY29sb3InOiBbe1xuICAgICAgICBwbGFjZWhvbGRlcjogW2NvbG9yc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQbGFjZWhvbGRlciBPcGFjaXR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGxhY2Vob2xkZXItb3BhY2l0eVxuICAgICAgICovXG4gICAgICAncGxhY2Vob2xkZXItb3BhY2l0eSc6IFt7XG4gICAgICAgICdwbGFjZWhvbGRlci1vcGFjaXR5JzogW29wYWNpdHldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBBbGlnbm1lbnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWFsaWduXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWFsaWdubWVudCc6IFt7XG4gICAgICAgIHRleHQ6IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnLCAnanVzdGlmeScsICdzdGFydCcsICdlbmQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWNvbG9yXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWNvbG9yJzogW3tcbiAgICAgICAgdGV4dDogW2NvbG9yc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IE9wYWNpdHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LW9wYWNpdHlcbiAgICAgICAqL1xuICAgICAgJ3RleHQtb3BhY2l0eSc6IFt7XG4gICAgICAgICd0ZXh0LW9wYWNpdHknOiBbb3BhY2l0eV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IERlY29yYXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb25cbiAgICAgICAqL1xuICAgICAgJ3RleHQtZGVjb3JhdGlvbic6IFsndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCcsICduby11bmRlcmxpbmUnXSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBEZWNvcmF0aW9uIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1kZWNvcmF0aW9uLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnOiBbe1xuICAgICAgICBkZWNvcmF0aW9uOiBbLi4uZ2V0TGluZVN0eWxlcygpLCAnd2F2eSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBEZWNvcmF0aW9uIFRoaWNrbmVzc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtZGVjb3JhdGlvbi10aGlja25lc3NcbiAgICAgICAqL1xuICAgICAgJ3RleHQtZGVjb3JhdGlvbi10aGlja25lc3MnOiBbe1xuICAgICAgICBkZWNvcmF0aW9uOiBbJ2F1dG8nLCAnZnJvbS1mb250JywgaXNMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgVW5kZXJsaW5lIE9mZnNldFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtdW5kZXJsaW5lLW9mZnNldFxuICAgICAgICovXG4gICAgICAndW5kZXJsaW5lLW9mZnNldCc6IFt7XG4gICAgICAgICd1bmRlcmxpbmUtb2Zmc2V0JzogWydhdXRvJywgaXNMZW5ndGgsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBEZWNvcmF0aW9uIENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1kZWNvcmF0aW9uLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWRlY29yYXRpb24tY29sb3InOiBbe1xuICAgICAgICBkZWNvcmF0aW9uOiBbY29sb3JzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgVHJhbnNmb3JtXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC10cmFuc2Zvcm1cbiAgICAgICAqL1xuICAgICAgJ3RleHQtdHJhbnNmb3JtJzogWyd1cHBlcmNhc2UnLCAnbG93ZXJjYXNlJywgJ2NhcGl0YWxpemUnLCAnbm9ybWFsLWNhc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBPdmVyZmxvd1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgJ3RleHQtb3ZlcmZsb3cnOiBbJ3RydW5jYXRlJywgJ3RleHQtZWxsaXBzaXMnLCAndGV4dC1jbGlwJ10sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgV3JhcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtd3JhcFxuICAgICAgICovXG4gICAgICAndGV4dC13cmFwJzogW3tcbiAgICAgICAgdGV4dDogWyd3cmFwJywgJ25vd3JhcCcsICdiYWxhbmNlJywgJ3ByZXR0eSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBJbmRlbnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWluZGVudFxuICAgICAgICovXG4gICAgICBpbmRlbnQ6IFt7XG4gICAgICAgIGluZGVudDogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFZlcnRpY2FsIEFsaWdubWVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3ZlcnRpY2FsLWFsaWduXG4gICAgICAgKi9cbiAgICAgICd2ZXJ0aWNhbC1hbGlnbic6IFt7XG4gICAgICAgIGFsaWduOiBbJ2Jhc2VsaW5lJywgJ3RvcCcsICdtaWRkbGUnLCAnYm90dG9tJywgJ3RleHQtdG9wJywgJ3RleHQtYm90dG9tJywgJ3N1YicsICdzdXBlcicsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogV2hpdGVzcGFjZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3doaXRlc3BhY2VcbiAgICAgICAqL1xuICAgICAgd2hpdGVzcGFjZTogW3tcbiAgICAgICAgd2hpdGVzcGFjZTogWydub3JtYWwnLCAnbm93cmFwJywgJ3ByZScsICdwcmUtbGluZScsICdwcmUtd3JhcCcsICdicmVhay1zcGFjZXMnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFdvcmQgQnJlYWtcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy93b3JkLWJyZWFrXG4gICAgICAgKi9cbiAgICAgIGJyZWFrOiBbe1xuICAgICAgICBicmVhazogWydub3JtYWwnLCAnd29yZHMnLCAnYWxsJywgJ2tlZXAnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEh5cGhlbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9oeXBoZW5zXG4gICAgICAgKi9cbiAgICAgIGh5cGhlbnM6IFt7XG4gICAgICAgIGh5cGhlbnM6IFsnbm9uZScsICdtYW51YWwnLCAnYXV0byddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ29udGVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NvbnRlbnRcbiAgICAgICAqL1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgY29udGVudDogWydub25lJywgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gQmFja2dyb3VuZHNcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBBdHRhY2htZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2dyb3VuZC1hdHRhY2htZW50XG4gICAgICAgKi9cbiAgICAgICdiZy1hdHRhY2htZW50JzogW3tcbiAgICAgICAgYmc6IFsnZml4ZWQnLCAnbG9jYWwnLCAnc2Nyb2xsJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZ3JvdW5kIENsaXBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWNsaXBcbiAgICAgICAqL1xuICAgICAgJ2JnLWNsaXAnOiBbe1xuICAgICAgICAnYmctY2xpcCc6IFsnYm9yZGVyJywgJ3BhZGRpbmcnLCAnY29udGVudCcsICd0ZXh0J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZ3JvdW5kIE9wYWNpdHlcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2My4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLW9wYWNpdHlcbiAgICAgICAqL1xuICAgICAgJ2JnLW9wYWNpdHknOiBbe1xuICAgICAgICAnYmctb3BhY2l0eSc6IFtvcGFjaXR5XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgT3JpZ2luXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2dyb3VuZC1vcmlnaW5cbiAgICAgICAqL1xuICAgICAgJ2JnLW9yaWdpbic6IFt7XG4gICAgICAgICdiZy1vcmlnaW4nOiBbJ2JvcmRlcicsICdwYWRkaW5nJywgJ2NvbnRlbnQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLXBvc2l0aW9uXG4gICAgICAgKi9cbiAgICAgICdiZy1wb3NpdGlvbic6IFt7XG4gICAgICAgIGJnOiBbLi4uZ2V0UG9zaXRpb25zKCksIGlzQXJiaXRyYXJ5UG9zaXRpb25dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBSZXBlYXRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLXJlcGVhdFxuICAgICAgICovXG4gICAgICAnYmctcmVwZWF0JzogW3tcbiAgICAgICAgYmc6IFsnbm8tcmVwZWF0Jywge1xuICAgICAgICAgIHJlcGVhdDogWycnLCAneCcsICd5JywgJ3JvdW5kJywgJ3NwYWNlJ11cbiAgICAgICAgfV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZ3JvdW5kIFNpemVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLXNpemVcbiAgICAgICAqL1xuICAgICAgJ2JnLXNpemUnOiBbe1xuICAgICAgICBiZzogWydhdXRvJywgJ2NvdmVyJywgJ2NvbnRhaW4nLCBpc0FyYml0cmFyeVNpemVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBJbWFnZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtaW1hZ2VcbiAgICAgICAqL1xuICAgICAgJ2JnLWltYWdlJzogW3tcbiAgICAgICAgYmc6IFsnbm9uZScsIHtcbiAgICAgICAgICAnZ3JhZGllbnQtdG8nOiBbJ3QnLCAndHInLCAncicsICdicicsICdiJywgJ2JsJywgJ2wnLCAndGwnXVxuICAgICAgICB9LCBpc0FyYml0cmFyeUltYWdlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdiZy1jb2xvcic6IFt7XG4gICAgICAgIGJnOiBbY29sb3JzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyYWRpZW50IENvbG9yIFN0b3BzIEZyb20gUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmFkaWVudC1jb2xvci1zdG9wc1xuICAgICAgICovXG4gICAgICAnZ3JhZGllbnQtZnJvbS1wb3MnOiBbe1xuICAgICAgICBmcm9tOiBbZ3JhZGllbnRDb2xvclN0b3BQb3NpdGlvbnNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JhZGllbnQgQ29sb3IgU3RvcHMgVmlhIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LXZpYS1wb3MnOiBbe1xuICAgICAgICB2aWE6IFtncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBUbyBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyYWRpZW50LWNvbG9yLXN0b3BzXG4gICAgICAgKi9cbiAgICAgICdncmFkaWVudC10by1wb3MnOiBbe1xuICAgICAgICB0bzogW2dyYWRpZW50Q29sb3JTdG9wUG9zaXRpb25zXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyYWRpZW50IENvbG9yIFN0b3BzIEZyb21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmFkaWVudC1jb2xvci1zdG9wc1xuICAgICAgICovXG4gICAgICAnZ3JhZGllbnQtZnJvbSc6IFt7XG4gICAgICAgIGZyb206IFtncmFkaWVudENvbG9yU3RvcHNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JhZGllbnQgQ29sb3IgU3RvcHMgVmlhXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LXZpYSc6IFt7XG4gICAgICAgIHZpYTogW2dyYWRpZW50Q29sb3JTdG9wc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBUb1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyYWRpZW50LWNvbG9yLXN0b3BzXG4gICAgICAgKi9cbiAgICAgICdncmFkaWVudC10byc6IFt7XG4gICAgICAgIHRvOiBbZ3JhZGllbnRDb2xvclN0b3BzXVxuICAgICAgfV0sXG4gICAgICAvLyBCb3JkZXJzXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgIHJvdW5kZWQ6IFt7XG4gICAgICAgIHJvdW5kZWQ6IFtib3JkZXJSYWRpdXNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtcyc6IFt7XG4gICAgICAgICdyb3VuZGVkLXMnOiBbYm9yZGVyUmFkaXVzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1lJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtZSc6IFtib3JkZXJSYWRpdXNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBUb3BcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLXQnOiBbe1xuICAgICAgICAncm91bmRlZC10JzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1yJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtcic6IFtib3JkZXJSYWRpdXNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLWInOiBbe1xuICAgICAgICAncm91bmRlZC1iJzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIExlZnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLWwnOiBbe1xuICAgICAgICAncm91bmRlZC1sJzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFN0YXJ0IFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1zcyc6IFt7XG4gICAgICAgICdyb3VuZGVkLXNzJzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFN0YXJ0IEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtc2UnOiBbe1xuICAgICAgICAncm91bmRlZC1zZSc6IFtib3JkZXJSYWRpdXNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBFbmQgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1lZSc6IFt7XG4gICAgICAgICdyb3VuZGVkLWVlJzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIEVuZCBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtZXMnOiBbe1xuICAgICAgICAncm91bmRlZC1lcyc6IFtib3JkZXJSYWRpdXNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBUb3AgTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtdGwnOiBbe1xuICAgICAgICAncm91bmRlZC10bCc6IFtib3JkZXJSYWRpdXNdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBUb3AgUmlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLXRyJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtdHInOiBbYm9yZGVyUmFkaXVzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgQm90dG9tIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1icic6IFt7XG4gICAgICAgICdyb3VuZGVkLWJyJzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIEJvdHRvbSBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1ibCc6IFt7XG4gICAgICAgICdyb3VuZGVkLWJsJzogW2JvcmRlclJhZGl1c11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13JzogW3tcbiAgICAgICAgYm9yZGVyOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LXgnOiBbe1xuICAgICAgICAnYm9yZGVyLXgnOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LXknOiBbe1xuICAgICAgICAnYm9yZGVyLXknOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy1zJzogW3tcbiAgICAgICAgJ2JvcmRlci1zJzogW2JvcmRlcldpZHRoXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LWUnOiBbe1xuICAgICAgICAnYm9yZGVyLWUnOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctdCc6IFt7XG4gICAgICAgICdib3JkZXItdCc6IFtib3JkZXJXaWR0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGggUmlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LXInOiBbe1xuICAgICAgICAnYm9yZGVyLXInOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIEJvdHRvbVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctYic6IFt7XG4gICAgICAgICdib3JkZXItYic6IFtib3JkZXJXaWR0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGggTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctbCc6IFt7XG4gICAgICAgICdib3JkZXItbCc6IFtib3JkZXJXaWR0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgT3BhY2l0eVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1vcGFjaXR5XG4gICAgICAgKi9cbiAgICAgICdib3JkZXItb3BhY2l0eSc6IFt7XG4gICAgICAgICdib3JkZXItb3BhY2l0eSc6IFtvcGFjaXR5XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBTdHlsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zdHlsZVxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXN0eWxlJzogW3tcbiAgICAgICAgYm9yZGVyOiBbLi4uZ2V0TGluZVN0eWxlcygpLCAnaGlkZGVuJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgV2lkdGggWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS13aWR0aFxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXgnOiBbe1xuICAgICAgICAnZGl2aWRlLXgnOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRGl2aWRlIFdpZHRoIFggUmV2ZXJzZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS13aWR0aFxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXgtcmV2ZXJzZSc6IFsnZGl2aWRlLXgtcmV2ZXJzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgV2lkdGggWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS13aWR0aFxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXknOiBbe1xuICAgICAgICAnZGl2aWRlLXknOiBbYm9yZGVyV2lkdGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRGl2aWRlIFdpZHRoIFkgUmV2ZXJzZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS13aWR0aFxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXktcmV2ZXJzZSc6IFsnZGl2aWRlLXktcmV2ZXJzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgT3BhY2l0eVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS1vcGFjaXR5XG4gICAgICAgKi9cbiAgICAgICdkaXZpZGUtb3BhY2l0eSc6IFt7XG4gICAgICAgICdkaXZpZGUtb3BhY2l0eSc6IFtvcGFjaXR5XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpdmlkZSBTdHlsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS1zdHlsZVxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXN0eWxlJzogW3tcbiAgICAgICAgZGl2aWRlOiBnZXRMaW5lU3R5bGVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xvcic6IFt7XG4gICAgICAgIGJvcmRlcjogW2JvcmRlckNvbG9yXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3IteCc6IFt7XG4gICAgICAgICdib3JkZXIteCc6IFtib3JkZXJDb2xvcl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXknOiBbe1xuICAgICAgICAnYm9yZGVyLXknOiBbYm9yZGVyQ29sb3JdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIENvbG9yIFNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xvci1zJzogW3tcbiAgICAgICAgJ2JvcmRlci1zJzogW2JvcmRlckNvbG9yXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBFXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItZSc6IFt7XG4gICAgICAgICdib3JkZXItZSc6IFtib3JkZXJDb2xvcl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItdCc6IFt7XG4gICAgICAgICdib3JkZXItdCc6IFtib3JkZXJDb2xvcl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgUmlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xvci1yJzogW3tcbiAgICAgICAgJ2JvcmRlci1yJzogW2JvcmRlckNvbG9yXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xvci1iJzogW3tcbiAgICAgICAgJ2JvcmRlci1iJzogW2JvcmRlckNvbG9yXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItbCc6IFt7XG4gICAgICAgICdib3JkZXItbCc6IFtib3JkZXJDb2xvcl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9kaXZpZGUtY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2RpdmlkZS1jb2xvcic6IFt7XG4gICAgICAgIGRpdmlkZTogW2JvcmRlckNvbG9yXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE91dGxpbmUgU3R5bGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdXRsaW5lLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdvdXRsaW5lLXN0eWxlJzogW3tcbiAgICAgICAgb3V0bGluZTogWycnLCAuLi5nZXRMaW5lU3R5bGVzKCldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3V0bGluZSBPZmZzZXRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdXRsaW5lLW9mZnNldFxuICAgICAgICovXG4gICAgICAnb3V0bGluZS1vZmZzZXQnOiBbe1xuICAgICAgICAnb3V0bGluZS1vZmZzZXQnOiBbaXNMZW5ndGgsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3V0bGluZSBXaWR0aFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL291dGxpbmUtd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ291dGxpbmUtdyc6IFt7XG4gICAgICAgIG91dGxpbmU6IFtpc0xlbmd0aCwgaXNBcmJpdHJhcnlMZW5ndGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3V0bGluZSBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL291dGxpbmUtY29sb3JcbiAgICAgICAqL1xuICAgICAgJ291dGxpbmUtY29sb3InOiBbe1xuICAgICAgICBvdXRsaW5lOiBbY29sb3JzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yaW5nLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdyaW5nLXcnOiBbe1xuICAgICAgICByaW5nOiBnZXRMZW5ndGhXaXRoRW1wdHlBbmRBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgV2lkdGggSW5zZXRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yaW5nLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdyaW5nLXctaW5zZXQnOiBbJ3JpbmctaW5zZXQnXSxcbiAgICAgIC8qKlxuICAgICAgICogUmluZyBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3JpbmctY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3JpbmctY29sb3InOiBbe1xuICAgICAgICByaW5nOiBbY29sb3JzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgT3BhY2l0eVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Jpbmctb3BhY2l0eVxuICAgICAgICovXG4gICAgICAncmluZy1vcGFjaXR5JzogW3tcbiAgICAgICAgJ3Jpbmctb3BhY2l0eSc6IFtvcGFjaXR5XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgT2Zmc2V0IFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcmluZy1vZmZzZXQtd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ3Jpbmctb2Zmc2V0LXcnOiBbe1xuICAgICAgICAncmluZy1vZmZzZXQnOiBbaXNMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgT2Zmc2V0IENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcmluZy1vZmZzZXQtY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3Jpbmctb2Zmc2V0LWNvbG9yJzogW3tcbiAgICAgICAgJ3Jpbmctb2Zmc2V0JzogW2NvbG9yc11cbiAgICAgIH1dLFxuICAgICAgLy8gRWZmZWN0c1xuICAgICAgLyoqXG4gICAgICAgKiBCb3ggU2hhZG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvd1xuICAgICAgICovXG4gICAgICBzaGFkb3c6IFt7XG4gICAgICAgIHNoYWRvdzogWycnLCAnaW5uZXInLCAnbm9uZScsIGlzVHNoaXJ0U2l6ZSwgaXNBcmJpdHJhcnlTaGFkb3ddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm94IFNoYWRvdyBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JveC1zaGFkb3ctY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3NoYWRvdy1jb2xvcic6IFt7XG4gICAgICAgIHNoYWRvdzogW2lzQW55XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE9wYWNpdHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vcGFjaXR5XG4gICAgICAgKi9cbiAgICAgIG9wYWNpdHk6IFt7XG4gICAgICAgIG9wYWNpdHk6IFtvcGFjaXR5XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1peCBCbGVuZCBNb2RlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWl4LWJsZW5kLW1vZGVcbiAgICAgICAqL1xuICAgICAgJ21peC1ibGVuZCc6IFt7XG4gICAgICAgICdtaXgtYmxlbmQnOiBbLi4uZ2V0QmxlbmRNb2RlcygpLCAncGx1cy1saWdodGVyJywgJ3BsdXMtZGFya2VyJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZ3JvdW5kIEJsZW5kIE1vZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWJsZW5kLW1vZGVcbiAgICAgICAqL1xuICAgICAgJ2JnLWJsZW5kJzogW3tcbiAgICAgICAgJ2JnLWJsZW5kJzogZ2V0QmxlbmRNb2RlcygpXG4gICAgICB9XSxcbiAgICAgIC8vIEZpbHRlcnNcbiAgICAgIC8qKlxuICAgICAgICogRmlsdGVyXG4gICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjMuMC4wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmlsdGVyXG4gICAgICAgKi9cbiAgICAgIGZpbHRlcjogW3tcbiAgICAgICAgZmlsdGVyOiBbJycsICdub25lJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCbHVyXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmx1clxuICAgICAgICovXG4gICAgICBibHVyOiBbe1xuICAgICAgICBibHVyOiBbYmx1cl1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmlnaHRuZXNzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJpZ2h0bmVzc1xuICAgICAgICovXG4gICAgICBicmlnaHRuZXNzOiBbe1xuICAgICAgICBicmlnaHRuZXNzOiBbYnJpZ2h0bmVzc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDb250cmFzdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NvbnRyYXN0XG4gICAgICAgKi9cbiAgICAgIGNvbnRyYXN0OiBbe1xuICAgICAgICBjb250cmFzdDogW2NvbnRyYXN0XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERyb3AgU2hhZG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZHJvcC1zaGFkb3dcbiAgICAgICAqL1xuICAgICAgJ2Ryb3Atc2hhZG93JzogW3tcbiAgICAgICAgJ2Ryb3Atc2hhZG93JzogWycnLCAnbm9uZScsIGlzVHNoaXJ0U2l6ZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmF5c2NhbGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmF5c2NhbGVcbiAgICAgICAqL1xuICAgICAgZ3JheXNjYWxlOiBbe1xuICAgICAgICBncmF5c2NhbGU6IFtncmF5c2NhbGVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSHVlIFJvdGF0ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2h1ZS1yb3RhdGVcbiAgICAgICAqL1xuICAgICAgJ2h1ZS1yb3RhdGUnOiBbe1xuICAgICAgICAnaHVlLXJvdGF0ZSc6IFtodWVSb3RhdGVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSW52ZXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaW52ZXJ0XG4gICAgICAgKi9cbiAgICAgIGludmVydDogW3tcbiAgICAgICAgaW52ZXJ0OiBbaW52ZXJ0XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNhdHVyYXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2F0dXJhdGVcbiAgICAgICAqL1xuICAgICAgc2F0dXJhdGU6IFt7XG4gICAgICAgIHNhdHVyYXRlOiBbc2F0dXJhdGVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2VwaWFcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zZXBpYVxuICAgICAgICovXG4gICAgICBzZXBpYTogW3tcbiAgICAgICAgc2VwaWE6IFtzZXBpYV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBGaWx0ZXJcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2My4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1maWx0ZXJcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWZpbHRlcic6IFt7XG4gICAgICAgICdiYWNrZHJvcC1maWx0ZXInOiBbJycsICdub25lJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBCbHVyXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3AtYmx1clxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3AtYmx1cic6IFt7XG4gICAgICAgICdiYWNrZHJvcC1ibHVyJzogW2JsdXJdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgQnJpZ2h0bmVzc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWJyaWdodG5lc3NcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWJyaWdodG5lc3MnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtYnJpZ2h0bmVzcyc6IFticmlnaHRuZXNzXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIENvbnRyYXN0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3AtY29udHJhc3RcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWNvbnRyYXN0JzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLWNvbnRyYXN0JzogW2NvbnRyYXN0XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIEdyYXlzY2FsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWdyYXlzY2FsZVxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3AtZ3JheXNjYWxlJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLWdyYXlzY2FsZSc6IFtncmF5c2NhbGVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgSHVlIFJvdGF0ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWh1ZS1yb3RhdGVcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWh1ZS1yb3RhdGUnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtaHVlLXJvdGF0ZSc6IFtodWVSb3RhdGVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgSW52ZXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3AtaW52ZXJ0XG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1pbnZlcnQnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtaW52ZXJ0JzogW2ludmVydF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBPcGFjaXR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atb3BhY2l0eVxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3Atb3BhY2l0eSc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1vcGFjaXR5JzogW29wYWNpdHldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgU2F0dXJhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1zYXR1cmF0ZVxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3Atc2F0dXJhdGUnOiBbe1xuICAgICAgICAnYmFja2Ryb3Atc2F0dXJhdGUnOiBbc2F0dXJhdGVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgU2VwaWFcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1zZXBpYVxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3Atc2VwaWEnOiBbe1xuICAgICAgICAnYmFja2Ryb3Atc2VwaWEnOiBbc2VwaWFdXG4gICAgICB9XSxcbiAgICAgIC8vIFRhYmxlc1xuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sbGFwc2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sbGFwc2VcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xsYXBzZSc6IFt7XG4gICAgICAgIGJvcmRlcjogWydjb2xsYXBzZScsICdzZXBhcmF0ZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItc3BhY2luZ1xuICAgICAgICovXG4gICAgICAnYm9yZGVyLXNwYWNpbmcnOiBbe1xuICAgICAgICAnYm9yZGVyLXNwYWNpbmcnOiBbYm9yZGVyU3BhY2luZ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgU3BhY2luZyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXNwYWNpbmdcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1zcGFjaW5nLXgnOiBbe1xuICAgICAgICAnYm9yZGVyLXNwYWNpbmcteCc6IFtib3JkZXJTcGFjaW5nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBTcGFjaW5nIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItc3BhY2luZ1xuICAgICAgICovXG4gICAgICAnYm9yZGVyLXNwYWNpbmcteSc6IFt7XG4gICAgICAgICdib3JkZXItc3BhY2luZy15JzogW2JvcmRlclNwYWNpbmddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGFibGUgTGF5b3V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGFibGUtbGF5b3V0XG4gICAgICAgKi9cbiAgICAgICd0YWJsZS1sYXlvdXQnOiBbe1xuICAgICAgICB0YWJsZTogWydhdXRvJywgJ2ZpeGVkJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDYXB0aW9uIFNpZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jYXB0aW9uLXNpZGVcbiAgICAgICAqL1xuICAgICAgY2FwdGlvbjogW3tcbiAgICAgICAgY2FwdGlvbjogWyd0b3AnLCAnYm90dG9tJ11cbiAgICAgIH1dLFxuICAgICAgLy8gVHJhbnNpdGlvbnMgYW5kIEFuaW1hdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuaXNpdGlvbiBQcm9wZXJ0eVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zaXRpb24tcHJvcGVydHlcbiAgICAgICAqL1xuICAgICAgdHJhbnNpdGlvbjogW3tcbiAgICAgICAgdHJhbnNpdGlvbjogWydub25lJywgJ2FsbCcsICcnLCAnY29sb3JzJywgJ29wYWNpdHknLCAnc2hhZG93JywgJ3RyYW5zZm9ybScsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNpdGlvbiBEdXJhdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zaXRpb24tZHVyYXRpb25cbiAgICAgICAqL1xuICAgICAgZHVyYXRpb246IFt7XG4gICAgICAgIGR1cmF0aW9uOiBnZXROdW1iZXJBbmRBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zaXRpb24gVGltaW5nIEZ1bmN0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgZWFzZTogW3tcbiAgICAgICAgZWFzZTogWydsaW5lYXInLCAnaW4nLCAnb3V0JywgJ2luLW91dCcsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNpdGlvbiBEZWxheVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zaXRpb24tZGVsYXlcbiAgICAgICAqL1xuICAgICAgZGVsYXk6IFt7XG4gICAgICAgIGRlbGF5OiBnZXROdW1iZXJBbmRBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEFuaW1hdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FuaW1hdGlvblxuICAgICAgICovXG4gICAgICBhbmltYXRlOiBbe1xuICAgICAgICBhbmltYXRlOiBbJ25vbmUnLCAnc3BpbicsICdwaW5nJywgJ3B1bHNlJywgJ2JvdW5jZScsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8vIFRyYW5zZm9ybXNcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNmb3JtXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNmb3JtXG4gICAgICAgKi9cbiAgICAgIHRyYW5zZm9ybTogW3tcbiAgICAgICAgdHJhbnNmb3JtOiBbJycsICdncHUnLCAnbm9uZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2NhbGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY2FsZVxuICAgICAgICovXG4gICAgICBzY2FsZTogW3tcbiAgICAgICAgc2NhbGU6IFtzY2FsZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY2FsZSBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2NhbGVcbiAgICAgICAqL1xuICAgICAgJ3NjYWxlLXgnOiBbe1xuICAgICAgICAnc2NhbGUteCc6IFtzY2FsZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY2FsZSBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2NhbGVcbiAgICAgICAqL1xuICAgICAgJ3NjYWxlLXknOiBbe1xuICAgICAgICAnc2NhbGUteSc6IFtzY2FsZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSb3RhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yb3RhdGVcbiAgICAgICAqL1xuICAgICAgcm90YXRlOiBbe1xuICAgICAgICByb3RhdGU6IFtpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2xhdGVcbiAgICAgICAqL1xuICAgICAgJ3RyYW5zbGF0ZS14JzogW3tcbiAgICAgICAgJ3RyYW5zbGF0ZS14JzogW3RyYW5zbGF0ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2xhdGUgWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zbGF0ZVxuICAgICAgICovXG4gICAgICAndHJhbnNsYXRlLXknOiBbe1xuICAgICAgICAndHJhbnNsYXRlLXknOiBbdHJhbnNsYXRlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNrZXcgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NrZXdcbiAgICAgICAqL1xuICAgICAgJ3NrZXcteCc6IFt7XG4gICAgICAgICdza2V3LXgnOiBbc2tld11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTa2V3IFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9za2V3XG4gICAgICAgKi9cbiAgICAgICdza2V3LXknOiBbe1xuICAgICAgICAnc2tldy15JzogW3NrZXddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNmb3JtIE9yaWdpblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zZm9ybS1vcmlnaW5cbiAgICAgICAqL1xuICAgICAgJ3RyYW5zZm9ybS1vcmlnaW4nOiBbe1xuICAgICAgICBvcmlnaW46IFsnY2VudGVyJywgJ3RvcCcsICd0b3AtcmlnaHQnLCAncmlnaHQnLCAnYm90dG9tLXJpZ2h0JywgJ2JvdHRvbScsICdib3R0b20tbGVmdCcsICdsZWZ0JywgJ3RvcC1sZWZ0JywgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gSW50ZXJhY3Rpdml0eVxuICAgICAgLyoqXG4gICAgICAgKiBBY2NlbnQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hY2NlbnQtY29sb3JcbiAgICAgICAqL1xuICAgICAgYWNjZW50OiBbe1xuICAgICAgICBhY2NlbnQ6IFsnYXV0bycsIGNvbG9yc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBcHBlYXJhbmNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYXBwZWFyYW5jZVxuICAgICAgICovXG4gICAgICBhcHBlYXJhbmNlOiBbe1xuICAgICAgICBhcHBlYXJhbmNlOiBbJ25vbmUnLCAnYXV0byddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ3Vyc29yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY3Vyc29yXG4gICAgICAgKi9cbiAgICAgIGN1cnNvcjogW3tcbiAgICAgICAgY3Vyc29yOiBbJ2F1dG8nLCAnZGVmYXVsdCcsICdwb2ludGVyJywgJ3dhaXQnLCAndGV4dCcsICdtb3ZlJywgJ2hlbHAnLCAnbm90LWFsbG93ZWQnLCAnbm9uZScsICdjb250ZXh0LW1lbnUnLCAncHJvZ3Jlc3MnLCAnY2VsbCcsICdjcm9zc2hhaXInLCAndmVydGljYWwtdGV4dCcsICdhbGlhcycsICdjb3B5JywgJ25vLWRyb3AnLCAnZ3JhYicsICdncmFiYmluZycsICdhbGwtc2Nyb2xsJywgJ2NvbC1yZXNpemUnLCAncm93LXJlc2l6ZScsICduLXJlc2l6ZScsICdlLXJlc2l6ZScsICdzLXJlc2l6ZScsICd3LXJlc2l6ZScsICduZS1yZXNpemUnLCAnbnctcmVzaXplJywgJ3NlLXJlc2l6ZScsICdzdy1yZXNpemUnLCAnZXctcmVzaXplJywgJ25zLXJlc2l6ZScsICduZXN3LXJlc2l6ZScsICdud3NlLXJlc2l6ZScsICd6b29tLWluJywgJ3pvb20tb3V0JywgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDYXJldCBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2p1c3QtaW4tdGltZS1tb2RlI2NhcmV0LWNvbG9yLXV0aWxpdGllc1xuICAgICAgICovXG4gICAgICAnY2FyZXQtY29sb3InOiBbe1xuICAgICAgICBjYXJldDogW2NvbG9yc11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQb2ludGVyIEV2ZW50c1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BvaW50ZXItZXZlbnRzXG4gICAgICAgKi9cbiAgICAgICdwb2ludGVyLWV2ZW50cyc6IFt7XG4gICAgICAgICdwb2ludGVyLWV2ZW50cyc6IFsnbm9uZScsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSZXNpemVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yZXNpemVcbiAgICAgICAqL1xuICAgICAgcmVzaXplOiBbe1xuICAgICAgICByZXNpemU6IFsnbm9uZScsICd5JywgJ3gnLCAnJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgQmVoYXZpb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtYmVoYXZpb3JcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1iZWhhdmlvcic6IFt7XG4gICAgICAgIHNjcm9sbDogWydhdXRvJywgJ3Ntb290aCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tJzogW3tcbiAgICAgICAgJ3Njcm9sbC1tJzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1teCc6IFt7XG4gICAgICAgICdzY3JvbGwtbXgnOiBnZXRTcGFjaW5nV2l0aEFyYml0cmFyeSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW15JzogW3tcbiAgICAgICAgJ3Njcm9sbC1teSc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW1zJzogW3tcbiAgICAgICAgJ3Njcm9sbC1tcyc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tZSc6IFt7XG4gICAgICAgICdzY3JvbGwtbWUnOiBnZXRTcGFjaW5nV2l0aEFyYml0cmFyeSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBUb3BcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbXQnOiBbe1xuICAgICAgICAnc2Nyb2xsLW10JzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gUmlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbXInOiBbe1xuICAgICAgICAnc2Nyb2xsLW1yJzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW1iJzogW3tcbiAgICAgICAgJ3Njcm9sbC1tYic6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIExlZnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbWwnOiBbe1xuICAgICAgICAnc2Nyb2xsLW1sJzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXBhZGRpbmdcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1wJzogW3tcbiAgICAgICAgJ3Njcm9sbC1wJzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXB4JzogW3tcbiAgICAgICAgJ3Njcm9sbC1weCc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgUGFkZGluZyBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXBhZGRpbmdcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1weSc6IFt7XG4gICAgICAgICdzY3JvbGwtcHknOiBnZXRTcGFjaW5nV2l0aEFyYml0cmFyeSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXBzJzogW3tcbiAgICAgICAgJ3Njcm9sbC1wcyc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgUGFkZGluZyBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXBlJzogW3tcbiAgICAgICAgJ3Njcm9sbC1wZSc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgUGFkZGluZyBUb3BcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXB0JzogW3tcbiAgICAgICAgJ3Njcm9sbC1wdCc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgUGFkZGluZyBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHInOiBbe1xuICAgICAgICAnc2Nyb2xsLXByJzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIEJvdHRvbVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcGInOiBbe1xuICAgICAgICAnc2Nyb2xsLXBiJzogZ2V0U3BhY2luZ1dpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIExlZnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXBsJzogW3tcbiAgICAgICAgJ3Njcm9sbC1wbCc6IGdldFNwYWNpbmdXaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgU25hcCBBbGlnblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1zbmFwLWFsaWduXG4gICAgICAgKi9cbiAgICAgICdzbmFwLWFsaWduJzogW3tcbiAgICAgICAgc25hcDogWydzdGFydCcsICdlbmQnLCAnY2VudGVyJywgJ2FsaWduLW5vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBTbmFwIFN0b3BcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtc25hcC1zdG9wXG4gICAgICAgKi9cbiAgICAgICdzbmFwLXN0b3AnOiBbe1xuICAgICAgICBzbmFwOiBbJ25vcm1hbCcsICdhbHdheXMnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBTbmFwIFR5cGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtc25hcC10eXBlXG4gICAgICAgKi9cbiAgICAgICdzbmFwLXR5cGUnOiBbe1xuICAgICAgICBzbmFwOiBbJ25vbmUnLCAneCcsICd5JywgJ2JvdGgnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBTbmFwIFR5cGUgU3RyaWN0bmVzc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1zbmFwLXR5cGVcbiAgICAgICAqL1xuICAgICAgJ3NuYXAtc3RyaWN0bmVzcyc6IFt7XG4gICAgICAgIHNuYXA6IFsnbWFuZGF0b3J5JywgJ3Byb3hpbWl0eSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVG91Y2ggQWN0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG91Y2gtYWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRvdWNoOiBbe1xuICAgICAgICB0b3VjaDogWydhdXRvJywgJ25vbmUnLCAnbWFuaXB1bGF0aW9uJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3VjaCBBY3Rpb24gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RvdWNoLWFjdGlvblxuICAgICAgICovXG4gICAgICAndG91Y2gteCc6IFt7XG4gICAgICAgICd0b3VjaC1wYW4nOiBbJ3gnLCAnbGVmdCcsICdyaWdodCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVG91Y2ggQWN0aW9uIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3VjaC1hY3Rpb25cbiAgICAgICAqL1xuICAgICAgJ3RvdWNoLXknOiBbe1xuICAgICAgICAndG91Y2gtcGFuJzogWyd5JywgJ3VwJywgJ2Rvd24nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRvdWNoIEFjdGlvbiBQaW5jaCBab29tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG91Y2gtYWN0aW9uXG4gICAgICAgKi9cbiAgICAgICd0b3VjaC1weic6IFsndG91Y2gtcGluY2gtem9vbSddLFxuICAgICAgLyoqXG4gICAgICAgKiBVc2VyIFNlbGVjdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3VzZXItc2VsZWN0XG4gICAgICAgKi9cbiAgICAgIHNlbGVjdDogW3tcbiAgICAgICAgc2VsZWN0OiBbJ25vbmUnLCAndGV4dCcsICdhbGwnLCAnYXV0byddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogV2lsbCBDaGFuZ2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy93aWxsLWNoYW5nZVxuICAgICAgICovXG4gICAgICAnd2lsbC1jaGFuZ2UnOiBbe1xuICAgICAgICAnd2lsbC1jaGFuZ2UnOiBbJ2F1dG8nLCAnc2Nyb2xsJywgJ2NvbnRlbnRzJywgJ3RyYW5zZm9ybScsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8vIFNWR1xuICAgICAgLyoqXG4gICAgICAgKiBGaWxsXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmlsbFxuICAgICAgICovXG4gICAgICBmaWxsOiBbe1xuICAgICAgICBmaWxsOiBbY29sb3JzLCAnbm9uZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3Ryb2tlIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3Ryb2tlLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdzdHJva2Utdyc6IFt7XG4gICAgICAgIHN0cm9rZTogW2lzTGVuZ3RoLCBpc0FyYml0cmFyeUxlbmd0aCwgaXNBcmJpdHJhcnlOdW1iZXJdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3Ryb2tlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3Ryb2tlXG4gICAgICAgKi9cbiAgICAgIHN0cm9rZTogW3tcbiAgICAgICAgc3Ryb2tlOiBbY29sb3JzLCAnbm9uZSddXG4gICAgICB9XSxcbiAgICAgIC8vIEFjY2Vzc2liaWxpdHlcbiAgICAgIC8qKlxuICAgICAgICogU2NyZWVuIFJlYWRlcnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JlZW4tcmVhZGVyc1xuICAgICAgICovXG4gICAgICBzcjogWydzci1vbmx5JywgJ25vdC1zci1vbmx5J10sXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlZCBDb2xvciBBZGp1c3RcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb3JjZWQtY29sb3ItYWRqdXN0XG4gICAgICAgKi9cbiAgICAgICdmb3JjZWQtY29sb3ItYWRqdXN0JzogW3tcbiAgICAgICAgJ2ZvcmNlZC1jb2xvci1hZGp1c3QnOiBbJ2F1dG8nLCAnbm9uZSddXG4gICAgICB9XVxuICAgIH0sXG4gICAgY29uZmxpY3RpbmdDbGFzc0dyb3Vwczoge1xuICAgICAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3cteCcsICdvdmVyZmxvdy15J10sXG4gICAgICBvdmVyc2Nyb2xsOiBbJ292ZXJzY3JvbGwteCcsICdvdmVyc2Nyb2xsLXknXSxcbiAgICAgIGluc2V0OiBbJ2luc2V0LXgnLCAnaW5zZXQteScsICdzdGFydCcsICdlbmQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10sXG4gICAgICAnaW5zZXQteCc6IFsncmlnaHQnLCAnbGVmdCddLFxuICAgICAgJ2luc2V0LXknOiBbJ3RvcCcsICdib3R0b20nXSxcbiAgICAgIGZsZXg6IFsnYmFzaXMnLCAnZ3JvdycsICdzaHJpbmsnXSxcbiAgICAgIGdhcDogWydnYXAteCcsICdnYXAteSddLFxuICAgICAgcDogWydweCcsICdweScsICdwcycsICdwZScsICdwdCcsICdwcicsICdwYicsICdwbCddLFxuICAgICAgcHg6IFsncHInLCAncGwnXSxcbiAgICAgIHB5OiBbJ3B0JywgJ3BiJ10sXG4gICAgICBtOiBbJ214JywgJ215JywgJ21zJywgJ21lJywgJ210JywgJ21yJywgJ21iJywgJ21sJ10sXG4gICAgICBteDogWydtcicsICdtbCddLFxuICAgICAgbXk6IFsnbXQnLCAnbWInXSxcbiAgICAgIHNpemU6IFsndycsICdoJ10sXG4gICAgICAnZm9udC1zaXplJzogWydsZWFkaW5nJ10sXG4gICAgICAnZnZuLW5vcm1hbCc6IFsnZnZuLW9yZGluYWwnLCAnZnZuLXNsYXNoZWQtemVybycsICdmdm4tZmlndXJlJywgJ2Z2bi1zcGFjaW5nJywgJ2Z2bi1mcmFjdGlvbiddLFxuICAgICAgJ2Z2bi1vcmRpbmFsJzogWydmdm4tbm9ybWFsJ10sXG4gICAgICAnZnZuLXNsYXNoZWQtemVybyc6IFsnZnZuLW5vcm1hbCddLFxuICAgICAgJ2Z2bi1maWd1cmUnOiBbJ2Z2bi1ub3JtYWwnXSxcbiAgICAgICdmdm4tc3BhY2luZyc6IFsnZnZuLW5vcm1hbCddLFxuICAgICAgJ2Z2bi1mcmFjdGlvbic6IFsnZnZuLW5vcm1hbCddLFxuICAgICAgJ2xpbmUtY2xhbXAnOiBbJ2Rpc3BsYXknLCAnb3ZlcmZsb3cnXSxcbiAgICAgIHJvdW5kZWQ6IFsncm91bmRlZC1zJywgJ3JvdW5kZWQtZScsICdyb3VuZGVkLXQnLCAncm91bmRlZC1yJywgJ3JvdW5kZWQtYicsICdyb3VuZGVkLWwnLCAncm91bmRlZC1zcycsICdyb3VuZGVkLXNlJywgJ3JvdW5kZWQtZWUnLCAncm91bmRlZC1lcycsICdyb3VuZGVkLXRsJywgJ3JvdW5kZWQtdHInLCAncm91bmRlZC1icicsICdyb3VuZGVkLWJsJ10sXG4gICAgICAncm91bmRlZC1zJzogWydyb3VuZGVkLXNzJywgJ3JvdW5kZWQtZXMnXSxcbiAgICAgICdyb3VuZGVkLWUnOiBbJ3JvdW5kZWQtc2UnLCAncm91bmRlZC1lZSddLFxuICAgICAgJ3JvdW5kZWQtdCc6IFsncm91bmRlZC10bCcsICdyb3VuZGVkLXRyJ10sXG4gICAgICAncm91bmRlZC1yJzogWydyb3VuZGVkLXRyJywgJ3JvdW5kZWQtYnInXSxcbiAgICAgICdyb3VuZGVkLWInOiBbJ3JvdW5kZWQtYnInLCAncm91bmRlZC1ibCddLFxuICAgICAgJ3JvdW5kZWQtbCc6IFsncm91bmRlZC10bCcsICdyb3VuZGVkLWJsJ10sXG4gICAgICAnYm9yZGVyLXNwYWNpbmcnOiBbJ2JvcmRlci1zcGFjaW5nLXgnLCAnYm9yZGVyLXNwYWNpbmcteSddLFxuICAgICAgJ2JvcmRlci13JzogWydib3JkZXItdy1zJywgJ2JvcmRlci13LWUnLCAnYm9yZGVyLXctdCcsICdib3JkZXItdy1yJywgJ2JvcmRlci13LWInLCAnYm9yZGVyLXctbCddLFxuICAgICAgJ2JvcmRlci13LXgnOiBbJ2JvcmRlci13LXInLCAnYm9yZGVyLXctbCddLFxuICAgICAgJ2JvcmRlci13LXknOiBbJ2JvcmRlci13LXQnLCAnYm9yZGVyLXctYiddLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IFsnYm9yZGVyLWNvbG9yLXMnLCAnYm9yZGVyLWNvbG9yLWUnLCAnYm9yZGVyLWNvbG9yLXQnLCAnYm9yZGVyLWNvbG9yLXInLCAnYm9yZGVyLWNvbG9yLWInLCAnYm9yZGVyLWNvbG9yLWwnXSxcbiAgICAgICdib3JkZXItY29sb3IteCc6IFsnYm9yZGVyLWNvbG9yLXInLCAnYm9yZGVyLWNvbG9yLWwnXSxcbiAgICAgICdib3JkZXItY29sb3IteSc6IFsnYm9yZGVyLWNvbG9yLXQnLCAnYm9yZGVyLWNvbG9yLWInXSxcbiAgICAgICdzY3JvbGwtbSc6IFsnc2Nyb2xsLW14JywgJ3Njcm9sbC1teScsICdzY3JvbGwtbXMnLCAnc2Nyb2xsLW1lJywgJ3Njcm9sbC1tdCcsICdzY3JvbGwtbXInLCAnc2Nyb2xsLW1iJywgJ3Njcm9sbC1tbCddLFxuICAgICAgJ3Njcm9sbC1teCc6IFsnc2Nyb2xsLW1yJywgJ3Njcm9sbC1tbCddLFxuICAgICAgJ3Njcm9sbC1teSc6IFsnc2Nyb2xsLW10JywgJ3Njcm9sbC1tYiddLFxuICAgICAgJ3Njcm9sbC1wJzogWydzY3JvbGwtcHgnLCAnc2Nyb2xsLXB5JywgJ3Njcm9sbC1wcycsICdzY3JvbGwtcGUnLCAnc2Nyb2xsLXB0JywgJ3Njcm9sbC1wcicsICdzY3JvbGwtcGInLCAnc2Nyb2xsLXBsJ10sXG4gICAgICAnc2Nyb2xsLXB4JzogWydzY3JvbGwtcHInLCAnc2Nyb2xsLXBsJ10sXG4gICAgICAnc2Nyb2xsLXB5JzogWydzY3JvbGwtcHQnLCAnc2Nyb2xsLXBiJ10sXG4gICAgICB0b3VjaDogWyd0b3VjaC14JywgJ3RvdWNoLXknLCAndG91Y2gtcHonXSxcbiAgICAgICd0b3VjaC14JzogWyd0b3VjaCddLFxuICAgICAgJ3RvdWNoLXknOiBbJ3RvdWNoJ10sXG4gICAgICAndG91Y2gtcHonOiBbJ3RvdWNoJ11cbiAgICB9LFxuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczoge1xuICAgICAgJ2ZvbnQtc2l6ZSc6IFsnbGVhZGluZyddXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gYmFzZUNvbmZpZyBDb25maWcgd2hlcmUgb3RoZXIgY29uZmlnIHdpbGwgYmUgbWVyZ2VkIGludG8uIFRoaXMgb2JqZWN0IHdpbGwgYmUgbXV0YXRlZC5cbiAqIEBwYXJhbSBjb25maWdFeHRlbnNpb24gUGFydGlhbCBjb25maWcgdG8gbWVyZ2UgaW50byB0aGUgYGJhc2VDb25maWdgLlxuICovXG5jb25zdCBtZXJnZUNvbmZpZ3MgPSAoYmFzZUNvbmZpZywge1xuICBjYWNoZVNpemUsXG4gIHByZWZpeCxcbiAgc2VwYXJhdG9yLFxuICBleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZSxcbiAgZXh0ZW5kID0ge30sXG4gIG92ZXJyaWRlID0ge31cbn0pID0+IHtcbiAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlQ29uZmlnLCAnY2FjaGVTaXplJywgY2FjaGVTaXplKTtcbiAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlQ29uZmlnLCAncHJlZml4JywgcHJlZml4KTtcbiAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlQ29uZmlnLCAnc2VwYXJhdG9yJywgc2VwYXJhdG9yKTtcbiAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlQ29uZmlnLCAnZXhwZXJpbWVudGFsUGFyc2VDbGFzc05hbWUnLCBleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZSk7XG4gIGZvciAoY29uc3QgY29uZmlnS2V5IGluIG92ZXJyaWRlKSB7XG4gICAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWdbY29uZmlnS2V5XSwgb3ZlcnJpZGVbY29uZmlnS2V5XSk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gZXh0ZW5kKSB7XG4gICAgbWVyZ2VDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWdba2V5XSwgZXh0ZW5kW2tleV0pO1xuICB9XG4gIHJldHVybiBiYXNlQ29uZmlnO1xufTtcbmNvbnN0IG92ZXJyaWRlUHJvcGVydHkgPSAoYmFzZU9iamVjdCwgb3ZlcnJpZGVLZXksIG92ZXJyaWRlVmFsdWUpID0+IHtcbiAgaWYgKG92ZXJyaWRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGJhc2VPYmplY3Rbb3ZlcnJpZGVLZXldID0gb3ZlcnJpZGVWYWx1ZTtcbiAgfVxufTtcbmNvbnN0IG92ZXJyaWRlQ29uZmlnUHJvcGVydGllcyA9IChiYXNlT2JqZWN0LCBvdmVycmlkZU9iamVjdCkgPT4ge1xuICBpZiAob3ZlcnJpZGVPYmplY3QpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvdmVycmlkZU9iamVjdCkge1xuICAgICAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlT2JqZWN0LCBrZXksIG92ZXJyaWRlT2JqZWN0W2tleV0pO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG1lcmdlQ29uZmlnUHJvcGVydGllcyA9IChiYXNlT2JqZWN0LCBtZXJnZU9iamVjdCkgPT4ge1xuICBpZiAobWVyZ2VPYmplY3QpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBtZXJnZU9iamVjdCkge1xuICAgICAgY29uc3QgbWVyZ2VWYWx1ZSA9IG1lcmdlT2JqZWN0W2tleV07XG4gICAgICBpZiAobWVyZ2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJhc2VPYmplY3Rba2V5XSA9IChiYXNlT2JqZWN0W2tleV0gfHwgW10pLmNvbmNhdChtZXJnZVZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5jb25zdCBleHRlbmRUYWlsd2luZE1lcmdlID0gKGNvbmZpZ0V4dGVuc2lvbiwgLi4uY3JlYXRlQ29uZmlnKSA9PiB0eXBlb2YgY29uZmlnRXh0ZW5zaW9uID09PSAnZnVuY3Rpb24nID8gY3JlYXRlVGFpbHdpbmRNZXJnZShnZXREZWZhdWx0Q29uZmlnLCBjb25maWdFeHRlbnNpb24sIC4uLmNyZWF0ZUNvbmZpZykgOiBjcmVhdGVUYWlsd2luZE1lcmdlKCgpID0+IG1lcmdlQ29uZmlncyhnZXREZWZhdWx0Q29uZmlnKCksIGNvbmZpZ0V4dGVuc2lvbiksIC4uLmNyZWF0ZUNvbmZpZyk7XG5jb25zdCB0d01lcmdlID0gLyojX19QVVJFX18qL2NyZWF0ZVRhaWx3aW5kTWVyZ2UoZ2V0RGVmYXVsdENvbmZpZyk7XG5leHBvcnQgeyBjcmVhdGVUYWlsd2luZE1lcmdlLCBleHRlbmRUYWlsd2luZE1lcmdlLCBmcm9tVGhlbWUsIGdldERlZmF1bHRDb25maWcsIG1lcmdlQ29uZmlncywgdHdKb2luLCB0d01lcmdlLCB2YWxpZGF0b3JzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idW5kbGUtbWpzLm1qcy5tYXBcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/tailwind-merge/dist/bundle-mjs.mjs\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/App.tsx": /*!********************************!*\ !*** ./src/components/App.tsx ***! \********************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Tab: () => (/* binding */ Tab),\n/* harmony export */ \"default\": () => (/* binding */ App)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _neynar_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @neynar/react */ \"(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js\");\n/* harmony import */ var _components_ui_Header__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/components/ui/Header */ \"(app-pages-browser)/./src/components/ui/Header.tsx\");\n/* harmony import */ var _components_ui_Footer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~/components/ui/Footer */ \"(app-pages-browser)/./src/components/ui/Footer.tsx\");\n/* harmony import */ var _components_ui_tabs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ~/components/ui/tabs */ \"(app-pages-browser)/./src/components/ui/tabs/index.ts\");\n/* harmony import */ var _hooks_useNeynarUser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ~/hooks/useNeynarUser */ \"(app-pages-browser)/./src/hooks/useNeynarUser.ts\");\n/* __next_internal_client_entry_do_not_use__ Tab,default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n\n// --- Types ---\nvar Tab = /*#__PURE__*/ function(Tab) {\n Tab[\"Home\"] = \"home\";\n Tab[\"Races\"] = \"races\";\n Tab[\"Context\"] = \"context\";\n Tab[\"Wallet\"] = \"wallet\";\n Tab[\"Profile\"] = \"profile\";\n return Tab;\n}({});\n/**\n * App component serves as the main container for the mini app interface.\n * \n * This component orchestrates the overall mini app experience by:\n * - Managing tab navigation and state\n * - Handling Farcaster mini app initialization\n * - Coordinating wallet and context state\n * - Providing error handling and loading states\n * - Rendering the appropriate tab content based on user selection\n * \n * The component integrates with the Neynar SDK for Farcaster functionality\n * and Wagmi for wallet management. It provides a complete mini app\n * experience with multiple tabs for different functionality areas.\n * \n * Features:\n * - Tab-based navigation (Home, Actions, Context, Wallet)\n * - Farcaster mini app integration\n * - Wallet connection management\n * - Error handling and display\n * - Loading states for async operations\n * \n * @param props - Component props\n * @param props.title - Optional title for the mini app (defaults to \"Neynar Starter Kit\")\n * \n * @example\n * ```tsx\n * <App title=\"My Mini App\" />\n * ```\n */ function App() {\n let { title } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {\n title: \"Neynar Starter Kit\"\n };\n var _context_client_safeAreaInsets, _context_client_safeAreaInsets1, _context_client_safeAreaInsets2, _context_client_safeAreaInsets3;\n _s();\n // --- Hooks ---\n const { isSDKLoaded, context, setInitialTab, setActiveTab, currentTab } = (0,_neynar_react__WEBPACK_IMPORTED_MODULE_2__.useMiniApp)();\n // --- Neynar user hook ---\n const { user: neynarUser } = (0,_hooks_useNeynarUser__WEBPACK_IMPORTED_MODULE_6__.useNeynarUser)(context || undefined);\n // --- Effects ---\n /**\n * Sets the initial tab to \"home\" when the SDK is loaded.\n * \n * This effect ensures that users start on the home tab when they first\n * load the mini app. It only runs when the SDK is fully loaded to\n * prevent errors during initialization.\n */ (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"App.useEffect\": ()=>{\n if (isSDKLoaded) {\n setInitialTab(\"home\");\n }\n }\n }[\"App.useEffect\"], [\n isSDKLoaded,\n setInitialTab\n ]);\n // --- Early Returns ---\n if (!isSDKLoaded) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-center h-screen\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"spinner h-8 w-8 mx-auto mb-4\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 87,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n children: \"Loading SDK...\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 88,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 86,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 85,\n columnNumber: 7\n }, this);\n }\n var _context_client_safeAreaInsets_top, _context_client_safeAreaInsets_bottom, _context_client_safeAreaInsets_left, _context_client_safeAreaInsets_right;\n // --- Render ---\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n paddingTop: (_context_client_safeAreaInsets_top = context === null || context === void 0 ? void 0 : (_context_client_safeAreaInsets = context.client.safeAreaInsets) === null || _context_client_safeAreaInsets === void 0 ? void 0 : _context_client_safeAreaInsets.top) !== null && _context_client_safeAreaInsets_top !== void 0 ? _context_client_safeAreaInsets_top : 0,\n paddingBottom: (_context_client_safeAreaInsets_bottom = context === null || context === void 0 ? void 0 : (_context_client_safeAreaInsets1 = context.client.safeAreaInsets) === null || _context_client_safeAreaInsets1 === void 0 ? void 0 : _context_client_safeAreaInsets1.bottom) !== null && _context_client_safeAreaInsets_bottom !== void 0 ? _context_client_safeAreaInsets_bottom : 0,\n paddingLeft: (_context_client_safeAreaInsets_left = context === null || context === void 0 ? void 0 : (_context_client_safeAreaInsets2 = context.client.safeAreaInsets) === null || _context_client_safeAreaInsets2 === void 0 ? void 0 : _context_client_safeAreaInsets2.left) !== null && _context_client_safeAreaInsets_left !== void 0 ? _context_client_safeAreaInsets_left : 0,\n paddingRight: (_context_client_safeAreaInsets_right = context === null || context === void 0 ? void 0 : (_context_client_safeAreaInsets3 = context.client.safeAreaInsets) === null || _context_client_safeAreaInsets3 === void 0 ? void 0 : _context_client_safeAreaInsets3.right) !== null && _context_client_safeAreaInsets_right !== void 0 ? _context_client_safeAreaInsets_right : 0\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_Header__WEBPACK_IMPORTED_MODULE_3__.Header, {\n neynarUser: neynarUser\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 105,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"container py-2 pb-20\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-bold text-center mb-4\",\n children: title\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 110,\n columnNumber: 9\n }, this),\n currentTab === \"home\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_tabs__WEBPACK_IMPORTED_MODULE_5__.HomeTab, {}, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 113,\n columnNumber: 37\n }, this),\n currentTab === \"races\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_tabs__WEBPACK_IMPORTED_MODULE_5__.RacesTab, {}, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 114,\n columnNumber: 38\n }, this),\n currentTab === \"profile\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_tabs__WEBPACK_IMPORTED_MODULE_5__.ProfileTab, {}, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 115,\n columnNumber: 40\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_Footer__WEBPACK_IMPORTED_MODULE_4__.Footer, {\n activeTab: currentTab,\n setActiveTab: setActiveTab\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 118,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 108,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/App.tsx\",\n lineNumber: 96,\n columnNumber: 5\n }, this);\n}\n_s(App, \"4Y/7hAEl+3ME3yczyRpSUmT2xwI=\", false, function() {\n return [\n _neynar_react__WEBPACK_IMPORTED_MODULE_2__.useMiniApp,\n _hooks_useNeynarUser__WEBPACK_IMPORTED_MODULE_6__.useNeynarUser\n ];\n});\n_c = App;\nvar _c;\n$RefreshReg$(_c, \"App\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL0FwcC50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBRWtDO0FBQ1M7QUFDSztBQUNBO0FBQ21CO0FBRWI7QUFFdEQsZ0JBQWdCO0FBQ1QsaUNBQUtROzs7Ozs7V0FBQUE7TUFNWDtBQU1EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNEJDLEdBQ2MsU0FBU0M7UUFDdEIsRUFBRUMsS0FBSyxFQUFZLEdBQW5CLGlFQUFzQjtRQUFFQSxPQUFPO0lBQXFCO1FBNENsQ0MsZ0NBQ0dBLGlDQUNGQSxpQ0FDQ0E7O0lBN0NwQixnQkFBZ0I7SUFDaEIsTUFBTSxFQUNKQyxXQUFXLEVBQ1hELE9BQU8sRUFDUEUsYUFBYSxFQUNiQyxZQUFZLEVBQ1pDLFVBQVUsRUFDWCxHQUFHZCx5REFBVUE7SUFFZCwyQkFBMkI7SUFDM0IsTUFBTSxFQUFFZSxNQUFNQyxVQUFVLEVBQUUsR0FBR1YsbUVBQWFBLENBQUNJLFdBQVdPO0lBRXRELGtCQUFrQjtJQUNsQjs7Ozs7O0dBTUMsR0FDRGxCLGdEQUFTQTt5QkFBQztZQUNSLElBQUlZLGFBQWE7Z0JBQ2ZDO1lBQ0Y7UUFDRjt3QkFBRztRQUFDRDtRQUFhQztLQUFjO0lBRS9CLHdCQUF3QjtJQUN4QixJQUFJLENBQUNELGFBQWE7UUFDaEIscUJBQ0UsOERBQUNPO1lBQUlDLFdBQVU7c0JBQ2IsNEVBQUNEO2dCQUFJQyxXQUFVOztrQ0FDYiw4REFBQ0Q7d0JBQUlDLFdBQVU7Ozs7OztrQ0FDZiw4REFBQ0M7a0NBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBSVg7UUFNa0JWLG9DQUNHQSx1Q0FDRkEscUNBQ0NBO0lBUHBCLGlCQUFpQjtJQUNqQixxQkFDRSw4REFBQ1E7UUFDQ0csT0FBTztZQUNMQyxZQUFZWixDQUFBQSxxQ0FBQUEsb0JBQUFBLCtCQUFBQSxpQ0FBQUEsUUFBU2EsTUFBTSxDQUFDQyxjQUFjLGNBQTlCZCxxREFBQUEsK0JBQWdDZSxHQUFHLGNBQW5DZixnREFBQUEscUNBQXVDO1lBQ25EZ0IsZUFBZWhCLENBQUFBLHdDQUFBQSxvQkFBQUEsK0JBQUFBLGtDQUFBQSxRQUFTYSxNQUFNLENBQUNDLGNBQWMsY0FBOUJkLHNEQUFBQSxnQ0FBZ0NpQixNQUFNLGNBQXRDakIsbURBQUFBLHdDQUEwQztZQUN6RGtCLGFBQWFsQixDQUFBQSxzQ0FBQUEsb0JBQUFBLCtCQUFBQSxrQ0FBQUEsUUFBU2EsTUFBTSxDQUFDQyxjQUFjLGNBQTlCZCxzREFBQUEsZ0NBQWdDbUIsSUFBSSxjQUFwQ25CLGlEQUFBQSxzQ0FBd0M7WUFDckRvQixjQUFjcEIsQ0FBQUEsdUNBQUFBLG9CQUFBQSwrQkFBQUEsa0NBQUFBLFFBQVNhLE1BQU0sQ0FBQ0MsY0FBYyxjQUE5QmQsc0RBQUFBLGdDQUFnQ3FCLEtBQUssY0FBckNyQixrREFBQUEsdUNBQXlDO1FBQ3pEOzswQkFHQSw4REFBQ1QseURBQU1BO2dCQUFDZSxZQUFZQTs7Ozs7OzBCQUdwQiw4REFBQ0U7Z0JBQUlDLFdBQVU7O2tDQUViLDhEQUFDYTt3QkFBR2IsV0FBVTtrQ0FBdUNWOzs7Ozs7b0JBR3BESyx1Q0FBMkIsOERBQUNYLHdEQUFPQTs7Ozs7b0JBQ25DVyx3Q0FBNEIsOERBQUNWLHlEQUFRQTs7Ozs7b0JBQ3JDVSwwQ0FBOEIsOERBQUNULDJEQUFVQTs7Ozs7a0NBRzFDLDhEQUFDSCx5REFBTUE7d0JBQUMrQixXQUFXbkI7d0JBQW1CRCxjQUFjQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSTVEO0dBckV3Qkw7O1FBVWxCUixxREFBVUE7UUFHZU0sK0RBQWFBOzs7S0FicEJFIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2NvbXBvbmVudHMvQXBwLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VNaW5pQXBwIH0gZnJvbSBcIkBuZXluYXIvcmVhY3RcIjtcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gXCJ+L2NvbXBvbmVudHMvdWkvSGVhZGVyXCI7XG5pbXBvcnQgeyBGb290ZXIgfSBmcm9tIFwifi9jb21wb25lbnRzL3VpL0Zvb3RlclwiO1xuaW1wb3J0IHtIb21lVGFiLCBSYWNlc1RhYiwgUHJvZmlsZVRhYn0gZnJvbSBcIn4vY29tcG9uZW50cy91aS90YWJzXCI7XG5pbXBvcnQgeyBVU0VfV0FMTEVUIH0gZnJvbSBcIn4vbGliL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdXNlTmV5bmFyVXNlciB9IGZyb20gXCJ+L2hvb2tzL3VzZU5leW5hclVzZXJcIjtcblxuLy8gLS0tIFR5cGVzIC0tLVxuZXhwb3J0IGVudW0gVGFiIHtcbiAgSG9tZSA9IFwiaG9tZVwiLFxuICBSYWNlcyA9IFwicmFjZXNcIixcbiAgQ29udGV4dCA9IFwiY29udGV4dFwiLFxuICBXYWxsZXQgPSBcIndhbGxldFwiLFxuICBQcm9maWxlID0gXCJwcm9maWxlXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwUHJvcHMge1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcHAgY29tcG9uZW50IHNlcnZlcyBhcyB0aGUgbWFpbiBjb250YWluZXIgZm9yIHRoZSBtaW5pIGFwcCBpbnRlcmZhY2UuXG4gKiBcbiAqIFRoaXMgY29tcG9uZW50IG9yY2hlc3RyYXRlcyB0aGUgb3ZlcmFsbCBtaW5pIGFwcCBleHBlcmllbmNlIGJ5OlxuICogLSBNYW5hZ2luZyB0YWIgbmF2aWdhdGlvbiBhbmQgc3RhdGVcbiAqIC0gSGFuZGxpbmcgRmFyY2FzdGVyIG1pbmkgYXBwIGluaXRpYWxpemF0aW9uXG4gKiAtIENvb3JkaW5hdGluZyB3YWxsZXQgYW5kIGNvbnRleHQgc3RhdGVcbiAqIC0gUHJvdmlkaW5nIGVycm9yIGhhbmRsaW5nIGFuZCBsb2FkaW5nIHN0YXRlc1xuICogLSBSZW5kZXJpbmcgdGhlIGFwcHJvcHJpYXRlIHRhYiBjb250ZW50IGJhc2VkIG9uIHVzZXIgc2VsZWN0aW9uXG4gKiBcbiAqIFRoZSBjb21wb25lbnQgaW50ZWdyYXRlcyB3aXRoIHRoZSBOZXluYXIgU0RLIGZvciBGYXJjYXN0ZXIgZnVuY3Rpb25hbGl0eVxuICogYW5kIFdhZ21pIGZvciB3YWxsZXQgbWFuYWdlbWVudC4gSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBtaW5pIGFwcFxuICogZXhwZXJpZW5jZSB3aXRoIG11bHRpcGxlIHRhYnMgZm9yIGRpZmZlcmVudCBmdW5jdGlvbmFsaXR5IGFyZWFzLlxuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gVGFiLWJhc2VkIG5hdmlnYXRpb24gKEhvbWUsIEFjdGlvbnMsIENvbnRleHQsIFdhbGxldClcbiAqIC0gRmFyY2FzdGVyIG1pbmkgYXBwIGludGVncmF0aW9uXG4gKiAtIFdhbGxldCBjb25uZWN0aW9uIG1hbmFnZW1lbnRcbiAqIC0gRXJyb3IgaGFuZGxpbmcgYW5kIGRpc3BsYXlcbiAqIC0gTG9hZGluZyBzdGF0ZXMgZm9yIGFzeW5jIG9wZXJhdGlvbnNcbiAqIFxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcGFyYW0gcHJvcHMudGl0bGUgLSBPcHRpb25hbCB0aXRsZSBmb3IgdGhlIG1pbmkgYXBwIChkZWZhdWx0cyB0byBcIk5leW5hciBTdGFydGVyIEtpdFwiKVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiA8QXBwIHRpdGxlPVwiTXkgTWluaSBBcHBcIiAvPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcChcbiAgeyB0aXRsZSB9OiBBcHBQcm9wcyA9IHsgdGl0bGU6IFwiTmV5bmFyIFN0YXJ0ZXIgS2l0XCIgfVxuKSB7XG4gIC8vIC0tLSBIb29rcyAtLS1cbiAgY29uc3Qge1xuICAgIGlzU0RLTG9hZGVkLFxuICAgIGNvbnRleHQsXG4gICAgc2V0SW5pdGlhbFRhYixcbiAgICBzZXRBY3RpdmVUYWIsXG4gICAgY3VycmVudFRhYixcbiAgfSA9IHVzZU1pbmlBcHAoKTtcblxuICAvLyAtLS0gTmV5bmFyIHVzZXIgaG9vayAtLS1cbiAgY29uc3QgeyB1c2VyOiBuZXluYXJVc2VyIH0gPSB1c2VOZXluYXJVc2VyKGNvbnRleHQgfHwgdW5kZWZpbmVkKTtcblxuICAvLyAtLS0gRWZmZWN0cyAtLS1cbiAgLyoqXG4gICAqIFNldHMgdGhlIGluaXRpYWwgdGFiIHRvIFwiaG9tZVwiIHdoZW4gdGhlIFNESyBpcyBsb2FkZWQuXG4gICAqIFxuICAgKiBUaGlzIGVmZmVjdCBlbnN1cmVzIHRoYXQgdXNlcnMgc3RhcnQgb24gdGhlIGhvbWUgdGFiIHdoZW4gdGhleSBmaXJzdFxuICAgKiBsb2FkIHRoZSBtaW5pIGFwcC4gSXQgb25seSBydW5zIHdoZW4gdGhlIFNESyBpcyBmdWxseSBsb2FkZWQgdG9cbiAgICogcHJldmVudCBlcnJvcnMgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNTREtMb2FkZWQpIHtcbiAgICAgIHNldEluaXRpYWxUYWIoVGFiLkhvbWUpO1xuICAgIH1cbiAgfSwgW2lzU0RLTG9hZGVkLCBzZXRJbml0aWFsVGFiXSk7XG5cbiAgLy8gLS0tIEVhcmx5IFJldHVybnMgLS0tXG4gIGlmICghaXNTREtMb2FkZWQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBoLXNjcmVlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGlubmVyIGgtOCB3LTggbXgtYXV0byBtYi00XCI+PC9kaXY+XG4gICAgICAgICAgPHA+TG9hZGluZyBTREsuLi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIC8vIC0tLSBSZW5kZXIgLS0tXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcGFkZGluZ1RvcDogY29udGV4dD8uY2xpZW50LnNhZmVBcmVhSW5zZXRzPy50b3AgPz8gMCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogY29udGV4dD8uY2xpZW50LnNhZmVBcmVhSW5zZXRzPy5ib3R0b20gPz8gMCxcbiAgICAgICAgcGFkZGluZ0xlZnQ6IGNvbnRleHQ/LmNsaWVudC5zYWZlQXJlYUluc2V0cz8ubGVmdCA/PyAwLFxuICAgICAgICBwYWRkaW5nUmlnaHQ6IGNvbnRleHQ/LmNsaWVudC5zYWZlQXJlYUluc2V0cz8ucmlnaHQgPz8gMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgey8qIEhlYWRlciBzaG91bGQgYmUgZnVsbCB3aWR0aCAqL31cbiAgICAgIDxIZWFkZXIgbmV5bmFyVXNlcj17bmV5bmFyVXNlcn0gLz5cblxuICAgICAgey8qIE1haW4gY29udGVudCBhbmQgZm9vdGVyIHNob3VsZCBiZSBjZW50ZXJlZCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyIHB5LTIgcGItMjBcIj5cbiAgICAgICAgey8qIE1haW4gdGl0bGUgKi99XG4gICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC1jZW50ZXIgbWItNFwiPnt0aXRsZX08L2gxPlxuXG4gICAgICAgIHsvKiBUYWIgY29udGVudCByZW5kZXJpbmcgKi99XG4gICAgICAgIHtjdXJyZW50VGFiID09PSBUYWIuSG9tZSAmJiA8SG9tZVRhYiAvPn1cbiAgICAgICAge2N1cnJlbnRUYWIgPT09IFRhYi5SYWNlcyAmJiA8UmFjZXNUYWIgLz59XG4gICAgICAgIHtjdXJyZW50VGFiID09PSBUYWIuUHJvZmlsZSAmJiA8UHJvZmlsZVRhYiAvPn1cblxuICAgICAgICB7LyogRm9vdGVyIHdpdGggbmF2aWdhdGlvbiAqL31cbiAgICAgICAgPEZvb3RlciBhY3RpdmVUYWI9e2N1cnJlbnRUYWIgYXMgVGFifSBzZXRBY3RpdmVUYWI9e3NldEFjdGl2ZVRhYn0gLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlTWluaUFwcCIsIkhlYWRlciIsIkZvb3RlciIsIkhvbWVUYWIiLCJSYWNlc1RhYiIsIlByb2ZpbGVUYWIiLCJ1c2VOZXluYXJVc2VyIiwiVGFiIiwiQXBwIiwidGl0bGUiLCJjb250ZXh0IiwiaXNTREtMb2FkZWQiLCJzZXRJbml0aWFsVGFiIiwic2V0QWN0aXZlVGFiIiwiY3VycmVudFRhYiIsInVzZXIiLCJuZXluYXJVc2VyIiwidW5kZWZpbmVkIiwiZGl2IiwiY2xhc3NOYW1lIiwicCIsInN0eWxlIiwicGFkZGluZ1RvcCIsImNsaWVudCIsInNhZmVBcmVhSW5zZXRzIiwidG9wIiwicGFkZGluZ0JvdHRvbSIsImJvdHRvbSIsInBhZGRpbmdMZWZ0IiwibGVmdCIsInBhZGRpbmdSaWdodCIsInJpZ2h0IiwiaDEiLCJhY3RpdmVUYWIiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/App.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/Footer.tsx": /*!**************************************!*\ !*** ./src/components/ui/Footer.tsx ***! \**************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Footer: () => (/* binding */ Footer)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/components/App */ \"(app-pages-browser)/./src/components/App.tsx\");\n/* harmony import */ var _barrel_optimize_names_Home_Trophy_User_lucide_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! __barrel_optimize__?names=Home,Trophy,User!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/house.js\");\n/* harmony import */ var _barrel_optimize_names_Home_Trophy_User_lucide_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! __barrel_optimize__?names=Home,Trophy,User!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trophy.js\");\n/* harmony import */ var _barrel_optimize_names_Home_Trophy_User_lucide_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! __barrel_optimize__?names=Home,Trophy,User!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/user.js\");\n/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/lib/utils */ \"(app-pages-browser)/./src/lib/utils.ts\");\n/* harmony import */ var _components_ui_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~/components/ui/button */ \"(app-pages-browser)/./src/components/ui/button.tsx\");\n\n\n\n\n\n\nconst Footer = (param)=>{\n let { activeTab, setActiveTab } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"nav\", {\n className: \"fixed bottom-0 left-0 right-0 z-50 border-t border-border bg-card/95 backdrop-blur supports-[backdrop-filter]:bg-card/80\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-around h-16 max-w-lg mx-auto px-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_4__.Button, {\n variant: \"outline\",\n onClick: ()=>setActiveTab(_components_App__WEBPACK_IMPORTED_MODULE_2__.Tab.Home),\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)(\"flex flex-col items-center justify-center gap-1 flex-1 h-full transition-colors\", activeTab === _components_App__WEBPACK_IMPORTED_MODULE_2__.Tab.Home ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"h-5 w-5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Home_Trophy_User_lucide_react__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 23,\n columnNumber: 43\n }, undefined)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 23,\n columnNumber: 17\n }, undefined),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs font-medium\",\n children: \"Home\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 24,\n columnNumber: 17\n }, undefined)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 15,\n columnNumber: 13\n }, undefined),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_4__.Button, {\n variant: \"outline\",\n onClick: ()=>setActiveTab(_components_App__WEBPACK_IMPORTED_MODULE_2__.Tab.Races),\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)(\"flex flex-col items-center justify-center gap-1 flex-1 h-full transition-colors\", activeTab === _components_App__WEBPACK_IMPORTED_MODULE_2__.Tab.Races ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"h-5 w-5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Home_Trophy_User_lucide_react__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 34,\n columnNumber: 43\n }, undefined)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 34,\n columnNumber: 17\n }, undefined),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs font-medium\",\n children: \"Races\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 35,\n columnNumber: 17\n }, undefined)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 26,\n columnNumber: 13\n }, undefined),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_4__.Button, {\n variant: \"outline\",\n onClick: ()=>setActiveTab(_components_App__WEBPACK_IMPORTED_MODULE_2__.Tab.Profile),\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)(\"flex flex-col items-center justify-center gap-1 flex-1 h-full transition-colors\", activeTab === _components_App__WEBPACK_IMPORTED_MODULE_2__.Tab.Profile ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"h-5 w-5 mx-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Home_Trophy_User_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {}, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 46,\n columnNumber: 51\n }, undefined)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 46,\n columnNumber: 17\n }, undefined),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs font-medium mx-auto\",\n children: \"Profile\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 47,\n columnNumber: 17\n }, undefined)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, undefined)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 14,\n columnNumber: 9\n }, undefined)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Footer.tsx\",\n lineNumber: 13,\n columnNumber: 5\n }, undefined);\n};\n_c = Footer;\nvar _c;\n$RefreshReg$(_c, \"Footer\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL0Zvb3Rlci50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBMEI7QUFDYTtBQUNVO0FBQ2xCO0FBQ2U7QUFPdkMsTUFBTU8sU0FBZ0M7UUFBQyxFQUFFQyxTQUFTLEVBQUVDLFlBQVksRUFBRTt5QkFDckUsOERBQUNDO1FBQUlDLFdBQVU7a0JBQ1gsNEVBQUNDO1lBQUlELFdBQVU7OzhCQUNYLDhEQUFDTCx5REFBTUE7b0JBQ0hPLFNBQVE7b0JBQ1JDLFNBQVMsSUFBTUwsYUFBYVIsZ0RBQUdBLENBQUNDLElBQUk7b0JBQ3BDUyxXQUFXTiw4Q0FBRUEsQ0FDVCxtRkFDQUcsY0FBY1AsZ0RBQUdBLENBQUNDLElBQUksR0FBRyxpQkFBaUI7O3NDQUc5Qyw4REFBQ2E7NEJBQUtKLFdBQVU7c0NBQVUsNEVBQUNULDRGQUFJQTs7Ozs7Ozs7OztzQ0FDL0IsOERBQUNhOzRCQUFLSixXQUFVO3NDQUFzQjs7Ozs7Ozs7Ozs7OzhCQUUxQyw4REFBQ0wseURBQU1BO29CQUNITyxTQUFRO29CQUNSQyxTQUFTLElBQU1MLGFBQWFSLGdEQUFHQSxDQUFDZSxLQUFLO29CQUNyQ0wsV0FBV04sOENBQUVBLENBQ1QsbUZBQ0FHLGNBQWNQLGdEQUFHQSxDQUFDZSxLQUFLLEdBQUcsaUJBQWlCOztzQ0FHL0MsOERBQUNEOzRCQUFLSixXQUFVO3NDQUFVLDRFQUFDUiw0RkFBTUE7Ozs7Ozs7Ozs7c0NBQ2pDLDhEQUFDWTs0QkFBS0osV0FBVTtzQ0FBc0I7Ozs7Ozs7Ozs7Ozs4QkFHMUMsOERBQUNMLHlEQUFNQTtvQkFDSE8sU0FBUTtvQkFDUkMsU0FBUyxJQUFNTCxhQUFhUixnREFBR0EsQ0FBQ2dCLE9BQU87b0JBQ3ZDTixXQUFXTiw4Q0FBRUEsQ0FDVCxtRkFDQUcsY0FBY1AsZ0RBQUdBLENBQUNnQixPQUFPLEdBQUcsaUJBQWlCOztzQ0FHakQsOERBQUNGOzRCQUFLSixXQUFVO3NDQUFrQiw0RUFBQ1AsNEZBQUlBOzs7Ozs7Ozs7O3NDQUN2Qyw4REFBQ1c7NEJBQUtKLFdBQVU7c0NBQThCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUk1RDtLQXZDV0oiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy91aS9Gb290ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFRhYiB9IGZyb20gXCJ+L2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBIb21lLCBUcm9waHksIFVzZXIgfSBmcm9tIFwibHVjaWRlLXJlYWN0XCJcbmltcG9ydCB7Y259IGZyb20gXCJ+L2xpYi91dGlsc1wiO1xuaW1wb3J0IHtCdXR0b259IGZyb20gXCJ+L2NvbXBvbmVudHMvdWkvYnV0dG9uXCI7XG5cbmludGVyZmFjZSBGb290ZXJQcm9wcyB7XG4gIGFjdGl2ZVRhYjogVGFiO1xuICBzZXRBY3RpdmVUYWI6ICh0YWI6IFRhYikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IEZvb3RlcjogUmVhY3QuRkM8Rm9vdGVyUHJvcHM+ID0gKHsgYWN0aXZlVGFiLCBzZXRBY3RpdmVUYWIgfSkgPT4gKFxuICAgIDxuYXYgY2xhc3NOYW1lPVwiZml4ZWQgYm90dG9tLTAgbGVmdC0wIHJpZ2h0LTAgei01MCBib3JkZXItdCBib3JkZXItYm9yZGVyIGJnLWNhcmQvOTUgYmFja2Ryb3AtYmx1ciBzdXBwb3J0cy1bYmFja2Ryb3AtZmlsdGVyXTpiZy1jYXJkLzgwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1hcm91bmQgaC0xNiBtYXgtdy1sZyBteC1hdXRvIHB4LTRcIj5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0QWN0aXZlVGFiKFRhYi5Ib21lKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICBcImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIGZsZXgtMSBoLWZ1bGwgdHJhbnNpdGlvbi1jb2xvcnNcIixcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGFiID09PSBUYWIuSG9tZSA/IFwidGV4dC1wcmltYXJ5XCIgOiBcInRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaC01IHctNVwiPjxIb21lIC8+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1tZWRpdW1cIj5Ib21lPC9zcGFuPlxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVRhYihUYWIuUmFjZXMpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgIFwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEgZmxleC0xIGgtZnVsbCB0cmFuc2l0aW9uLWNvbG9yc1wiLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVUYWIgPT09IFRhYi5SYWNlcyA/IFwidGV4dC1wcmltYXJ5XCIgOiBcInRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaC01IHctNVwiPjxUcm9waHkgLz48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBmb250LW1lZGl1bVwiPlJhY2VzPC9zcGFuPlxuICAgICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0QWN0aXZlVGFiKFRhYi5Qcm9maWxlKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICBcImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIGZsZXgtMSBoLWZ1bGwgdHJhbnNpdGlvbi1jb2xvcnNcIixcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGFiID09PSBUYWIuUHJvZmlsZSA/IFwidGV4dC1wcmltYXJ5XCIgOiBcInRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaC01IHctNSBteC1hdXRvXCI+PFVzZXIgLz48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBmb250LW1lZGl1bSBteC1hdXRvXCI+UHJvZmlsZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25hdj5cbik7XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJUYWIiLCJIb21lIiwiVHJvcGh5IiwiVXNlciIsImNuIiwiQnV0dG9uIiwiRm9vdGVyIiwiYWN0aXZlVGFiIiwic2V0QWN0aXZlVGFiIiwibmF2IiwiY2xhc3NOYW1lIiwiZGl2IiwidmFyaWFudCIsIm9uQ2xpY2siLCJzcGFuIiwiUmFjZXMiLCJQcm9maWxlIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/Footer.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/Header.tsx": /*!**************************************!*\ !*** ./src/components/ui/Header.tsx ***! \**************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Header: () => (/* binding */ Header)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _neynar_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @neynar/react */ \"(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js\");\n/* harmony import */ var _barrel_optimize_names_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! __barrel_optimize__?names=Trophy!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trophy.js\");\n/* harmony import */ var _lib_wallet_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/lib/wallet-context */ \"(app-pages-browser)/./src/lib/wallet-context.tsx\");\n/* __next_internal_client_entry_do_not_use__ Header auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nfunction Header(param) {\n let { neynarUser } = param;\n _s();\n const { context } = (0,_neynar_react__WEBPACK_IMPORTED_MODULE_2__.useMiniApp)();\n const [isUserDropdownOpen, setIsUserDropdownOpen] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const { balance } = (0,_lib_wallet_context__WEBPACK_IMPORTED_MODULE_3__.useWallet)();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"border-b border-border bg-card\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"max-w-lg mx-auto px-8 py-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-bold text-balance\",\n children: \"Farbets\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 27,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Place your bets, win big\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 28,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 26,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 px-4 py-2 rounded-lg bg-secondary\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-4 w-4 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 31,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-bold\",\n children: balance.toLocaleString()\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 32,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs text-muted-foreground\",\n children: \"coins\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 33,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 30,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 25,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 24,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/Header.tsx\",\n lineNumber: 23,\n columnNumber: 7\n }, this);\n}\n_s(Header, \"sQJC2WMi1kZRpQMn+Z55uJTcrmI=\", false, function() {\n return [\n _neynar_react__WEBPACK_IMPORTED_MODULE_2__.useMiniApp,\n _lib_wallet_context__WEBPACK_IMPORTED_MODULE_3__.useWallet\n ];\n});\n_c = Header;\nvar _c;\n$RefreshReg$(_c, \"Header\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL0hlYWRlci50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRWlDO0FBR1U7QUFDUDtBQUNXO0FBU3hDLFNBQVNJLE9BQU8sS0FBMkI7UUFBM0IsRUFBRUMsVUFBVSxFQUFlLEdBQTNCOztJQUNyQixNQUFNLEVBQUVDLE9BQU8sRUFBRSxHQUFHTCx5REFBVUE7SUFDOUIsTUFBTSxDQUFDTSxvQkFBb0JDLHNCQUFzQixHQUFHUiwrQ0FBUUEsQ0FBQztJQUM3RCxNQUFNLEVBQUVTLE9BQU8sRUFBRSxHQUFHTiw4REFBU0E7SUFFN0IscUJBQ0ksOERBQUNPO1FBQU9DLFdBQVU7a0JBQ2QsNEVBQUNDO1lBQUlELFdBQVU7c0JBQ1gsNEVBQUNDO2dCQUFJRCxXQUFVOztrQ0FDWCw4REFBQ0M7OzBDQUNHLDhEQUFDQztnQ0FBR0YsV0FBVTswQ0FBa0M7Ozs7OzswQ0FDaEQsOERBQUNHO2dDQUFFSCxXQUFVOzBDQUFnQzs7Ozs7Ozs7Ozs7O2tDQUVqRCw4REFBQ0M7d0JBQUlELFdBQVU7OzBDQUNYLDhEQUFDVCxrRkFBTUE7Z0NBQUNTLFdBQVU7Ozs7OzswQ0FDbEIsOERBQUNJO2dDQUFLSixXQUFVOzBDQUFhRixRQUFRTyxjQUFjOzs7Ozs7MENBQ25ELDhEQUFDRDtnQ0FBS0osV0FBVTswQ0FBZ0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNdEU7R0F0QmdCUDs7UUFDTUgscURBQVVBO1FBRVZFLDBEQUFTQTs7O0tBSGZDIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2NvbXBvbmVudHMvdWkvSGVhZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEFQUF9OQU1FIH0gZnJvbSBcIn4vbGliL2NvbnN0YW50c1wiO1xuaW1wb3J0IHNkayBmcm9tIFwiQGZhcmNhc3Rlci9taW5pYXBwLXNka1wiO1xuaW1wb3J0IHsgdXNlTWluaUFwcCB9IGZyb20gXCJAbmV5bmFyL3JlYWN0XCI7XG5pbXBvcnQge1Ryb3BoeX0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiO1xuaW1wb3J0IHt1c2VXYWxsZXR9IGZyb20gXCJ+L2xpYi93YWxsZXQtY29udGV4dFwiO1xuXG50eXBlIEhlYWRlclByb3BzID0ge1xuICBuZXluYXJVc2VyPzoge1xuICAgIGZpZDogbnVtYmVyO1xuICAgIHNjb3JlOiBudW1iZXI7XG4gIH0gfCBudWxsO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcih7IG5leW5hclVzZXIgfTogSGVhZGVyUHJvcHMpIHtcbiAgY29uc3QgeyBjb250ZXh0IH0gPSB1c2VNaW5pQXBwKCk7XG4gIGNvbnN0IFtpc1VzZXJEcm9wZG93bk9wZW4sIHNldElzVXNlckRyb3Bkb3duT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IHsgYmFsYW5jZSB9ID0gdXNlV2FsbGV0KClcblxuICByZXR1cm4gKFxuICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIGJnLWNhcmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LWxnIG14LWF1dG8gcHgtOCBweS00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC1iYWxhbmNlXCI+RmFyYmV0czwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5QbGFjZSB5b3VyIGJldHMsIHdpbiBiaWc8L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNCBweS0yIHJvdW5kZWQtbGcgYmctc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRyb3BoeSBjbGFzc05hbWU9XCJoLTQgdy00IHRleHQtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ib2xkXCI+e2JhbGFuY2UudG9Mb2NhbGVTdHJpbmcoKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5jb2luczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaGVhZGVyPlxuICApO1xufVxuIl0sIm5hbWVzIjpbInVzZVN0YXRlIiwidXNlTWluaUFwcCIsIlRyb3BoeSIsInVzZVdhbGxldCIsIkhlYWRlciIsIm5leW5hclVzZXIiLCJjb250ZXh0IiwiaXNVc2VyRHJvcGRvd25PcGVuIiwic2V0SXNVc2VyRHJvcGRvd25PcGVuIiwiYmFsYW5jZSIsImhlYWRlciIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwicCIsInNwYW4iLCJ0b0xvY2FsZVN0cmluZyJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/Header.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/avatar.tsx": /*!**************************************!*\ !*** ./src/components/ui/avatar.tsx ***! \**************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Avatar: () => (/* binding */ Avatar),\n/* harmony export */ AvatarFallback: () => (/* binding */ AvatarFallback),\n/* harmony export */ AvatarImage: () => (/* binding */ AvatarImage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @radix-ui/react-avatar */ \"(app-pages-browser)/./node_modules/@radix-ui/react-avatar/dist/index.mjs\");\n/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/lib/utils */ \"(app-pages-browser)/./src/lib/utils.ts\");\n/* __next_internal_client_entry_do_not_use__ Avatar,AvatarImage,AvatarFallback auto */ \n\n\n\nconst Avatar = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__.Root, {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/avatar.tsx\",\n lineNumber: 12,\n columnNumber: 3\n }, undefined);\n});\n_c1 = Avatar;\nAvatar.displayName = _radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__.Root.displayName;\nconst AvatarImage = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c2 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__.Image, {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"aspect-square h-full w-full\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/avatar.tsx\",\n lineNumber: 27,\n columnNumber: 3\n }, undefined);\n});\n_c3 = AvatarImage;\nAvatarImage.displayName = _radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__.Image.displayName;\nconst AvatarFallback = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c4 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__.Fallback, {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"flex h-full w-full items-center justify-center rounded-full bg-muted\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/avatar.tsx\",\n lineNumber: 39,\n columnNumber: 3\n }, undefined);\n});\n_c5 = AvatarFallback;\nAvatarFallback.displayName = _radix_ui_react_avatar__WEBPACK_IMPORTED_MODULE_3__.Fallback.displayName;\n\nvar _c, _c1, _c2, _c3, _c4, _c5;\n$RefreshReg$(_c, \"Avatar$React.forwardRef\");\n$RefreshReg$(_c1, \"Avatar\");\n$RefreshReg$(_c2, \"AvatarImage$React.forwardRef\");\n$RefreshReg$(_c3, \"AvatarImage\");\n$RefreshReg$(_c4, \"AvatarFallback$React.forwardRef\");\n$RefreshReg$(_c5, \"AvatarFallback\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL2F2YXRhci50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRThCO0FBQzJCO0FBRXpCO0FBRWhDLE1BQU1HLHVCQUFTSCw2Q0FBZ0IsTUFHN0IsUUFBMEJLO1FBQXpCLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyxPQUFPO3lCQUN4Qiw4REFBQ04sd0RBQW9CO1FBQ25CSSxLQUFLQTtRQUNMQyxXQUFXSiw4Q0FBRUEsQ0FDWCxpRUFDQUk7UUFFRCxHQUFHQyxLQUFLOzs7Ozs7OztBQUdiSixPQUFPTSxXQUFXLEdBQUdSLHdEQUFvQixDQUFDUSxXQUFXO0FBRXJELE1BQU1DLDRCQUFjViw2Q0FBZ0IsT0FHbEMsUUFBMEJLO1FBQXpCLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyxPQUFPO3lCQUN4Qiw4REFBQ04seURBQXFCO1FBQ3BCSSxLQUFLQTtRQUNMQyxXQUFXSiw4Q0FBRUEsQ0FBQywrQkFBK0JJO1FBQzVDLEdBQUdDLEtBQUs7Ozs7Ozs7O0FBR2JHLFlBQVlELFdBQVcsR0FBR1IseURBQXFCLENBQUNRLFdBQVc7QUFFM0QsTUFBTUcsK0JBQWlCWiw2Q0FBZ0IsT0FHckMsUUFBMEJLO1FBQXpCLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyxPQUFPO3lCQUN4Qiw4REFBQ04sNERBQXdCO1FBQ3ZCSSxLQUFLQTtRQUNMQyxXQUFXSiw4Q0FBRUEsQ0FDWCx3RUFDQUk7UUFFRCxHQUFHQyxLQUFLOzs7Ozs7OztBQUdiSyxlQUFlSCxXQUFXLEdBQUdSLDREQUF3QixDQUFDUSxXQUFXO0FBRW5CIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2NvbXBvbmVudHMvdWkvYXZhdGFyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIlxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgQXZhdGFyUHJpbWl0aXZlIGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtYXZhdGFyXCJcblxuaW1wb3J0IHsgY24gfSBmcm9tIFwifi9saWIvdXRpbHNcIlxuXG5jb25zdCBBdmF0YXIgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBSZWFjdC5FbGVtZW50UmVmPHR5cGVvZiBBdmF0YXJQcmltaXRpdmUuUm9vdD4sXG4gIFJlYWN0LkNvbXBvbmVudFByb3BzV2l0aG91dFJlZjx0eXBlb2YgQXZhdGFyUHJpbWl0aXZlLlJvb3Q+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxBdmF0YXJQcmltaXRpdmUuUm9vdFxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICBcInJlbGF0aXZlIGZsZXggaC0xMCB3LTEwIHNocmluay0wIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLWZ1bGxcIixcbiAgICAgIGNsYXNzTmFtZVxuICAgICl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkF2YXRhci5kaXNwbGF5TmFtZSA9IEF2YXRhclByaW1pdGl2ZS5Sb290LmRpc3BsYXlOYW1lXG5cbmNvbnN0IEF2YXRhckltYWdlID0gUmVhY3QuZm9yd2FyZFJlZjxcbiAgUmVhY3QuRWxlbWVudFJlZjx0eXBlb2YgQXZhdGFyUHJpbWl0aXZlLkltYWdlPixcbiAgUmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPHR5cGVvZiBBdmF0YXJQcmltaXRpdmUuSW1hZ2U+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxBdmF0YXJQcmltaXRpdmUuSW1hZ2VcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFwiYXNwZWN0LXNxdWFyZSBoLWZ1bGwgdy1mdWxsXCIsIGNsYXNzTmFtZSl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkF2YXRhckltYWdlLmRpc3BsYXlOYW1lID0gQXZhdGFyUHJpbWl0aXZlLkltYWdlLmRpc3BsYXlOYW1lXG5cbmNvbnN0IEF2YXRhckZhbGxiYWNrID0gUmVhY3QuZm9yd2FyZFJlZjxcbiAgUmVhY3QuRWxlbWVudFJlZjx0eXBlb2YgQXZhdGFyUHJpbWl0aXZlLkZhbGxiYWNrPixcbiAgUmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPHR5cGVvZiBBdmF0YXJQcmltaXRpdmUuRmFsbGJhY2s+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxBdmF0YXJQcmltaXRpdmUuRmFsbGJhY2tcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgXCJmbGV4IGgtZnVsbCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCBiZy1tdXRlZFwiLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQXZhdGFyRmFsbGJhY2suZGlzcGxheU5hbWUgPSBBdmF0YXJQcmltaXRpdmUuRmFsbGJhY2suZGlzcGxheU5hbWVcblxuZXhwb3J0IHsgQXZhdGFyLCBBdmF0YXJJbWFnZSwgQXZhdGFyRmFsbGJhY2sgfVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwiQXZhdGFyUHJpbWl0aXZlIiwiY24iLCJBdmF0YXIiLCJmb3J3YXJkUmVmIiwicmVmIiwiY2xhc3NOYW1lIiwicHJvcHMiLCJSb290IiwiZGlzcGxheU5hbWUiLCJBdmF0YXJJbWFnZSIsIkltYWdlIiwiQXZhdGFyRmFsbGJhY2siLCJGYWxsYmFjayJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/avatar.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/badge.tsx": /*!*************************************!*\ !*** ./src/components/ui/badge.tsx ***! \*************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Badge: () => (/* binding */ Badge),\n/* harmony export */ badgeVariants: () => (/* binding */ badgeVariants)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var class_variance_authority__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! class-variance-authority */ \"(app-pages-browser)/./node_modules/class-variance-authority/dist/index.mjs\");\n/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/lib/utils */ \"(app-pages-browser)/./src/lib/utils.ts\");\n\n\n\n\nconst badgeVariants = (0,class_variance_authority__WEBPACK_IMPORTED_MODULE_2__.cva)(\"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\", {\n variants: {\n variant: {\n default: \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive: \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\"\n }\n },\n defaultVariants: {\n variant: \"default\"\n }\n});\nfunction Badge(param) {\n let { className, variant, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)(badgeVariants({\n variant\n }), className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/badge.tsx\",\n lineNumber: 32,\n columnNumber: 5\n }, this);\n}\n_c = Badge;\n\nvar _c;\n$RefreshReg$(_c, \"Badge\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL2JhZGdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUE4QjtBQUNtQztBQUVqQztBQUVoQyxNQUFNRyxnQkFBZ0JGLDZEQUFHQSxDQUN2QiwwS0FDQTtJQUNFRyxVQUFVO1FBQ1JDLFNBQVM7WUFDUEMsU0FDRTtZQUNGQyxXQUNFO1lBQ0ZDLGFBQ0U7WUFDRkMsU0FBUztRQUNYO0lBQ0Y7SUFDQUMsaUJBQWlCO1FBQ2ZMLFNBQVM7SUFDWDtBQUNGO0FBT0YsU0FBU00sTUFBTSxLQUE0QztRQUE1QyxFQUFFQyxTQUFTLEVBQUVQLE9BQU8sRUFBRSxHQUFHUSxPQUFtQixHQUE1QztJQUNiLHFCQUNFLDhEQUFDQztRQUFJRixXQUFXViw4Q0FBRUEsQ0FBQ0MsY0FBYztZQUFFRTtRQUFRLElBQUlPO1FBQWEsR0FBR0MsS0FBSzs7Ozs7O0FBRXhFO0tBSlNGO0FBTXNCIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2NvbXBvbmVudHMvdWkvYmFkZ2UudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSBcImNsYXNzLXZhcmlhbmNlLWF1dGhvcml0eVwiXG5cbmltcG9ydCB7IGNuIH0gZnJvbSBcIn4vbGliL3V0aWxzXCJcblxuY29uc3QgYmFkZ2VWYXJpYW50cyA9IGN2YShcbiAgXCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJvcmRlciBweC0yLjUgcHktMC41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctcmluZyBmb2N1czpyaW5nLW9mZnNldC0yXCIsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIFwiYm9yZGVyLXRyYW5zcGFyZW50IGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeS84MFwiLFxuICAgICAgICBzZWNvbmRhcnk6XG4gICAgICAgICAgXCJib3JkZXItdHJhbnNwYXJlbnQgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwXCIsXG4gICAgICAgIGRlc3RydWN0aXZlOlxuICAgICAgICAgIFwiYm9yZGVyLXRyYW5zcGFyZW50IGJnLWRlc3RydWN0aXZlIHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS84MFwiLFxuICAgICAgICBvdXRsaW5lOiBcInRleHQtZm9yZWdyb3VuZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogXCJkZWZhdWx0XCIsXG4gICAgfSxcbiAgfVxuKVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhZGdlUHJvcHNcbiAgZXh0ZW5kcyBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4sXG4gICAgVmFyaWFudFByb3BzPHR5cGVvZiBiYWRnZVZhcmlhbnRzPiB7fVxuXG5mdW5jdGlvbiBCYWRnZSh7IGNsYXNzTmFtZSwgdmFyaWFudCwgLi4ucHJvcHMgfTogQmFkZ2VQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbihiYWRnZVZhcmlhbnRzKHsgdmFyaWFudCB9KSwgY2xhc3NOYW1lKX0gey4uLnByb3BzfSAvPlxuICApXG59XG5cbmV4cG9ydCB7IEJhZGdlLCBiYWRnZVZhcmlhbnRzIH1cbiJdLCJuYW1lcyI6WyJSZWFjdCIsImN2YSIsImNuIiwiYmFkZ2VWYXJpYW50cyIsInZhcmlhbnRzIiwidmFyaWFudCIsImRlZmF1bHQiLCJzZWNvbmRhcnkiLCJkZXN0cnVjdGl2ZSIsIm91dGxpbmUiLCJkZWZhdWx0VmFyaWFudHMiLCJCYWRnZSIsImNsYXNzTmFtZSIsInByb3BzIiwiZGl2Il0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/badge.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/button.tsx": /*!**************************************!*\ !*** ./src/components/ui/button.tsx ***! \**************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Button: () => (/* binding */ Button),\n/* harmony export */ buttonVariants: () => (/* binding */ buttonVariants)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _radix_ui_react_slot__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @radix-ui/react-slot */ \"(app-pages-browser)/./node_modules/@radix-ui/react-slot/dist/index.mjs\");\n/* harmony import */ var class_variance_authority__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! class-variance-authority */ \"(app-pages-browser)/./node_modules/class-variance-authority/dist/index.mjs\");\n/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/lib/utils */ \"(app-pages-browser)/./src/lib/utils.ts\");\n\n\n\n\n\nconst buttonVariants = (0,class_variance_authority__WEBPACK_IMPORTED_MODULE_2__.cva)(\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\", {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"text-primary-foreground hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\"\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\"\n }\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\"\n }\n});\nconst Button = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c = (param, ref)=>{\n let { className, variant, size, asChild = false, ...props } = param;\n const Comp = asChild ? _radix_ui_react_slot__WEBPACK_IMPORTED_MODULE_4__.Slot : \"button\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Comp, {\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)(buttonVariants({\n variant,\n size,\n className\n })),\n ref: ref,\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/button.tsx\",\n lineNumber: 46,\n columnNumber: 7\n }, undefined);\n});\n_c1 = Button;\nButton.displayName = \"Button\";\n\nvar _c, _c1;\n$RefreshReg$(_c, \"Button$React.forwardRef\");\n$RefreshReg$(_c1, \"Button\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL2J1dHRvbi50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQThCO0FBQ2E7QUFDc0I7QUFFakM7QUFFaEMsTUFBTUksaUJBQWlCRiw2REFBR0EsQ0FDeEIsNFZBQ0E7SUFDRUcsVUFBVTtRQUNSQyxTQUFTO1lBQ1BDLFNBQVM7WUFDVEMsYUFDRTtZQUNGQyxTQUNFO1lBQ0ZDLFdBQ0U7WUFDRkMsT0FBTztZQUNQQyxNQUFNO1FBQ1I7UUFDQUMsTUFBTTtZQUNKTixTQUFTO1lBQ1RPLElBQUk7WUFDSkMsSUFBSTtZQUNKQyxNQUFNO1FBQ1I7SUFDRjtJQUNBQyxpQkFBaUI7UUFDZlgsU0FBUztRQUNUTyxNQUFNO0lBQ1I7QUFDRjtBQVNGLE1BQU1LLHVCQUFTbEIsNkNBQWdCLE1BQzdCLFFBQTBEb0I7UUFBekQsRUFBRUMsU0FBUyxFQUFFZixPQUFPLEVBQUVPLElBQUksRUFBRVMsVUFBVSxLQUFLLEVBQUUsR0FBR0MsT0FBTztJQUN0RCxNQUFNQyxPQUFPRixVQUFVckIsc0RBQUlBLEdBQUc7SUFDOUIscUJBQ0UsOERBQUN1QjtRQUNDSCxXQUFXbEIsOENBQUVBLENBQUNDLGVBQWU7WUFBRUU7WUFBU087WUFBTVE7UUFBVTtRQUN4REQsS0FBS0E7UUFDSixHQUFHRyxLQUFLOzs7Ozs7QUFHZjs7QUFFRkwsT0FBT08sV0FBVyxHQUFHO0FBRVkiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy91aS9idXR0b24udHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1zbG90XCJcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tIFwiY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5XCJcblxuaW1wb3J0IHsgY24gfSBmcm9tIFwifi9saWIvdXRpbHNcIlxuXG5jb25zdCBidXR0b25WYXJpYW50cyA9IGN2YShcbiAgXCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC1tZCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaXplLTQgWyZfc3ZnXTpzaHJpbmstMFwiLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDogXCJiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkvOTBcIixcbiAgICAgICAgZGVzdHJ1Y3RpdmU6XG4gICAgICAgICAgXCJiZy1kZXN0cnVjdGl2ZSB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvOTBcIixcbiAgICAgICAgb3V0bGluZTpcbiAgICAgICAgICBcInRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmRcIixcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgIFwiYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwXCIsXG4gICAgICAgIGdob3N0OiBcImhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kXCIsXG4gICAgICAgIGxpbms6IFwidGV4dC1wcmltYXJ5IHVuZGVybGluZS1vZmZzZXQtNCBob3Zlcjp1bmRlcmxpbmVcIixcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIGRlZmF1bHQ6IFwiaC0xMCBweC00IHB5LTJcIixcbiAgICAgICAgc206IFwiaC05IHJvdW5kZWQtbWQgcHgtM1wiLFxuICAgICAgICBsZzogXCJoLTExIHJvdW5kZWQtbWQgcHgtOFwiLFxuICAgICAgICBpY29uOiBcImgtMTAgdy0xMFwiLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogXCJkZWZhdWx0XCIsXG4gICAgICBzaXplOiBcImRlZmF1bHRcIixcbiAgICB9LFxuICB9XG4pXG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uUHJvcHNcbiAgZXh0ZW5kcyBSZWFjdC5CdXR0b25IVE1MQXR0cmlidXRlczxIVE1MQnV0dG9uRWxlbWVudD4sXG4gICAgVmFyaWFudFByb3BzPHR5cGVvZiBidXR0b25WYXJpYW50cz4ge1xuICBhc0NoaWxkPzogYm9vbGVhblxufVxuXG5jb25zdCBCdXR0b24gPSBSZWFjdC5mb3J3YXJkUmVmPEhUTUxCdXR0b25FbGVtZW50LCBCdXR0b25Qcm9wcz4oXG4gICh7IGNsYXNzTmFtZSwgdmFyaWFudCwgc2l6ZSwgYXNDaGlsZCA9IGZhbHNlLCAuLi5wcm9wcyB9LCByZWYpID0+IHtcbiAgICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiBcImJ1dHRvblwiXG4gICAgcmV0dXJuIChcbiAgICAgIDxDb21wXG4gICAgICAgIGNsYXNzTmFtZT17Y24oYnV0dG9uVmFyaWFudHMoeyB2YXJpYW50LCBzaXplLCBjbGFzc05hbWUgfSkpfVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICApXG4gIH1cbilcbkJ1dHRvbi5kaXNwbGF5TmFtZSA9IFwiQnV0dG9uXCJcblxuZXhwb3J0IHsgQnV0dG9uLCBidXR0b25WYXJpYW50cyB9XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJTbG90IiwiY3ZhIiwiY24iLCJidXR0b25WYXJpYW50cyIsInZhcmlhbnRzIiwidmFyaWFudCIsImRlZmF1bHQiLCJkZXN0cnVjdGl2ZSIsIm91dGxpbmUiLCJzZWNvbmRhcnkiLCJnaG9zdCIsImxpbmsiLCJzaXplIiwic20iLCJsZyIsImljb24iLCJkZWZhdWx0VmFyaWFudHMiLCJCdXR0b24iLCJmb3J3YXJkUmVmIiwicmVmIiwiY2xhc3NOYW1lIiwiYXNDaGlsZCIsInByb3BzIiwiQ29tcCIsImRpc3BsYXlOYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/button.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/card.tsx": /*!************************************!*\ !*** ./src/components/ui/card.tsx ***! \************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Card: () => (/* binding */ Card),\n/* harmony export */ CardContent: () => (/* binding */ CardContent),\n/* harmony export */ CardDescription: () => (/* binding */ CardDescription),\n/* harmony export */ CardFooter: () => (/* binding */ CardFooter),\n/* harmony export */ CardHeader: () => (/* binding */ CardHeader),\n/* harmony export */ CardTitle: () => (/* binding */ CardTitle)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/lib/utils */ \"(app-pages-browser)/./src/lib/utils.ts\");\n\n\n\nconst Card = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"rounded-lg border bg-card text-card-foreground shadow-sm\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/card.tsx\",\n lineNumber: 9,\n columnNumber: 3\n }, undefined);\n});\n_c1 = Card;\nCard.displayName = \"Card\";\nconst CardHeader = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c2 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"flex flex-col space-y-1.5 p-6\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/card.tsx\",\n lineNumber: 24,\n columnNumber: 3\n }, undefined);\n});\n_c3 = CardHeader;\nCardHeader.displayName = \"CardHeader\";\nconst CardTitle = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c4 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"text-2xl font-semibold leading-none tracking-tight\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/card.tsx\",\n lineNumber: 36,\n columnNumber: 3\n }, undefined);\n});\n_c5 = CardTitle;\nCardTitle.displayName = \"CardTitle\";\nconst CardDescription = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c6 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"text-sm text-muted-foreground\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/card.tsx\",\n lineNumber: 51,\n columnNumber: 3\n }, undefined);\n});\n_c7 = CardDescription;\nCardDescription.displayName = \"CardDescription\";\nconst CardContent = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c8 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"p-6 pt-0\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/card.tsx\",\n lineNumber: 63,\n columnNumber: 3\n }, undefined);\n});\n_c9 = CardContent;\nCardContent.displayName = \"CardContent\";\nconst CardFooter = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(_c10 = (param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: ref,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)(\"flex items-center p-6 pt-0\", className),\n ...props\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/card.tsx\",\n lineNumber: 71,\n columnNumber: 3\n }, undefined);\n});\n_c11 = CardFooter;\nCardFooter.displayName = \"CardFooter\";\n\nvar _c, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11;\n$RefreshReg$(_c, \"Card$React.forwardRef\");\n$RefreshReg$(_c1, \"Card\");\n$RefreshReg$(_c2, \"CardHeader$React.forwardRef\");\n$RefreshReg$(_c3, \"CardHeader\");\n$RefreshReg$(_c4, \"CardTitle$React.forwardRef\");\n$RefreshReg$(_c5, \"CardTitle\");\n$RefreshReg$(_c6, \"CardDescription$React.forwardRef\");\n$RefreshReg$(_c7, \"CardDescription\");\n$RefreshReg$(_c8, \"CardContent$React.forwardRef\");\n$RefreshReg$(_c9, \"CardContent\");\n$RefreshReg$(_c10, \"CardFooter$React.forwardRef\");\n$RefreshReg$(_c11, \"CardFooter\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL2NhcmQudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQThCO0FBRUU7QUFFaEMsTUFBTUUscUJBQU9GLDZDQUFnQixNQUczQixRQUEwQkk7UUFBekIsRUFBRUMsU0FBUyxFQUFFLEdBQUdDLE9BQU87eUJBQ3hCLDhEQUFDQztRQUNDSCxLQUFLQTtRQUNMQyxXQUFXSiw4Q0FBRUEsQ0FDWCw0REFDQUk7UUFFRCxHQUFHQyxLQUFLOzs7Ozs7OztBQUdiSixLQUFLTSxXQUFXLEdBQUc7QUFFbkIsTUFBTUMsMkJBQWFULDZDQUFnQixPQUdqQyxRQUEwQkk7UUFBekIsRUFBRUMsU0FBUyxFQUFFLEdBQUdDLE9BQU87eUJBQ3hCLDhEQUFDQztRQUNDSCxLQUFLQTtRQUNMQyxXQUFXSiw4Q0FBRUEsQ0FBQyxpQ0FBaUNJO1FBQzlDLEdBQUdDLEtBQUs7Ozs7Ozs7O0FBR2JHLFdBQVdELFdBQVcsR0FBRztBQUV6QixNQUFNRSwwQkFBWVYsNkNBQWdCLE9BR2hDLFFBQTBCSTtRQUF6QixFQUFFQyxTQUFTLEVBQUUsR0FBR0MsT0FBTzt5QkFDeEIsOERBQUNDO1FBQ0NILEtBQUtBO1FBQ0xDLFdBQVdKLDhDQUFFQSxDQUNYLHNEQUNBSTtRQUVELEdBQUdDLEtBQUs7Ozs7Ozs7O0FBR2JJLFVBQVVGLFdBQVcsR0FBRztBQUV4QixNQUFNRyxnQ0FBa0JYLDZDQUFnQixPQUd0QyxRQUEwQkk7UUFBekIsRUFBRUMsU0FBUyxFQUFFLEdBQUdDLE9BQU87eUJBQ3hCLDhEQUFDQztRQUNDSCxLQUFLQTtRQUNMQyxXQUFXSiw4Q0FBRUEsQ0FBQyxpQ0FBaUNJO1FBQzlDLEdBQUdDLEtBQUs7Ozs7Ozs7O0FBR2JLLGdCQUFnQkgsV0FBVyxHQUFHO0FBRTlCLE1BQU1JLDRCQUFjWiw2Q0FBZ0IsT0FHbEMsUUFBMEJJO1FBQXpCLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyxPQUFPO3lCQUN4Qiw4REFBQ0M7UUFBSUgsS0FBS0E7UUFBS0MsV0FBV0osOENBQUVBLENBQUMsWUFBWUk7UUFBYSxHQUFHQyxLQUFLOzs7Ozs7OztBQUVoRU0sWUFBWUosV0FBVyxHQUFHO0FBRTFCLE1BQU1LLDJCQUFhYiw2Q0FBZ0IsUUFHakMsUUFBMEJJO1FBQXpCLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyxPQUFPO3lCQUN4Qiw4REFBQ0M7UUFDQ0gsS0FBS0E7UUFDTEMsV0FBV0osOENBQUVBLENBQUMsOEJBQThCSTtRQUMzQyxHQUFHQyxLQUFLOzs7Ozs7OztBQUdiTyxXQUFXTCxXQUFXLEdBQUc7QUFFdUQiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy91aS9jYXJkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuXG5pbXBvcnQgeyBjbiB9IGZyb20gXCJ+L2xpYi91dGlsc1wiXG5cbmNvbnN0IENhcmQgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxkaXZcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgXCJyb3VuZGVkLWxnIGJvcmRlciBiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kIHNoYWRvdy1zbVwiLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZC5kaXNwbGF5TmFtZSA9IFwiQ2FyZFwiXG5cbmNvbnN0IENhcmRIZWFkZXIgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxkaXZcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTEuNSBwLTZcIiwgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZEhlYWRlci5kaXNwbGF5TmFtZSA9IFwiQ2FyZEhlYWRlclwiXG5cbmNvbnN0IENhcmRUaXRsZSA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICBcInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lIHRyYWNraW5nLXRpZ2h0XCIsXG4gICAgICBjbGFzc05hbWVcbiAgICApfVxuICAgIHsuLi5wcm9wc31cbiAgLz5cbikpXG5DYXJkVGl0bGUuZGlzcGxheU5hbWUgPSBcIkNhcmRUaXRsZVwiXG5cbmNvbnN0IENhcmREZXNjcmlwdGlvbiA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oXCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiLCBjbGFzc05hbWUpfVxuICAgIHsuLi5wcm9wc31cbiAgLz5cbikpXG5DYXJkRGVzY3JpcHRpb24uZGlzcGxheU5hbWUgPSBcIkNhcmREZXNjcmlwdGlvblwiXG5cbmNvbnN0IENhcmRDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PlxuPigoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0sIHJlZikgPT4gKFxuICA8ZGl2IHJlZj17cmVmfSBjbGFzc05hbWU9e2NuKFwicC02IHB0LTBcIiwgY2xhc3NOYW1lKX0gey4uLnByb3BzfSAvPlxuKSlcbkNhcmRDb250ZW50LmRpc3BsYXlOYW1lID0gXCJDYXJkQ29udGVudFwiXG5cbmNvbnN0IENhcmRGb290ZXIgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxkaXZcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFwiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTBcIiwgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZEZvb3Rlci5kaXNwbGF5TmFtZSA9IFwiQ2FyZEZvb3RlclwiXG5cbmV4cG9ydCB7IENhcmQsIENhcmRIZWFkZXIsIENhcmRGb290ZXIsIENhcmRUaXRsZSwgQ2FyZERlc2NyaXB0aW9uLCBDYXJkQ29udGVudCB9XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJjbiIsIkNhcmQiLCJmb3J3YXJkUmVmIiwicmVmIiwiY2xhc3NOYW1lIiwicHJvcHMiLCJkaXYiLCJkaXNwbGF5TmFtZSIsIkNhcmRIZWFkZXIiLCJDYXJkVGl0bGUiLCJDYXJkRGVzY3JpcHRpb24iLCJDYXJkQ29udGVudCIsIkNhcmRGb290ZXIiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/card.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/tabs/ContextTab.tsx": /*!***********************************************!*\ !*** ./src/components/ui/tabs/ContextTab.tsx ***! \***********************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextTab: () => (/* binding */ ContextTab)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* __next_internal_client_entry_do_not_use__ ContextTab auto */ \n/**\n * HomeTab component displays the main landing content for the mini app.\n * \n * This is the default tab that users see when they first open the mini app.\n * It provides a simple welcome message and placeholder content that can be\n * customized for specific use cases.\n * \n * @example\n * ```tsx\n * <HomeTab />\n * ```\n */ function ContextTab() {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-center h-[calc(100vh-200px)] px-6\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center w-full max-w-md mx-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-lg mb-2\",\n children: \"Put content here!\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ContextTab.tsx\",\n lineNumber: 19,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ContextTab.tsx\",\n lineNumber: 18,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ContextTab.tsx\",\n lineNumber: 17,\n columnNumber: 5\n }, this);\n}\n_c = ContextTab;\nvar _c;\n$RefreshReg$(_c, \"ContextTab\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMvQ29udGV4dFRhYi50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7O0NBV0MsR0FDTSxTQUFTQTtJQUNkLHFCQUNFLDhEQUFDQztRQUFJQyxXQUFVO2tCQUNiLDRFQUFDRDtZQUFJQyxXQUFVO3NCQUNiLDRFQUFDQztnQkFBRUQsV0FBVTswQkFBZTs7Ozs7Ozs7Ozs7Ozs7OztBQUlwQztLQVJnQkYiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy91aS90YWJzL0NvbnRleHRUYWIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG4vKipcbiAqIEhvbWVUYWIgY29tcG9uZW50IGRpc3BsYXlzIHRoZSBtYWluIGxhbmRpbmcgY29udGVudCBmb3IgdGhlIG1pbmkgYXBwLlxuICogXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHRhYiB0aGF0IHVzZXJzIHNlZSB3aGVuIHRoZXkgZmlyc3Qgb3BlbiB0aGUgbWluaSBhcHAuXG4gKiBJdCBwcm92aWRlcyBhIHNpbXBsZSB3ZWxjb21lIG1lc3NhZ2UgYW5kIHBsYWNlaG9sZGVyIGNvbnRlbnQgdGhhdCBjYW4gYmVcbiAqIGN1c3RvbWl6ZWQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogPEhvbWVUYWIgLz5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29udGV4dFRhYigpIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtW2NhbGMoMTAwdmgtMjAwcHgpXSBweC02XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHctZnVsbCBtYXgtdy1tZCBteC1hdXRvXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtbGcgbWItMlwiPlB1dCBjb250ZW50IGhlcmUhPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59IFxuIl0sIm5hbWVzIjpbIkNvbnRleHRUYWIiLCJkaXYiLCJjbGFzc05hbWUiLCJwIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/tabs/ContextTab.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/tabs/HomeTab.tsx": /*!********************************************!*\ !*** ./src/components/ui/tabs/HomeTab.tsx ***! \********************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HomeTab: () => (/* binding */ HomeTab)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var _barrel_optimize_names_Clock_TrendingUp_lucide_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! __barrel_optimize__?names=Clock,TrendingUp!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js\");\n/* harmony import */ var _barrel_optimize_names_Clock_TrendingUp_lucide_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! __barrel_optimize__?names=Clock,TrendingUp!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trending-up.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/client/app-dir/link.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _components_ui_button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/components/ui/button */ \"(app-pages-browser)/./src/components/ui/button.tsx\");\n/* harmony import */ var _lib_wallet_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/lib/wallet-context */ \"(app-pages-browser)/./src/lib/wallet-context.tsx\");\n/* harmony import */ var _components_ui_card__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~/components/ui/card */ \"(app-pages-browser)/./src/components/ui/card.tsx\");\n/* __next_internal_client_entry_do_not_use__ HomeTab auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n/**\n * HomeTab component displays the main landing content for the mini app.\n *\n * This is the default tab that users see when they first open the mini app.\n * It provides a simple welcome message and placeholder content that can be\n * customized for specific use cases.\n *\n * @example\n * ```tsx\n * <HomeTab />\n * ```\n */ function HomeTab() {\n _s();\n const { stats } = (0,_lib_wallet_context__WEBPACK_IMPORTED_MODULE_3__.useWallet)();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between mb-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold\",\n children: \"Featured Race\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 28,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground flex items-center gap-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Clock_TrendingUp_lucide_react__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 30,\n columnNumber: 19\n }, this),\n \"Starting in 15m\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 29,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 27,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_4__.Card, {\n className: \"overflow-hidden\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative h-48 bg-gradient-to-br from-primary/20 to-secondary\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: \"/horse-racing-track.webp\",\n alt: \"Featured race track\",\n className: \"w-full h-full object-cover opacity-60\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 36,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 bg-gradient-to-t from-card to-transparent\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 41,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute bottom-0 left-0 right-0 p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"text-lg font-bold mb-1\",\n children: \"Churchill Downs Classic\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 43,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-muted-foreground\",\n children: \"8 horses • 1.5 miles • Dirt track\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 44,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 42,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 35,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_1___default()), {\n href: \"/races/1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_2__.Button, {\n className: \"w-full\",\n size: \"lg\",\n children: \"View Race & Place Bet\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 49,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 48,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 47,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 34,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 26,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold mt-4 mb-4\",\n children: \"Your Stats\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 58,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid grid-cols-3 gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_4__.Card, {\n className: \"p-4 text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-bold text-primary\",\n children: stats.totalBets\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 61,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-muted-foreground mt-1\",\n children: \"Total Bets\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 62,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 60,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_4__.Card, {\n className: \"p-4 text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-bold text-primary\",\n children: stats.totalWins\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 65,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-muted-foreground mt-1\",\n children: \"Wins\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 66,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 64,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_4__.Card, {\n className: \"p-4 text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-center gap-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Clock_TrendingUp_lucide_react__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-4 w-4 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 70,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-2xl font-bold text-primary\",\n children: [\n stats.winRate.toFixed(0),\n \"%\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 71,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 69,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-muted-foreground mt-1\",\n children: \"Win Rate\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 73,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 68,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 59,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 57,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold mt-4 mb-4\",\n children: \"Upcoming Races\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 79,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n {\n name: \"Belmont Stakes\",\n time: \"2h 30m\",\n horses: 10,\n track: \"Dirt\"\n },\n {\n name: \"Preakness Stakes\",\n time: \"4h 15m\",\n horses: 9,\n track: \"Dirt\"\n },\n {\n name: \"Kentucky Derby\",\n time: \"6h 45m\",\n horses: 12,\n track: \"Dirt\"\n }\n ].map((race, index)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_4__.Card, {\n className: \"p-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"font-semibold mb-1\",\n children: race.name\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 104,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-muted-foreground\",\n children: [\n race.horses,\n \" horses • \",\n race.track,\n \" track\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 105,\n columnNumber: 35\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 103,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-right\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-medium text-primary\",\n children: race.time\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 110,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_2__.Button, {\n variant: \"ghost\",\n size: \"sm\",\n className: \"mt-1\",\n children: \"View\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 111,\n columnNumber: 35\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 109,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 102,\n columnNumber: 27\n }, this)\n }, index, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 101,\n columnNumber: 23\n }, this))\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 80,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 78,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/HomeTab.tsx\",\n lineNumber: 25,\n columnNumber: 7\n }, this);\n}\n_s(HomeTab, \"3gyx3/TkkCWZwq9GH/MmaGnIyfU=\", false, function() {\n return [\n _lib_wallet_context__WEBPACK_IMPORTED_MODULE_3__.useWallet\n ];\n});\n_c = HomeTab;\nvar _c;\n$RefreshReg$(_c, \"HomeTab\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMvSG9tZVRhYi50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFFK0M7QUFDbEI7QUFDaUI7QUFDQztBQUNMO0FBRTFDOzs7Ozs7Ozs7OztDQVdDLEdBQ00sU0FBU007O0lBQ1osTUFBTSxFQUFFQyxLQUFLLEVBQUUsR0FBR0gsOERBQVNBO0lBRTdCLHFCQUNJLDhEQUFDSTtRQUFJQyxXQUFVOzswQkFDWCw4REFBQ0M7O2tDQUNHLDhEQUFDRjt3QkFBSUMsV0FBVTs7MENBQ1gsOERBQUNFO2dDQUFHRixXQUFVOzBDQUFvQjs7Ozs7OzBDQUNsQyw4REFBQ0c7Z0NBQUtILFdBQVU7O2tEQUNoQiw4REFBQ1QsNEZBQUtBO3dDQUFDUyxXQUFVOzs7Ozs7b0NBQVk7Ozs7Ozs7Ozs7Ozs7a0NBSWpDLDhEQUFDSixxREFBSUE7d0JBQUNJLFdBQVU7OzBDQUNaLDhEQUFDRDtnQ0FBSUMsV0FBVTs7a0RBQ1gsOERBQUNJO3dDQUNHQyxLQUFJO3dDQUNKQyxLQUFJO3dDQUNKTixXQUFVOzs7Ozs7a0RBRWQsOERBQUNEO3dDQUFJQyxXQUFVOzs7Ozs7a0RBQ2YsOERBQUNEO3dDQUFJQyxXQUFVOzswREFDWCw4REFBQ087Z0RBQUdQLFdBQVU7MERBQXlCOzs7Ozs7MERBQ3ZDLDhEQUFDUTtnREFBRVIsV0FBVTswREFBZ0M7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQ0FHckQsOERBQUNEO2dDQUFJQyxXQUFVOzBDQUNYLDRFQUFDUCxrREFBSUE7b0NBQUNnQixNQUFLOzhDQUNQLDRFQUFDZix5REFBTUE7d0NBQUNNLFdBQVU7d0NBQVNVLE1BQUs7a0RBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBUXJELDhEQUFDVDs7a0NBQ0csOERBQUNDO3dCQUFHRixXQUFVO2tDQUE4Qjs7Ozs7O2tDQUM1Qyw4REFBQ0Q7d0JBQUlDLFdBQVU7OzBDQUNYLDhEQUFDSixxREFBSUE7Z0NBQUNJLFdBQVU7O2tEQUNaLDhEQUFDRDt3Q0FBSUMsV0FBVTtrREFBbUNGLE1BQU1hLFNBQVM7Ozs7OztrREFDakUsOERBQUNaO3dDQUFJQyxXQUFVO2tEQUFxQzs7Ozs7Ozs7Ozs7OzBDQUV4RCw4REFBQ0oscURBQUlBO2dDQUFDSSxXQUFVOztrREFDWiw4REFBQ0Q7d0NBQUlDLFdBQVU7a0RBQW1DRixNQUFNYyxTQUFTOzs7Ozs7a0RBQ2pFLDhEQUFDYjt3Q0FBSUMsV0FBVTtrREFBcUM7Ozs7Ozs7Ozs7OzswQ0FFeEQsOERBQUNKLHFEQUFJQTtnQ0FBQ0ksV0FBVTs7a0RBQ1osOERBQUNEO3dDQUFJQyxXQUFVOzswREFDWCw4REFBQ1IsNEZBQVVBO2dEQUFDUSxXQUFVOzs7Ozs7MERBQ3RCLDhEQUFDRztnREFBS0gsV0FBVTs7b0RBQW1DRixNQUFNZSxPQUFPLENBQUNDLE9BQU8sQ0FBQztvREFBRzs7Ozs7Ozs7Ozs7OztrREFFaEYsOERBQUNmO3dDQUFJQyxXQUFVO2tEQUFxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQUtoRSw4REFBQ0M7O2tDQUNHLDhEQUFDQzt3QkFBR0YsV0FBVTtrQ0FBOEI7Ozs7OztrQ0FDNUMsOERBQUNEO3dCQUFJQyxXQUFVO2tDQUNWOzRCQUNHO2dDQUNJZSxNQUFNO2dDQUNOQyxNQUFNO2dDQUNOQyxRQUFRO2dDQUNSQyxPQUFPOzRCQUNYOzRCQUNBO2dDQUNJSCxNQUFNO2dDQUNOQyxNQUFNO2dDQUNOQyxRQUFRO2dDQUNSQyxPQUFPOzRCQUNYOzRCQUNBO2dDQUNJSCxNQUFNO2dDQUNOQyxNQUFNO2dDQUNOQyxRQUFRO2dDQUNSQyxPQUFPOzRCQUNYO3lCQUNILENBQUNDLEdBQUcsQ0FBQyxDQUFDQyxNQUFNQyxzQkFDVCw4REFBQ3pCLHFEQUFJQTtnQ0FBYUksV0FBVTswQ0FDeEIsNEVBQUNEO29DQUFJQyxXQUFVOztzREFDWCw4REFBQ0Q7NENBQUlDLFdBQVU7OzhEQUNYLDhEQUFDTztvREFBR1AsV0FBVTs4REFBc0JvQixLQUFLTCxJQUFJOzs7Ozs7OERBQzdDLDhEQUFDUDtvREFBRVIsV0FBVTs7d0RBQ1JvQixLQUFLSCxNQUFNO3dEQUFDO3dEQUFXRyxLQUFLRixLQUFLO3dEQUFDOzs7Ozs7Ozs7Ozs7O3NEQUczQyw4REFBQ25COzRDQUFJQyxXQUFVOzs4REFDWCw4REFBQ0Q7b0RBQUlDLFdBQVU7OERBQW9Db0IsS0FBS0osSUFBSTs7Ozs7OzhEQUM1RCw4REFBQ3RCLHlEQUFNQTtvREFBQzRCLFNBQVE7b0RBQVFaLE1BQUs7b0RBQUtWLFdBQVU7OERBQU87Ozs7Ozs7Ozs7Ozs7Ozs7OzsrQkFWcERxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCakM7R0FyR2dCeEI7O1FBQ01GLDBEQUFTQTs7O0tBRGZFIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2NvbXBvbmVudHMvdWkvdGFicy9Ib21lVGFiLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHtDbG9jaywgVHJlbmRpbmdVcH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHtCdXR0b259IGZyb20gXCJ+L2NvbXBvbmVudHMvdWkvYnV0dG9uXCI7XG5pbXBvcnQge3VzZVdhbGxldH0gZnJvbSBcIn4vbGliL3dhbGxldC1jb250ZXh0XCI7XG5pbXBvcnQge0NhcmR9IGZyb20gXCJ+L2NvbXBvbmVudHMvdWkvY2FyZFwiO1xuXG4vKipcbiAqIEhvbWVUYWIgY29tcG9uZW50IGRpc3BsYXlzIHRoZSBtYWluIGxhbmRpbmcgY29udGVudCBmb3IgdGhlIG1pbmkgYXBwLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgdGFiIHRoYXQgdXNlcnMgc2VlIHdoZW4gdGhleSBmaXJzdCBvcGVuIHRoZSBtaW5pIGFwcC5cbiAqIEl0IHByb3ZpZGVzIGEgc2ltcGxlIHdlbGNvbWUgbWVzc2FnZSBhbmQgcGxhY2Vob2xkZXIgY29udGVudCB0aGF0IGNhbiBiZVxuICogY3VzdG9taXplZCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIDxIb21lVGFiIC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhvbWVUYWIoKSB7XG4gICAgY29uc3QgeyBzdGF0cyB9ID0gdXNlV2FsbGV0KCk7XG5cbiAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiXCI+XG4gICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhsIGZvbnQtYm9sZFwiPkZlYXR1cmVkIFJhY2U8L2gyPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgIDxDbG9jayBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICAgIFN0YXJ0aW5nIGluIDE1bVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cIm92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLTQ4IGJnLWdyYWRpZW50LXRvLWJyIGZyb20tcHJpbWFyeS8yMCB0by1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi9ob3JzZS1yYWNpbmctdHJhY2sud2VicFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkZlYXR1cmVkIHJhY2UgdHJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlciBvcGFjaXR5LTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCBiZy1ncmFkaWVudC10by10IGZyb20tY2FyZCB0by10cmFuc3BhcmVudFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgcmlnaHQtMCBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1ib2xkIG1iLTFcIj5DaHVyY2hpbGwgRG93bnMgQ2xhc3NpYzwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+OCBob3JzZXMg4oCiIDEuNSBtaWxlcyDigKIgRGlydCB0cmFjazwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8TGluayBocmVmPVwiL3JhY2VzLzFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGxcIiBzaXplPVwibGdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgUmFjZSAmIFBsYWNlIEJldFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9DYXJkPlxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14bCBmb250LWJvbGQgbXQtNCBtYi00XCI+WW91ciBTdGF0czwvaDI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPENhcmQgY2xhc3NOYW1lPVwicC00IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC1wcmltYXJ5XCI+e3N0YXRzLnRvdGFsQmV0c308L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG10LTFcIj5Ub3RhbCBCZXRzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJwLTQgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXByaW1hcnlcIj57c3RhdHMudG90YWxXaW5zfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgbXQtMVwiPldpbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInAtNCB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRyZW5kaW5nVXAgY2xhc3NOYW1lPVwiaC00IHctNCB0ZXh0LXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC1wcmltYXJ5XCI+e3N0YXRzLndpblJhdGUudG9GaXhlZCgwKX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgbXQtMVwiPldpbiBSYXRlPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14bCBmb250LWJvbGQgbXQtNCBtYi00XCI+VXBjb21pbmcgUmFjZXM8L2gyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAge1tcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQmVsbW9udCBTdGFrZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogXCIyaCAzMG1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yc2VzOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2s6IFwiRGlydFwiLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlByZWFrbmVzcyBTdGFrZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogXCI0aCAxNW1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yc2VzOiA5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjazogXCJEaXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2VudHVja3kgRGVyYnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogXCI2aCA0NW1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yc2VzOiAxMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2s6IFwiRGlydFwiLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLm1hcCgocmFjZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8Q2FyZCBrZXk9e2luZGV4fSBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgbWItMVwiPntyYWNlLm5hbWV9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmFjZS5ob3JzZXN9IGhvcnNlcyDigKIge3JhY2UudHJhY2t9IHRyYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1wcmltYXJ5XCI+e3JhY2UudGltZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNpemU9XCJzbVwiIGNsYXNzTmFtZT1cIm10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJDbG9jayIsIlRyZW5kaW5nVXAiLCJMaW5rIiwiQnV0dG9uIiwidXNlV2FsbGV0IiwiQ2FyZCIsIkhvbWVUYWIiLCJzdGF0cyIsImRpdiIsImNsYXNzTmFtZSIsInNlY3Rpb24iLCJoMiIsInNwYW4iLCJpbWciLCJzcmMiLCJhbHQiLCJoMyIsInAiLCJocmVmIiwic2l6ZSIsInRvdGFsQmV0cyIsInRvdGFsV2lucyIsIndpblJhdGUiLCJ0b0ZpeGVkIiwibmFtZSIsInRpbWUiLCJob3JzZXMiLCJ0cmFjayIsIm1hcCIsInJhY2UiLCJpbmRleCIsInZhcmlhbnQiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/tabs/HomeTab.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/tabs/ProfileTab.tsx": /*!***********************************************!*\ !*** ./src/components/ui/tabs/ProfileTab.tsx ***! \***********************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProfileTab: () => (/* binding */ ProfileTab)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var _lib_wallet_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~/lib/wallet-context */ \"(app-pages-browser)/./src/lib/wallet-context.tsx\");\n/* harmony import */ var sonner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! sonner */ \"(app-pages-browser)/./node_modules/sonner/dist/index.mjs\");\n/* harmony import */ var _components_ui_avatar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/components/ui/avatar */ \"(app-pages-browser)/./src/components/ui/avatar.tsx\");\n/* harmony import */ var _components_ui_badge__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~/components/ui/badge */ \"(app-pages-browser)/./src/components/ui/badge.tsx\");\n/* harmony import */ var _components_ui_card__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ~/components/ui/card */ \"(app-pages-browser)/./src/components/ui/card.tsx\");\n/* harmony import */ var _barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! __barrel_optimize__?names=Coins,History,TrendingUp,Trophy!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/coins.js\");\n/* harmony import */ var _barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! __barrel_optimize__?names=Coins,History,TrendingUp,Trophy!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trophy.js\");\n/* harmony import */ var _barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! __barrel_optimize__?names=Coins,History,TrendingUp,Trophy!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/history.js\");\n/* harmony import */ var _barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! __barrel_optimize__?names=Coins,History,TrendingUp,Trophy!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trending-up.js\");\n/* harmony import */ var _components_ui_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ~/components/ui/button */ \"(app-pages-browser)/./src/components/ui/button.tsx\");\n/* __next_internal_client_entry_do_not_use__ ProfileTab auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n\n\n/**\n * HomeTab component displays the main landing content for the mini app.\n * \n * This is the default tab that users see when they first open the mini app.\n * It provides a simple welcome message and placeholder content that can be\n * customized for specific use cases.\n * \n * @example\n * ```tsx\n * <HomeTab />\n * ```\n */ function ProfileTab() {\n _s();\n const { balance, bets, stats, addCoins, updateBetStatus } = (0,_lib_wallet_context__WEBPACK_IMPORTED_MODULE_1__.useWallet)();\n const handleAddCoins = ()=>{\n addCoins(500);\n (0,sonner__WEBPACK_IMPORTED_MODULE_2__.toast)(\"Coins Added!\", {\n description: \"500 test coins have been added to your wallet.\"\n });\n };\n const handleSimulateWin = (betId)=>{\n updateBetStatus(betId, \"won\");\n (0,sonner__WEBPACK_IMPORTED_MODULE_2__.toast)(\"Congratulations!\", {\n description: \"Your bet won!\"\n });\n };\n const handleSimulateLoss = (betId)=>{\n updateBetStatus(betId, \"lost\");\n (0,sonner__WEBPACK_IMPORTED_MODULE_2__.toast)(\"Better luck next time\", {\n description: \"Your bet lost.\"\n });\n };\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-h-screen pb-20\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"border-b border-border bg-card rounded-lg\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"max-w-lg mx-auto px-4 py-6\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_avatar__WEBPACK_IMPORTED_MODULE_3__.Avatar, {\n className: \"h-20 w-20 border-2 border-primary\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_avatar__WEBPACK_IMPORTED_MODULE_3__.AvatarImage, {\n src: \"/placeholder.svg?height=80&width=80\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 53,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_avatar__WEBPACK_IMPORTED_MODULE_3__.AvatarFallback, {\n className: \"text-2xl font-bold\",\n children: \"JD\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 54,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 52,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-bold\",\n children: \"John Doe\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 57,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-muted-foreground\",\n children: \"@johndoe\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 58,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 mt-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_badge__WEBPACK_IMPORTED_MODULE_4__.Badge, {\n className: \"bg-primary/20 text-primary border-primary/30\",\n children: \"Level 1\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 60,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 59,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 56,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 51,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 50,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 49,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"max-w-lg mx-auto py-6 space-y-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Wallet\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 69,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_5__.Card, {\n className: \"p-6 bg-gradient-to-br from-primary/20 to-secondary\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between mb-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-5 w-5 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 73,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Test Coins\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 74,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 72,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_6__.Button, {\n variant: \"outline\",\n size: \"sm\",\n onClick: handleAddCoins,\n children: \"Add Coins\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 76,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 71,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-4xl font-bold\",\n children: balance.toLocaleString()\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 80,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-muted-foreground mt-1\",\n children: \"Available balance\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 81,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 70,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 68,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Statistics\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 86,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid grid-cols-2 gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_5__.Card, {\n className: \"p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 mb-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-4 w-4 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 90,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Total Wins\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 91,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 89,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-3xl font-bold\",\n children: stats.totalWins\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 93,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 88,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_5__.Card, {\n className: \"p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 mb-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 97,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Total Bets\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 98,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 96,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-3xl font-bold\",\n children: stats.totalBets\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 100,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 95,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_5__.Card, {\n className: \"p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 mb-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-4 w-4 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 104,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Win Rate\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 105,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 103,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-3xl font-bold\",\n children: [\n stats.winRate.toFixed(0),\n \"%\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 107,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 102,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_5__.Card, {\n className: \"p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 mb-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Coins_History_TrendingUp_Trophy_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-4 w-4 text-primary\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 111,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Total Won\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 112,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 110,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-3xl font-bold\",\n children: stats.totalWon.toLocaleString()\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 114,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 109,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 87,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 85,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between mb-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold\",\n children: \"Recent Activity\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 121,\n columnNumber: 25\n }, this),\n bets.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-muted-foreground\",\n children: \"No bets yet\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 122,\n columnNumber: 47\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 120,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: bets.slice(0, 10).map((bet)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_5__.Card, {\n className: \"p-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"font-semibold\",\n children: bet.raceName\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 130,\n columnNumber: 45\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-muted-foreground\",\n children: [\n bet.horseName,\n \" • \",\n bet.odds,\n \"x odds\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 131,\n columnNumber: 45\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-muted-foreground mt-1\",\n children: new Date(bet.timestamp).toLocaleString()\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 134,\n columnNumber: 45\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 129,\n columnNumber: 41\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-right\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-bold\",\n children: [\n bet.amount,\n \" coins\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 137,\n columnNumber: 45\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-muted-foreground\",\n children: \"Bet amount\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 138,\n columnNumber: 45\n }, this),\n bet.status === \"pending\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_badge__WEBPACK_IMPORTED_MODULE_4__.Badge, {\n className: \"mt-2 bg-secondary text-secondary-foreground\",\n children: \"Pending\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 140,\n columnNumber: 49\n }, this),\n bet.status === \"won\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_badge__WEBPACK_IMPORTED_MODULE_4__.Badge, {\n className: \"mt-2 bg-primary/20 text-primary border-primary/30\",\n children: \"Won\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 143,\n columnNumber: 49\n }, this),\n bet.status === \"lost\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_badge__WEBPACK_IMPORTED_MODULE_4__.Badge, {\n className: \"mt-2 bg-destructive/20 text-destructive border-destructive/30\",\n children: \"Lost\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 146,\n columnNumber: 49\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 136,\n columnNumber: 41\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 128,\n columnNumber: 37\n }, this),\n bet.status === \"pending\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 pt-2 border-t border-border\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_6__.Button, {\n size: \"sm\",\n variant: \"outline\",\n className: \"flex-1 bg-transparent\",\n onClick: ()=>handleSimulateWin(bet.id),\n children: \"Simulate Win\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 152,\n columnNumber: 45\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_6__.Button, {\n size: \"sm\",\n variant: \"outline\",\n className: \"flex-1 bg-transparent\",\n onClick: ()=>handleSimulateLoss(bet.id),\n children: \"Simulate Loss\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 160,\n columnNumber: 45\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 151,\n columnNumber: 41\n }, this),\n bet.status === \"won\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-primary font-semibold\",\n children: [\n \"Won: +\",\n bet.potentialWin,\n \" coins\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 171,\n columnNumber: 41\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 127,\n columnNumber: 33\n }, this)\n }, bet.id, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 126,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 124,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 119,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 67,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/ProfileTab.tsx\",\n lineNumber: 48,\n columnNumber: 9\n }, this);\n}\n_s(ProfileTab, \"9FcqDRN2pjTUgkblMN3Bu6NbQBM=\", false, function() {\n return [\n _lib_wallet_context__WEBPACK_IMPORTED_MODULE_1__.useWallet\n ];\n});\n_c = ProfileTab;\nvar _c;\n$RefreshReg$(_c, \"ProfileTab\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMvUHJvZmlsZVRhYi50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFK0M7QUFDbEI7QUFDOEM7QUFDL0I7QUFDRjtBQUNzQjtBQUNsQjtBQUU5Qzs7Ozs7Ozs7Ozs7Q0FXQyxHQUNNLFNBQVNZOztJQUNaLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxlQUFlLEVBQUUsR0FBR2pCLDhEQUFTQTtJQUVyRSxNQUFNa0IsaUJBQWlCO1FBQ25CRixTQUFTO1FBQ1RmLDZDQUFLQSxDQUFDLGdCQUFnQjtZQUNsQmtCLGFBQWE7UUFDakI7SUFDSjtJQUVBLE1BQU1DLG9CQUFvQixDQUFDQztRQUN2QkosZ0JBQWdCSSxPQUFPO1FBQ3ZCcEIsNkNBQUtBLENBQUMsb0JBQW9CO1lBQ3RCa0IsYUFBYTtRQUNqQjtJQUNKO0lBRUEsTUFBTUcscUJBQXFCLENBQUNEO1FBQ3hCSixnQkFBZ0JJLE9BQU87UUFDdkJwQiw2Q0FBS0EsQ0FBQyx5QkFBeUI7WUFDM0JrQixhQUFhO1FBQ2pCO0lBQ0o7SUFFQSxxQkFDSSw4REFBQ0k7UUFBSUMsV0FBVTs7MEJBQ1gsOERBQUNDO2dCQUFPRCxXQUFVOzBCQUNkLDRFQUFDRDtvQkFBSUMsV0FBVTs4QkFDWCw0RUFBQ0Q7d0JBQUlDLFdBQVU7OzBDQUNYLDhEQUFDdEIseURBQU1BO2dDQUFDc0IsV0FBVTs7a0RBQ2QsOERBQUNwQiw4REFBV0E7d0NBQUNzQixLQUFJOzs7Ozs7a0RBQ2pCLDhEQUFDdkIsaUVBQWNBO3dDQUFDcUIsV0FBVTtrREFBcUI7Ozs7Ozs7Ozs7OzswQ0FFbkQsOERBQUNEO2dDQUFJQyxXQUFVOztrREFDWCw4REFBQ0c7d0NBQUdILFdBQVU7a0RBQXFCOzs7Ozs7a0RBQ25DLDhEQUFDSTt3Q0FBRUosV0FBVTtrREFBZ0M7Ozs7OztrREFDN0MsOERBQUNEO3dDQUFJQyxXQUFVO2tEQUNYLDRFQUFDbkIsdURBQUtBOzRDQUFDbUIsV0FBVTtzREFBK0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFPcEYsOERBQUNLO2dCQUFLTCxXQUFVOztrQ0FDWiw4REFBQ007OzBDQUNHLDhEQUFDQztnQ0FBR1AsV0FBVTswQ0FBeUI7Ozs7OzswQ0FDdkMsOERBQUNsQixxREFBSUE7Z0NBQUNrQixXQUFVOztrREFDWiw4REFBQ0Q7d0NBQUlDLFdBQVU7OzBEQUNYLDhEQUFDRDtnREFBSUMsV0FBVTs7a0VBQ1gsOERBQUNqQiwyR0FBS0E7d0RBQUNpQixXQUFVOzs7Ozs7a0VBQ2pCLDhEQUFDUTt3REFBS1IsV0FBVTtrRUFBZ0M7Ozs7Ozs7Ozs7OzswREFFcEQsOERBQUNiLHlEQUFNQTtnREFBQ3NCLFNBQVE7Z0RBQVVDLE1BQUs7Z0RBQUtDLFNBQVNqQjswREFBZ0I7Ozs7Ozs7Ozs7OztrREFJakUsOERBQUNLO3dDQUFJQyxXQUFVO2tEQUFzQlgsUUFBUXVCLGNBQWM7Ozs7OztrREFDM0QsOERBQUNSO3dDQUFFSixXQUFVO2tEQUFxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQUkxRCw4REFBQ007OzBDQUNHLDhEQUFDQztnQ0FBR1AsV0FBVTswQ0FBeUI7Ozs7OzswQ0FDdkMsOERBQUNEO2dDQUFJQyxXQUFVOztrREFDWCw4REFBQ2xCLHFEQUFJQTt3Q0FBQ2tCLFdBQVU7OzBEQUNaLDhEQUFDRDtnREFBSUMsV0FBVTs7a0VBQ1gsOERBQUNoQiwyR0FBTUE7d0RBQUNnQixXQUFVOzs7Ozs7a0VBQ2xCLDhEQUFDUTt3REFBS1IsV0FBVTtrRUFBZ0M7Ozs7Ozs7Ozs7OzswREFFcEQsOERBQUNEO2dEQUFJQyxXQUFVOzBEQUFzQlQsTUFBTXNCLFNBQVM7Ozs7Ozs7Ozs7OztrREFFeEQsOERBQUMvQixxREFBSUE7d0NBQUNrQixXQUFVOzswREFDWiw4REFBQ0Q7Z0RBQUlDLFdBQVU7O2tFQUNYLDhEQUFDZiwyR0FBT0E7d0RBQUNlLFdBQVU7Ozs7OztrRUFDbkIsOERBQUNRO3dEQUFLUixXQUFVO2tFQUFnQzs7Ozs7Ozs7Ozs7OzBEQUVwRCw4REFBQ0Q7Z0RBQUlDLFdBQVU7MERBQXNCVCxNQUFNdUIsU0FBUzs7Ozs7Ozs7Ozs7O2tEQUV4RCw4REFBQ2hDLHFEQUFJQTt3Q0FBQ2tCLFdBQVU7OzBEQUNaLDhEQUFDRDtnREFBSUMsV0FBVTs7a0VBQ1gsOERBQUNkLDRHQUFVQTt3REFBQ2MsV0FBVTs7Ozs7O2tFQUN0Qiw4REFBQ1E7d0RBQUtSLFdBQVU7a0VBQWdDOzs7Ozs7Ozs7Ozs7MERBRXBELDhEQUFDRDtnREFBSUMsV0FBVTs7b0RBQXNCVCxNQUFNd0IsT0FBTyxDQUFDQyxPQUFPLENBQUM7b0RBQUc7Ozs7Ozs7Ozs7Ozs7a0RBRWxFLDhEQUFDbEMscURBQUlBO3dDQUFDa0IsV0FBVTs7MERBQ1osOERBQUNEO2dEQUFJQyxXQUFVOztrRUFDWCw4REFBQ2pCLDJHQUFLQTt3REFBQ2lCLFdBQVU7Ozs7OztrRUFDakIsOERBQUNRO3dEQUFLUixXQUFVO2tFQUFnQzs7Ozs7Ozs7Ozs7OzBEQUVwRCw4REFBQ0Q7Z0RBQUlDLFdBQVU7MERBQXNCVCxNQUFNMEIsUUFBUSxDQUFDTCxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBSzlFLDhEQUFDTjs7MENBQ0csOERBQUNQO2dDQUFJQyxXQUFVOztrREFDWCw4REFBQ087d0NBQUdQLFdBQVU7a0RBQW9COzs7Ozs7b0NBQ2pDVixLQUFLNEIsTUFBTSxLQUFLLG1CQUFLLDhEQUFDVjt3Q0FBS1IsV0FBVTtrREFBZ0M7Ozs7Ozs7Ozs7OzswQ0FFMUUsOERBQUNEO2dDQUFJQyxXQUFVOzBDQUNWVixLQUFLNkIsS0FBSyxDQUFDLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUNDLG9CQUNwQiw4REFBQ3ZDLHFEQUFJQTt3Q0FBY2tCLFdBQVU7a0RBQ3pCLDRFQUFDRDs0Q0FBSUMsV0FBVTs7OERBQ1gsOERBQUNEO29EQUFJQyxXQUFVOztzRUFDWCw4REFBQ0Q7OzhFQUNHLDhEQUFDdUI7b0VBQUd0QixXQUFVOzhFQUFpQnFCLElBQUlFLFFBQVE7Ozs7Ozs4RUFDM0MsOERBQUNuQjtvRUFBRUosV0FBVTs7d0VBQ1JxQixJQUFJRyxTQUFTO3dFQUFDO3dFQUFJSCxJQUFJSSxJQUFJO3dFQUFDOzs7Ozs7OzhFQUVoQyw4REFBQ3JCO29FQUFFSixXQUFVOzhFQUFzQyxJQUFJMEIsS0FBS0wsSUFBSU0sU0FBUyxFQUFFZixjQUFjOzs7Ozs7Ozs7Ozs7c0VBRTdGLDhEQUFDYjs0REFBSUMsV0FBVTs7OEVBQ1gsOERBQUNEO29FQUFJQyxXQUFVOzt3RUFBYXFCLElBQUlPLE1BQU07d0VBQUM7Ozs7Ozs7OEVBQ3ZDLDhEQUFDN0I7b0VBQUlDLFdBQVU7OEVBQWdDOzs7Ozs7Z0VBQzlDcUIsSUFBSVEsTUFBTSxLQUFLLDJCQUNaLDhEQUFDaEQsdURBQUtBO29FQUFDbUIsV0FBVTs4RUFBOEM7Ozs7OztnRUFFbEVxQixJQUFJUSxNQUFNLEtBQUssdUJBQ1osOERBQUNoRCx1REFBS0E7b0VBQUNtQixXQUFVOzhFQUFvRDs7Ozs7O2dFQUV4RXFCLElBQUlRLE1BQU0sS0FBSyx3QkFDWiw4REFBQ2hELHVEQUFLQTtvRUFBQ21CLFdBQVU7OEVBQWdFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0RBSTVGcUIsSUFBSVEsTUFBTSxLQUFLLDJCQUNaLDhEQUFDOUI7b0RBQUlDLFdBQVU7O3NFQUNYLDhEQUFDYix5REFBTUE7NERBQ0h1QixNQUFLOzREQUNMRCxTQUFROzREQUNSVCxXQUFVOzREQUNWVyxTQUFTLElBQU1mLGtCQUFrQnlCLElBQUlTLEVBQUU7c0VBQzFDOzs7Ozs7c0VBR0QsOERBQUMzQyx5REFBTUE7NERBQ0h1QixNQUFLOzREQUNMRCxTQUFROzREQUNSVCxXQUFVOzREQUNWVyxTQUFTLElBQU1iLG1CQUFtQnVCLElBQUlTLEVBQUU7c0VBQzNDOzs7Ozs7Ozs7Ozs7Z0RBS1JULElBQUlRLE1BQU0sS0FBSyx1QkFDWiw4REFBQzlCO29EQUFJQyxXQUFVOzt3REFBcUM7d0RBQU9xQixJQUFJVSxZQUFZO3dEQUFDOzs7Ozs7Ozs7Ozs7O3VDQTdDN0VWLElBQUlTLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RDdDO0dBOUpnQjFDOztRQUNnRFosMERBQVNBOzs7S0FEekRZIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2NvbXBvbmVudHMvdWkvdGFicy9Qcm9maWxlVGFiLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHt1c2VXYWxsZXR9IGZyb20gXCJ+L2xpYi93YWxsZXQtY29udGV4dFwiO1xuaW1wb3J0IHt0b2FzdH0gZnJvbSBcInNvbm5lclwiO1xuaW1wb3J0IHtBdmF0YXIsIEF2YXRhckZhbGxiYWNrLCBBdmF0YXJJbWFnZX0gZnJvbSBcIn4vY29tcG9uZW50cy91aS9hdmF0YXJcIjtcbmltcG9ydCB7QmFkZ2V9IGZyb20gXCJ+L2NvbXBvbmVudHMvdWkvYmFkZ2VcIjtcbmltcG9ydCB7Q2FyZH0gZnJvbSBcIn4vY29tcG9uZW50cy91aS9jYXJkXCI7XG5pbXBvcnQge0NvaW5zLCBUcm9waHksIEhpc3RvcnksIFRyZW5kaW5nVXB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIjtcbmltcG9ydCB7QnV0dG9ufSBmcm9tIFwifi9jb21wb25lbnRzL3VpL2J1dHRvblwiO1xuXG4vKipcbiAqIEhvbWVUYWIgY29tcG9uZW50IGRpc3BsYXlzIHRoZSBtYWluIGxhbmRpbmcgY29udGVudCBmb3IgdGhlIG1pbmkgYXBwLlxuICogXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHRhYiB0aGF0IHVzZXJzIHNlZSB3aGVuIHRoZXkgZmlyc3Qgb3BlbiB0aGUgbWluaSBhcHAuXG4gKiBJdCBwcm92aWRlcyBhIHNpbXBsZSB3ZWxjb21lIG1lc3NhZ2UgYW5kIHBsYWNlaG9sZGVyIGNvbnRlbnQgdGhhdCBjYW4gYmVcbiAqIGN1c3RvbWl6ZWQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogPEhvbWVUYWIgLz5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJvZmlsZVRhYigpIHtcbiAgICBjb25zdCB7IGJhbGFuY2UsIGJldHMsIHN0YXRzLCBhZGRDb2lucywgdXBkYXRlQmV0U3RhdHVzIH0gPSB1c2VXYWxsZXQoKVxuXG4gICAgY29uc3QgaGFuZGxlQWRkQ29pbnMgPSAoKSA9PiB7XG4gICAgICAgIGFkZENvaW5zKDUwMClcbiAgICAgICAgdG9hc3QoXCJDb2lucyBBZGRlZCFcIiwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiNTAwIHRlc3QgY29pbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIHlvdXIgd2FsbGV0LlwiLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVNpbXVsYXRlV2luID0gKGJldElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQmV0U3RhdHVzKGJldElkLCBcIndvblwiKVxuICAgICAgICB0b2FzdChcIkNvbmdyYXR1bGF0aW9ucyFcIiwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiWW91ciBiZXQgd29uIVwiLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVNpbXVsYXRlTG9zcyA9IChiZXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUJldFN0YXR1cyhiZXRJZCwgXCJsb3N0XCIpXG4gICAgICAgIHRvYXN0KFwiQmV0dGVyIGx1Y2sgbmV4dCB0aW1lXCIsIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIllvdXIgYmV0IGxvc3QuXCIsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gcGItMjBcIj5cbiAgICAgICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLWJvcmRlciBiZy1jYXJkIHJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LWxnIG14LWF1dG8gcHgtNCBweS02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBdmF0YXIgY2xhc3NOYW1lPVwiaC0yMCB3LTIwIGJvcmRlci0yIGJvcmRlci1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEF2YXRhckltYWdlIHNyYz1cIi9wbGFjZWhvbGRlci5zdmc/aGVpZ2h0PTgwJndpZHRoPTgwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXZhdGFyRmFsbGJhY2sgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+SkQ8L0F2YXRhckZhbGxiYWNrPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BdmF0YXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGRcIj5Kb2huIERvZTwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5Aam9obmRvZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlIGNsYXNzTmFtZT1cImJnLXByaW1hcnkvMjAgdGV4dC1wcmltYXJ5IGJvcmRlci1wcmltYXJ5LzMwXCI+TGV2ZWwgMTwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWF4LXctbGcgbXgtYXV0byBweS02IHNwYWNlLXktNlwiPlxuICAgICAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14bCBmb250LWJvbGQgbWItNFwiPldhbGxldDwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInAtNiBiZy1ncmFkaWVudC10by1iciBmcm9tLXByaW1hcnkvMjAgdG8tc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29pbnMgY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlRlc3QgQ29pbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9XCJzbVwiIG9uQ2xpY2s9e2hhbmRsZUFkZENvaW5zfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIENvaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC00eGwgZm9udC1ib2xkXCI+e2JhbGFuY2UudG9Mb2NhbGVTdHJpbmcoKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG10LTFcIj5BdmFpbGFibGUgYmFsYW5jZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9DYXJkPlxuICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14bCBmb250LWJvbGQgbWItNFwiPlN0YXRpc3RpY3M8L2gyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHJvcGh5IGNsYXNzTmFtZT1cImgtNCB3LTQgdGV4dC1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5Ub3RhbCBXaW5zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0zeGwgZm9udC1ib2xkXCI+e3N0YXRzLnRvdGFsV2luc308L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SGlzdG9yeSBjbGFzc05hbWU9XCJoLTQgdy00IHRleHQtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+VG90YWwgQmV0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZFwiPntzdGF0cy50b3RhbEJldHN9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRyZW5kaW5nVXAgY2xhc3NOYW1lPVwiaC00IHctNCB0ZXh0LXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPldpbiBSYXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0zeGwgZm9udC1ib2xkXCI+e3N0YXRzLndpblJhdGUudG9GaXhlZCgwKX0lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENvaW5zIGNsYXNzTmFtZT1cImgtNCB3LTQgdGV4dC1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5Ub3RhbCBXb248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTN4bCBmb250LWJvbGRcIj57c3RhdHMudG90YWxXb24udG9Mb2NhbGVTdHJpbmcoKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhsIGZvbnQtYm9sZFwiPlJlY2VudCBBY3Rpdml0eTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YmV0cy5sZW5ndGggPT09IDAgJiYgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5ObyBiZXRzIHlldDwvc3Bhbj59XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2JldHMuc2xpY2UoMCwgMTApLm1hcCgoYmV0KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENhcmQga2V5PXtiZXQuaWR9IGNsYXNzTmFtZT1cInAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZFwiPntiZXQucmFjZU5hbWV9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtiZXQuaG9yc2VOYW1lfSDigKIge2JldC5vZGRzfXggb2Rkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG10LTFcIj57bmV3IERhdGUoYmV0LnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1ib2xkXCI+e2JldC5hbW91bnR9IGNvaW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5CZXQgYW1vdW50PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtiZXQuc3RhdHVzID09PSBcInBlbmRpbmdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmFkZ2UgY2xhc3NOYW1lPVwibXQtMiBiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZFwiPlBlbmRpbmc8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YmV0LnN0YXR1cyA9PT0gXCJ3b25cIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmFkZ2UgY2xhc3NOYW1lPVwibXQtMiBiZy1wcmltYXJ5LzIwIHRleHQtcHJpbWFyeSBib3JkZXItcHJpbWFyeS8zMFwiPldvbjwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtiZXQuc3RhdHVzID09PSBcImxvc3RcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmFkZ2UgY2xhc3NOYW1lPVwibXQtMiBiZy1kZXN0cnVjdGl2ZS8yMCB0ZXh0LWRlc3RydWN0aXZlIGJvcmRlci1kZXN0cnVjdGl2ZS8zMFwiPkxvc3Q8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YmV0LnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMiBwdC0yIGJvcmRlci10IGJvcmRlci1ib3JkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSBiZy10cmFuc3BhcmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVTaW11bGF0ZVdpbihiZXQuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW11bGF0ZSBXaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgYmctdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2ltdWxhdGVMb3NzKGJldC5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlIExvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2JldC5zdGF0dXMgPT09IFwid29uXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXByaW1hcnkgZm9udC1zZW1pYm9sZFwiPldvbjogK3tiZXQucG90ZW50aWFsV2lufSBjb2luczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9DYXJkPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICAgIDwvbWFpbj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn0gXG4iXSwibmFtZXMiOlsidXNlV2FsbGV0IiwidG9hc3QiLCJBdmF0YXIiLCJBdmF0YXJGYWxsYmFjayIsIkF2YXRhckltYWdlIiwiQmFkZ2UiLCJDYXJkIiwiQ29pbnMiLCJUcm9waHkiLCJIaXN0b3J5IiwiVHJlbmRpbmdVcCIsIkJ1dHRvbiIsIlByb2ZpbGVUYWIiLCJiYWxhbmNlIiwiYmV0cyIsInN0YXRzIiwiYWRkQ29pbnMiLCJ1cGRhdGVCZXRTdGF0dXMiLCJoYW5kbGVBZGRDb2lucyIsImRlc2NyaXB0aW9uIiwiaGFuZGxlU2ltdWxhdGVXaW4iLCJiZXRJZCIsImhhbmRsZVNpbXVsYXRlTG9zcyIsImRpdiIsImNsYXNzTmFtZSIsImhlYWRlciIsInNyYyIsImgxIiwicCIsIm1haW4iLCJzZWN0aW9uIiwiaDIiLCJzcGFuIiwidmFyaWFudCIsInNpemUiLCJvbkNsaWNrIiwidG9Mb2NhbGVTdHJpbmciLCJ0b3RhbFdpbnMiLCJ0b3RhbEJldHMiLCJ3aW5SYXRlIiwidG9GaXhlZCIsInRvdGFsV29uIiwibGVuZ3RoIiwic2xpY2UiLCJtYXAiLCJiZXQiLCJoMyIsInJhY2VOYW1lIiwiaG9yc2VOYW1lIiwib2RkcyIsIkRhdGUiLCJ0aW1lc3RhbXAiLCJhbW91bnQiLCJzdGF0dXMiLCJpZCIsInBvdGVudGlhbFdpbiJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/tabs/ProfileTab.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/tabs/RacesTab.tsx": /*!*********************************************!*\ !*** ./src/components/ui/tabs/RacesTab.tsx ***! \*********************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RacesTab: () => (/* binding */ RacesTab)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var _components_ui_card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~/components/ui/card */ \"(app-pages-browser)/./src/components/ui/card.tsx\");\n/* harmony import */ var _barrel_optimize_names_Clock_MapPin_lucide_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! __barrel_optimize__?names=Clock,MapPin!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/map-pin.js\");\n/* harmony import */ var _barrel_optimize_names_Clock_MapPin_lucide_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! __barrel_optimize__?names=Clock,MapPin!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/client/app-dir/link.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_ui_button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/components/ui/button */ \"(app-pages-browser)/./src/components/ui/button.tsx\");\n/* harmony import */ var _components_ui_badge__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~/components/ui/badge */ \"(app-pages-browser)/./src/components/ui/badge.tsx\");\n/* __next_internal_client_entry_do_not_use__ RacesTab auto */ \n\n\n\n\n\n/**\n * HomeTab component displays the main landing content for the mini app.\n * \n * This is the default tab that users see when they first open the mini app.\n * It provides a simple welcome message and placeholder content that can be\n * customized for specific use cases.\n * \n * @example\n * ```tsx\n * <HomeTab />\n * ```\n */ function RacesTab() {\n const races = [\n {\n id: 1,\n name: \"Churchill Downs Classic\",\n location: \"Louisville, KY\",\n time: \"15m\",\n status: \"starting-soon\",\n horses: 8,\n distance: \"1.5 miles\",\n track: \"Dirt\"\n },\n {\n id: 2,\n name: \"Belmont Stakes\",\n location: \"Elmont, NY\",\n time: \"2h 30m\",\n status: \"upcoming\",\n horses: 10,\n distance: \"1.5 miles\",\n track: \"Dirt\"\n },\n {\n id: 3,\n name: \"Preakness Stakes\",\n location: \"Baltimore, MD\",\n time: \"4h 15m\",\n status: \"upcoming\",\n horses: 9,\n distance: \"1.2 miles\",\n track: \"Dirt\"\n },\n {\n id: 4,\n name: \"Kentucky Derby\",\n location: \"Louisville, KY\",\n time: \"6h 45m\",\n status: \"upcoming\",\n horses: 12,\n distance: \"1.25 miles\",\n track: \"Dirt\"\n },\n {\n id: 5,\n name: \"Santa Anita Derby\",\n location: \"Arcadia, CA\",\n time: \"8h 20m\",\n status: \"upcoming\",\n horses: 11,\n distance: \"1.1 miles\",\n track: \"Dirt\"\n }\n ];\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-h-screen pb-20\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"max-w-lg mx-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-4\",\n children: races.map((race)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_card__WEBPACK_IMPORTED_MODULE_1__.Card, {\n className: \"overflow-hidden\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative h-32 bg-gradient-to-br from-primary/20 to-secondary\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: \"/horse-racing-motion.webp?height=128&width=400&query=horse racing \".concat(race.name),\n alt: race.name,\n className: \"w-full h-full object-cover opacity-50\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 82,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 bg-gradient-to-t from-card to-transparent\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 87,\n columnNumber: 29\n }, this),\n race.status === \"starting-soon\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_badge__WEBPACK_IMPORTED_MODULE_4__.Badge, {\n className: \"absolute top-3 right-3 bg-primary text-primary-foreground\",\n children: \"Starting Soon\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 89,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 81,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"text-lg font-bold mb-2\",\n children: race.name\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 93,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2 mb-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 text-sm text-muted-foreground\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Clock_MapPin_lucide_react__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 96,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: race.location\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 97,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 95,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 text-sm text-muted-foreground\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_Clock_MapPin_lucide_react__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 100,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"Starts in \",\n race.time\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 101,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 99,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-4 text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-muted-foreground\",\n children: [\n race.horses,\n \" horses\"\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 104,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-muted-foreground\",\n children: \"•\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 105,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-muted-foreground\",\n children: race.distance\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 106,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-muted-foreground\",\n children: \"•\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 107,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-muted-foreground\",\n children: race.track\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 108,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 103,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 94,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_2___default()), {\n href: \"/races/\".concat(race.id),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_3__.Button, {\n className: \"w-full\",\n children: \"View Race Details\"\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 112,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 111,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 92,\n columnNumber: 25\n }, this)\n ]\n }, race.id, true, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 80,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 78,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 77,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/components/ui/tabs/RacesTab.tsx\",\n lineNumber: 76,\n columnNumber: 7\n }, this);\n}\n_c = RacesTab;\nvar _c;\n$RefreshReg$(_c, \"RacesTab\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMvUmFjZXNUYWIudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFFMEM7QUFDQztBQUNkO0FBQ2lCO0FBQ0Y7QUFFNUM7Ozs7Ozs7Ozs7O0NBV0MsR0FDTSxTQUFTTTtJQUNaLE1BQU1DLFFBQVE7UUFDVjtZQUNJQyxJQUFJO1lBQ0pDLE1BQU07WUFDTkMsVUFBVTtZQUNWQyxNQUFNO1lBQ05DLFFBQVE7WUFDUkMsUUFBUTtZQUNSQyxVQUFVO1lBQ1ZDLE9BQU87UUFDWDtRQUNBO1lBQ0lQLElBQUk7WUFDSkMsTUFBTTtZQUNOQyxVQUFVO1lBQ1ZDLE1BQU07WUFDTkMsUUFBUTtZQUNSQyxRQUFRO1lBQ1JDLFVBQVU7WUFDVkMsT0FBTztRQUNYO1FBQ0E7WUFDSVAsSUFBSTtZQUNKQyxNQUFNO1lBQ05DLFVBQVU7WUFDVkMsTUFBTTtZQUNOQyxRQUFRO1lBQ1JDLFFBQVE7WUFDUkMsVUFBVTtZQUNWQyxPQUFPO1FBQ1g7UUFDQTtZQUNJUCxJQUFJO1lBQ0pDLE1BQU07WUFDTkMsVUFBVTtZQUNWQyxNQUFNO1lBQ05DLFFBQVE7WUFDUkMsUUFBUTtZQUNSQyxVQUFVO1lBQ1ZDLE9BQU87UUFDWDtRQUNBO1lBQ0lQLElBQUk7WUFDSkMsTUFBTTtZQUNOQyxVQUFVO1lBQ1ZDLE1BQU07WUFDTkMsUUFBUTtZQUNSQyxRQUFRO1lBQ1JDLFVBQVU7WUFDVkMsT0FBTztRQUNYO0tBQ0g7SUFFSCxxQkFDSSw4REFBQ0M7UUFBSUMsV0FBVTtrQkFDYiw0RUFBQ0Q7WUFBSUMsV0FBVTtzQkFDWCw0RUFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ1ZWLE1BQU1XLEdBQUcsQ0FBQyxDQUFDQyxxQkFDUiw4REFBQ25CLHFEQUFJQTt3QkFBZWlCLFdBQVU7OzBDQUMxQiw4REFBQ0Q7Z0NBQUlDLFdBQVU7O2tEQUNYLDhEQUFDRzt3Q0FDR0MsS0FBSyxxRUFBK0UsT0FBVkYsS0FBS1YsSUFBSTt3Q0FDbkZhLEtBQUtILEtBQUtWLElBQUk7d0NBQ2RRLFdBQVU7Ozs7OztrREFFZCw4REFBQ0Q7d0NBQUlDLFdBQVU7Ozs7OztvQ0FDZEUsS0FBS1AsTUFBTSxLQUFLLGlDQUNiLDhEQUFDUCx1REFBS0E7d0NBQUNZLFdBQVU7a0RBQTREOzs7Ozs7Ozs7Ozs7MENBR3JGLDhEQUFDRDtnQ0FBSUMsV0FBVTs7a0RBQ1gsOERBQUNNO3dDQUFHTixXQUFVO2tEQUEwQkUsS0FBS1YsSUFBSTs7Ozs7O2tEQUNqRCw4REFBQ087d0NBQUlDLFdBQVU7OzBEQUNYLDhEQUFDRDtnREFBSUMsV0FBVTs7a0VBQ1gsOERBQUNmLHdGQUFNQTt3REFBQ2UsV0FBVTs7Ozs7O2tFQUNsQiw4REFBQ087a0VBQU1MLEtBQUtULFFBQVE7Ozs7Ozs7Ozs7OzswREFFeEIsOERBQUNNO2dEQUFJQyxXQUFVOztrRUFDWCw4REFBQ2hCLHdGQUFLQTt3REFBQ2dCLFdBQVU7Ozs7OztrRUFDakIsOERBQUNPOzs0REFBSzs0REFBV0wsS0FBS1IsSUFBSTs7Ozs7Ozs7Ozs7OzswREFFOUIsOERBQUNLO2dEQUFJQyxXQUFVOztrRUFDWCw4REFBQ087d0RBQUtQLFdBQVU7OzREQUF5QkUsS0FBS04sTUFBTTs0REFBQzs7Ozs7OztrRUFDckQsOERBQUNXO3dEQUFLUCxXQUFVO2tFQUF3Qjs7Ozs7O2tFQUN4Qyw4REFBQ087d0RBQUtQLFdBQVU7a0VBQXlCRSxLQUFLTCxRQUFROzs7Ozs7a0VBQ3RELDhEQUFDVTt3REFBS1AsV0FBVTtrRUFBd0I7Ozs7OztrRUFDeEMsOERBQUNPO3dEQUFLUCxXQUFVO2tFQUF5QkUsS0FBS0osS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tEQUczRCw4REFBQ1osa0RBQUlBO3dDQUFDc0IsTUFBTSxVQUFrQixPQUFSTixLQUFLWCxFQUFFO2tEQUN6Qiw0RUFBQ0oseURBQU1BOzRDQUFDYSxXQUFVO3NEQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBaEM1QkUsS0FBS1gsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5Q3RDO0tBcEdnQkYiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy91aS90YWJzL1JhY2VzVGFiLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHtDYXJkfSBmcm9tIFwifi9jb21wb25lbnRzL3VpL2NhcmRcIjtcbmltcG9ydCB7Q2xvY2ssIE1hcFBpbn0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHtCdXR0b259IGZyb20gXCJ+L2NvbXBvbmVudHMvdWkvYnV0dG9uXCI7XG5pbXBvcnQge0JhZGdlfSBmcm9tIFwifi9jb21wb25lbnRzL3VpL2JhZGdlXCI7XG5cbi8qKlxuICogSG9tZVRhYiBjb21wb25lbnQgZGlzcGxheXMgdGhlIG1haW4gbGFuZGluZyBjb250ZW50IGZvciB0aGUgbWluaSBhcHAuXG4gKiBcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgdGFiIHRoYXQgdXNlcnMgc2VlIHdoZW4gdGhleSBmaXJzdCBvcGVuIHRoZSBtaW5pIGFwcC5cbiAqIEl0IHByb3ZpZGVzIGEgc2ltcGxlIHdlbGNvbWUgbWVzc2FnZSBhbmQgcGxhY2Vob2xkZXIgY29udGVudCB0aGF0IGNhbiBiZVxuICogY3VzdG9taXplZCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiA8SG9tZVRhYiAvPlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSYWNlc1RhYigpIHtcbiAgICBjb25zdCByYWNlcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgICBuYW1lOiBcIkNodXJjaGlsbCBEb3ducyBDbGFzc2ljXCIsXG4gICAgICAgICAgICBsb2NhdGlvbjogXCJMb3Vpc3ZpbGxlLCBLWVwiLFxuICAgICAgICAgICAgdGltZTogXCIxNW1cIixcbiAgICAgICAgICAgIHN0YXR1czogXCJzdGFydGluZy1zb29uXCIsXG4gICAgICAgICAgICBob3JzZXM6IDgsXG4gICAgICAgICAgICBkaXN0YW5jZTogXCIxLjUgbWlsZXNcIixcbiAgICAgICAgICAgIHRyYWNrOiBcIkRpcnRcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IDIsXG4gICAgICAgICAgICBuYW1lOiBcIkJlbG1vbnQgU3Rha2VzXCIsXG4gICAgICAgICAgICBsb2NhdGlvbjogXCJFbG1vbnQsIE5ZXCIsXG4gICAgICAgICAgICB0aW1lOiBcIjJoIDMwbVwiLFxuICAgICAgICAgICAgc3RhdHVzOiBcInVwY29taW5nXCIsXG4gICAgICAgICAgICBob3JzZXM6IDEwLFxuICAgICAgICAgICAgZGlzdGFuY2U6IFwiMS41IG1pbGVzXCIsXG4gICAgICAgICAgICB0cmFjazogXCJEaXJ0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAzLFxuICAgICAgICAgICAgbmFtZTogXCJQcmVha25lc3MgU3Rha2VzXCIsXG4gICAgICAgICAgICBsb2NhdGlvbjogXCJCYWx0aW1vcmUsIE1EXCIsXG4gICAgICAgICAgICB0aW1lOiBcIjRoIDE1bVwiLFxuICAgICAgICAgICAgc3RhdHVzOiBcInVwY29taW5nXCIsXG4gICAgICAgICAgICBob3JzZXM6IDksXG4gICAgICAgICAgICBkaXN0YW5jZTogXCIxLjIgbWlsZXNcIixcbiAgICAgICAgICAgIHRyYWNrOiBcIkRpcnRcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IDQsXG4gICAgICAgICAgICBuYW1lOiBcIktlbnR1Y2t5IERlcmJ5XCIsXG4gICAgICAgICAgICBsb2NhdGlvbjogXCJMb3Vpc3ZpbGxlLCBLWVwiLFxuICAgICAgICAgICAgdGltZTogXCI2aCA0NW1cIixcbiAgICAgICAgICAgIHN0YXR1czogXCJ1cGNvbWluZ1wiLFxuICAgICAgICAgICAgaG9yc2VzOiAxMixcbiAgICAgICAgICAgIGRpc3RhbmNlOiBcIjEuMjUgbWlsZXNcIixcbiAgICAgICAgICAgIHRyYWNrOiBcIkRpcnRcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IDUsXG4gICAgICAgICAgICBuYW1lOiBcIlNhbnRhIEFuaXRhIERlcmJ5XCIsXG4gICAgICAgICAgICBsb2NhdGlvbjogXCJBcmNhZGlhLCBDQVwiLFxuICAgICAgICAgICAgdGltZTogXCI4aCAyMG1cIixcbiAgICAgICAgICAgIHN0YXR1czogXCJ1cGNvbWluZ1wiLFxuICAgICAgICAgICAgaG9yc2VzOiAxMSxcbiAgICAgICAgICAgIGRpc3RhbmNlOiBcIjEuMSBtaWxlc1wiLFxuICAgICAgICAgICAgdHJhY2s6IFwiRGlydFwiLFxuICAgICAgICB9LFxuICAgIF1cblxuICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gcGItMjBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXgtdy1sZyBteC1hdXRvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICAgIHtyYWNlcy5tYXAoKHJhY2UpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPENhcmQga2V5PXtyYWNlLmlkfSBjbGFzc05hbWU9XCJvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC0zMiBiZy1ncmFkaWVudC10by1iciBmcm9tLXByaW1hcnkvMjAgdG8tc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2AvaG9yc2UtcmFjaW5nLW1vdGlvbi53ZWJwP2hlaWdodD0xMjgmd2lkdGg9NDAwJnF1ZXJ5PWhvcnNlIHJhY2luZyAke3JhY2UubmFtZX1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9e3JhY2UubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBvYmplY3QtY292ZXIgb3BhY2l0eS01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgYmctZ3JhZGllbnQtdG8tdCBmcm9tLWNhcmQgdG8tdHJhbnNwYXJlbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYWNlLnN0YXR1cyA9PT0gXCJzdGFydGluZy1zb29uXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmFkZ2UgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTMgcmlnaHQtMyBiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kXCI+U3RhcnRpbmcgU29vbjwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LWJvbGQgbWItMlwiPntyYWNlLm5hbWV9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMiBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57cmFjZS5sb2NhdGlvbn08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2xvY2sgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TdGFydHMgaW4ge3JhY2UudGltZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPntyYWNlLmhvcnNlc30gaG9yc2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+4oCiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3JhY2UuZGlzdGFuY2V9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+4oCiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3JhY2UudHJhY2t9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGluayBocmVmPXtgL3JhY2VzLyR7cmFjZS5pZH1gfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGxcIj5WaWV3IFJhY2UgRGV0YWlsczwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgKTtcbn0gXG4iXSwibmFtZXMiOlsiQ2FyZCIsIkNsb2NrIiwiTWFwUGluIiwiTGluayIsIkJ1dHRvbiIsIkJhZGdlIiwiUmFjZXNUYWIiLCJyYWNlcyIsImlkIiwibmFtZSIsImxvY2F0aW9uIiwidGltZSIsInN0YXR1cyIsImhvcnNlcyIsImRpc3RhbmNlIiwidHJhY2siLCJkaXYiLCJjbGFzc05hbWUiLCJtYXAiLCJyYWNlIiwiaW1nIiwic3JjIiwiYWx0IiwiaDMiLCJzcGFuIiwiaHJlZiJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/tabs/RacesTab.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./src/components/ui/tabs/index.ts": /*!*****************************************!*\ !*** ./src/components/ui/tabs/index.ts ***! \*****************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextTab: () => (/* reexport safe */ _ContextTab__WEBPACK_IMPORTED_MODULE_2__.ContextTab),\n/* harmony export */ HomeTab: () => (/* reexport safe */ _HomeTab__WEBPACK_IMPORTED_MODULE_0__.HomeTab),\n/* harmony export */ ProfileTab: () => (/* reexport safe */ _ProfileTab__WEBPACK_IMPORTED_MODULE_3__.ProfileTab),\n/* harmony export */ RacesTab: () => (/* reexport safe */ _RacesTab__WEBPACK_IMPORTED_MODULE_1__.RacesTab)\n/* harmony export */ });\n/* harmony import */ var _HomeTab__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./HomeTab */ \"(app-pages-browser)/./src/components/ui/tabs/HomeTab.tsx\");\n/* harmony import */ var _RacesTab__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RacesTab */ \"(app-pages-browser)/./src/components/ui/tabs/RacesTab.tsx\");\n/* harmony import */ var _ContextTab__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ContextTab */ \"(app-pages-browser)/./src/components/ui/tabs/ContextTab.tsx\");\n/* harmony import */ var _ProfileTab__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ProfileTab */ \"(app-pages-browser)/./src/components/ui/tabs/ProfileTab.tsx\");\n\n\n\n\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMvaW5kZXgudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBb0M7QUFDRTtBQUNJO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy91aS90YWJzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEhvbWVUYWIgfSBmcm9tICcuL0hvbWVUYWInO1xuZXhwb3J0IHsgUmFjZXNUYWIgfSBmcm9tICcuL1JhY2VzVGFiJztcbmV4cG9ydCB7IENvbnRleHRUYWIgfSBmcm9tICcuL0NvbnRleHRUYWInO1xuZXhwb3J0IHsgUHJvZmlsZVRhYiB9IGZyb20gJy4vUHJvZmlsZVRhYic7Il0sIm5hbWVzIjpbIkhvbWVUYWIiLCJSYWNlc1RhYiIsIkNvbnRleHRUYWIiLCJQcm9maWxlVGFiIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/tabs/index.ts\n")); /***/ }), /***/ "(app-pages-browser)/./src/hooks/useNeynarUser.ts": /*!************************************!*\ !*** ./src/hooks/useNeynarUser.ts ***! \************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useNeynarUser: () => (/* binding */ useNeynarUser)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nfunction useNeynarUser(context) {\n var _context_user;\n const [user, setUser] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)({\n \"useNeynarUser.useEffect\": ()=>{\n var _context_user;\n if (!(context === null || context === void 0 ? void 0 : (_context_user = context.user) === null || _context_user === void 0 ? void 0 : _context_user.fid)) {\n setUser(null);\n setError(null);\n return;\n }\n setLoading(true);\n setError(null);\n fetch(\"/api/users?fids=\".concat(context.user.fid)).then({\n \"useNeynarUser.useEffect\": (response)=>{\n if (!response.ok) throw new Error(\"HTTP error! status: \".concat(response.status));\n return response.json();\n }\n }[\"useNeynarUser.useEffect\"]).then({\n \"useNeynarUser.useEffect\": (data)=>{\n var _data_users;\n if ((_data_users = data.users) === null || _data_users === void 0 ? void 0 : _data_users[0]) {\n setUser(data.users[0]);\n } else {\n setUser(null);\n }\n }\n }[\"useNeynarUser.useEffect\"]).catch({\n \"useNeynarUser.useEffect\": (err)=>setError(err.message)\n }[\"useNeynarUser.useEffect\"]).finally({\n \"useNeynarUser.useEffect\": ()=>setLoading(false)\n }[\"useNeynarUser.useEffect\"]);\n }\n }[\"useNeynarUser.useEffect\"], [\n context === null || context === void 0 ? void 0 : (_context_user = context.user) === null || _context_user === void 0 ? void 0 : _context_user.fid\n ]);\n return {\n user,\n loading,\n error\n };\n}\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9ob29rcy91c2VOZXluYXJVc2VyLnRzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUE0QztBQU9yQyxTQUFTRSxjQUFjQyxPQUFxQztRQTJCN0RBO0lBMUJKLE1BQU0sQ0FBQ0MsTUFBTUMsUUFBUSxHQUFHSiwrQ0FBUUEsQ0FBb0I7SUFDcEQsTUFBTSxDQUFDSyxTQUFTQyxXQUFXLEdBQUdOLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ08sT0FBT0MsU0FBUyxHQUFHUiwrQ0FBUUEsQ0FBZ0I7SUFFbERELGdEQUFTQTttQ0FBQztnQkFDSEc7WUFBTCxJQUFJLEVBQUNBLG9CQUFBQSwrQkFBQUEsZ0JBQUFBLFFBQVNDLElBQUksY0FBYkQsb0NBQUFBLGNBQWVPLEdBQUcsR0FBRTtnQkFDdkJMLFFBQVE7Z0JBQ1JJLFNBQVM7Z0JBQ1Q7WUFDRjtZQUNBRixXQUFXO1lBQ1hFLFNBQVM7WUFDVEUsTUFBTSxtQkFBb0MsT0FBakJSLFFBQVFDLElBQUksQ0FBQ00sR0FBRyxHQUN0Q0UsSUFBSTsyQ0FBQyxDQUFDQztvQkFDTCxJQUFJLENBQUNBLFNBQVNDLEVBQUUsRUFBRSxNQUFNLElBQUlDLE1BQU0sdUJBQXVDLE9BQWhCRixTQUFTRyxNQUFNO29CQUN4RSxPQUFPSCxTQUFTSSxJQUFJO2dCQUN0QjswQ0FDQ0wsSUFBSTsyQ0FBQyxDQUFDTTt3QkFDREE7b0JBQUosS0FBSUEsY0FBQUEsS0FBS0MsS0FBSyxjQUFWRCxrQ0FBQUEsV0FBWSxDQUFDLEVBQUUsRUFBRTt3QkFDbkJiLFFBQVFhLEtBQUtDLEtBQUssQ0FBQyxFQUFFO29CQUN2QixPQUFPO3dCQUNMZCxRQUFRO29CQUNWO2dCQUNGOzBDQUNDZSxLQUFLOzJDQUFDLENBQUNDLE1BQVFaLFNBQVNZLElBQUlDLE9BQU87MENBQ25DQyxPQUFPOzJDQUFDLElBQU1oQixXQUFXOztRQUM5QjtrQ0FBRztRQUFDSixvQkFBQUEsK0JBQUFBLGdCQUFBQSxRQUFTQyxJQUFJLGNBQWJELG9DQUFBQSxjQUFlTyxHQUFHO0tBQUM7SUFFdkIsT0FBTztRQUFFTjtRQUFNRTtRQUFTRTtJQUFNO0FBQ2hDIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2hvb2tzL3VzZU5leW5hclVzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leW5hclVzZXIge1xuICBmaWQ6IG51bWJlcjtcbiAgc2NvcmU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU5leW5hclVzZXIoY29udGV4dD86IHsgdXNlcj86IHsgZmlkPzogbnVtYmVyIH0gfSkge1xuICBjb25zdCBbdXNlciwgc2V0VXNlcl0gPSB1c2VTdGF0ZTxOZXluYXJVc2VyIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29udGV4dD8udXNlcj8uZmlkKSB7XG4gICAgICBzZXRVc2VyKG51bGwpO1xuICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgc2V0RXJyb3IobnVsbCk7XG4gICAgZmV0Y2goYC9hcGkvdXNlcnM/Zmlkcz0ke2NvbnRleHQudXNlci5maWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEudXNlcnM/LlswXSkge1xuICAgICAgICAgIHNldFVzZXIoZGF0YS51c2Vyc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VXNlcihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBzZXRFcnJvcihlcnIubWVzc2FnZSkpXG4gICAgICAuZmluYWxseSgoKSA9PiBzZXRMb2FkaW5nKGZhbHNlKSk7XG4gIH0sIFtjb250ZXh0Py51c2VyPy5maWRdKTtcblxuICByZXR1cm4geyB1c2VyLCBsb2FkaW5nLCBlcnJvciB9O1xufSAiXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJ1c2VOZXluYXJVc2VyIiwiY29udGV4dCIsInVzZXIiLCJzZXRVc2VyIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiZmlkIiwiZmV0Y2giLCJ0aGVuIiwicmVzcG9uc2UiLCJvayIsIkVycm9yIiwic3RhdHVzIiwianNvbiIsImRhdGEiLCJ1c2VycyIsImNhdGNoIiwiZXJyIiwibWVzc2FnZSIsImZpbmFsbHkiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/hooks/useNeynarUser.ts\n")); /***/ }), /***/ "(app-pages-browser)/./src/lib/utils.ts": /*!**************************!*\ !*** ./src/lib/utils.ts ***! \**************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ cn: () => (/* binding */ cn),\n/* harmony export */ getFarcasterDomainManifest: () => (/* binding */ getFarcasterDomainManifest),\n/* harmony export */ getMiniAppEmbedMetadata: () => (/* binding */ getMiniAppEmbedMetadata)\n/* harmony export */ });\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var tailwind_merge__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tailwind-merge */ \"(app-pages-browser)/./node_modules/tailwind-merge/dist/bundle-mjs.mjs\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"(app-pages-browser)/./src/lib/constants.ts\");\n\n\n\nfunction cn() {\n for(var _len = arguments.length, inputs = new Array(_len), _key = 0; _key < _len; _key++){\n inputs[_key] = arguments[_key];\n }\n return (0,tailwind_merge__WEBPACK_IMPORTED_MODULE_2__.twMerge)((0,clsx__WEBPACK_IMPORTED_MODULE_0__.clsx)(inputs));\n}\nfunction getMiniAppEmbedMetadata(ogImageUrl) {\n return {\n version: 'next',\n imageUrl: ogImageUrl !== null && ogImageUrl !== void 0 ? ogImageUrl : _constants__WEBPACK_IMPORTED_MODULE_1__.APP_OG_IMAGE_URL,\n ogTitle: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_NAME,\n ogDescription: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_DESCRIPTION,\n ogImageUrl: ogImageUrl !== null && ogImageUrl !== void 0 ? ogImageUrl : _constants__WEBPACK_IMPORTED_MODULE_1__.APP_OG_IMAGE_URL,\n button: {\n title: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_BUTTON_TEXT,\n action: {\n type: 'launch_frame',\n name: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_NAME,\n url: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_URL,\n splashImageUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_SPLASH_URL,\n iconUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_ICON_URL,\n splashBackgroundColor: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_SPLASH_BACKGROUND_COLOR,\n description: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_DESCRIPTION,\n primaryCategory: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_PRIMARY_CATEGORY,\n tags: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_TAGS\n }\n }\n };\n}\nasync function getFarcasterDomainManifest() {\n return {\n accountAssociation: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_ACCOUNT_ASSOCIATION,\n miniapp: {\n version: '1',\n name: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_NAME !== null && _constants__WEBPACK_IMPORTED_MODULE_1__.APP_NAME !== void 0 ? _constants__WEBPACK_IMPORTED_MODULE_1__.APP_NAME : 'Neynar Starter Kit',\n homeUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_URL,\n iconUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_ICON_URL,\n imageUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_OG_IMAGE_URL,\n buttonTitle: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_BUTTON_TEXT !== null && _constants__WEBPACK_IMPORTED_MODULE_1__.APP_BUTTON_TEXT !== void 0 ? _constants__WEBPACK_IMPORTED_MODULE_1__.APP_BUTTON_TEXT : 'Launch Mini App',\n splashImageUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_SPLASH_URL,\n splashBackgroundColor: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_SPLASH_BACKGROUND_COLOR,\n webhookUrl: _constants__WEBPACK_IMPORTED_MODULE_1__.APP_WEBHOOK_URL\n }\n };\n}\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvdXRpbHMudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQTZDO0FBQ0o7QUFlcEI7QUFFZCxTQUFTYztJQUFHO1FBQUdDLE9BQUgsdUJBQXVCOztJQUN4QyxPQUFPZCx1REFBT0EsQ0FBQ0QsMENBQUlBLENBQUNlO0FBQ3RCO0FBRU8sU0FBU0Msd0JBQXdCQyxVQUFtQjtJQUN6RCxPQUFPO1FBQ0xDLFNBQVM7UUFDVEMsVUFBVUYsdUJBQUFBLHdCQUFBQSxhQUFjWCx3REFBZ0JBO1FBQ3hDYyxTQUFTZixnREFBUUE7UUFDakJnQixlQUFlbEIsdURBQWVBO1FBQzlCYyxZQUFZQSx1QkFBQUEsd0JBQUFBLGFBQWNYLHdEQUFnQkE7UUFDMUNnQixRQUFRO1lBQ05DLE9BQU9yQix1REFBZUE7WUFDdEJzQixRQUFRO2dCQUNOQyxNQUFNO2dCQUNOQyxNQUFNckIsZ0RBQVFBO2dCQUNkc0IsS0FBS2hCLCtDQUFPQTtnQkFDWmlCLGdCQUFnQm5CLHNEQUFjQTtnQkFDOUJvQixTQUFTekIsb0RBQVlBO2dCQUNyQjBCLHVCQUF1QnRCLG1FQUEyQkE7Z0JBQ2xEdUIsYUFBYTVCLHVEQUFlQTtnQkFDNUI2QixpQkFBaUJ6Qiw0REFBb0JBO2dCQUNyQzBCLE1BQU12QixnREFBUUE7WUFDaEI7UUFDRjtJQUNGO0FBQ0Y7QUFFTyxlQUFld0I7SUFDcEIsT0FBTztRQUNMQyxvQkFBb0J0QiwrREFBdUJBO1FBQzNDdUIsU0FBUztZQUNQbEIsU0FBUztZQUNUUSxNQUFNckIsZ0RBQVFBLGFBQVJBLGdEQUFRQSxjQUFSQSxnREFBUUEsR0FBSTtZQUNsQmdDLFNBQVMxQiwrQ0FBT0E7WUFDaEJrQixTQUFTekIsb0RBQVlBO1lBQ3JCZSxVQUFVYix3REFBZ0JBO1lBQzFCZ0MsYUFBYXBDLHVEQUFlQSxhQUFmQSx1REFBZUEsY0FBZkEsdURBQWVBLEdBQUk7WUFDaEMwQixnQkFBZ0JuQixzREFBY0E7WUFDOUJxQix1QkFBdUJ0QixtRUFBMkJBO1lBQ2xEK0IsWUFBWTNCLHVEQUFlQTtRQUM3QjtJQUNGO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvbGliL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ2xhc3NWYWx1ZSwgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgdHdNZXJnZSB9IGZyb20gJ3RhaWx3aW5kLW1lcmdlJztcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvc3JjL21hbmlmZXN0JztcbmltcG9ydCB7XG4gIEFQUF9CVVRUT05fVEVYVCxcbiAgQVBQX0RFU0NSSVBUSU9OLFxuICBBUFBfSUNPTl9VUkwsXG4gIEFQUF9OQU1FLFxuICBBUFBfT0dfSU1BR0VfVVJMLFxuICBBUFBfUFJJTUFSWV9DQVRFR09SWSxcbiAgQVBQX1NQTEFTSF9CQUNLR1JPVU5EX0NPTE9SLFxuICBBUFBfU1BMQVNIX1VSTCxcbiAgQVBQX1RBR1MsXG4gIEFQUF9VUkwsXG4gIEFQUF9XRUJIT09LX1VSTCxcbiAgQVBQX0FDQ09VTlRfQVNTT0NJQVRJT04sXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNuKC4uLmlucHV0czogQ2xhc3NWYWx1ZVtdKSB7XG4gIHJldHVybiB0d01lcmdlKGNsc3goaW5wdXRzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5pQXBwRW1iZWRNZXRhZGF0YShvZ0ltYWdlVXJsPzogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogJ25leHQnLFxuICAgIGltYWdlVXJsOiBvZ0ltYWdlVXJsID8/IEFQUF9PR19JTUFHRV9VUkwsXG4gICAgb2dUaXRsZTogQVBQX05BTUUsXG4gICAgb2dEZXNjcmlwdGlvbjogQVBQX0RFU0NSSVBUSU9OLFxuICAgIG9nSW1hZ2VVcmw6IG9nSW1hZ2VVcmwgPz8gQVBQX09HX0lNQUdFX1VSTCxcbiAgICBidXR0b246IHtcbiAgICAgIHRpdGxlOiBBUFBfQlVUVE9OX1RFWFQsXG4gICAgICBhY3Rpb246IHtcbiAgICAgICAgdHlwZTogJ2xhdW5jaF9mcmFtZScsXG4gICAgICAgIG5hbWU6IEFQUF9OQU1FLFxuICAgICAgICB1cmw6IEFQUF9VUkwsXG4gICAgICAgIHNwbGFzaEltYWdlVXJsOiBBUFBfU1BMQVNIX1VSTCxcbiAgICAgICAgaWNvblVybDogQVBQX0lDT05fVVJMLFxuICAgICAgICBzcGxhc2hCYWNrZ3JvdW5kQ29sb3I6IEFQUF9TUExBU0hfQkFDS0dST1VORF9DT0xPUixcbiAgICAgICAgZGVzY3JpcHRpb246IEFQUF9ERVNDUklQVElPTixcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBBUFBfUFJJTUFSWV9DQVRFR09SWSxcbiAgICAgICAgdGFnczogQVBQX1RBR1MsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGYXJjYXN0ZXJEb21haW5NYW5pZmVzdCgpOiBQcm9taXNlPE1hbmlmZXN0PiB7XG4gIHJldHVybiB7XG4gICAgYWNjb3VudEFzc29jaWF0aW9uOiBBUFBfQUNDT1VOVF9BU1NPQ0lBVElPTiEsXG4gICAgbWluaWFwcDoge1xuICAgICAgdmVyc2lvbjogJzEnLFxuICAgICAgbmFtZTogQVBQX05BTUUgPz8gJ05leW5hciBTdGFydGVyIEtpdCcsXG4gICAgICBob21lVXJsOiBBUFBfVVJMLFxuICAgICAgaWNvblVybDogQVBQX0lDT05fVVJMLFxuICAgICAgaW1hZ2VVcmw6IEFQUF9PR19JTUFHRV9VUkwsXG4gICAgICBidXR0b25UaXRsZTogQVBQX0JVVFRPTl9URVhUID8/ICdMYXVuY2ggTWluaSBBcHAnLFxuICAgICAgc3BsYXNoSW1hZ2VVcmw6IEFQUF9TUExBU0hfVVJMLFxuICAgICAgc3BsYXNoQmFja2dyb3VuZENvbG9yOiBBUFBfU1BMQVNIX0JBQ0tHUk9VTkRfQ09MT1IsXG4gICAgICB3ZWJob29rVXJsOiBBUFBfV0VCSE9PS19VUkwsXG4gICAgfSxcbiAgfTtcbn1cbiJdLCJuYW1lcyI6WyJjbHN4IiwidHdNZXJnZSIsIkFQUF9CVVRUT05fVEVYVCIsIkFQUF9ERVNDUklQVElPTiIsIkFQUF9JQ09OX1VSTCIsIkFQUF9OQU1FIiwiQVBQX09HX0lNQUdFX1VSTCIsIkFQUF9QUklNQVJZX0NBVEVHT1JZIiwiQVBQX1NQTEFTSF9CQUNLR1JPVU5EX0NPTE9SIiwiQVBQX1NQTEFTSF9VUkwiLCJBUFBfVEFHUyIsIkFQUF9VUkwiLCJBUFBfV0VCSE9PS19VUkwiLCJBUFBfQUNDT1VOVF9BU1NPQ0lBVElPTiIsImNuIiwiaW5wdXRzIiwiZ2V0TWluaUFwcEVtYmVkTWV0YWRhdGEiLCJvZ0ltYWdlVXJsIiwidmVyc2lvbiIsImltYWdlVXJsIiwib2dUaXRsZSIsIm9nRGVzY3JpcHRpb24iLCJidXR0b24iLCJ0aXRsZSIsImFjdGlvbiIsInR5cGUiLCJuYW1lIiwidXJsIiwic3BsYXNoSW1hZ2VVcmwiLCJpY29uVXJsIiwic3BsYXNoQmFja2dyb3VuZENvbG9yIiwiZGVzY3JpcHRpb24iLCJwcmltYXJ5Q2F0ZWdvcnkiLCJ0YWdzIiwiZ2V0RmFyY2FzdGVyRG9tYWluTWFuaWZlc3QiLCJhY2NvdW50QXNzb2NpYXRpb24iLCJtaW5pYXBwIiwiaG9tZVVybCIsImJ1dHRvblRpdGxlIiwid2ViaG9va1VybCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/utils.ts\n")); /***/ }), /***/ "(app-pages-browser)/./src/lib/wallet-context.tsx": /*!************************************!*\ !*** ./src/lib/wallet-context.tsx ***! \************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WalletProvider: () => (/* binding */ WalletProvider),\n/* harmony export */ useWallet: () => (/* binding */ useWallet)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* __next_internal_client_entry_do_not_use__ WalletProvider,useWallet auto */ \nvar _s = $RefreshSig$(), _s1 = $RefreshSig$();\n\nconst WalletContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)(undefined);\nfunction WalletProvider(param) {\n let { children } = param;\n _s();\n const [balance, setBalance] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1000);\n const [bets, setBets] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n // Load from localStorage on mount\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"WalletProvider.useEffect\": ()=>{\n const savedBalance = localStorage.getItem(\"wallet-balance\");\n const savedBets = localStorage.getItem(\"wallet-bets\");\n if (savedBalance) setBalance(Number.parseFloat(savedBalance));\n if (savedBets) setBets(JSON.parse(savedBets));\n }\n }[\"WalletProvider.useEffect\"], []);\n // Save to localStorage whenever balance or bets change\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"WalletProvider.useEffect\": ()=>{\n localStorage.setItem(\"wallet-balance\", balance.toString());\n }\n }[\"WalletProvider.useEffect\"], [\n balance\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"WalletProvider.useEffect\": ()=>{\n localStorage.setItem(\"wallet-bets\", JSON.stringify(bets));\n }\n }[\"WalletProvider.useEffect\"], [\n bets\n ]);\n const addBet = (bet)=>{\n const newBet = {\n ...bet,\n id: \"bet-\".concat(Date.now(), \"-\").concat(Math.random()),\n timestamp: Date.now(),\n status: \"pending\"\n };\n setBets((prev)=>[\n newBet,\n ...prev\n ]);\n setBalance((prev)=>prev - bet.amount);\n };\n const updateBetStatus = (betId, status)=>{\n setBets((prev)=>prev.map((bet)=>{\n if (bet.id === betId && bet.status === \"pending\") {\n if (status === \"won\") {\n setBalance((b)=>b + bet.potentialWin);\n }\n return {\n ...bet,\n status\n };\n }\n return bet;\n }));\n };\n const addCoins = (amount)=>{\n setBalance((prev)=>prev + amount);\n };\n const stats = {\n totalBets: bets.length,\n totalWins: bets.filter((b)=>b.status === \"won\").length,\n totalLosses: bets.filter((b)=>b.status === \"lost\").length,\n winRate: bets.length > 0 ? bets.filter((b)=>b.status === \"won\").length / bets.length * 100 : 0,\n totalWon: bets.filter((b)=>b.status === \"won\").reduce((sum, b)=>sum + b.potentialWin, 0),\n totalLost: bets.filter((b)=>b.status === \"lost\").reduce((sum, b)=>sum + b.amount, 0)\n };\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(WalletContext.Provider, {\n value: {\n balance,\n bets,\n addBet,\n updateBetStatus,\n addCoins,\n stats\n },\n children: children\n }, void 0, false, {\n fileName: \"/home/wslxt/cs472/farcaster/src/lib/wallet-context.tsx\",\n lineNumber: 99,\n columnNumber: 9\n }, this);\n}\n_s(WalletProvider, \"jvTu62Sqq48QwjRnDWt7hlK5K0s=\");\n_c = WalletProvider;\nfunction useWallet() {\n _s1();\n const context = (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(WalletContext);\n if (context === undefined) {\n throw new Error(\"useWallet must be used within a WalletProvider\");\n }\n return context;\n}\n_s1(useWallet, \"b9L3QQ+jgeyIrH0NfHrJ8nn7VMU=\");\nvar _c;\n$RefreshReg$(_c, \"WalletProvider\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvd2FsbGV0LWNvbnRleHQudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHc0U7QUErQnRFLE1BQU1JLDhCQUFnQkosb0RBQWFBLENBQWdDSztBQUU1RCxTQUFTQyxlQUFlLEtBQTJDO1FBQTNDLEVBQUVDLFFBQVEsRUFBaUMsR0FBM0M7O0lBQzNCLE1BQU0sQ0FBQ0MsU0FBU0MsV0FBVyxHQUFHUCwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUNRLE1BQU1DLFFBQVEsR0FBR1QsK0NBQVFBLENBQVEsRUFBRTtJQUUxQyxrQ0FBa0M7SUFDbENDLGdEQUFTQTtvQ0FBQztZQUNOLE1BQU1TLGVBQWVDLGFBQWFDLE9BQU8sQ0FBQztZQUMxQyxNQUFNQyxZQUFZRixhQUFhQyxPQUFPLENBQUM7WUFFdkMsSUFBSUYsY0FBY0gsV0FBV08sT0FBT0MsVUFBVSxDQUFDTDtZQUMvQyxJQUFJRyxXQUFXSixRQUFRTyxLQUFLQyxLQUFLLENBQUNKO1FBQ3RDO21DQUFHLEVBQUU7SUFFTCx1REFBdUQ7SUFDdkRaLGdEQUFTQTtvQ0FBQztZQUNOVSxhQUFhTyxPQUFPLENBQUMsa0JBQWtCWixRQUFRYSxRQUFRO1FBQzNEO21DQUFHO1FBQUNiO0tBQVE7SUFFWkwsZ0RBQVNBO29DQUFDO1lBQ05VLGFBQWFPLE9BQU8sQ0FBQyxlQUFlRixLQUFLSSxTQUFTLENBQUNaO1FBQ3ZEO21DQUFHO1FBQUNBO0tBQUs7SUFFVCxNQUFNYSxTQUFTLENBQUNDO1FBQ1osTUFBTUMsU0FBYztZQUNoQixHQUFHRCxHQUFHO1lBQ05FLElBQUksT0FBcUJDLE9BQWRDLEtBQUtDLEdBQUcsSUFBRyxLQUFpQixPQUFkRixLQUFLRyxNQUFNO1lBQ3BDQyxXQUFXSCxLQUFLQyxHQUFHO1lBQ25CRyxRQUFRO1FBQ1o7UUFFQXJCLFFBQVEsQ0FBQ3NCLE9BQVM7Z0JBQUNSO21CQUFXUTthQUFLO1FBQ25DeEIsV0FBVyxDQUFDd0IsT0FBU0EsT0FBT1QsSUFBSVUsTUFBTTtJQUMxQztJQUVBLE1BQU1DLGtCQUFrQixDQUFDQyxPQUFlSjtRQUNwQ3JCLFFBQVEsQ0FBQ3NCLE9BQ0xBLEtBQUtJLEdBQUcsQ0FBQyxDQUFDYjtnQkFDTixJQUFJQSxJQUFJRSxFQUFFLEtBQUtVLFNBQVNaLElBQUlRLE1BQU0sS0FBSyxXQUFXO29CQUM5QyxJQUFJQSxXQUFXLE9BQU87d0JBQ2xCdkIsV0FBVyxDQUFDNkIsSUFBTUEsSUFBSWQsSUFBSWUsWUFBWTtvQkFDMUM7b0JBQ0EsT0FBTzt3QkFBRSxHQUFHZixHQUFHO3dCQUFFUTtvQkFBTztnQkFDNUI7Z0JBQ0EsT0FBT1I7WUFDWDtJQUVSO0lBRUEsTUFBTWdCLFdBQVcsQ0FBQ047UUFDZHpCLFdBQVcsQ0FBQ3dCLE9BQVNBLE9BQU9DO0lBQ2hDO0lBRUEsTUFBTU8sUUFBUTtRQUNWQyxXQUFXaEMsS0FBS2lDLE1BQU07UUFDdEJDLFdBQVdsQyxLQUFLbUMsTUFBTSxDQUFDLENBQUNQLElBQU1BLEVBQUVOLE1BQU0sS0FBSyxPQUFPVyxNQUFNO1FBQ3hERyxhQUFhcEMsS0FBS21DLE1BQU0sQ0FBQyxDQUFDUCxJQUFNQSxFQUFFTixNQUFNLEtBQUssUUFBUVcsTUFBTTtRQUMzREksU0FBU3JDLEtBQUtpQyxNQUFNLEdBQUcsSUFBSSxLQUFNRSxNQUFNLENBQUMsQ0FBQ1AsSUFBTUEsRUFBRU4sTUFBTSxLQUFLLE9BQU9XLE1BQU0sR0FBR2pDLEtBQUtpQyxNQUFNLEdBQUksTUFBTTtRQUNqR0ssVUFBVXRDLEtBQUttQyxNQUFNLENBQUMsQ0FBQ1AsSUFBTUEsRUFBRU4sTUFBTSxLQUFLLE9BQU9pQixNQUFNLENBQUMsQ0FBQ0MsS0FBS1osSUFBTVksTUFBTVosRUFBRUMsWUFBWSxFQUFFO1FBQzFGWSxXQUFXekMsS0FBS21DLE1BQU0sQ0FBQyxDQUFDUCxJQUFNQSxFQUFFTixNQUFNLEtBQUssUUFBUWlCLE1BQU0sQ0FBQyxDQUFDQyxLQUFLWixJQUFNWSxNQUFNWixFQUFFSixNQUFNLEVBQUU7SUFDMUY7SUFFQSxxQkFDSSw4REFBQzlCLGNBQWNnRCxRQUFRO1FBQUNDLE9BQU87WUFBRTdDO1lBQVNFO1lBQU1hO1lBQVFZO1lBQWlCSztZQUFVQztRQUFNO2tCQUNwRmxDOzs7Ozs7QUFHYjtHQWxFZ0JEO0tBQUFBO0FBb0VULFNBQVNnRDs7SUFDWixNQUFNQyxVQUFVdEQsaURBQVVBLENBQUNHO0lBQzNCLElBQUltRCxZQUFZbEQsV0FBVztRQUN2QixNQUFNLElBQUltRCxNQUFNO0lBQ3BCO0lBQ0EsT0FBT0Q7QUFDWDtJQU5nQkQiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvbGliL3dhbGxldC1jb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIlxuXG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiXG5cbmludGVyZmFjZSBCZXQge1xuICAgIGlkOiBzdHJpbmdcbiAgICByYWNlSWQ6IG51bWJlclxuICAgIHJhY2VOYW1lOiBzdHJpbmdcbiAgICBob3JzZUlkOiBudW1iZXJcbiAgICBob3JzZU5hbWU6IHN0cmluZ1xuICAgIGFtb3VudDogbnVtYmVyXG4gICAgb2RkczogbnVtYmVyXG4gICAgcG90ZW50aWFsV2luOiBudW1iZXJcbiAgICB0aW1lc3RhbXA6IG51bWJlclxuICAgIHN0YXR1czogXCJwZW5kaW5nXCIgfCBcIndvblwiIHwgXCJsb3N0XCJcbn1cblxuaW50ZXJmYWNlIFdhbGxldENvbnRleHRUeXBlIHtcbiAgICBiYWxhbmNlOiBudW1iZXJcbiAgICBiZXRzOiBCZXRbXVxuICAgIGFkZEJldDogKGJldDogT21pdDxCZXQsIFwiaWRcIiB8IFwidGltZXN0YW1wXCIgfCBcInN0YXR1c1wiPikgPT4gdm9pZFxuICAgIHVwZGF0ZUJldFN0YXR1czogKGJldElkOiBzdHJpbmcsIHN0YXR1czogXCJ3b25cIiB8IFwibG9zdFwiKSA9PiB2b2lkXG4gICAgYWRkQ29pbnM6IChhbW91bnQ6IG51bWJlcikgPT4gdm9pZFxuICAgIHN0YXRzOiB7XG4gICAgICAgIHRvdGFsQmV0czogbnVtYmVyXG4gICAgICAgIHRvdGFsV2luczogbnVtYmVyXG4gICAgICAgIHRvdGFsTG9zc2VzOiBudW1iZXJcbiAgICAgICAgd2luUmF0ZTogbnVtYmVyXG4gICAgICAgIHRvdGFsV29uOiBudW1iZXJcbiAgICAgICAgdG90YWxMb3N0OiBudW1iZXJcbiAgICB9XG59XG5cbmNvbnN0IFdhbGxldENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFdhbGxldENvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5cbmV4cG9ydCBmdW5jdGlvbiBXYWxsZXRQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gICAgY29uc3QgW2JhbGFuY2UsIHNldEJhbGFuY2VdID0gdXNlU3RhdGUoMTAwMClcbiAgICBjb25zdCBbYmV0cywgc2V0QmV0c10gPSB1c2VTdGF0ZTxCZXRbXT4oW10pXG5cbiAgICAvLyBMb2FkIGZyb20gbG9jYWxTdG9yYWdlIG9uIG1vdW50XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2F2ZWRCYWxhbmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ3YWxsZXQtYmFsYW5jZVwiKVxuICAgICAgICBjb25zdCBzYXZlZEJldHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIndhbGxldC1iZXRzXCIpXG5cbiAgICAgICAgaWYgKHNhdmVkQmFsYW5jZSkgc2V0QmFsYW5jZShOdW1iZXIucGFyc2VGbG9hdChzYXZlZEJhbGFuY2UpKVxuICAgICAgICBpZiAoc2F2ZWRCZXRzKSBzZXRCZXRzKEpTT04ucGFyc2Uoc2F2ZWRCZXRzKSlcbiAgICB9LCBbXSlcblxuICAgIC8vIFNhdmUgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGJhbGFuY2Ugb3IgYmV0cyBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIndhbGxldC1iYWxhbmNlXCIsIGJhbGFuY2UudG9TdHJpbmcoKSlcbiAgICB9LCBbYmFsYW5jZV0pXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIndhbGxldC1iZXRzXCIsIEpTT04uc3RyaW5naWZ5KGJldHMpKVxuICAgIH0sIFtiZXRzXSlcblxuICAgIGNvbnN0IGFkZEJldCA9IChiZXQ6IE9taXQ8QmV0LCBcImlkXCIgfCBcInRpbWVzdGFtcFwiIHwgXCJzdGF0dXNcIj4pID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmV0OiBCZXQgPSB7XG4gICAgICAgICAgICAuLi5iZXQsXG4gICAgICAgICAgICBpZDogYGJldC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEJldHMoKHByZXYpID0+IFtuZXdCZXQsIC4uLnByZXZdKVxuICAgICAgICBzZXRCYWxhbmNlKChwcmV2KSA9PiBwcmV2IC0gYmV0LmFtb3VudClcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVCZXRTdGF0dXMgPSAoYmV0SWQ6IHN0cmluZywgc3RhdHVzOiBcIndvblwiIHwgXCJsb3N0XCIpID0+IHtcbiAgICAgICAgc2V0QmV0cygocHJldikgPT5cbiAgICAgICAgICAgIHByZXYubWFwKChiZXQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYmV0LmlkID09PSBiZXRJZCAmJiBiZXQuc3RhdHVzID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBcIndvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCYWxhbmNlKChiKSA9PiBiICsgYmV0LnBvdGVudGlhbFdpbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iZXQsIHN0YXR1cyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiZXRcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgYWRkQ29pbnMgPSAoYW1vdW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgc2V0QmFsYW5jZSgocHJldikgPT4gcHJldiArIGFtb3VudClcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0cyA9IHtcbiAgICAgICAgdG90YWxCZXRzOiBiZXRzLmxlbmd0aCxcbiAgICAgICAgdG90YWxXaW5zOiBiZXRzLmZpbHRlcigoYikgPT4gYi5zdGF0dXMgPT09IFwid29uXCIpLmxlbmd0aCxcbiAgICAgICAgdG90YWxMb3NzZXM6IGJldHMuZmlsdGVyKChiKSA9PiBiLnN0YXR1cyA9PT0gXCJsb3N0XCIpLmxlbmd0aCxcbiAgICAgICAgd2luUmF0ZTogYmV0cy5sZW5ndGggPiAwID8gKGJldHMuZmlsdGVyKChiKSA9PiBiLnN0YXR1cyA9PT0gXCJ3b25cIikubGVuZ3RoIC8gYmV0cy5sZW5ndGgpICogMTAwIDogMCxcbiAgICAgICAgdG90YWxXb246IGJldHMuZmlsdGVyKChiKSA9PiBiLnN0YXR1cyA9PT0gXCJ3b25cIikucmVkdWNlKChzdW0sIGIpID0+IHN1bSArIGIucG90ZW50aWFsV2luLCAwKSxcbiAgICAgICAgdG90YWxMb3N0OiBiZXRzLmZpbHRlcigoYikgPT4gYi5zdGF0dXMgPT09IFwibG9zdFwiKS5yZWR1Y2UoKHN1bSwgYikgPT4gc3VtICsgYi5hbW91bnQsIDApLFxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxXYWxsZXRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGJhbGFuY2UsIGJldHMsIGFkZEJldCwgdXBkYXRlQmV0U3RhdHVzLCBhZGRDb2lucywgc3RhdHMgfX0+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvV2FsbGV0Q29udGV4dC5Qcm92aWRlcj5cbiAgICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VXYWxsZXQoKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoV2FsbGV0Q29udGV4dClcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZVdhbGxldCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgV2FsbGV0UHJvdmlkZXJcIilcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHRcbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVDb250ZXh0IiwidXNlQ29udGV4dCIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwiV2FsbGV0Q29udGV4dCIsInVuZGVmaW5lZCIsIldhbGxldFByb3ZpZGVyIiwiY2hpbGRyZW4iLCJiYWxhbmNlIiwic2V0QmFsYW5jZSIsImJldHMiLCJzZXRCZXRzIiwic2F2ZWRCYWxhbmNlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNhdmVkQmV0cyIsIk51bWJlciIsInBhcnNlRmxvYXQiLCJKU09OIiwicGFyc2UiLCJzZXRJdGVtIiwidG9TdHJpbmciLCJzdHJpbmdpZnkiLCJhZGRCZXQiLCJiZXQiLCJuZXdCZXQiLCJpZCIsIk1hdGgiLCJEYXRlIiwibm93IiwicmFuZG9tIiwidGltZXN0YW1wIiwic3RhdHVzIiwicHJldiIsImFtb3VudCIsInVwZGF0ZUJldFN0YXR1cyIsImJldElkIiwibWFwIiwiYiIsInBvdGVudGlhbFdpbiIsImFkZENvaW5zIiwic3RhdHMiLCJ0b3RhbEJldHMiLCJsZW5ndGgiLCJ0b3RhbFdpbnMiLCJmaWx0ZXIiLCJ0b3RhbExvc3NlcyIsIndpblJhdGUiLCJ0b3RhbFdvbiIsInJlZHVjZSIsInN1bSIsInRvdGFsTG9zdCIsIlByb3ZpZGVyIiwidmFsdWUiLCJ1c2VXYWxsZXQiLCJjb250ZXh0IiwiRXJyb3IiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/wallet-context.tsx\n")); /***/ }) }]); |